[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 /* 2 YUI 3.17.2 (build 9c3c78e) 3 Copyright 2014 Yahoo! Inc. All rights reserved. 4 Licensed under the BSD License. 5 http://yuilibrary.com/license/ 6 */ 7 8 YUI.add('color-harmony', function (Y, NAME) { 9 10 /** 11 Color Harmony provides methods useful for color combination discovery. 12 13 @module color 14 @submodule color-harmony 15 @class Harmony 16 @namespace Color 17 @since 3.8.0 18 */ 19 var HSL = 'hsl', 20 RGB = 'rgb', 21 22 SPLIT_OFFSET = 30, 23 ANALOGOUS_OFFSET = 10, 24 TRIAD_OFFSET = 360/3, 25 TETRAD_OFFSET = 360/6, 26 SQUARE_OFFSET = 360/4 , 27 28 DEF_COUNT = 5, 29 DEF_OFFSET = 10, 30 31 Color = Y.Color, 32 33 Harmony = { 34 35 // Color Groups 36 /** 37 Returns an Array of two colors. The first color in the Array 38 will be the color passed in. The second will be the 39 complementary color of the color provided 40 @public 41 @method getComplementary 42 @param {String} str 43 @param {String} [to] 44 @return {Array} 45 @since 3.8.0 46 **/ 47 getComplementary: function(str, to) { 48 var c = Harmony._start(str), 49 offsets = []; 50 51 to = to || Color.findType(str); 52 53 offsets.push({}); 54 offsets.push({ h: 180 }); 55 56 return Harmony._adjustOffsetAndFinish(c, offsets, to); 57 }, 58 59 /** 60 Returns an Array of three colors. The first color in the Array 61 will be the color passed in. The second two will be split 62 complementary colors. 63 @public 64 @method getSplit 65 @param {String} str 66 @param {Number} [offset] 67 @param {String} [to] 68 @return {String} 69 @since 3.8.0 70 **/ 71 getSplit: function(str, offset, to) { 72 var c = Harmony._start(str), 73 offsets = []; 74 75 offset = offset || SPLIT_OFFSET; 76 77 to = to || Color.findType(str); 78 79 offsets.push({}); 80 offsets.push({ h: 180 + offset }); 81 offsets.push({ h: 180 - offset }); 82 83 return Harmony._adjustOffsetAndFinish(c, offsets, to); 84 }, 85 86 /** 87 Returns an Array of five colors. The first color in the Array 88 will be the color passed in. The remaining four will be 89 analogous colors two in either direction from the initially 90 provided color. 91 @public 92 @method getAnalogous 93 @param {String} str 94 @param {Number} [offset] 95 @param {String} [to] 96 @return {String} 97 @since 3.8.0 98 **/ 99 getAnalogous: function(str, offset, to) { 100 var c = Harmony._start(str), 101 offsets = []; 102 103 offset = offset || ANALOGOUS_OFFSET; 104 to = to || Color.findType(str); 105 106 offsets.push({}); 107 offsets.push({ h: offset }); 108 offsets.push({ h: offset * 2 }); 109 offsets.push({ h: -offset }); 110 offsets.push({ h: -offset * 2 }); 111 112 return Harmony._adjustOffsetAndFinish(c, offsets, to); 113 }, 114 115 /** 116 Returns an Array of three colors. The first color in the Array 117 will be the color passed in. The second two will be equidistant 118 from the start color and each other. 119 @public 120 @method getTriad 121 @param {String} str 122 @param {String} [to] 123 @return {String} 124 @since 3.8.0 125 **/ 126 getTriad: function(str, to) { 127 var c = Harmony._start(str), 128 offsets = []; 129 130 to = to || Color.findType(str); 131 132 offsets.push({}); 133 offsets.push({ h: TRIAD_OFFSET }); 134 offsets.push({ h: -TRIAD_OFFSET }); 135 136 return Harmony._adjustOffsetAndFinish(c, offsets, to); 137 }, 138 139 /** 140 Returns an Array of four colors. The first color in the Array 141 will be the color passed in. The remaining three colors are 142 equidistant offsets from the starting color and each other. 143 @public 144 @method getTetrad 145 @param {String} str 146 @param {Number} [offset] 147 @param {String} [to] 148 @return {String} 149 @since 3.8.0 150 **/ 151 getTetrad: function(str, offset, to) { 152 var c = Harmony._start(str), 153 offsets = []; 154 155 offset = offset || TETRAD_OFFSET; 156 to = to || Color.findType(str); 157 158 offsets.push({}); 159 offsets.push({ h: offset }); 160 offsets.push({ h: 180 }); 161 offsets.push({ h: 180 + offset }); 162 163 return Harmony._adjustOffsetAndFinish(c, offsets, to); 164 }, 165 166 /** 167 Returns an Array of four colors. The first color in the Array 168 will be the color passed in. The remaining three colors are 169 equidistant offsets from the starting color and each other. 170 @public 171 @method getSquare 172 @param {String} str 173 @param {String} [to] 174 @return {String} 175 @since 3.8.0 176 **/ 177 getSquare: function(str, to) { 178 var c = Harmony._start(str), 179 offsets = []; 180 181 to = to || Color.findType(str); 182 183 offsets.push({}); 184 offsets.push({ h: SQUARE_OFFSET }); 185 offsets.push({ h: SQUARE_OFFSET * 2 }); 186 offsets.push({ h: SQUARE_OFFSET * 3 }); 187 188 return Harmony._adjustOffsetAndFinish(c, offsets, to); 189 }, 190 191 /** 192 Calculates lightness offsets resulting in a monochromatic Array 193 of values. 194 @public 195 @method getMonochrome 196 @param {String} str 197 @param {Number} [count] 198 @param {String} [to] 199 @return {String} 200 @since 3.8.0 201 **/ 202 getMonochrome: function(str, count, to) { 203 var c = Harmony._start(str), 204 colors = [], 205 i = 0, 206 l, 207 step, 208 _c = c.concat(); 209 210 count = count || DEF_COUNT; 211 to = to || Color.findType(str); 212 213 214 if (count < 2) { 215 return str; 216 } 217 218 step = 100 / (count - 1); 219 220 for (; i <= 100; i += step) { 221 _c[2] = Math.max(Math.min(i, 100), 0); 222 colors.push(_c.concat()); 223 } 224 225 l = colors.length; 226 227 for (i=0; i<l; i++) { 228 colors[i] = Harmony._finish(colors[i], to); 229 } 230 231 return colors; 232 }, 233 234 /** 235 Creates an Array of similar colors. Returned Array is prepended 236 with the color provided followed a number of colors decided 237 by count 238 @public 239 @method getSimilar 240 @param {String} str 241 @param {Number} [offset] 242 @param {Number} [count] 243 @param {String} [to] 244 @return {String} 245 @since 3.8.0 246 **/ 247 getSimilar: function(str, offset, count, to) { 248 var c = Harmony._start(str), 249 offsets = [], 250 slOffset, 251 s = +(c[1]), 252 sMin, 253 sMax, 254 sRand, 255 l = +(c[2]), 256 lMin, 257 lMax, 258 lRand; 259 260 to = to || Color.findType(str); 261 count = count || DEF_COUNT; 262 offset = offset || DEF_OFFSET; 263 264 slOffset = (offset > 100) ? 100 : offset; 265 sMin = Math.max(0, s - slOffset); 266 sMax = Math.min(100, s + slOffset); 267 lMin = Math.max(0, l - slOffset); 268 lMax = Math.min(100, l + slOffset); 269 270 offsets.push({}); 271 for (i = 0; i < count; i++) { 272 sRand = ( Math.round( (Math.random() * (sMax - sMin)) + sMin ) ); 273 lRand = ( Math.round( (Math.random() * (lMax - lMin)) + lMin ) ); 274 275 offsets.push({ 276 h: ( Math.random() * (offset * 2)) - offset, 277 // because getOffset adjusts from the existing color, we 278 // need to adjust it negatively to get a good number for 279 // saturation and luminance, otherwise we get a lot of white 280 s: -(s - sRand), 281 l: -(l - lRand) 282 }); 283 } 284 285 return Harmony._adjustOffsetAndFinish(c, offsets, to); 286 }, 287 288 /** 289 Adjusts the provided color by the offset(s) given. You may 290 adjust hue, saturation, and/or luminance in one step. 291 @public 292 @method getOffset 293 @param {String} str 294 @param {Object} adjust 295 @param {Number} [adjust.h] 296 @param {Number} [adjust.s] 297 @param {Number} [adjust.l] 298 @param {String} [to] 299 @return {String} 300 @since 3.8.0 301 **/ 302 getOffset: function(str, adjust, to) { 303 var started = Y.Lang.isArray(str), 304 hsla, 305 type; 306 307 if (!started) { 308 hsla = Harmony._start(str); 309 type = Color.findType(str); 310 } else { 311 hsla = str; 312 type = 'hsl'; 313 } 314 315 to = to || type; 316 317 if (adjust.h) { 318 hsla[0] = ((+hsla[0]) + adjust.h) % 360; 319 } 320 321 if (adjust.s) { 322 hsla[1] = Math.max(Math.min((+hsla[1]) + adjust.s, 100), 0); 323 } 324 325 if (adjust.l) { 326 hsla[2] = Math.max(Math.min((+hsla[2]) + adjust.l, 100), 0); 327 } 328 329 if (!started) { 330 return Harmony._finish(hsla, to); 331 } 332 333 return hsla; 334 }, 335 336 /** 337 Returns 0 - 100 percentage of brightness from `0` (black) being the 338 darkest to `100` (white) being the brightest. 339 @public 340 @method getBrightness 341 @param {String} str 342 @return {Number} 343 @since 3.8.0 344 **/ 345 getBrightness: function(str) { 346 var c = Color.toArray(Color._convertTo(str, RGB)), 347 r = c[0], 348 g = c[1], 349 b = c[2], 350 weights = Y.Color._brightnessWeights; 351 352 353 return Math.round(Math.sqrt( 354 (r * r * weights.r) + 355 (g * g * weights.g) + 356 (b * b * weights.b) 357 ) / 255 * 100); 358 }, 359 360 /** 361 Returns a new color value with adjusted luminance so that the 362 brightness of the return color matches the perceived brightness 363 of the `match` color provided. 364 @public 365 @method getSimilarBrightness 366 @param {String} str 367 @param {String} match 368 @param {String} [to] 369 @return {String} 370 @since 3.8.0 371 **/ 372 getSimilarBrightness: function(str, match, to){ 373 var c = Color.toArray(Color._convertTo(str, HSL)), 374 b = Harmony.getBrightness(match); 375 376 to = to || Color.findType(str); 377 378 if (to === 'keyword') { 379 to = 'hex'; 380 } 381 382 c[2] = Harmony._searchLuminanceForBrightness(c, b, 0, 100); 383 384 str = Color.fromArray(c, Y.Color.TYPES.HSLA); 385 386 return Color._convertTo(str, to); 387 }, 388 389 //-------------------- 390 // PRIVATE 391 //-------------------- 392 /** 393 Converts the provided color from additive to subtractive returning 394 an Array of HSLA values 395 @private 396 @method _start 397 @param {String} str 398 @return {Array} 399 @since 3.8.0 400 */ 401 _start: function(str) { 402 var hsla = Color.toArray(Color._convertTo(str, HSL)); 403 hsla[0] = Harmony._toSubtractive(hsla[0]); 404 405 return hsla; 406 }, 407 408 /** 409 Converts the provided HSLA values from subtractive to additive 410 returning a converted color string 411 @private 412 @method _finish 413 @param {Array} hsla 414 @param {String} [to] 415 @return {String} 416 @since 3.8.0 417 */ 418 _finish: function(hsla, to) { 419 hsla[0] = Harmony._toAdditive(hsla[0]); 420 hsla = 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')'; 421 422 if (to === 'keyword') { 423 to = 'hex'; 424 } 425 426 return Color._convertTo(hsla, to); 427 }, 428 429 /** 430 Adjusts the hue degree from subtractive to additive 431 @private 432 @method _toAdditive 433 @param {Number} hue 434 @return {Number} Converted additive hue 435 @since 3.8.0 436 */ 437 _toAdditive: function(hue) { 438 hue = Y.Color._constrainHue(hue); 439 440 if (hue <= 180) { 441 hue /= 1.5; 442 } else if (hue < 240) { 443 hue = 120 + (hue - 180) * 2; 444 } 445 446 return Y.Color._constrainHue(hue, 10); 447 }, 448 449 /** 450 Adjusts the hue degree from additive to subtractive 451 @private 452 @method _toSubtractive 453 @param {Number} hue 454 @return {Number} Converted subtractive hue 455 @since 3.8.0 456 */ 457 _toSubtractive: function(hue) { 458 hue = Y.Color._constrainHue(hue); 459 460 if (hue <= 120) { 461 hue *= 1.5; 462 } else if (hue < 240) { 463 hue = 180 + (hue - 120) / 2; 464 } 465 466 return Y.Color._constrainHue(hue, 10); 467 }, 468 469 /** 470 Contrain the hue to a value between 0 and 360 for calculations 471 and real color wheel value space. Provide a precision value 472 to round return value to a decimal place 473 @private 474 @method _constrainHue 475 @param {Number} hue 476 @param {Number} [precision] 477 @return {Number} Constrained hue value 478 @since 3.8.0 479 **/ 480 _constrainHue: function(hue, precision) { 481 while (hue < 0) { 482 hue += 360; 483 } 484 hue %= 360; 485 486 if (precision) { 487 hue = Math.round(hue * precision) / precision; 488 } 489 490 return hue; 491 }, 492 493 /** 494 Brightness weight factors for perceived brightness calculations 495 496 "standard" values are listed as R: 0.241, G: 0.691, B: 0.068 497 These values were changed based on grey scale comparison of hsl 498 to new hsl where brightness is said to be within plus or minus 0.01. 499 @private 500 @property _brightnessWeights 501 @since 3.8.0 502 */ 503 _brightnessWeights: { 504 r: 0.221, 505 g: 0.711, 506 b: 0.068 507 }, 508 509 /** 510 Calculates the luminance as a mid range between the min and max 511 to match the brightness level provided 512 @private 513 @method _searchLuminanceForBrightness 514 @param {Array} color HSLA values 515 @param {Number} brightness Brightness to be matched 516 @param {Number} min Minimum range for luminance 517 @param {Number} max Maximum range for luminance 518 @return {Number} Found luminance to achieve requested brightness 519 @since 3.8.0 520 **/ 521 _searchLuminanceForBrightness: function(color, brightness, min, max) { 522 var luminance = (max + min) / 2, 523 b; 524 525 color[2] = luminance; 526 b = Harmony.getBrightness(Color.fromArray(color, Y.Color.TYPES.HSL)); 527 528 if (b + 2 > brightness && b - 2 < brightness) { 529 return luminance; 530 } else if (b > brightness) { 531 return Harmony._searchLuminanceForBrightness(color, brightness, min, luminance); 532 } else { 533 return Harmony._searchLuminanceForBrightness(color, brightness, luminance, max); 534 } 535 }, 536 537 /** 538 Takes an HSL array, and an array of offsets and returns and array 539 of colors that have been adjusted. The returned colors will 540 match the array of offsets provided. If you wish you have the 541 same color value returned, you can provide null or an empty 542 object to the offsets. The returned array will contain color 543 value strings that have been adjusted from subtractive to 544 additive. 545 @private 546 @method _adjustOffsetAndFinish 547 @param {Array} color 548 @param {Array} offsets 549 @param {String} to 550 @return {Array} 551 @since 3.8.0 552 **/ 553 _adjustOffsetAndFinish: function(color, offsets, to) { 554 var colors = [], 555 i, 556 l = offsets.length, 557 _c; 558 559 for (i = 0; i < l; i++ ) { 560 _c = color.concat(); 561 if (offsets[i]) { 562 _c = Harmony.getOffset(_c, offsets[i]); 563 } 564 colors.push(Harmony._finish(_c, to)); 565 } 566 567 return colors; 568 } 569 570 }; 571 572 Y.Color = Y.mix(Y.Color, Harmony); 573 574 575 }, '3.17.2', {"requires": ["color-hsl"]});
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |