Bug 20489 Configure illegal file characters https://bugzilla.wikimedia.org/show_bug...
[mediawiki.git] / js2 / mwEmbed / libClipEdit / pixastic-lib / actions / hsl.js
blob510f71b138560aa2e1908b3bb4ccc63952390e8f
1 /*
2  * Pixastic Lib - HSL Adjust  - v0.1.0
3  * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/
4  * MIT License [http://www.opensource.org/licenses/mit-license.php]
5  */
7 Pixastic.Actions.hsl = {
8         process : function(params) {
10                 var hue = parseInt(params.options.hue,10)||0;
11                 var saturation = (parseInt(params.options.saturation,10)||0) / 100;
12                 var lightness = (parseInt(params.options.lightness,10)||0) / 100;
15                 // this seems to give the same result as Photoshop
16                 if (saturation < 0) {
17                         var satMul = 1+saturation;
18                 } else {
19                         var satMul = 1+saturation*2;
20                 }
22                 hue = (hue%360) / 360;
23                 var hue6 = hue * 6;
25                 var rgbDiv = 1 / 255;
27                 var light255 = lightness * 255;
28                 var lightp1 = 1 + lightness;
29                 var lightm1 = 1 - lightness;
30                 if (Pixastic.Client.hasCanvasImageData()) {
31                         var data = Pixastic.prepareData(params);
33                         var rect = params.options.rect;
34                         var w = rect.width;
35                         var h = rect.height;
37                         var w4 = w*4;
38                         var y = h;
40                         do {
41                                 var offsetY = (y-1)*w4;
42                                 var x = w;
43                                 do {
44                                         var offset = offsetY + (x*4-4);
46                                         var r = data[offset];
47                                         var g = data[offset+1];
48                                         var b = data[offset+2];
50                                         if (hue != 0 || saturation != 0) {
51                                                 // ok, here comes rgb to hsl + adjust + hsl to rgb, all in one jumbled mess. 
52                                                 // It's not so pretty, but it's been optimized to get somewhat decent performance.
53                                                 // The transforms were originally adapted from the ones found in Graphics Gems, but have been heavily modified.
54                                                 var vs = r;
55                                                 if (g > vs) vs = g;
56                                                 if (b > vs) vs = b;
57                                                 var ms = r;
58                                                 if (g < ms) ms = g;
59                                                 if (b < ms) ms = b;
60                                                 var vm = (vs-ms);
61                                                 var l = (ms+vs)/255 * 0.5;
62                                                 if (l > 0) {
63                                                         if (vm > 0) {
64                                                                 if (l <= 0.5) {
65                                                                         var s = vm / (vs+ms) * satMul;
66                                                                         if (s > 1) s = 1;
67                                                                         var v = (l * (1+s));
68                                                                 } else {
69                                                                         var s = vm / (510-vs-ms) * satMul;
70                                                                         if (s > 1) s = 1;
71                                                                         var v = (l+s - l*s);
72                                                                 }
73                                                                 if (r == vs) {
74                                                                         if (g == ms)
75                                                                                 var h = 5 + ((vs-b)/vm) + hue6;
76                                                                         else
77                                                                                 var h = 1 - ((vs-g)/vm) + hue6;
78                                                                 } else if (g == vs) {
79                                                                         if (b == ms)
80                                                                                 var h = 1 + ((vs-r)/vm) + hue6;
81                                                                         else
82                                                                                 var h = 3 - ((vs-b)/vm) + hue6;
83                                                                 } else {
84                                                                         if (r == ms)
85                                                                                 var h = 3 + ((vs-g)/vm) + hue6;
86                                                                         else
87                                                                                 var h = 5 - ((vs-r)/vm) + hue6;
88                                                                 }
89                                                                 if (h < 0) h+=6;
90                                                                 if (h >= 6) h-=6;
91                                                                 var m = (l+l-v);
92                                                                 var sextant = h>>0;
93                                                                 switch (sextant) {
94                                                                         case 0: r = v*255; g = (m+((v-m)*(h-sextant)))*255; b = m*255; break;
95                                                                         case 1: r = (v-((v-m)*(h-sextant)))*255; g = v*255; b = m*255; break;
96                                                                         case 2: r = m*255; g = v*255; b = (m+((v-m)*(h-sextant)))*255; break;
97                                                                         case 3: r = m*255; g = (v-((v-m)*(h-sextant)))*255; b = v*255; break;
98                                                                         case 4: r = (m+((v-m)*(h-sextant)))*255; g = m*255; b = v*255; break;
99                                                                         case 5: r = v*255; g = m*255; b = (v-((v-m)*(h-sextant)))*255; break;
100                                                                 }
101                                                         }
102                                                 }
103                                         }
105                                         if (lightness < 0) {
106                                                 r *= lightp1;
107                                                 g *= lightp1;
108                                                 b *= lightp1;
109                                         } else if (lightness > 0) {
110                                                 r = r * lightm1 + light255;
111                                                 g = g * lightm1 + light255;
112                                                 b = b * lightm1 + light255;
113                                         }
115                                         if (r < 0) r = 0;
116                                         if (g < 0) g = 0;
117                                         if (b < 0) b = 0;
118                                         if (r > 255) r = 255;
119                                         if (g > 255) g = 255;
120                                         if (b > 255) b = 255;
122                                         data[offset] = r;
123                                         data[offset+1] = g;
124                                         data[offset+2] = b;
126                                 } while (--x);
127                         } while (--y);
128                         return true;
129                 }
130         },
131         checkSupport : function() {
132                 return Pixastic.Client.hasCanvasImageData();
133         }