2 * Pixastic Lib - Blend - 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]
7 Pixastic
.Actions
.blend
= {
9 process : function(params
) {
10 var amount
= parseFloat(params
.options
.amount
);
11 var mode
= (params
.options
.mode
|| "normal").toLowerCase();
12 var image
= params
.options
.image
;
14 amount
= Math
.max(0,Math
.min(1,amount
));
16 if (!image
) return false;
18 if (Pixastic
.Client
.hasCanvasImageData()) {
19 var rect
= params
.options
.rect
;
20 var data
= Pixastic
.prepareData(params
);
24 params
.useData
= false;
26 var otherCanvas
= document
.createElement("canvas");
27 otherCanvas
.width
= params
.canvas
.width
;
28 otherCanvas
.height
= params
.canvas
.height
;
29 var otherCtx
= otherCanvas
.getContext("2d");
30 otherCtx
.drawImage(image
,0,0);
32 var params2
= {canvas
:otherCanvas
,options
:params
.options
};
33 var data2
= Pixastic
.prepareData(params2
);
34 var dataDesc2
= params2
.canvasData
;
47 // data2[pix-=4] = data2[pix];
48 // data2[pix1=pix+1] = data2[pix1];
49 // data2[pix2=pix+2] = data2[pix2];
55 data2
[pix
-=4] = data
[pix
] * data2
[pix
] / 255;
56 data2
[pix1
=pix
+1] = data
[pix1
] * data2
[pix1
] / 255;
57 data2
[pix2
=pix
+2] = data
[pix2
] * data2
[pix2
] / 255;
63 if ((r1
= data
[pix
-=4]) > data2
[pix
])
65 if ((g1
= data
[pix1
=pix
+1]) > data2
[pix1
])
67 if ((b1
= data
[pix2
=pix
+2]) > data2
[pix2
])
74 if ((r1
= data
[pix
-=4]) < data2
[pix
])
76 if ((g1
= data
[pix1
=pix
+1]) < data2
[pix1
])
78 if ((b1
= data
[pix2
=pix
+2]) < data2
[pix2
])
86 if (((r1
= data
[pix
-=4])*0.3+(g1
= data
[pix1
=pix
+1])*0.59+(b1
= data
[pix2
=pix
+2])*0.11) <= (data2
[pix
]*0.3+data2
[pix1
]*0.59+data2
[pix2
]*0.11)) {
96 if (((r1
= data
[pix
-=4])*0.3+(g1
= data
[pix1
=pix
+1])*0.59+(b1
= data
[pix2
=pix
+2])*0.11) > (data2
[pix
]*0.3+data2
[pix1
]*0.59+data2
[pix2
]*0.11)) {
106 if ((r3
= data
[pix
-=4] + data2
[pix
]) > 255)
110 if ((g3
= data
[pix1
=pix
+1] + data2
[pix1
]) > 255)
114 if ((b3
= data
[pix2
=pix
+2] + data2
[pix2
]) > 255)
123 if ((r3
= data
[pix
-=4] + data2
[pix
]) < 255)
126 data2
[pix
] = (r3
- 255);
127 if ((g3
= data
[pix1
=pix
+1] + data2
[pix1
]) < 255)
130 data2
[pix1
] = (g3
- 255);
131 if ((b3
= data
[pix2
=pix
+2] + data2
[pix2
]) < 255)
134 data2
[pix2
] = (b3
- 255);
140 if ((r3
= data
[pix
-=4] - data2
[pix
]) < 0)
144 if ((g3
= data
[pix1
=pix
+1] - data2
[pix1
]) < 0)
148 if ((b3
= data
[pix2
=pix
+2] - data2
[pix2
]) < 0)
157 data2
[pix
-=4] = (255 - ( ((255-data2
[pix
])*(255-data
[pix
])) >> 8));
158 data2
[pix1
=pix
+1] = (255 - ( ((255-data2
[pix1
])*(255-data
[pix1
])) >> 8));
159 data2
[pix2
=pix
+2] = (255 - ( ((255-data2
[pix2
])*(255-data
[pix2
])) >> 8));
164 var div_2_255
= 2 / 255;
166 data2
[pix
-=4] = (r1
= data
[pix
]) - (r1
* div_2_255
- 1) * data2
[pix
];
167 data2
[pix1
=pix
+1] = (g1
= data
[pix1
]) - (g1
* div_2_255
- 1) * data2
[pix1
];
168 data2
[pix2
=pix
+2] = (b1
= data
[pix2
]) - (b1
* div_2_255
- 1) * data2
[pix2
];
173 var div_2_255
= 2 / 255;
175 if ((r1
= data
[pix
-=4]) < 128)
176 data2
[pix
] = data2
[pix
]*r1
*div_2_255
;
178 data2
[pix
] = 255 - (255-data2
[pix
])*(255-r1
)*div_2_255
;
180 if ((g1
= data
[pix1
=pix
+1]) < 128)
181 data2
[pix1
] = data2
[pix1
]*g1
*div_2_255
;
183 data2
[pix1
] = 255 - (255-data2
[pix1
])*(255-g1
)*div_2_255
;
185 if ((b1
= data
[pix2
=pix
+2]) < 128)
186 data2
[pix2
] = data2
[pix2
]*b1
*div_2_255
;
188 data2
[pix2
] = 255 - (255-data2
[pix2
])*(255-b1
)*div_2_255
;
194 var div_2_255
= 2 / 255;
196 if ((r1
= data
[pix
-=4]) < 128)
197 data2
[pix
] = ((data2
[pix
]>>1) + 64) * r1
* div_2_255
;
199 data2
[pix
] = 255 - (191 - (data2
[pix
]>>1)) * (255-r1
) * div_2_255
;
201 if ((g1
= data
[pix1
=pix
+1]) < 128)
202 data2
[pix1
] = ((data2
[pix1
]>>1)+64) * g1
* div_2_255
;
204 data2
[pix1
] = 255 - (191 - (data2
[pix1
]>>1)) * (255-g1
) * div_2_255
;
206 if ((b1
= data
[pix2
=pix
+2]) < 128)
207 data2
[pix2
] = ((data2
[pix2
]>>1)+64) * b1
* div_2_255
;
209 data2
[pix2
] = 255 - (191 - (data2
[pix2
]>>1)) * (255-b1
) * div_2_255
;
216 var div_2_255
= 2 / 255;
218 if ((r2
= data2
[pix
-=4]) < 128)
219 data2
[pix
] = data
[pix
] * r2
* div_2_255
;
221 data2
[pix
] = 255 - (255-data
[pix
]) * (255-r2
) * div_2_255
;
223 if ((g2
= data2
[pix1
=pix
+1]) < 128)
224 data2
[pix1
] = data
[pix1
] * g2
* div_2_255
;
226 data2
[pix1
] = 255 - (255-data
[pix1
]) * (255-g2
) * div_2_255
;
228 if ((b2
= data2
[pix2
=pix
+2]) < 128)
229 data2
[pix2
] = data
[pix2
] * b2
* div_2_255
;
231 data2
[pix2
] = 255 - (255-data
[pix2
]) * (255-b2
) * div_2_255
;
238 if ((r3
= (data
[pix
-=4]<<8)/(255-(r2
= data2
[pix
]))) > 255 || r2
== 255)
243 if ((g3
= (data
[pix1
=pix
+1]<<8)/(255-(g2
= data2
[pix1
]))) > 255 || g2
== 255)
248 if ((b3
= (data
[pix2
=pix
+2]<<8)/(255-(b2
= data2
[pix2
]))) > 255 || b2
== 255)
258 if ((r3
= 255-((255-data
[pix
-=4])<<8)/data2
[pix
]) < 0 || data2
[pix
] == 0)
263 if ((g3
= 255-((255-data
[pix1
=pix
+1])<<8)/data2
[pix1
]) < 0 || data2
[pix1
] == 0)
268 if ((b3
= 255-((255-data
[pix2
=pix
+2])<<8)/data2
[pix2
]) < 0 || data2
[pix2
] == 0)
277 if ( ((r3
= 2*(r2
=data2
[pix
-=4])+data
[pix
]-256) < 0) || (r2
< 128 && r3
< 0)) {
285 if ( ((g3
= 2*(g2
=data2
[pix1
=pix
+1])+data
[pix1
]-256) < 0) || (g2
< 128 && g3
< 0)) {
293 if ( ((b3
= 2*(b2
=data2
[pix2
=pix
+2])+data
[pix2
]-256) < 0) || (b2
< 128 && b3
< 0)) {
307 if ((r2
=data2
[pix
-=4]) < 128) {
309 if ((r3
= 255 - ((255-data
[pix
])<<8) / (2*r2
)) < 0)
316 } else if ((r3
= (r4
=2*r2
-256)) < 255) {
317 if ((r3
= (data
[pix
]<<8)/(255-r4
)) > 255)
328 if ((g2
=data2
[pix1
=pix
+1]) < 128) {
330 if ((g3
= 255 - ((255-data
[pix1
])<<8) / (2*g2
)) < 0)
337 } else if ((g3
= (g4
=2*g2
-256)) < 255) {
338 if ((g3
= (data
[pix1
]<<8)/(255-g4
)) > 255)
349 if ((b2
=data2
[pix2
=pix
+2]) < 128) {
351 if ((b3
= 255 - ((255-data
[pix2
])<<8) / (2*b2
)) < 0)
358 } else if ((b3
= (b4
=2*b2
-256)) < 255) {
359 if ((b3
= (data
[pix2
]<<8)/(255-b4
)) > 255)
374 if ((r2
=data2
[pix
-=4]) < 128)
375 if ((r1
=data
[pix
]) < (r4
=2*r2
))
380 if ((r1
=data
[pix
]) > (r4
=2*r2
-256))
385 if ((g2
=data2
[pix1
=pix
+1]) < 128)
386 if ((g1
=data
[pix1
]) < (g4
=2*g2
))
391 if ((g1
=data
[pix1
]) > (g4
=2*g2
-256))
396 if ((r2
=data2
[pix2
=pix
+2]) < 128)
397 if ((r1
=data
[pix2
]) < (r4
=2*r2
))
402 if ((r1
=data
[pix2
]) > (r4
=2*r2
-256))
411 if ((r2
= data2
[pix
-=4]) < 128)
412 if (255 - ((255-data
[pix
])<<8)/(2*r2
) < 128 || r2
== 0)
416 else if ((r4
=2*r2
-256) < 255 && (data
[pix
]<<8)/(255-r4
) < 128)
421 if ((g2
= data2
[pix1
=pix
+1]) < 128)
422 if (255 - ((255-data
[pix1
])<<8)/(2*g2
) < 128 || g2
== 0)
426 else if ((g4
=2*g2
-256) < 255 && (data
[pix1
]<<8)/(255-g4
) < 128)
431 if ((b2
= data2
[pix2
=pix
+2]) < 128)
432 if (255 - ((255-data
[pix2
])<<8)/(2*b2
) < 128 || b2
== 0)
436 else if ((b4
=2*b2
-256) < 255 && (data
[pix2
]<<8)/(255-b4
) < 128)
444 otherCtx
.putImageData(dataDesc2
,0,0);
445 var ctx
= params
.canvas
.getContext("2d");
447 ctx
.globalAlpha
= amount
;
450 0,0,rect
.width
,rect
.height
,
451 rect
.left
,rect
.top
,rect
.width
,rect
.height
459 checkSupport : function() {
460 return Pixastic
.Client
.hasCanvasImageData();