diff --git a/actions/blend.js b/actions/blend.js index 0792f8f..f08232b 100755 --- a/actions/blend.js +++ b/actions/blend.js @@ -1,508 +1,508 @@ -/* - * Pixastic Lib - Blend - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.blend = { - - process : function(params) { - var amount = parseFloat(params.options.amount); - var mode = (params.options.mode || "normal").toLowerCase(); - var image = params.options.image; - - amount = Math.max(0,Math.min(1,amount)); - - if (!image) return false; - - if (Pixastic.Client.hasCanvasImageData()) { - - var rect = params.options.rect; - var data = Pixastic.prepareData(params); - var w = rect.width; - var h = rect.height; - - params.useData = false; - - var otherCanvas = document.createElement("canvas"); - otherCanvas.width = params.canvas.width; - otherCanvas.height = params.canvas.height; - var otherCtx = otherCanvas.getContext("2d"); - otherCtx.drawImage(image,0,0); - - var params2 = {canvas:otherCanvas,options:params.options}; - var data2 = Pixastic.prepareData(params2); - var dataDesc2 = params2.canvasData; - - var p = w*h; - var pix = p*4; - var pix1, pix2; - var r1, g1, b1; - var r2, g2, b2; - var r3, g3, b3; - var r4, g4, b4; - - var dataChanged = false; - - switch (mode) { - case "normal" : - //while (p--) { - // data2[pix-=4] = data2[pix]; - // data2[pix1=pix+1] = data2[pix1]; - // data2[pix2=pix+2] = data2[pix2]; - //} - break; - - case "multiply" : - while (p--) { - data2[pix-=4] = data[pix] * data2[pix] / 255; - data2[pix1=pix+1] = data[pix1] * data2[pix1] / 255; - data2[pix2=pix+2] = data[pix2] * data2[pix2] / 255; - } - dataChanged = true; - break; - - case "lighten" : - while (p--) { - if ((r1 = data[pix-=4]) > data2[pix]) - data2[pix] = r1; - if ((g1 = data[pix1=pix+1]) > data2[pix1]) - data2[pix1] = g1; - if ((b1 = data[pix2=pix+2]) > data2[pix2]) - data2[pix2] = b1; - } - dataChanged = true; - break; - - case "darken" : - while (p--) { - if ((r1 = data[pix-=4]) < data2[pix]) - data2[pix] = r1; - if ((g1 = data[pix1=pix+1]) < data2[pix1]) - data2[pix1] = g1; - if ((b1 = data[pix2=pix+2]) < data2[pix2]) - data2[pix2] = b1; - - } - dataChanged = true; - break; - - case "darkercolor" : - while (p--) { - 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)) { - data2[pix] = r1; - data2[pix1] = g1; - data2[pix2] = b1; - } - } - dataChanged = true; - break; - - case "lightercolor" : - while (p--) { - 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)) { - data2[pix] = r1; - data2[pix1] = g1; - data2[pix2] = b1; - } - } - dataChanged = true; - break; - - case "lineardodge" : - /* - otherCtx.globalCompositeOperation = "source-over"; - otherCtx.drawImage(params.canvas, 0, 0); - otherCtx.globalCompositeOperation = "lighter"; - otherCtx.drawImage(image, 0, 0); - */ - - while (p--) { - if ((r3 = data[pix-=4] + data2[pix]) > 255) - data2[pix] = 255; - else - data2[pix] = r3; - if ((g3 = data[pix1=pix+1] + data2[pix1]) > 255) - data2[pix1] = 255; - else - data2[pix1] = g3; - if ((b3 = data[pix2=pix+2] + data2[pix2]) > 255) - data2[pix2] = 255; - else - data2[pix2] = b3; - } - dataChanged = true; - - break; - - case "linearburn" : - while (p--) { - if ((r3 = data[pix-=4] + data2[pix]) < 255) - data2[pix] = 0; - else - data2[pix] = (r3 - 255); - if ((g3 = data[pix1=pix+1] + data2[pix1]) < 255) - data2[pix1] = 0; - else - data2[pix1] = (g3 - 255); - if ((b3 = data[pix2=pix+2] + data2[pix2]) < 255) - data2[pix2] = 0; - else - data2[pix2] = (b3 - 255); - } - dataChanged = true; - break; - - case "difference" : - while (p--) { - if ((r3 = data[pix-=4] - data2[pix]) < 0) - data2[pix] = -r3; - else - data2[pix] = r3; - if ((g3 = data[pix1=pix+1] - data2[pix1]) < 0) - data2[pix1] = -g3; - else - data2[pix1] = g3; - if ((b3 = data[pix2=pix+2] - data2[pix2]) < 0) - data2[pix2] = -b3; - else - data2[pix2] = b3; - } - dataChanged = true; - break; - - case "screen" : - while (p--) { - data2[pix-=4] = (255 - ( ((255-data2[pix])*(255-data[pix])) >> 8)); - data2[pix1=pix+1] = (255 - ( ((255-data2[pix1])*(255-data[pix1])) >> 8)); - data2[pix2=pix+2] = (255 - ( ((255-data2[pix2])*(255-data[pix2])) >> 8)); - } - dataChanged = true; - break; - - case "exclusion" : - var div_2_255 = 2 / 255; - while (p--) { - data2[pix-=4] = (r1 = data[pix]) - (r1 * div_2_255 - 1) * data2[pix]; - data2[pix1=pix+1] = (g1 = data[pix1]) - (g1 * div_2_255 - 1) * data2[pix1]; - data2[pix2=pix+2] = (b1 = data[pix2]) - (b1 * div_2_255 - 1) * data2[pix2]; - } - dataChanged = true; - break; - - case "overlay" : - var div_2_255 = 2 / 255; - while (p--) { - if ((r1 = data[pix-=4]) < 128) - data2[pix] = data2[pix]*r1*div_2_255; - else - data2[pix] = 255 - (255-data2[pix])*(255-r1)*div_2_255; - - if ((g1 = data[pix1=pix+1]) < 128) - data2[pix1] = data2[pix1]*g1*div_2_255; - else - data2[pix1] = 255 - (255-data2[pix1])*(255-g1)*div_2_255; - - if ((b1 = data[pix2=pix+2]) < 128) - data2[pix2] = data2[pix2]*b1*div_2_255; - else - data2[pix2] = 255 - (255-data2[pix2])*(255-b1)*div_2_255; - - } - dataChanged = true; - break; - - case "softlight" : - var div_2_255 = 2 / 255; - while (p--) { - if ((r1 = data[pix-=4]) < 128) - data2[pix] = ((data2[pix]>>1) + 64) * r1 * div_2_255; - else - data2[pix] = 255 - (191 - (data2[pix]>>1)) * (255-r1) * div_2_255; - - if ((g1 = data[pix1=pix+1]) < 128) - data2[pix1] = ((data2[pix1]>>1)+64) * g1 * div_2_255; - else - data2[pix1] = 255 - (191 - (data2[pix1]>>1)) * (255-g1) * div_2_255; - - if ((b1 = data[pix2=pix+2]) < 128) - data2[pix2] = ((data2[pix2]>>1)+64) * b1 * div_2_255; - else - data2[pix2] = 255 - (191 - (data2[pix2]>>1)) * (255-b1) * div_2_255; - - } - dataChanged = true; - break; - - case "hardlight" : - var div_2_255 = 2 / 255; - while (p--) { - if ((r2 = data2[pix-=4]) < 128) - data2[pix] = data[pix] * r2 * div_2_255; - else - data2[pix] = 255 - (255-data[pix]) * (255-r2) * div_2_255; - - if ((g2 = data2[pix1=pix+1]) < 128) - data2[pix1] = data[pix1] * g2 * div_2_255; - else - data2[pix1] = 255 - (255-data[pix1]) * (255-g2) * div_2_255; - - if ((b2 = data2[pix2=pix+2]) < 128) - data2[pix2] = data[pix2] * b2 * div_2_255; - else - data2[pix2] = 255 - (255-data[pix2]) * (255-b2) * div_2_255; - - } - dataChanged = true; - break; - - case "colordodge" : - while (p--) { - if ((r3 = (data[pix-=4]<<8)/(255-(r2 = data2[pix]))) > 255 || r2 == 255) - data2[pix] = 255; - else - data2[pix] = r3; - - if ((g3 = (data[pix1=pix+1]<<8)/(255-(g2 = data2[pix1]))) > 255 || g2 == 255) - data2[pix1] = 255; - else - data2[pix1] = g3; - - if ((b3 = (data[pix2=pix+2]<<8)/(255-(b2 = data2[pix2]))) > 255 || b2 == 255) - data2[pix2] = 255; - else - data2[pix2] = b3; - } - dataChanged = true; - break; - - case "colorburn" : - while (p--) { - if ((r3 = 255-((255-data[pix-=4])<<8)/data2[pix]) < 0 || data2[pix] == 0) - data2[pix] = 0; - else - data2[pix] = r3; - - if ((g3 = 255-((255-data[pix1=pix+1])<<8)/data2[pix1]) < 0 || data2[pix1] == 0) - data2[pix1] = 0; - else - data2[pix1] = g3; - - if ((b3 = 255-((255-data[pix2=pix+2])<<8)/data2[pix2]) < 0 || data2[pix2] == 0) - data2[pix2] = 0; - else - data2[pix2] = b3; - } - dataChanged = true; - break; - - case "linearlight" : - while (p--) { - if ( ((r3 = 2*(r2=data2[pix-=4])+data[pix]-256) < 0) || (r2 < 128 && r3 < 0)) { - data2[pix] = 0 - } else { - if (r3 > 255) - data2[pix] = 255; - else - data2[pix] = r3; - } - if ( ((g3 = 2*(g2=data2[pix1=pix+1])+data[pix1]-256) < 0) || (g2 < 128 && g3 < 0)) { - data2[pix1] = 0 - } else { - if (g3 > 255) - data2[pix1] = 255; - else - data2[pix1] = g3; - } - if ( ((b3 = 2*(b2=data2[pix2=pix+2])+data[pix2]-256) < 0) || (b2 < 128 && b3 < 0)) { - data2[pix2] = 0 - } else { - if (b3 > 255) - data2[pix2] = 255; - else - data2[pix2] = b3; - } - } - dataChanged = true; - break; - - case "vividlight" : - while (p--) { - if ((r2=data2[pix-=4]) < 128) { - if (r2) { - if ((r3 = 255 - ((255-data[pix])<<8) / (2*r2)) < 0) - data2[pix] = 0; - else - data2[pix] = r3 - } else { - data2[pix] = 0; - } - } else if ((r3 = (r4=2*r2-256)) < 255) { - if ((r3 = (data[pix]<<8)/(255-r4)) > 255) - data2[pix] = 255; - else - data2[pix] = r3; - } else { - if (r3 < 0) - data2[pix] = 0; - else - data2[pix] = r3 - } - - if ((g2=data2[pix1=pix+1]) < 128) { - if (g2) { - if ((g3 = 255 - ((255-data[pix1])<<8) / (2*g2)) < 0) - data2[pix1] = 0; - else - data2[pix1] = g3; - } else { - data2[pix1] = 0; - } - } else if ((g3 = (g4=2*g2-256)) < 255) { - if ((g3 = (data[pix1]<<8)/(255-g4)) > 255) - data2[pix1] = 255; - else - data2[pix1] = g3; - } else { - if (g3 < 0) - data2[pix1] = 0; - else - data2[pix1] = g3; - } - - if ((b2=data2[pix2=pix+2]) < 128) { - if (b2) { - if ((b3 = 255 - ((255-data[pix2])<<8) / (2*b2)) < 0) - data2[pix2] = 0; - else - data2[pix2] = b3; - } else { - data2[pix2] = 0; - } - } else if ((b3 = (b4=2*b2-256)) < 255) { - if ((b3 = (data[pix2]<<8)/(255-b4)) > 255) - data2[pix2] = 255; - else - data2[pix2] = b3; - } else { - if (b3 < 0) - data2[pix2] = 0; - else - data2[pix2] = b3; - } - } - dataChanged = true; - break; - - case "pinlight" : - while (p--) { - if ((r2=data2[pix-=4]) < 128) - if ((r1=data[pix]) < (r4=2*r2)) - data2[pix] = r1; - else - data2[pix] = r4; - else - if ((r1=data[pix]) > (r4=2*r2-256)) - data2[pix] = r1; - else - data2[pix] = r4; - - if ((g2=data2[pix1=pix+1]) < 128) - if ((g1=data[pix1]) < (g4=2*g2)) - data2[pix1] = g1; - else - data2[pix1] = g4; - else - if ((g1=data[pix1]) > (g4=2*g2-256)) - data2[pix1] = g1; - else - data2[pix1] = g4; - - if ((r2=data2[pix2=pix+2]) < 128) - if ((r1=data[pix2]) < (r4=2*r2)) - data2[pix2] = r1; - else - data2[pix2] = r4; - else - if ((r1=data[pix2]) > (r4=2*r2-256)) - data2[pix2] = r1; - else - data2[pix2] = r4; - } - dataChanged = true; - break; - - case "hardmix" : - while (p--) { - if ((r2 = data2[pix-=4]) < 128) - if (255 - ((255-data[pix])<<8)/(2*r2) < 128 || r2 == 0) - data2[pix] = 0; - else - data2[pix] = 255; - else if ((r4=2*r2-256) < 255 && (data[pix]<<8)/(255-r4) < 128) - data2[pix] = 0; - else - data2[pix] = 255; - - if ((g2 = data2[pix1=pix+1]) < 128) - if (255 - ((255-data[pix1])<<8)/(2*g2) < 128 || g2 == 0) - data2[pix1] = 0; - else - data2[pix1] = 255; - else if ((g4=2*g2-256) < 255 && (data[pix1]<<8)/(255-g4) < 128) - data2[pix1] = 0; - else - data2[pix1] = 255; - - if ((b2 = data2[pix2=pix+2]) < 128) - if (255 - ((255-data[pix2])<<8)/(2*b2) < 128 || b2 == 0) - data2[pix2] = 0; - else - data2[pix2] = 255; - else if ((b4=2*b2-256) < 255 && (data[pix2]<<8)/(255-b4) < 128) - data2[pix2] = 0; - else - data2[pix2] = 255; - } - dataChanged = true; - break; - } - - if (dataChanged) - otherCtx.putImageData(dataDesc2,0,0); - - if (amount != 1 && !Pixastic.Client.hasGlobalAlpha()) { - var p = w*h; - var amount2 = amount; - var amount1 = 1 - amount; - while (p--) { - var pix = p*4; - var r = (data[pix] * amount1 + data2[pix] * amount2)>>0; - var g = (data[pix+1] * amount1 + data2[pix+1] * amount2)>>0; - var b = (data[pix+2] * amount1 + data2[pix+2] * amount2)>>0; - - data[pix] = r; - data[pix+1] = g; - data[pix+2] = b; - } - params.useData = true; - } else { - var ctx = params.canvas.getContext("2d"); - ctx.save(); - ctx.globalAlpha = amount; - ctx.drawImage( - otherCanvas, - 0,0,rect.width,rect.height, - rect.left,rect.top,rect.width,rect.height - ); - ctx.globalAlpha = 1; - ctx.restore(); - } - - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } +/* + * Pixastic Lib - Blend - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.blend = { + + process : function(params) { + var amount = parseFloat(params.options.amount); + var mode = (params.options.mode || "normal").toLowerCase(); + var image = params.options.image; + + amount = Math.max(0,Math.min(1,amount)); + + if (!image) return false; + + if (Pixastic.Client.hasCanvasImageData()) { + + var rect = params.options.rect; + var data = Pixastic.prepareData(params); + var w = rect.width; + var h = rect.height; + + params.useData = false; + + var otherCanvas = document.createElement("canvas"); + otherCanvas.width = params.canvas.width; + otherCanvas.height = params.canvas.height; + var otherCtx = otherCanvas.getContext("2d"); + otherCtx.drawImage(image,0,0); + + var params2 = {canvas:otherCanvas,options:params.options}; + var data2 = Pixastic.prepareData(params2); + var dataDesc2 = params2.canvasData; + + var p = w*h; + var pix = p*4; + var pix1, pix2; + var r1, g1, b1; + var r2, g2, b2; + var r3, g3, b3; + var r4, g4, b4; + + var dataChanged = false; + + switch (mode) { + case "normal" : + //while (p--) { + // data2[pix-=4] = data2[pix]; + // data2[pix1=pix+1] = data2[pix1]; + // data2[pix2=pix+2] = data2[pix2]; + //} + break; + + case "multiply" : + while (p--) { + data2[pix-=4] = data[pix] * data2[pix] / 255; + data2[pix1=pix+1] = data[pix1] * data2[pix1] / 255; + data2[pix2=pix+2] = data[pix2] * data2[pix2] / 255; + } + dataChanged = true; + break; + + case "lighten" : + while (p--) { + if ((r1 = data[pix-=4]) > data2[pix]) + data2[pix] = r1; + if ((g1 = data[pix1=pix+1]) > data2[pix1]) + data2[pix1] = g1; + if ((b1 = data[pix2=pix+2]) > data2[pix2]) + data2[pix2] = b1; + } + dataChanged = true; + break; + + case "darken" : + while (p--) { + if ((r1 = data[pix-=4]) < data2[pix]) + data2[pix] = r1; + if ((g1 = data[pix1=pix+1]) < data2[pix1]) + data2[pix1] = g1; + if ((b1 = data[pix2=pix+2]) < data2[pix2]) + data2[pix2] = b1; + + } + dataChanged = true; + break; + + case "darkercolor" : + while (p--) { + 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)) { + data2[pix] = r1; + data2[pix1] = g1; + data2[pix2] = b1; + } + } + dataChanged = true; + break; + + case "lightercolor" : + while (p--) { + 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)) { + data2[pix] = r1; + data2[pix1] = g1; + data2[pix2] = b1; + } + } + dataChanged = true; + break; + + case "lineardodge" : + /* + otherCtx.globalCompositeOperation = "source-over"; + otherCtx.drawImage(params.canvas, 0, 0); + otherCtx.globalCompositeOperation = "lighter"; + otherCtx.drawImage(image, 0, 0); + */ + + while (p--) { + if ((r3 = data[pix-=4] + data2[pix]) > 255) + data2[pix] = 255; + else + data2[pix] = r3; + if ((g3 = data[pix1=pix+1] + data2[pix1]) > 255) + data2[pix1] = 255; + else + data2[pix1] = g3; + if ((b3 = data[pix2=pix+2] + data2[pix2]) > 255) + data2[pix2] = 255; + else + data2[pix2] = b3; + } + dataChanged = true; + + break; + + case "linearburn" : + while (p--) { + if ((r3 = data[pix-=4] + data2[pix]) < 255) + data2[pix] = 0; + else + data2[pix] = (r3 - 255); + if ((g3 = data[pix1=pix+1] + data2[pix1]) < 255) + data2[pix1] = 0; + else + data2[pix1] = (g3 - 255); + if ((b3 = data[pix2=pix+2] + data2[pix2]) < 255) + data2[pix2] = 0; + else + data2[pix2] = (b3 - 255); + } + dataChanged = true; + break; + + case "difference" : + while (p--) { + if ((r3 = data[pix-=4] - data2[pix]) < 0) + data2[pix] = -r3; + else + data2[pix] = r3; + if ((g3 = data[pix1=pix+1] - data2[pix1]) < 0) + data2[pix1] = -g3; + else + data2[pix1] = g3; + if ((b3 = data[pix2=pix+2] - data2[pix2]) < 0) + data2[pix2] = -b3; + else + data2[pix2] = b3; + } + dataChanged = true; + break; + + case "screen" : + while (p--) { + data2[pix-=4] = (255 - ( ((255-data2[pix])*(255-data[pix])) >> 8)); + data2[pix1=pix+1] = (255 - ( ((255-data2[pix1])*(255-data[pix1])) >> 8)); + data2[pix2=pix+2] = (255 - ( ((255-data2[pix2])*(255-data[pix2])) >> 8)); + } + dataChanged = true; + break; + + case "exclusion" : + var div_2_255 = 2 / 255; + while (p--) { + data2[pix-=4] = (r1 = data[pix]) - (r1 * div_2_255 - 1) * data2[pix]; + data2[pix1=pix+1] = (g1 = data[pix1]) - (g1 * div_2_255 - 1) * data2[pix1]; + data2[pix2=pix+2] = (b1 = data[pix2]) - (b1 * div_2_255 - 1) * data2[pix2]; + } + dataChanged = true; + break; + + case "overlay" : + var div_2_255 = 2 / 255; + while (p--) { + if ((r1 = data[pix-=4]) < 128) + data2[pix] = data2[pix]*r1*div_2_255; + else + data2[pix] = 255 - (255-data2[pix])*(255-r1)*div_2_255; + + if ((g1 = data[pix1=pix+1]) < 128) + data2[pix1] = data2[pix1]*g1*div_2_255; + else + data2[pix1] = 255 - (255-data2[pix1])*(255-g1)*div_2_255; + + if ((b1 = data[pix2=pix+2]) < 128) + data2[pix2] = data2[pix2]*b1*div_2_255; + else + data2[pix2] = 255 - (255-data2[pix2])*(255-b1)*div_2_255; + + } + dataChanged = true; + break; + + case "softlight" : + var div_2_255 = 2 / 255; + while (p--) { + if ((r1 = data[pix-=4]) < 128) + data2[pix] = ((data2[pix]>>1) + 64) * r1 * div_2_255; + else + data2[pix] = 255 - (191 - (data2[pix]>>1)) * (255-r1) * div_2_255; + + if ((g1 = data[pix1=pix+1]) < 128) + data2[pix1] = ((data2[pix1]>>1)+64) * g1 * div_2_255; + else + data2[pix1] = 255 - (191 - (data2[pix1]>>1)) * (255-g1) * div_2_255; + + if ((b1 = data[pix2=pix+2]) < 128) + data2[pix2] = ((data2[pix2]>>1)+64) * b1 * div_2_255; + else + data2[pix2] = 255 - (191 - (data2[pix2]>>1)) * (255-b1) * div_2_255; + + } + dataChanged = true; + break; + + case "hardlight" : + var div_2_255 = 2 / 255; + while (p--) { + if ((r2 = data2[pix-=4]) < 128) + data2[pix] = data[pix] * r2 * div_2_255; + else + data2[pix] = 255 - (255-data[pix]) * (255-r2) * div_2_255; + + if ((g2 = data2[pix1=pix+1]) < 128) + data2[pix1] = data[pix1] * g2 * div_2_255; + else + data2[pix1] = 255 - (255-data[pix1]) * (255-g2) * div_2_255; + + if ((b2 = data2[pix2=pix+2]) < 128) + data2[pix2] = data[pix2] * b2 * div_2_255; + else + data2[pix2] = 255 - (255-data[pix2]) * (255-b2) * div_2_255; + + } + dataChanged = true; + break; + + case "colordodge" : + while (p--) { + if ((r3 = (data[pix-=4]<<8)/(255-(r2 = data2[pix]))) > 255 || r2 == 255) + data2[pix] = 255; + else + data2[pix] = r3; + + if ((g3 = (data[pix1=pix+1]<<8)/(255-(g2 = data2[pix1]))) > 255 || g2 == 255) + data2[pix1] = 255; + else + data2[pix1] = g3; + + if ((b3 = (data[pix2=pix+2]<<8)/(255-(b2 = data2[pix2]))) > 255 || b2 == 255) + data2[pix2] = 255; + else + data2[pix2] = b3; + } + dataChanged = true; + break; + + case "colorburn" : + while (p--) { + if ((r3 = 255-((255-data[pix-=4])<<8)/data2[pix]) < 0 || data2[pix] == 0) + data2[pix] = 0; + else + data2[pix] = r3; + + if ((g3 = 255-((255-data[pix1=pix+1])<<8)/data2[pix1]) < 0 || data2[pix1] == 0) + data2[pix1] = 0; + else + data2[pix1] = g3; + + if ((b3 = 255-((255-data[pix2=pix+2])<<8)/data2[pix2]) < 0 || data2[pix2] == 0) + data2[pix2] = 0; + else + data2[pix2] = b3; + } + dataChanged = true; + break; + + case "linearlight" : + while (p--) { + if ( ((r3 = 2*(r2=data2[pix-=4])+data[pix]-256) < 0) || (r2 < 128 && r3 < 0)) { + data2[pix] = 0 + } else { + if (r3 > 255) + data2[pix] = 255; + else + data2[pix] = r3; + } + if ( ((g3 = 2*(g2=data2[pix1=pix+1])+data[pix1]-256) < 0) || (g2 < 128 && g3 < 0)) { + data2[pix1] = 0 + } else { + if (g3 > 255) + data2[pix1] = 255; + else + data2[pix1] = g3; + } + if ( ((b3 = 2*(b2=data2[pix2=pix+2])+data[pix2]-256) < 0) || (b2 < 128 && b3 < 0)) { + data2[pix2] = 0 + } else { + if (b3 > 255) + data2[pix2] = 255; + else + data2[pix2] = b3; + } + } + dataChanged = true; + break; + + case "vividlight" : + while (p--) { + if ((r2=data2[pix-=4]) < 128) { + if (r2) { + if ((r3 = 255 - ((255-data[pix])<<8) / (2*r2)) < 0) + data2[pix] = 0; + else + data2[pix] = r3 + } else { + data2[pix] = 0; + } + } else if ((r3 = (r4=2*r2-256)) < 255) { + if ((r3 = (data[pix]<<8)/(255-r4)) > 255) + data2[pix] = 255; + else + data2[pix] = r3; + } else { + if (r3 < 0) + data2[pix] = 0; + else + data2[pix] = r3 + } + + if ((g2=data2[pix1=pix+1]) < 128) { + if (g2) { + if ((g3 = 255 - ((255-data[pix1])<<8) / (2*g2)) < 0) + data2[pix1] = 0; + else + data2[pix1] = g3; + } else { + data2[pix1] = 0; + } + } else if ((g3 = (g4=2*g2-256)) < 255) { + if ((g3 = (data[pix1]<<8)/(255-g4)) > 255) + data2[pix1] = 255; + else + data2[pix1] = g3; + } else { + if (g3 < 0) + data2[pix1] = 0; + else + data2[pix1] = g3; + } + + if ((b2=data2[pix2=pix+2]) < 128) { + if (b2) { + if ((b3 = 255 - ((255-data[pix2])<<8) / (2*b2)) < 0) + data2[pix2] = 0; + else + data2[pix2] = b3; + } else { + data2[pix2] = 0; + } + } else if ((b3 = (b4=2*b2-256)) < 255) { + if ((b3 = (data[pix2]<<8)/(255-b4)) > 255) + data2[pix2] = 255; + else + data2[pix2] = b3; + } else { + if (b3 < 0) + data2[pix2] = 0; + else + data2[pix2] = b3; + } + } + dataChanged = true; + break; + + case "pinlight" : + while (p--) { + if ((r2=data2[pix-=4]) < 128) + if ((r1=data[pix]) < (r4=2*r2)) + data2[pix] = r1; + else + data2[pix] = r4; + else + if ((r1=data[pix]) > (r4=2*r2-256)) + data2[pix] = r1; + else + data2[pix] = r4; + + if ((g2=data2[pix1=pix+1]) < 128) + if ((g1=data[pix1]) < (g4=2*g2)) + data2[pix1] = g1; + else + data2[pix1] = g4; + else + if ((g1=data[pix1]) > (g4=2*g2-256)) + data2[pix1] = g1; + else + data2[pix1] = g4; + + if ((r2=data2[pix2=pix+2]) < 128) + if ((r1=data[pix2]) < (r4=2*r2)) + data2[pix2] = r1; + else + data2[pix2] = r4; + else + if ((r1=data[pix2]) > (r4=2*r2-256)) + data2[pix2] = r1; + else + data2[pix2] = r4; + } + dataChanged = true; + break; + + case "hardmix" : + while (p--) { + if ((r2 = data2[pix-=4]) < 128) + if (255 - ((255-data[pix])<<8)/(2*r2) < 128 || r2 == 0) + data2[pix] = 0; + else + data2[pix] = 255; + else if ((r4=2*r2-256) < 255 && (data[pix]<<8)/(255-r4) < 128) + data2[pix] = 0; + else + data2[pix] = 255; + + if ((g2 = data2[pix1=pix+1]) < 128) + if (255 - ((255-data[pix1])<<8)/(2*g2) < 128 || g2 == 0) + data2[pix1] = 0; + else + data2[pix1] = 255; + else if ((g4=2*g2-256) < 255 && (data[pix1]<<8)/(255-g4) < 128) + data2[pix1] = 0; + else + data2[pix1] = 255; + + if ((b2 = data2[pix2=pix+2]) < 128) + if (255 - ((255-data[pix2])<<8)/(2*b2) < 128 || b2 == 0) + data2[pix2] = 0; + else + data2[pix2] = 255; + else if ((b4=2*b2-256) < 255 && (data[pix2]<<8)/(255-b4) < 128) + data2[pix2] = 0; + else + data2[pix2] = 255; + } + dataChanged = true; + break; + } + + if (dataChanged) + otherCtx.putImageData(dataDesc2,0,0); + + if (amount != 1 && !Pixastic.Client.hasGlobalAlpha()) { + var p = w*h; + var amount2 = amount; + var amount1 = 1 - amount; + while (p--) { + var pix = p*4; + var r = (data[pix] * amount1 + data2[pix] * amount2)>>0; + var g = (data[pix+1] * amount1 + data2[pix+1] * amount2)>>0; + var b = (data[pix+2] * amount1 + data2[pix+2] * amount2)>>0; + + data[pix] = r; + data[pix+1] = g; + data[pix+2] = b; + } + params.useData = true; + } else { + var ctx = params.canvas.getContext("2d"); + ctx.save(); + ctx.globalAlpha = amount; + ctx.drawImage( + otherCanvas, + 0,0,rect.width,rect.height, + rect.left,rect.top,rect.width,rect.height + ); + ctx.globalAlpha = 1; + ctx.restore(); + } + + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } } \ No newline at end of file diff --git a/actions/blur.js b/actions/blur.js index 460853c..f53192c 100755 --- a/actions/blur.js +++ b/actions/blur.js @@ -1,126 +1,126 @@ -/* - * Pixastic Lib - Blur filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.blur = { - process : function(params) { - - if (typeof params.options.fixMargin == "undefined") - params.options.fixMargin = true; - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var dataCopy = Pixastic.prepareData(params, true) - - /* - var kernel = [ - [0.5, 1, 0.5], - [1, 2, 1], - [0.5, 1, 0.5] - ]; - */ - - var kernel = [ - [0, 1, 0], - [1, 2, 1], - [0, 1, 0] - ]; - - var weight = 0; - for (var i=0;i<3;i++) { - for (var j=0;j<3;j++) { - weight += kernel[i][j]; - } - } - - weight = 1 / (weight*2); - - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - - var prevY = (y == 1) ? 0 : y-2; - var nextY = (y == h) ? y - 1 : y; - - var offsetYPrev = prevY*w*4; - var offsetYNext = nextY*w*4; - - var x = w; - do { - var offset = offsetY + (x*4-4); - - var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; - var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; - - data[offset] = ( - /* - dataCopy[offsetPrev - 4] - + dataCopy[offsetPrev+4] - + dataCopy[offsetNext - 4] - + dataCopy[offsetNext+4] - + - */ - (dataCopy[offsetPrev] - + dataCopy[offset-4] - + dataCopy[offset+4] - + dataCopy[offsetNext]) * 2 - + dataCopy[offset] * 4 - ) * weight; - - data[offset+1] = ( - /* - dataCopy[offsetPrev - 3] - + dataCopy[offsetPrev+5] - + dataCopy[offsetNext - 3] - + dataCopy[offsetNext+5] - + - */ - (dataCopy[offsetPrev+1] - + dataCopy[offset-3] - + dataCopy[offset+5] - + dataCopy[offsetNext+1]) * 2 - + dataCopy[offset+1] * 4 - ) * weight; - - data[offset+2] = ( - /* - dataCopy[offsetPrev - 2] - + dataCopy[offsetPrev+6] - + dataCopy[offsetNext - 2] - + dataCopy[offsetNext+6] - + - */ - (dataCopy[offsetPrev+2] - + dataCopy[offset-2] - + dataCopy[offset+6] - + dataCopy[offsetNext+2]) * 2 - + dataCopy[offset+2] * 4 - ) * weight; - - } while (--x); - } while (--y); - - return true; - - } else if (Pixastic.Client.isIE()) { - params.image.style.filter += " progid:DXImageTransform.Microsoft.Blur(pixelradius=1.5)"; - - if (params.options.fixMargin) { - params.image.style.marginLeft = (parseInt(params.image.style.marginLeft,10)||0) - 2 + "px"; - params.image.style.marginTop = (parseInt(params.image.style.marginTop,10)||0) - 2 + "px"; - } - - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); - } +/* + * Pixastic Lib - Blur filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.blur = { + process : function(params) { + + if (typeof params.options.fixMargin == "undefined") + params.options.fixMargin = true; + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var dataCopy = Pixastic.prepareData(params, true) + + /* + var kernel = [ + [0.5, 1, 0.5], + [1, 2, 1], + [0.5, 1, 0.5] + ]; + */ + + var kernel = [ + [0, 1, 0], + [1, 2, 1], + [0, 1, 0] + ]; + + var weight = 0; + for (var i=0;i<3;i++) { + for (var j=0;j<3;j++) { + weight += kernel[i][j]; + } + } + + weight = 1 / (weight*2); + + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + + var prevY = (y == 1) ? 0 : y-2; + var nextY = (y == h) ? y - 1 : y; + + var offsetYPrev = prevY*w*4; + var offsetYNext = nextY*w*4; + + var x = w; + do { + var offset = offsetY + (x*4-4); + + var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; + var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; + + data[offset] = ( + /* + dataCopy[offsetPrev - 4] + + dataCopy[offsetPrev+4] + + dataCopy[offsetNext - 4] + + dataCopy[offsetNext+4] + + + */ + (dataCopy[offsetPrev] + + dataCopy[offset-4] + + dataCopy[offset+4] + + dataCopy[offsetNext]) * 2 + + dataCopy[offset] * 4 + ) * weight; + + data[offset+1] = ( + /* + dataCopy[offsetPrev - 3] + + dataCopy[offsetPrev+5] + + dataCopy[offsetNext - 3] + + dataCopy[offsetNext+5] + + + */ + (dataCopy[offsetPrev+1] + + dataCopy[offset-3] + + dataCopy[offset+5] + + dataCopy[offsetNext+1]) * 2 + + dataCopy[offset+1] * 4 + ) * weight; + + data[offset+2] = ( + /* + dataCopy[offsetPrev - 2] + + dataCopy[offsetPrev+6] + + dataCopy[offsetNext - 2] + + dataCopy[offsetNext+6] + + + */ + (dataCopy[offsetPrev+2] + + dataCopy[offset-2] + + dataCopy[offset+6] + + dataCopy[offsetNext+2]) * 2 + + dataCopy[offset+2] * 4 + ) * weight; + + } while (--x); + } while (--y); + + return true; + + } else if (Pixastic.Client.isIE()) { + params.image.style.filter += " progid:DXImageTransform.Microsoft.Blur(pixelradius=1.5)"; + + if (params.options.fixMargin) { + params.image.style.marginLeft = (parseInt(params.image.style.marginLeft,10)||0) - 2 + "px"; + params.image.style.marginTop = (parseInt(params.image.style.marginTop,10)||0) - 2 + "px"; + } + + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); + } } \ No newline at end of file diff --git a/actions/blurfast.js b/actions/blurfast.js index e78b42e..0fbcf7d 100755 --- a/actions/blurfast.js +++ b/actions/blurfast.js @@ -1,77 +1,77 @@ -/* - * Pixastic Lib - Blur Fast - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.blurfast = { - process : function(params) { - - var amount = parseFloat(params.options.amount)||0; - var clear = !!(params.options.clear && params.options.clear != "false"); - - amount = Math.max(0,Math.min(5,amount)); - - if (Pixastic.Client.hasCanvas()) { - var rect = params.options.rect; - - var ctx = params.canvas.getContext("2d"); - ctx.save(); - ctx.beginPath(); - ctx.rect(rect.left, rect.top, rect.width, rect.height); - ctx.clip(); - - var scale = 2; - var smallWidth = Math.round(params.width / scale); - var smallHeight = Math.round(params.height / scale); - - var copy = document.createElement("canvas"); - copy.width = smallWidth; - copy.height = smallHeight; - - var clear = false; - var steps = Math.round(amount * 20); - - var copyCtx = copy.getContext("2d"); - for (var i=0;i 255 ) - data[pix] = 255; - else if (r < 0) - data[pix] = 0; - else - data[pix] = r; - - if ((g = data[pix1=pix+1] * mul + add) > 255 ) - data[pix1] = 255; - else if (g < 0) - data[pix1] = 0; - else - data[pix1] = g; - - if ((b = data[pix2=pix+2] * mul + add) > 255 ) - data[pix2] = 255; - else if (b < 0) - data[pix2] = 0; - else - data[pix2] = b; - } - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } -} - +/* + * Pixastic Lib - Brightness/Contrast filter - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.brightness = { + + process : function(params) { + + var brightness = parseInt(params.options.brightness,10) || 0; + var contrast = parseFloat(params.options.contrast)||0; + var legacy = !!(params.options.legacy && params.options.legacy != "false"); + + if (legacy) { + brightness = Math.min(150,Math.max(-150,brightness)); + } else { + var brightMul = 1 + Math.min(150,Math.max(-150,brightness)) / 150; + } + contrast = Math.max(0,contrast+1); + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + var p = w*h; + var pix = p*4, pix1, pix2; + + var mul, add; + if (contrast != 1) { + if (legacy) { + mul = contrast; + add = (brightness - 128) * contrast + 128; + } else { + mul = brightMul * contrast; + add = - contrast * 128 + 128; + } + } else { // this if-then is not necessary anymore, is it? + if (legacy) { + mul = 1; + add = brightness; + } else { + mul = brightMul; + add = 0; + } + } + var r, g, b; + while (p--) { + if ((r = data[pix-=4] * mul + add) > 255 ) + data[pix] = 255; + else if (r < 0) + data[pix] = 0; + else + data[pix] = r; + + if ((g = data[pix1=pix+1] * mul + add) > 255 ) + data[pix1] = 255; + else if (g < 0) + data[pix1] = 0; + else + data[pix1] = g; + + if ((b = data[pix2=pix+2] * mul + add) > 255 ) + data[pix2] = 255; + else if (b < 0) + data[pix2] = 0; + else + data[pix2] = b; + } + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } +} + diff --git a/actions/coloradjust.js b/actions/coloradjust.js index 378ea67..30fb56b 100755 --- a/actions/coloradjust.js +++ b/actions/coloradjust.js @@ -1,62 +1,62 @@ -/* - * Pixastic Lib - Color adjust filter - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.coloradjust = { - - process : function(params) { - var red = parseFloat(params.options.red) || 0; - var green = parseFloat(params.options.green) || 0; - var blue = parseFloat(params.options.blue) || 0; - - red = Math.round(red*255); - green = Math.round(green*255); - blue = Math.round(blue*255); - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var rect = params.options.rect; - - var p = rect.width*rect.height; - var pix = p*4, pix1, pix2; - - var r, g, b; - while (p--) { - pix -= 4; - - if (red) { - if ((r = data[pix] + red) < 0 ) - data[pix] = 0; - else if (r > 255 ) - data[pix] = 255; - else - data[pix] = r; - } - - if (green) { - if ((g = data[pix1=pix+1] + green) < 0 ) - data[pix1] = 0; - else if (g > 255 ) - data[pix1] = 255; - else - data[pix1] = g; - } - - if (blue) { - if ((b = data[pix2=pix+2] + blue) < 0 ) - data[pix2] = 0; - else if (b > 255 ) - data[pix2] = 255; - else - data[pix2] = b; - } - } - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData()); - } -} +/* + * Pixastic Lib - Color adjust filter - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.coloradjust = { + + process : function(params) { + var red = parseFloat(params.options.red) || 0; + var green = parseFloat(params.options.green) || 0; + var blue = parseFloat(params.options.blue) || 0; + + red = Math.round(red*255); + green = Math.round(green*255); + blue = Math.round(blue*255); + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var rect = params.options.rect; + + var p = rect.width*rect.height; + var pix = p*4, pix1, pix2; + + var r, g, b; + while (p--) { + pix -= 4; + + if (red) { + if ((r = data[pix] + red) < 0 ) + data[pix] = 0; + else if (r > 255 ) + data[pix] = 255; + else + data[pix] = r; + } + + if (green) { + if ((g = data[pix1=pix+1] + green) < 0 ) + data[pix1] = 0; + else if (g > 255 ) + data[pix1] = 255; + else + data[pix1] = g; + } + + if (blue) { + if ((b = data[pix2=pix+2] + blue) < 0 ) + data[pix2] = 0; + else if (b > 255 ) + data[pix2] = 255; + else + data[pix2] = b; + } + } + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData()); + } +} diff --git a/actions/colorhistogram.js b/actions/colorhistogram.js index 7b52cb8..03402f8 100755 --- a/actions/colorhistogram.js +++ b/actions/colorhistogram.js @@ -1,82 +1,82 @@ -/* - * Pixastic Lib - Histogram - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - - -Pixastic.Actions.colorhistogram = { - - array256 : function(default_value) { - arr = []; - for (var i=0; i<256; i++) { arr[i] = default_value; } - return arr - }, - - process : function(params) { - var values = []; - if (typeof params.options.returnValue != "object") { - params.options.returnValue = {rvals:[], gvals:[], bvals:[]}; - } - var paint = !!(params.options.paint); - - var returnValue = params.options.returnValue; - if (typeof returnValue.values != "array") { - returnValue.rvals = []; - returnValue.gvals = []; - returnValue.bvals = []; - } - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - params.useData = false; - - var rvals = this.array256(0); - var gvals = this.array256(0); - var bvals = this.array256(0); - - var rect = params.options.rect; - - var p = rect.width*rect.height; - var pix = p*4; - while (p--) { - rvals[data[pix-=4]]++; - gvals[data[pix+1]]++; - bvals[data[pix+2]]++; - } - - returnValue.rvals = rvals; - returnValue.gvals = gvals; - returnValue.bvals = bvals; - - if (paint) { - var ctx = params.canvas.getContext("2d"); - var vals = [rvals, gvals, bvals]; - for (var v=0;v<3;v++) { - var yoff = (v+1) * params.height / 3; - var maxValue = 0; - for (var i=0;i<256;i++) { - if (vals[v][i] > maxValue) - maxValue = vals[v][i]; - } - var heightScale = params.height / 3 / maxValue; - var widthScale = params.width / 256; - if (v==0) ctx.fillStyle = "rgba(255,0,0,0.5)"; - else if (v==1) ctx.fillStyle = "rgba(0,255,0,0.5)"; - else if (v==2) ctx.fillStyle = "rgba(0,0,255,0.5)"; - for (var i=0;i<256;i++) { - ctx.fillRect( - i * widthScale, params.height - heightScale * vals[v][i] - params.height + yoff, - widthScale, vals[v][i] * heightScale - ); - } - } - } - return true; - } - }, - - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } +/* + * Pixastic Lib - Histogram - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + + +Pixastic.Actions.colorhistogram = { + + array256 : function(default_value) { + arr = []; + for (var i=0; i<256; i++) { arr[i] = default_value; } + return arr + }, + + process : function(params) { + var values = []; + if (typeof params.options.returnValue != "object") { + params.options.returnValue = {rvals:[], gvals:[], bvals:[]}; + } + var paint = !!(params.options.paint); + + var returnValue = params.options.returnValue; + if (typeof returnValue.values != "array") { + returnValue.rvals = []; + returnValue.gvals = []; + returnValue.bvals = []; + } + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + params.useData = false; + + var rvals = this.array256(0); + var gvals = this.array256(0); + var bvals = this.array256(0); + + var rect = params.options.rect; + + var p = rect.width*rect.height; + var pix = p*4; + while (p--) { + rvals[data[pix-=4]]++; + gvals[data[pix+1]]++; + bvals[data[pix+2]]++; + } + + returnValue.rvals = rvals; + returnValue.gvals = gvals; + returnValue.bvals = bvals; + + if (paint) { + var ctx = params.canvas.getContext("2d"); + var vals = [rvals, gvals, bvals]; + for (var v=0;v<3;v++) { + var yoff = (v+1) * params.height / 3; + var maxValue = 0; + for (var i=0;i<256;i++) { + if (vals[v][i] > maxValue) + maxValue = vals[v][i]; + } + var heightScale = params.height / 3 / maxValue; + var widthScale = params.width / 256; + if (v==0) ctx.fillStyle = "rgba(255,0,0,0.5)"; + else if (v==1) ctx.fillStyle = "rgba(0,255,0,0.5)"; + else if (v==2) ctx.fillStyle = "rgba(0,0,255,0.5)"; + for (var i=0;i<256;i++) { + ctx.fillRect( + i * widthScale, params.height - heightScale * vals[v][i] - params.height + yoff, + widthScale, vals[v][i] * heightScale + ); + } + } + } + return true; + } + }, + + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } } \ No newline at end of file diff --git a/actions/crop.js b/actions/crop.js index 7e61a62..bd1b522 100755 --- a/actions/crop.js +++ b/actions/crop.js @@ -1,63 +1,63 @@ -/* - * Pixastic Lib - Crop - v0.1.1 - * Copyright (c) 2008-2009 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.crop = { - process : function(params) { - if (Pixastic.Client.hasCanvas()) { - var rect = params.options.rect; - - var width = rect.width; - var height = rect.height; - var top = rect.top; - var left = rect.left; - - if (typeof params.options.left != "undefined") - left = parseInt(params.options.left,10); - if (typeof params.options.top != "undefined") - top = parseInt(params.options.top,10); - if (typeof params.options.height != "undefined") - width = parseInt(params.options.width,10); - if (typeof params.options.height != "undefined") - height = parseInt(params.options.height,10); - - if (left < 0) left = 0; - if (left > params.width-1) left = params.width-1; - - if (top < 0) top = 0; - if (top > params.height-1) top = params.height-1; - - if (width < 1) width = 1; - if (left + width > params.width) - width = params.width - left; - - if (height < 1) height = 1; - if (top + height > params.height) - height = params.height - top; - - var copy = document.createElement("canvas"); - copy.width = params.width; - copy.height = params.height; - copy.getContext("2d").drawImage(params.canvas,0,0); - - params.canvas.width = width; - params.canvas.height = height; - params.canvas.getContext("2d").clearRect(0,0,width,height); - - params.canvas.getContext("2d").drawImage(copy, - left,top,width,height, - 0,0,width,height - ); - - params.useData = false; - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvas(); - } -} - - +/* + * Pixastic Lib - Crop - v0.1.1 + * Copyright (c) 2008-2009 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.crop = { + process : function(params) { + if (Pixastic.Client.hasCanvas()) { + var rect = params.options.rect; + + var width = rect.width; + var height = rect.height; + var top = rect.top; + var left = rect.left; + + if (typeof params.options.left != "undefined") + left = parseInt(params.options.left,10); + if (typeof params.options.top != "undefined") + top = parseInt(params.options.top,10); + if (typeof params.options.height != "undefined") + width = parseInt(params.options.width,10); + if (typeof params.options.height != "undefined") + height = parseInt(params.options.height,10); + + if (left < 0) left = 0; + if (left > params.width-1) left = params.width-1; + + if (top < 0) top = 0; + if (top > params.height-1) top = params.height-1; + + if (width < 1) width = 1; + if (left + width > params.width) + width = params.width - left; + + if (height < 1) height = 1; + if (top + height > params.height) + height = params.height - top; + + var copy = document.createElement("canvas"); + copy.width = params.width; + copy.height = params.height; + copy.getContext("2d").drawImage(params.canvas,0,0); + + params.canvas.width = width; + params.canvas.height = height; + params.canvas.getContext("2d").clearRect(0,0,width,height); + + params.canvas.getContext("2d").drawImage(copy, + left,top,width,height, + 0,0,width,height + ); + + params.useData = false; + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvas(); + } +} + + diff --git a/actions/desaturate.js b/actions/desaturate.js index 03e32a6..0c346c1 100755 --- a/actions/desaturate.js +++ b/actions/desaturate.js @@ -1,37 +1,37 @@ -/* - * Pixastic Lib - Desaturation filter - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.desaturate = { - - process : function(params) { - var useAverage = !!(params.options.average && params.options.average != "false"); - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - - var p = w*h; - var pix = p*4, pix1, pix2; - - if (useAverage) { - while (p--) - data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]+data[pix1]+data[pix2])/3 - } else { - while (p--) - data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]*0.3 + data[pix1]*0.59 + data[pix2]*0.11); - } - return true; - } else if (Pixastic.Client.isIE()) { - params.image.style.filter += " gray"; - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); - } +/* + * Pixastic Lib - Desaturation filter - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.desaturate = { + + process : function(params) { + var useAverage = !!(params.options.average && params.options.average != "false"); + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + var p = w*h; + var pix = p*4, pix1, pix2; + + if (useAverage) { + while (p--) + data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]+data[pix1]+data[pix2])/3 + } else { + while (p--) + data[pix-=4] = data[pix1=pix+1] = data[pix2=pix+2] = (data[pix]*0.3 + data[pix1]*0.59 + data[pix2]*0.11); + } + return true; + } else if (Pixastic.Client.isIE()) { + params.image.style.filter += " gray"; + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); + } } \ No newline at end of file diff --git a/actions/edges.js b/actions/edges.js index ab04319..a3002aa 100755 --- a/actions/edges.js +++ b/actions/edges.js @@ -1,115 +1,115 @@ -/* - * Pixastic Lib - Edge detection filter - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.edges = { - process : function(params) { - - var mono = !!(params.options.mono && params.options.mono != "false"); - var invert = !!(params.options.invert && params.options.invert != "false"); - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var dataCopy = Pixastic.prepareData(params, true) - - var c = -1/8; - var kernel = [ - [c, c, c], - [c, 1, c], - [c, c, c] - ]; - - weight = 1/c; - - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - - var nextY = (y == h) ? y - 1 : y; - var prevY = (y == 1) ? 0 : y-2; - - var offsetYPrev = prevY*w*4; - var offsetYNext = nextY*w*4; - - var x = w; - do { - var offset = offsetY + (x*4-4); - - var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; - var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; - - var r = ((dataCopy[offsetPrev-4] - + dataCopy[offsetPrev] - + dataCopy[offsetPrev+4] - + dataCopy[offset-4] - + dataCopy[offset+4] - + dataCopy[offsetNext-4] - + dataCopy[offsetNext] - + dataCopy[offsetNext+4]) * c - + dataCopy[offset] - ) - * weight; - - var g = ((dataCopy[offsetPrev-3] - + dataCopy[offsetPrev+1] - + dataCopy[offsetPrev+5] - + dataCopy[offset-3] - + dataCopy[offset+5] - + dataCopy[offsetNext-3] - + dataCopy[offsetNext+1] - + dataCopy[offsetNext+5]) * c - + dataCopy[offset+1]) - * weight; - - var b = ((dataCopy[offsetPrev-2] - + dataCopy[offsetPrev+2] - + dataCopy[offsetPrev+6] - + dataCopy[offset-2] - + dataCopy[offset+6] - + dataCopy[offsetNext-2] - + dataCopy[offsetNext+2] - + dataCopy[offsetNext+6]) * c - + dataCopy[offset+2]) - * weight; - - if (mono) { - var brightness = (r*0.3 + g*0.59 + b*0.11)||0; - if (invert) brightness = 255 - brightness; - if (brightness < 0 ) brightness = 0; - if (brightness > 255 ) brightness = 255; - r = g = b = brightness; - } else { - if (invert) { - r = 255 - r; - g = 255 - g; - b = 255 - b; - } - if (r < 0 ) r = 0; - if (g < 0 ) g = 0; - if (b < 0 ) b = 0; - if (r > 255 ) r = 255; - if (g > 255 ) g = 255; - if (b > 255 ) b = 255; - } - - data[offset] = r; - data[offset+1] = g; - data[offset+2] = b; - - } while (--x); - } while (--y); - - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } +/* + * Pixastic Lib - Edge detection filter - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.edges = { + process : function(params) { + + var mono = !!(params.options.mono && params.options.mono != "false"); + var invert = !!(params.options.invert && params.options.invert != "false"); + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var dataCopy = Pixastic.prepareData(params, true) + + var c = -1/8; + var kernel = [ + [c, c, c], + [c, 1, c], + [c, c, c] + ]; + + weight = 1/c; + + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + + var nextY = (y == h) ? y - 1 : y; + var prevY = (y == 1) ? 0 : y-2; + + var offsetYPrev = prevY*w*4; + var offsetYNext = nextY*w*4; + + var x = w; + do { + var offset = offsetY + (x*4-4); + + var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; + var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; + + var r = ((dataCopy[offsetPrev-4] + + dataCopy[offsetPrev] + + dataCopy[offsetPrev+4] + + dataCopy[offset-4] + + dataCopy[offset+4] + + dataCopy[offsetNext-4] + + dataCopy[offsetNext] + + dataCopy[offsetNext+4]) * c + + dataCopy[offset] + ) + * weight; + + var g = ((dataCopy[offsetPrev-3] + + dataCopy[offsetPrev+1] + + dataCopy[offsetPrev+5] + + dataCopy[offset-3] + + dataCopy[offset+5] + + dataCopy[offsetNext-3] + + dataCopy[offsetNext+1] + + dataCopy[offsetNext+5]) * c + + dataCopy[offset+1]) + * weight; + + var b = ((dataCopy[offsetPrev-2] + + dataCopy[offsetPrev+2] + + dataCopy[offsetPrev+6] + + dataCopy[offset-2] + + dataCopy[offset+6] + + dataCopy[offsetNext-2] + + dataCopy[offsetNext+2] + + dataCopy[offsetNext+6]) * c + + dataCopy[offset+2]) + * weight; + + if (mono) { + var brightness = (r*0.3 + g*0.59 + b*0.11)||0; + if (invert) brightness = 255 - brightness; + if (brightness < 0 ) brightness = 0; + if (brightness > 255 ) brightness = 255; + r = g = b = brightness; + } else { + if (invert) { + r = 255 - r; + g = 255 - g; + b = 255 - b; + } + if (r < 0 ) r = 0; + if (g < 0 ) g = 0; + if (b < 0 ) b = 0; + if (r > 255 ) r = 255; + if (g > 255 ) g = 255; + if (b > 255 ) b = 255; + } + + data[offset] = r; + data[offset+1] = g; + data[offset+2] = b; + + } while (--x); + } while (--y); + + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } } \ No newline at end of file diff --git a/actions/edges2.js b/actions/edges2.js index 4ab464b..13a3b39 100755 --- a/actions/edges2.js +++ b/actions/edges2.js @@ -1,103 +1,103 @@ -/* - * Pixastic Lib - Edge detection 2 - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - * - * Contribution by Oliver Hunt (http://nerget.com/, http://nerget.com/canvas/edgeDetection.js). Thanks Oliver! - * - */ - -Pixastic.Actions.edges2 = { - process : function(params) { - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var dataCopy = Pixastic.prepareData(params, true) - - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - - var w4 = w * 4; - var pixel = w4 + 4; // Start at (1,1) - var hm1 = h - 1; - var wm1 = w - 1; - for (var y = 1; y < hm1; ++y) { - // Prepare initial cached values for current row - var centerRow = pixel - 4; - var priorRow = centerRow - w4; - var nextRow = centerRow + w4; - - var r1 = - dataCopy[priorRow] - dataCopy[centerRow] - dataCopy[nextRow]; - var g1 = - dataCopy[++priorRow] - dataCopy[++centerRow] - dataCopy[++nextRow]; - var b1 = - dataCopy[++priorRow] - dataCopy[++centerRow] - dataCopy[++nextRow]; - - var rp = dataCopy[priorRow += 2]; - var gp = dataCopy[++priorRow]; - var bp = dataCopy[++priorRow]; - - var rc = dataCopy[centerRow += 2]; - var gc = dataCopy[++centerRow]; - var bc = dataCopy[++centerRow]; - - var rn = dataCopy[nextRow += 2]; - var gn = dataCopy[++nextRow]; - var bn = dataCopy[++nextRow]; - - var r2 = - rp - rc - rn; - var g2 = - gp - gc - gn; - var b2 = - bp - bc - bn; - - // Main convolution loop - for (var x = 1; x < wm1; ++x) { - centerRow = pixel + 4; - priorRow = centerRow - w4; - nextRow = centerRow + w4; - - var r = 127 + r1 - rp - (rc * -8) - rn; - var g = 127 + g1 - gp - (gc * -8) - gn; - var b = 127 + b1 - bp - (bc * -8) - bn; - - r1 = r2; - g1 = g2; - b1 = b2; - - rp = dataCopy[ priorRow]; - gp = dataCopy[++priorRow]; - bp = dataCopy[++priorRow]; - - rc = dataCopy[ centerRow]; - gc = dataCopy[++centerRow]; - bc = dataCopy[++centerRow]; - - rn = dataCopy[ nextRow]; - gn = dataCopy[++nextRow]; - bn = dataCopy[++nextRow]; - - r += (r2 = - rp - rc - rn); - g += (g2 = - gp - gc - gn); - b += (b2 = - bp - bc - bn); - - if (r > 255) r = 255; - if (g > 255) g = 255; - if (b > 255) b = 255; - if (r < 0) r = 0; - if (g < 0) g = 0; - if (b < 0) b = 0; - - data[pixel] = r; - data[++pixel] = g; - data[++pixel] = b; - //data[++pixel] = 255; // alpha - - pixel+=2; - } - pixel += 8; - } - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } +/* + * Pixastic Lib - Edge detection 2 - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + * + * Contribution by Oliver Hunt (http://nerget.com/, http://nerget.com/canvas/edgeDetection.js). Thanks Oliver! + * + */ + +Pixastic.Actions.edges2 = { + process : function(params) { + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var dataCopy = Pixastic.prepareData(params, true) + + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + var w4 = w * 4; + var pixel = w4 + 4; // Start at (1,1) + var hm1 = h - 1; + var wm1 = w - 1; + for (var y = 1; y < hm1; ++y) { + // Prepare initial cached values for current row + var centerRow = pixel - 4; + var priorRow = centerRow - w4; + var nextRow = centerRow + w4; + + var r1 = - dataCopy[priorRow] - dataCopy[centerRow] - dataCopy[nextRow]; + var g1 = - dataCopy[++priorRow] - dataCopy[++centerRow] - dataCopy[++nextRow]; + var b1 = - dataCopy[++priorRow] - dataCopy[++centerRow] - dataCopy[++nextRow]; + + var rp = dataCopy[priorRow += 2]; + var gp = dataCopy[++priorRow]; + var bp = dataCopy[++priorRow]; + + var rc = dataCopy[centerRow += 2]; + var gc = dataCopy[++centerRow]; + var bc = dataCopy[++centerRow]; + + var rn = dataCopy[nextRow += 2]; + var gn = dataCopy[++nextRow]; + var bn = dataCopy[++nextRow]; + + var r2 = - rp - rc - rn; + var g2 = - gp - gc - gn; + var b2 = - bp - bc - bn; + + // Main convolution loop + for (var x = 1; x < wm1; ++x) { + centerRow = pixel + 4; + priorRow = centerRow - w4; + nextRow = centerRow + w4; + + var r = 127 + r1 - rp - (rc * -8) - rn; + var g = 127 + g1 - gp - (gc * -8) - gn; + var b = 127 + b1 - bp - (bc * -8) - bn; + + r1 = r2; + g1 = g2; + b1 = b2; + + rp = dataCopy[ priorRow]; + gp = dataCopy[++priorRow]; + bp = dataCopy[++priorRow]; + + rc = dataCopy[ centerRow]; + gc = dataCopy[++centerRow]; + bc = dataCopy[++centerRow]; + + rn = dataCopy[ nextRow]; + gn = dataCopy[++nextRow]; + bn = dataCopy[++nextRow]; + + r += (r2 = - rp - rc - rn); + g += (g2 = - gp - gc - gn); + b += (b2 = - bp - bc - bn); + + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + if (r < 0) r = 0; + if (g < 0) g = 0; + if (b < 0) b = 0; + + data[pixel] = r; + data[++pixel] = g; + data[++pixel] = b; + //data[++pixel] = 255; // alpha + + pixel+=2; + } + pixel += 8; + } + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } } \ No newline at end of file diff --git a/actions/emboss.js b/actions/emboss.js index 8131a55..0b8b065 100755 --- a/actions/emboss.js +++ b/actions/emboss.js @@ -1,134 +1,134 @@ -/* - * Pixastic Lib - Emboss filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.emboss = { - process : function(params) { - - var strength = parseFloat(params.options.strength)||1; - var greyLevel = typeof params.options.greyLevel != "undefined" ? parseInt(params.options.greyLevel) : 180; - var direction = params.options.direction||"topleft"; - var blend = !!(params.options.blend && params.options.blend != "false"); - - var dirY = 0; - var dirX = 0; - - switch (direction) { - case "topleft": // top left - dirY = -1; - dirX = -1; - break; - case "top": // top - dirY = -1; - dirX = 0; - break; - case "topright": // top right - dirY = -1; - dirX = 1; - break; - case "right": // right - dirY = 0; - dirX = 1; - break; - case "bottomright": // bottom right - dirY = 1; - dirX = 1; - break; - case "bottom": // bottom - dirY = 1; - dirX = 0; - break; - case "bottomleft": // bottom left - dirY = 1; - dirX = -1; - break; - case "left": // left - dirY = 0; - dirX = -1; - break; - } - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var dataCopy = Pixastic.prepareData(params, true) - - var invertAlpha = !!params.options.invertAlpha; - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - - var otherY = dirY; - if (y + otherY < 1) otherY = 0; - if (y + otherY > h) otherY = 0; - - var offsetYOther = (y-1+otherY)*w*4; - - var x = w; - do { - var offset = offsetY + (x-1)*4; - - var otherX = dirX; - if (x + otherX < 1) otherX = 0; - if (x + otherX > w) otherX = 0; - - var offsetOther = offsetYOther + (x-1+otherX)*4; - - var dR = dataCopy[offset] - dataCopy[offsetOther]; - var dG = dataCopy[offset+1] - dataCopy[offsetOther+1]; - var dB = dataCopy[offset+2] - dataCopy[offsetOther+2]; - - var dif = dR; - var absDif = dif > 0 ? dif : -dif; - - var absG = dG > 0 ? dG : -dG; - var absB = dB > 0 ? dB : -dB; - - if (absG > absDif) { - dif = dG; - } - if (absB > absDif) { - dif = dB; - } - - dif *= strength; - - if (blend) { - var r = data[offset] + dif; - var g = data[offset+1] + dif; - var b = data[offset+2] + dif; - - data[offset] = (r > 255) ? 255 : (r < 0 ? 0 : r); - data[offset+1] = (g > 255) ? 255 : (g < 0 ? 0 : g); - data[offset+2] = (b > 255) ? 255 : (b < 0 ? 0 : b); - } else { - var grey = greyLevel - dif; - if (grey < 0) { - grey = 0; - } else if (grey > 255) { - grey = 255; - } - - data[offset] = data[offset+1] = data[offset+2] = grey; - } - - } while (--x); - } while (--y); - return true; - - } else if (Pixastic.Client.isIE()) { - params.image.style.filter += " progid:DXImageTransform.Microsoft.emboss()"; - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); - } - -} +/* + * Pixastic Lib - Emboss filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.emboss = { + process : function(params) { + + var strength = parseFloat(params.options.strength)||1; + var greyLevel = typeof params.options.greyLevel != "undefined" ? parseInt(params.options.greyLevel) : 180; + var direction = params.options.direction||"topleft"; + var blend = !!(params.options.blend && params.options.blend != "false"); + + var dirY = 0; + var dirX = 0; + + switch (direction) { + case "topleft": // top left + dirY = -1; + dirX = -1; + break; + case "top": // top + dirY = -1; + dirX = 0; + break; + case "topright": // top right + dirY = -1; + dirX = 1; + break; + case "right": // right + dirY = 0; + dirX = 1; + break; + case "bottomright": // bottom right + dirY = 1; + dirX = 1; + break; + case "bottom": // bottom + dirY = 1; + dirX = 0; + break; + case "bottomleft": // bottom left + dirY = 1; + dirX = -1; + break; + case "left": // left + dirY = 0; + dirX = -1; + break; + } + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var dataCopy = Pixastic.prepareData(params, true) + + var invertAlpha = !!params.options.invertAlpha; + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + + var otherY = dirY; + if (y + otherY < 1) otherY = 0; + if (y + otherY > h) otherY = 0; + + var offsetYOther = (y-1+otherY)*w*4; + + var x = w; + do { + var offset = offsetY + (x-1)*4; + + var otherX = dirX; + if (x + otherX < 1) otherX = 0; + if (x + otherX > w) otherX = 0; + + var offsetOther = offsetYOther + (x-1+otherX)*4; + + var dR = dataCopy[offset] - dataCopy[offsetOther]; + var dG = dataCopy[offset+1] - dataCopy[offsetOther+1]; + var dB = dataCopy[offset+2] - dataCopy[offsetOther+2]; + + var dif = dR; + var absDif = dif > 0 ? dif : -dif; + + var absG = dG > 0 ? dG : -dG; + var absB = dB > 0 ? dB : -dB; + + if (absG > absDif) { + dif = dG; + } + if (absB > absDif) { + dif = dB; + } + + dif *= strength; + + if (blend) { + var r = data[offset] + dif; + var g = data[offset+1] + dif; + var b = data[offset+2] + dif; + + data[offset] = (r > 255) ? 255 : (r < 0 ? 0 : r); + data[offset+1] = (g > 255) ? 255 : (g < 0 ? 0 : g); + data[offset+2] = (b > 255) ? 255 : (b < 0 ? 0 : b); + } else { + var grey = greyLevel - dif; + if (grey < 0) { + grey = 0; + } else if (grey > 255) { + grey = 255; + } + + data[offset] = data[offset+1] = data[offset+2] = grey; + } + + } while (--x); + } while (--y); + return true; + + } else if (Pixastic.Client.isIE()) { + params.image.style.filter += " progid:DXImageTransform.Microsoft.emboss()"; + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); + } + +} diff --git a/actions/flip.js b/actions/flip.js index 4a2a483..01e45ea 100755 --- a/actions/flip.js +++ b/actions/flip.js @@ -1,34 +1,34 @@ -/* - * Pixastic Lib - Flip - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.flip = { - process : function(params) { - var rect = params.options.rect; - var copyCanvas = document.createElement("canvas"); - copyCanvas.width = rect.width; - copyCanvas.height = rect.height; - copyCanvas.getContext("2d").drawImage(params.image, rect.left, rect.top, rect.width, rect.height, 0, 0, rect.width, rect.height); - - var ctx = params.canvas.getContext("2d"); - ctx.clearRect(rect.left, rect.top, rect.width, rect.height); - - if (params.options.axis == "horizontal") { - ctx.scale(-1,1); - ctx.drawImage(copyCanvas, -rect.left-rect.width, rect.top, rect.width, rect.height) - } else { - ctx.scale(1,-1); - ctx.drawImage(copyCanvas, rect.left, -rect.top-rect.height, rect.width, rect.height) - } - - params.useData = false; - - return true; - }, - checkSupport : function() { - return Pixastic.Client.hasCanvas(); - } -} - +/* + * Pixastic Lib - Flip - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.flip = { + process : function(params) { + var rect = params.options.rect; + var copyCanvas = document.createElement("canvas"); + copyCanvas.width = rect.width; + copyCanvas.height = rect.height; + copyCanvas.getContext("2d").drawImage(params.image, rect.left, rect.top, rect.width, rect.height, 0, 0, rect.width, rect.height); + + var ctx = params.canvas.getContext("2d"); + ctx.clearRect(rect.left, rect.top, rect.width, rect.height); + + if (params.options.axis == "horizontal") { + ctx.scale(-1,1); + ctx.drawImage(copyCanvas, -rect.left-rect.width, rect.top, rect.width, rect.height) + } else { + ctx.scale(1,-1); + ctx.drawImage(copyCanvas, rect.left, -rect.top-rect.height, rect.width, rect.height) + } + + params.useData = false; + + return true; + }, + checkSupport : function() { + return Pixastic.Client.hasCanvas(); + } +} + diff --git a/actions/fliph.js b/actions/fliph.js index a53521e..2d01841 100755 --- a/actions/fliph.js +++ b/actions/fliph.js @@ -1,33 +1,33 @@ -/* - * Pixastic Lib - Horizontal flip - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.fliph = { - process : function(params) { - if (Pixastic.Client.hasCanvas()) { - var rect = params.options.rect; - var copyCanvas = document.createElement("canvas"); - copyCanvas.width = rect.width; - copyCanvas.height = rect.height; - copyCanvas.getContext("2d").drawImage(params.image, rect.left, rect.top, rect.width, rect.height, 0, 0, rect.width, rect.height); - - var ctx = params.canvas.getContext("2d"); - ctx.clearRect(rect.left, rect.top, rect.width, rect.height); - ctx.scale(-1,1); - ctx.drawImage(copyCanvas, -rect.left-rect.width, rect.top, rect.width, rect.height) - params.useData = false; - - return true; - - } else if (Pixastic.Client.isIE()) { - params.image.style.filter += " fliph"; - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvas() || Pixastic.Client.isIE()); - } -} - +/* + * Pixastic Lib - Horizontal flip - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.fliph = { + process : function(params) { + if (Pixastic.Client.hasCanvas()) { + var rect = params.options.rect; + var copyCanvas = document.createElement("canvas"); + copyCanvas.width = rect.width; + copyCanvas.height = rect.height; + copyCanvas.getContext("2d").drawImage(params.image, rect.left, rect.top, rect.width, rect.height, 0, 0, rect.width, rect.height); + + var ctx = params.canvas.getContext("2d"); + ctx.clearRect(rect.left, rect.top, rect.width, rect.height); + ctx.scale(-1,1); + ctx.drawImage(copyCanvas, -rect.left-rect.width, rect.top, rect.width, rect.height) + params.useData = false; + + return true; + + } else if (Pixastic.Client.isIE()) { + params.image.style.filter += " fliph"; + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvas() || Pixastic.Client.isIE()); + } +} + diff --git a/actions/flipv.js b/actions/flipv.js index f7bcf1b..66f5d5f 100755 --- a/actions/flipv.js +++ b/actions/flipv.js @@ -1,33 +1,33 @@ -/* - * Pixastic Lib - Vertical flip - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.flipv = { - process : function(params) { - if (Pixastic.Client.hasCanvas()) { - var rect = params.options.rect; - var copyCanvas = document.createElement("canvas"); - copyCanvas.width = rect.width; - copyCanvas.height = rect.height; - copyCanvas.getContext("2d").drawImage(params.image, rect.left, rect.top, rect.width, rect.height, 0, 0, rect.width, rect.height); - - var ctx = params.canvas.getContext("2d"); - ctx.clearRect(rect.left, rect.top, rect.width, rect.height); - ctx.scale(1,-1); - ctx.drawImage(copyCanvas, rect.left, -rect.top-rect.height, rect.width, rect.height) - params.useData = false; - - return true; - - } else if (Pixastic.Client.isIE()) { - params.image.style.filter += " flipv"; - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvas() || Pixastic.Client.isIE()); - } -} - +/* + * Pixastic Lib - Vertical flip - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.flipv = { + process : function(params) { + if (Pixastic.Client.hasCanvas()) { + var rect = params.options.rect; + var copyCanvas = document.createElement("canvas"); + copyCanvas.width = rect.width; + copyCanvas.height = rect.height; + copyCanvas.getContext("2d").drawImage(params.image, rect.left, rect.top, rect.width, rect.height, 0, 0, rect.width, rect.height); + + var ctx = params.canvas.getContext("2d"); + ctx.clearRect(rect.left, rect.top, rect.width, rect.height); + ctx.scale(1,-1); + ctx.drawImage(copyCanvas, rect.left, -rect.top-rect.height, rect.width, rect.height) + params.useData = false; + + return true; + + } else if (Pixastic.Client.isIE()) { + params.image.style.filter += " flipv"; + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvas() || Pixastic.Client.isIE()); + } +} + diff --git a/actions/glow.js b/actions/glow.js index fffa9fd..6f7dbbc 100755 --- a/actions/glow.js +++ b/actions/glow.js @@ -1,80 +1,80 @@ -/* - * Pixastic Lib - Glow - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - - -Pixastic.Actions.glow = { - process : function(params) { - - var amount = (parseFloat(params.options.amount)||0); - var blurAmount = parseFloat(params.options.radius)||0; - - amount = Math.min(1,Math.max(0,amount)); - blurAmount = Math.min(5,Math.max(0,blurAmount)); - - if (Pixastic.Client.hasCanvasImageData()) { - var rect = params.options.rect; - - var blurCanvas = document.createElement("canvas"); - blurCanvas.width = params.width; - blurCanvas.height = params.height; - var blurCtx = blurCanvas.getContext("2d"); - blurCtx.drawImage(params.canvas,0,0); - - var scale = 2; - var smallWidth = Math.round(params.width / scale); - var smallHeight = Math.round(params.height / scale); - - var copy = document.createElement("canvas"); - copy.width = smallWidth; - copy.height = smallHeight; - - var clear = true; - var steps = Math.round(blurAmount * 20); - - var copyCtx = copy.getContext("2d"); - for (var i=0;i 255) data[pix] = 255; - if ((data[pix1-=4] += amount * blurData[pix1]) > 255) data[pix1] = 255; - if ((data[pix2-=4] += amount * blurData[pix2]) > 255) data[pix2] = 255; - } - - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } -} - - - +/* + * Pixastic Lib - Glow - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + + +Pixastic.Actions.glow = { + process : function(params) { + + var amount = (parseFloat(params.options.amount)||0); + var blurAmount = parseFloat(params.options.radius)||0; + + amount = Math.min(1,Math.max(0,amount)); + blurAmount = Math.min(5,Math.max(0,blurAmount)); + + if (Pixastic.Client.hasCanvasImageData()) { + var rect = params.options.rect; + + var blurCanvas = document.createElement("canvas"); + blurCanvas.width = params.width; + blurCanvas.height = params.height; + var blurCtx = blurCanvas.getContext("2d"); + blurCtx.drawImage(params.canvas,0,0); + + var scale = 2; + var smallWidth = Math.round(params.width / scale); + var smallHeight = Math.round(params.height / scale); + + var copy = document.createElement("canvas"); + copy.width = smallWidth; + copy.height = smallHeight; + + var clear = true; + var steps = Math.round(blurAmount * 20); + + var copyCtx = copy.getContext("2d"); + for (var i=0;i 255) data[pix] = 255; + if ((data[pix1-=4] += amount * blurData[pix1]) > 255) data[pix1] = 255; + if ((data[pix2-=4] += amount * blurData[pix2]) > 255) data[pix2] = 255; + } + + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } +} + + + diff --git a/actions/histogram.js b/actions/histogram.js index aa051fd..c48ef01 100755 --- a/actions/histogram.js +++ b/actions/histogram.js @@ -1,74 +1,74 @@ -/* - * Pixastic Lib - Histogram - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.histogram = { - process : function(params) { - - var average = !!(params.options.average && params.options.average != "false"); - var paint = !!(params.options.paint && params.options.paint != "false"); - var color = params.options.color || "rgba(255,255,255,0.5)"; - var values = []; - if (typeof params.options.returnValue != "object") { - params.options.returnValue = {values:[]}; - } - var returnValue = params.options.returnValue; - if (typeof returnValue.values != "array") { - returnValue.values = []; - } - values = returnValue.values; - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - params.useData = false; - - for (var i=0;i<256;i++) { - values[i] = 0; - } - - var rect = params.options.rect; - var p = rect.width * rect.height; - - var pix = p*4, pix1 = pix + 1, pix2 = pix + 2, pix3 = pix + 3; - var round = Math.round; - - if (average) { - while (p--) { - values[ round((data[pix-=4]+data[pix+1]+data[pix+2])/3) ]++; - } - } else { - while (p--) { - values[ round(data[pix-=4]*0.3 + data[pix+1]*0.59 + data[pix+2]*0.11) ]++; - } - } - - if (paint) { - var maxValue = 0; - for (var i=0;i<256;i++) { - if (values[i] > maxValue) { - maxValue = values[i]; - } - } - var heightScale = params.height / maxValue; - var widthScale = params.width / 256; - var ctx = params.canvas.getContext("2d"); - ctx.fillStyle = color; - for (var i=0;i<256;i++) { - ctx.fillRect( - i * widthScale, params.height - heightScale * values[i], - widthScale, values[i] * heightScale - ); - } - } - - returnValue.values = values; - - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } -} +/* + * Pixastic Lib - Histogram - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.histogram = { + process : function(params) { + + var average = !!(params.options.average && params.options.average != "false"); + var paint = !!(params.options.paint && params.options.paint != "false"); + var color = params.options.color || "rgba(255,255,255,0.5)"; + var values = []; + if (typeof params.options.returnValue != "object") { + params.options.returnValue = {values:[]}; + } + var returnValue = params.options.returnValue; + if (typeof returnValue.values != "array") { + returnValue.values = []; + } + values = returnValue.values; + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + params.useData = false; + + for (var i=0;i<256;i++) { + values[i] = 0; + } + + var rect = params.options.rect; + var p = rect.width * rect.height; + + var pix = p*4, pix1 = pix + 1, pix2 = pix + 2, pix3 = pix + 3; + var round = Math.round; + + if (average) { + while (p--) { + values[ round((data[pix-=4]+data[pix+1]+data[pix+2])/3) ]++; + } + } else { + while (p--) { + values[ round(data[pix-=4]*0.3 + data[pix+1]*0.59 + data[pix+2]*0.11) ]++; + } + } + + if (paint) { + var maxValue = 0; + for (var i=0;i<256;i++) { + if (values[i] > maxValue) { + maxValue = values[i]; + } + } + var heightScale = params.height / maxValue; + var widthScale = params.width / 256; + var ctx = params.canvas.getContext("2d"); + ctx.fillStyle = color; + for (var i=0;i<256;i++) { + ctx.fillRect( + i * widthScale, params.height - heightScale * values[i], + widthScale, values[i] * heightScale + ); + } + } + + returnValue.values = values; + + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } +} diff --git a/actions/hsl.js b/actions/hsl.js index 4d8ee33..d0b7d50 100755 --- a/actions/hsl.js +++ b/actions/hsl.js @@ -1,145 +1,145 @@ -/* - * Pixastic Lib - HSL Adjust - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.hsl = { - process : function(params) { - - var hue = parseInt(params.options.hue,10)||0; - var saturation = (parseInt(params.options.saturation,10)||0) / 100; - var lightness = (parseInt(params.options.lightness,10)||0) / 100; - - - // this seems to give the same result as Photoshop - if (saturation < 0) { - var satMul = 1+saturation; - } else { - var satMul = 1+saturation*2; - } - - hue = (hue%360) / 360; - var hue6 = hue * 6; - - var rgbDiv = 1 / 255; - - var light255 = lightness * 255; - var lightp1 = 1 + lightness; - var lightm1 = 1 - lightness; - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - - var rect = params.options.rect; - - var p = rect.width * rect.height; - - var pix = p*4, pix1 = pix + 1, pix2 = pix + 2, pix3 = pix + 3; - - while (p--) { - - var r = data[pix-=4]; - var g = data[pix1=pix+1]; - var b = data[pix2=pix+2]; - - if (hue != 0 || saturation != 0) { - // ok, here comes rgb to hsl + adjust + hsl to rgb, all in one jumbled mess. - // It's not so pretty, but it's been optimized to get somewhat decent performance. - // The transforms were originally adapted from the ones found in Graphics Gems, but have been heavily modified. - var vs = r; - if (g > vs) vs = g; - if (b > vs) vs = b; - var ms = r; - if (g < ms) ms = g; - if (b < ms) ms = b; - var vm = (vs-ms); - var l = (ms+vs)/510; - if (l > 0) { - if (vm > 0) { - if (l <= 0.5) { - var s = vm / (vs+ms) * satMul; - if (s > 1) s = 1; - var v = (l * (1+s)); - } else { - var s = vm / (510-vs-ms) * satMul; - if (s > 1) s = 1; - var v = (l+s - l*s); - } - if (r == vs) { - if (g == ms) - var h = 5 + ((vs-b)/vm) + hue6; - else - var h = 1 - ((vs-g)/vm) + hue6; - } else if (g == vs) { - if (b == ms) - var h = 1 + ((vs-r)/vm) + hue6; - else - var h = 3 - ((vs-b)/vm) + hue6; - } else { - if (r == ms) - var h = 3 + ((vs-g)/vm) + hue6; - else - var h = 5 - ((vs-r)/vm) + hue6; - } - if (h < 0) h+=6; - if (h >= 6) h-=6; - var m = (l+l-v); - var sextant = h>>0; - if (sextant == 0) { - r = v*255; g = (m+((v-m)*(h-sextant)))*255; b = m*255; - } else if (sextant == 1) { - r = (v-((v-m)*(h-sextant)))*255; g = v*255; b = m*255; - } else if (sextant == 2) { - r = m*255; g = v*255; b = (m+((v-m)*(h-sextant)))*255; - } else if (sextant == 3) { - r = m*255; g = (v-((v-m)*(h-sextant)))*255; b = v*255; - } else if (sextant == 4) { - r = (m+((v-m)*(h-sextant)))*255; g = m*255; b = v*255; - } else if (sextant == 5) { - r = v*255; g = m*255; b = (v-((v-m)*(h-sextant)))*255; - } - } - } - } - - if (lightness < 0) { - r *= lightp1; - g *= lightp1; - b *= lightp1; - } else if (lightness > 0) { - r = r * lightm1 + light255; - g = g * lightm1 + light255; - b = b * lightm1 + light255; - } - - if (r < 0) - data[pix] = 0 - else if (r > 255) - data[pix] = 255 - else - data[pix] = r; - - if (g < 0) - data[pix1] = 0 - else if (g > 255) - data[pix1] = 255 - else - data[pix1] = g; - - if (b < 0) - data[pix2] = 0 - else if (b > 255) - data[pix2] = 255 - else - data[pix2] = b; - - } - - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } - -} +/* + * Pixastic Lib - HSL Adjust - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.hsl = { + process : function(params) { + + var hue = parseInt(params.options.hue,10)||0; + var saturation = (parseInt(params.options.saturation,10)||0) / 100; + var lightness = (parseInt(params.options.lightness,10)||0) / 100; + + + // this seems to give the same result as Photoshop + if (saturation < 0) { + var satMul = 1+saturation; + } else { + var satMul = 1+saturation*2; + } + + hue = (hue%360) / 360; + var hue6 = hue * 6; + + var rgbDiv = 1 / 255; + + var light255 = lightness * 255; + var lightp1 = 1 + lightness; + var lightm1 = 1 - lightness; + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + + var rect = params.options.rect; + + var p = rect.width * rect.height; + + var pix = p*4, pix1 = pix + 1, pix2 = pix + 2, pix3 = pix + 3; + + while (p--) { + + var r = data[pix-=4]; + var g = data[pix1=pix+1]; + var b = data[pix2=pix+2]; + + if (hue != 0 || saturation != 0) { + // ok, here comes rgb to hsl + adjust + hsl to rgb, all in one jumbled mess. + // It's not so pretty, but it's been optimized to get somewhat decent performance. + // The transforms were originally adapted from the ones found in Graphics Gems, but have been heavily modified. + var vs = r; + if (g > vs) vs = g; + if (b > vs) vs = b; + var ms = r; + if (g < ms) ms = g; + if (b < ms) ms = b; + var vm = (vs-ms); + var l = (ms+vs)/510; + if (l > 0) { + if (vm > 0) { + if (l <= 0.5) { + var s = vm / (vs+ms) * satMul; + if (s > 1) s = 1; + var v = (l * (1+s)); + } else { + var s = vm / (510-vs-ms) * satMul; + if (s > 1) s = 1; + var v = (l+s - l*s); + } + if (r == vs) { + if (g == ms) + var h = 5 + ((vs-b)/vm) + hue6; + else + var h = 1 - ((vs-g)/vm) + hue6; + } else if (g == vs) { + if (b == ms) + var h = 1 + ((vs-r)/vm) + hue6; + else + var h = 3 - ((vs-b)/vm) + hue6; + } else { + if (r == ms) + var h = 3 + ((vs-g)/vm) + hue6; + else + var h = 5 - ((vs-r)/vm) + hue6; + } + if (h < 0) h+=6; + if (h >= 6) h-=6; + var m = (l+l-v); + var sextant = h>>0; + if (sextant == 0) { + r = v*255; g = (m+((v-m)*(h-sextant)))*255; b = m*255; + } else if (sextant == 1) { + r = (v-((v-m)*(h-sextant)))*255; g = v*255; b = m*255; + } else if (sextant == 2) { + r = m*255; g = v*255; b = (m+((v-m)*(h-sextant)))*255; + } else if (sextant == 3) { + r = m*255; g = (v-((v-m)*(h-sextant)))*255; b = v*255; + } else if (sextant == 4) { + r = (m+((v-m)*(h-sextant)))*255; g = m*255; b = v*255; + } else if (sextant == 5) { + r = v*255; g = m*255; b = (v-((v-m)*(h-sextant)))*255; + } + } + } + } + + if (lightness < 0) { + r *= lightp1; + g *= lightp1; + b *= lightp1; + } else if (lightness > 0) { + r = r * lightm1 + light255; + g = g * lightm1 + light255; + b = b * lightm1 + light255; + } + + if (r < 0) + data[pix] = 0 + else if (r > 255) + data[pix] = 255 + else + data[pix] = r; + + if (g < 0) + data[pix1] = 0 + else if (g > 255) + data[pix1] = 255 + else + data[pix1] = g; + + if (b < 0) + data[pix2] = 0 + else if (b > 255) + data[pix2] = 255 + else + data[pix2] = b; + + } + + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } + +} diff --git a/actions/invert.js b/actions/invert.js index 8b422c9..77cc94d 100755 --- a/actions/invert.js +++ b/actions/invert.js @@ -1,36 +1,36 @@ -/* - * Pixastic Lib - Invert filter - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.invert = { - process : function(params) { - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - - var invertAlpha = !!params.options.invertAlpha; - var rect = params.options.rect; - - var p = rect.width * rect.height; - - var pix = p*4, pix1 = pix + 1, pix2 = pix + 2, pix3 = pix + 3; - - while (p--) { - data[pix-=4] = 255 - data[pix]; - data[pix1-=4] = 255 - data[pix1]; - data[pix2-=4] = 255 - data[pix2]; - if (invertAlpha) - data[pix3-=4] = 255 - data[pix3]; - } - - return true; - } else if (Pixastic.Client.isIE()) { - params.image.style.filter += " invert"; - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); - } -} +/* + * Pixastic Lib - Invert filter - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.invert = { + process : function(params) { + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + + var invertAlpha = !!params.options.invertAlpha; + var rect = params.options.rect; + + var p = rect.width * rect.height; + + var pix = p*4, pix1 = pix + 1, pix2 = pix + 2, pix3 = pix + 3; + + while (p--) { + data[pix-=4] = 255 - data[pix]; + data[pix1-=4] = 255 - data[pix1]; + data[pix2-=4] = 255 - data[pix2]; + if (invertAlpha) + data[pix3-=4] = 255 - data[pix3]; + } + + return true; + } else if (Pixastic.Client.isIE()) { + params.image.style.filter += " invert"; + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); + } +} diff --git a/actions/laplace.js b/actions/laplace.js index e71f119..abb099f 100755 --- a/actions/laplace.js +++ b/actions/laplace.js @@ -1,112 +1,112 @@ -/* - * Pixastic Lib - Laplace filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.laplace = { - process : function(params) { - - var strength = 1.0; - var invert = !!(params.options.invert && params.options.invert != "false"); - var contrast = parseFloat(params.options.edgeStrength)||0; - - var greyLevel = parseInt(params.options.greyLevel)||0; - - contrast = -contrast; - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var dataCopy = Pixastic.prepareData(params, true) - - var kernel = [ - [-1, -1, -1], - [-1, 8, -1], - [-1, -1, -1] - ]; - - var weight = 1/8; - - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - - var nextY = (y == h) ? y - 1 : y; - var prevY = (y == 1) ? 0 : y-2; - - var offsetYPrev = prevY*w*4; - var offsetYNext = nextY*w*4; - - var x = w; - do { - var offset = offsetY + (x*4-4); - - var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; - var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; - - var r = ((-dataCopy[offsetPrev-4] - - dataCopy[offsetPrev] - - dataCopy[offsetPrev+4] - - dataCopy[offset-4] - - dataCopy[offset+4] - - dataCopy[offsetNext-4] - - dataCopy[offsetNext] - - dataCopy[offsetNext+4]) - + dataCopy[offset] * 8) - * weight; - - var g = ((-dataCopy[offsetPrev-3] - - dataCopy[offsetPrev+1] - - dataCopy[offsetPrev+5] - - dataCopy[offset-3] - - dataCopy[offset+5] - - dataCopy[offsetNext-3] - - dataCopy[offsetNext+1] - - dataCopy[offsetNext+5]) - + dataCopy[offset+1] * 8) - * weight; - - var b = ((-dataCopy[offsetPrev-2] - - dataCopy[offsetPrev+2] - - dataCopy[offsetPrev+6] - - dataCopy[offset-2] - - dataCopy[offset+6] - - dataCopy[offsetNext-2] - - dataCopy[offsetNext+2] - - dataCopy[offsetNext+6]) - + dataCopy[offset+2] * 8) - * weight; - - var brightness = ((r + g + b)/3) + greyLevel; - - if (contrast != 0) { - if (brightness > 127) { - brightness += ((brightness + 1) - 128) * contrast; - } else if (brightness < 127) { - brightness -= (brightness + 1) * contrast; - } - } - if (invert) { - brightness = 255 - brightness; - } - if (brightness < 0 ) brightness = 0; - if (brightness > 255 ) brightness = 255; - - data[offset] = data[offset+1] = data[offset+2] = brightness; - - } while (--x); - } while (--y); - - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } -} - +/* + * Pixastic Lib - Laplace filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.laplace = { + process : function(params) { + + var strength = 1.0; + var invert = !!(params.options.invert && params.options.invert != "false"); + var contrast = parseFloat(params.options.edgeStrength)||0; + + var greyLevel = parseInt(params.options.greyLevel)||0; + + contrast = -contrast; + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var dataCopy = Pixastic.prepareData(params, true) + + var kernel = [ + [-1, -1, -1], + [-1, 8, -1], + [-1, -1, -1] + ]; + + var weight = 1/8; + + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + + var nextY = (y == h) ? y - 1 : y; + var prevY = (y == 1) ? 0 : y-2; + + var offsetYPrev = prevY*w*4; + var offsetYNext = nextY*w*4; + + var x = w; + do { + var offset = offsetY + (x*4-4); + + var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; + var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; + + var r = ((-dataCopy[offsetPrev-4] + - dataCopy[offsetPrev] + - dataCopy[offsetPrev+4] + - dataCopy[offset-4] + - dataCopy[offset+4] + - dataCopy[offsetNext-4] + - dataCopy[offsetNext] + - dataCopy[offsetNext+4]) + + dataCopy[offset] * 8) + * weight; + + var g = ((-dataCopy[offsetPrev-3] + - dataCopy[offsetPrev+1] + - dataCopy[offsetPrev+5] + - dataCopy[offset-3] + - dataCopy[offset+5] + - dataCopy[offsetNext-3] + - dataCopy[offsetNext+1] + - dataCopy[offsetNext+5]) + + dataCopy[offset+1] * 8) + * weight; + + var b = ((-dataCopy[offsetPrev-2] + - dataCopy[offsetPrev+2] + - dataCopy[offsetPrev+6] + - dataCopy[offset-2] + - dataCopy[offset+6] + - dataCopy[offsetNext-2] + - dataCopy[offsetNext+2] + - dataCopy[offsetNext+6]) + + dataCopy[offset+2] * 8) + * weight; + + var brightness = ((r + g + b)/3) + greyLevel; + + if (contrast != 0) { + if (brightness > 127) { + brightness += ((brightness + 1) - 128) * contrast; + } else if (brightness < 127) { + brightness -= (brightness + 1) * contrast; + } + } + if (invert) { + brightness = 255 - brightness; + } + if (brightness < 0 ) brightness = 0; + if (brightness > 255 ) brightness = 255; + + data[offset] = data[offset+1] = data[offset+2] = brightness; + + } while (--x); + } while (--y); + + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } +} + diff --git a/actions/lighten.js b/actions/lighten.js index 69d0af0..93c9093 100755 --- a/actions/lighten.js +++ b/actions/lighten.js @@ -1,61 +1,61 @@ -/* - * Pixastic Lib - Lighten filter - v0.1.1 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.lighten = { - - process : function(params) { - var amount = parseFloat(params.options.amount) || 0; - amount = Math.max(-1, Math.min(1, amount)); - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var rect = params.options.rect; - - var p = rect.width * rect.height; - - var pix = p*4, pix1 = pix + 1, pix2 = pix + 2; - var mul = amount + 1; - - while (p--) { - if ((data[pix-=4] = data[pix] * mul) > 255) - data[pix] = 255; - - if ((data[pix1-=4] = data[pix1] * mul) > 255) - data[pix1] = 255; - - if ((data[pix2-=4] = data[pix2] * mul) > 255) - data[pix2] = 255; - - } - - return true; - - } else if (Pixastic.Client.isIE()) { - var img = params.image; - if (amount < 0) { - img.style.filter += " light()"; - img.filters[img.filters.length-1].addAmbient( - 255,255,255, - 100 * -amount - ); - } else if (amount > 0) { - img.style.filter += " light()"; - img.filters[img.filters.length-1].addAmbient( - 255,255,255, - 100 - ); - img.filters[img.filters.length-1].addAmbient( - 255,255,255, - 100 * amount - ); - } - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); - } -} +/* + * Pixastic Lib - Lighten filter - v0.1.1 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.lighten = { + + process : function(params) { + var amount = parseFloat(params.options.amount) || 0; + amount = Math.max(-1, Math.min(1, amount)); + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var rect = params.options.rect; + + var p = rect.width * rect.height; + + var pix = p*4, pix1 = pix + 1, pix2 = pix + 2; + var mul = amount + 1; + + while (p--) { + if ((data[pix-=4] = data[pix] * mul) > 255) + data[pix] = 255; + + if ((data[pix1-=4] = data[pix1] * mul) > 255) + data[pix1] = 255; + + if ((data[pix2-=4] = data[pix2] * mul) > 255) + data[pix2] = 255; + + } + + return true; + + } else if (Pixastic.Client.isIE()) { + var img = params.image; + if (amount < 0) { + img.style.filter += " light()"; + img.filters[img.filters.length-1].addAmbient( + 255,255,255, + 100 * -amount + ); + } else if (amount > 0) { + img.style.filter += " light()"; + img.filters[img.filters.length-1].addAmbient( + 255,255,255, + 100 + ); + img.filters[img.filters.length-1].addAmbient( + 255,255,255, + 100 * amount + ); + } + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData() || Pixastic.Client.isIE()); + } +} diff --git a/actions/mosaic.js b/actions/mosaic.js index f8e2d9f..6b5754c 100755 --- a/actions/mosaic.js +++ b/actions/mosaic.js @@ -1,55 +1,55 @@ -/* - * Pixastic Lib - Mosaic filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.mosaic = { - - process : function(params) { - var blockSize = Math.max(1,parseInt(params.options.blockSize,10)); - - if (Pixastic.Client.hasCanvasImageData()) { - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - var w4 = w*4; - var y = h; - - var ctx = params.canvas.getContext("2d"); - - var pixel = document.createElement("canvas"); - pixel.width = pixel.height = 1; - var pixelCtx = pixel.getContext("2d"); - - var copy = document.createElement("canvas"); - copy.width = w; - copy.height = h; - var copyCtx = copy.getContext("2d"); - copyCtx.drawImage(params.canvas,rect.left,rect.top,w,h, 0,0,w,h); - - for (var y=0;y w) - blockSizeX = w - x; - if (blockSizeY + y > h) - blockSizeY = h - y; - - pixelCtx.drawImage(copy, x, y, blockSizeX, blockSizeY, 0, 0, 1, 1); - var data = pixelCtx.getImageData(0,0,1,1).data; - ctx.fillStyle = "rgb(" + data[0] + "," + data[1] + "," + data[2] + ")"; - ctx.fillRect(rect.left + x, rect.top + y, blockSize, blockSize); - } - } - params.useData = false; - - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData()); - } +/* + * Pixastic Lib - Mosaic filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.mosaic = { + + process : function(params) { + var blockSize = Math.max(1,parseInt(params.options.blockSize,10)); + + if (Pixastic.Client.hasCanvasImageData()) { + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + var w4 = w*4; + var y = h; + + var ctx = params.canvas.getContext("2d"); + + var pixel = document.createElement("canvas"); + pixel.width = pixel.height = 1; + var pixelCtx = pixel.getContext("2d"); + + var copy = document.createElement("canvas"); + copy.width = w; + copy.height = h; + var copyCtx = copy.getContext("2d"); + copyCtx.drawImage(params.canvas,rect.left,rect.top,w,h, 0,0,w,h); + + for (var y=0;y w) + blockSizeX = w - x; + if (blockSizeY + y > h) + blockSizeY = h - y; + + pixelCtx.drawImage(copy, x, y, blockSizeX, blockSizeY, 0, 0, 1, 1); + var data = pixelCtx.getImageData(0,0,1,1).data; + ctx.fillStyle = "rgb(" + data[0] + "," + data[1] + "," + data[2] + ")"; + ctx.fillRect(rect.left + x, rect.top + y, blockSize, blockSize); + } + } + params.useData = false; + + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData()); + } } \ No newline at end of file diff --git a/actions/noise.js b/actions/noise.js index ce88a85..143bcc7 100755 --- a/actions/noise.js +++ b/actions/noise.js @@ -1,73 +1,73 @@ -/* - * Pixastic Lib - Noise filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.noise = { - - process : function(params) { - var amount = 0; - var strength = 0; - var mono = false; - - if (typeof params.options.amount != "undefined") - amount = parseFloat(params.options.amount)||0; - if (typeof params.options.strength != "undefined") - strength = parseFloat(params.options.strength)||0; - if (typeof params.options.mono != "undefined") - mono = !!(params.options.mono && params.options.mono != "false"); - - amount = Math.max(0,Math.min(1,amount)); - strength = Math.max(0,Math.min(1,strength)); - - var noise = 128 * strength; - var noise2 = noise / 2; - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - var w4 = w*4; - var y = h; - var random = Math.random; - - do { - var offsetY = (y-1)*w4; - var x = w; - do { - var offset = offsetY + (x-1)*4; - if (random() < amount) { - if (mono) { - var pixelNoise = - noise2 + random() * noise; - var r = data[offset] + pixelNoise; - var g = data[offset+1] + pixelNoise; - var b = data[offset+2] + pixelNoise; - } else { - var r = data[offset] - noise2 + (random() * noise); - var g = data[offset+1] - noise2 + (random() * noise); - var b = data[offset+2] - noise2 + (random() * noise); - } - - if (r < 0 ) r = 0; - if (g < 0 ) g = 0; - if (b < 0 ) b = 0; - if (r > 255 ) r = 255; - if (g > 255 ) g = 255; - if (b > 255 ) b = 255; - - data[offset] = r; - data[offset+1] = g; - data[offset+2] = b; - } - } while (--x); - } while (--y); - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } -} - +/* + * Pixastic Lib - Noise filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.noise = { + + process : function(params) { + var amount = 0; + var strength = 0; + var mono = false; + + if (typeof params.options.amount != "undefined") + amount = parseFloat(params.options.amount)||0; + if (typeof params.options.strength != "undefined") + strength = parseFloat(params.options.strength)||0; + if (typeof params.options.mono != "undefined") + mono = !!(params.options.mono && params.options.mono != "false"); + + amount = Math.max(0,Math.min(1,amount)); + strength = Math.max(0,Math.min(1,strength)); + + var noise = 128 * strength; + var noise2 = noise / 2; + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + var w4 = w*4; + var y = h; + var random = Math.random; + + do { + var offsetY = (y-1)*w4; + var x = w; + do { + var offset = offsetY + (x-1)*4; + if (random() < amount) { + if (mono) { + var pixelNoise = - noise2 + random() * noise; + var r = data[offset] + pixelNoise; + var g = data[offset+1] + pixelNoise; + var b = data[offset+2] + pixelNoise; + } else { + var r = data[offset] - noise2 + (random() * noise); + var g = data[offset+1] - noise2 + (random() * noise); + var b = data[offset+2] - noise2 + (random() * noise); + } + + if (r < 0 ) r = 0; + if (g < 0 ) g = 0; + if (b < 0 ) b = 0; + if (r > 255 ) r = 255; + if (g > 255 ) g = 255; + if (b > 255 ) b = 255; + + data[offset] = r; + data[offset+1] = g; + data[offset+2] = b; + } + } while (--x); + } while (--y); + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } +} + diff --git a/actions/pointillize.js b/actions/pointillize.js index 7ee049e..42de579 100755 --- a/actions/pointillize.js +++ b/actions/pointillize.js @@ -1,91 +1,91 @@ -/* - * Pixastic Lib - Pointillize filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.pointillize = { - - process : function(params) { - var radius = Math.max(1,parseInt(params.options.radius,10)); - var density = Math.min(5,Math.max(0,parseFloat(params.options.density)||0)); - var noise = Math.max(0,parseFloat(params.options.noise)||0); - var transparent = !!(params.options.transparent && params.options.transparent != "false"); - - if (Pixastic.Client.hasCanvasImageData()) { - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - var w4 = w*4; - var y = h; - - var ctx = params.canvas.getContext("2d"); - var canvasWidth = params.canvas.width; - var canvasHeight = params.canvas.height; - - var pixel = document.createElement("canvas"); - pixel.width = pixel.height = 1; - var pixelCtx = pixel.getContext("2d"); - - var copy = document.createElement("canvas"); - copy.width = w; - copy.height = h; - var copyCtx = copy.getContext("2d"); - copyCtx.drawImage(params.canvas,rect.left,rect.top,w,h, 0,0,w,h); - - var diameter = radius * 2; - - if (transparent) - ctx.clearRect(rect.left, rect.top, rect.width, rect.height); - - var noiseRadius = radius * noise; - - var dist = 1 / density; - - for (var y=0;y>0 : x; - rndY = noise ? (y+((Math.random()*2-1) * noiseRadius))>>0 : y; - - var pixX = rndX - radius; - var pixY = rndY - radius; - if (pixX < 0) pixX = 0; - if (pixY < 0) pixY = 0; - - var cx = rndX + rect.left; - var cy = rndY + rect.top; - if (cx < 0) cx = 0; - if (cx > canvasWidth) cx = canvasWidth; - if (cy < 0) cy = 0; - if (cy > canvasHeight) cy = canvasHeight; - - var diameterX = diameter; - var diameterY = diameter; - - if (diameterX + pixX > w) - diameterX = w - pixX; - if (diameterY + pixY > h) - diameterY = h - pixY; - if (diameterX < 1) diameterX = 1; - if (diameterY < 1) diameterY = 1; - - pixelCtx.drawImage(copy, pixX, pixY, diameterX, diameterY, 0, 0, 1, 1); - var data = pixelCtx.getImageData(0,0,1,1).data; - - ctx.fillStyle = "rgb(" + data[0] + "," + data[1] + "," + data[2] + ")"; - ctx.beginPath(); - ctx.arc(cx, cy, radius, 0, Math.PI*2, true); - ctx.closePath(); - ctx.fill(); - } - } - - params.useData = false; - - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData()); - } +/* + * Pixastic Lib - Pointillize filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.pointillize = { + + process : function(params) { + var radius = Math.max(1,parseInt(params.options.radius,10)); + var density = Math.min(5,Math.max(0,parseFloat(params.options.density)||0)); + var noise = Math.max(0,parseFloat(params.options.noise)||0); + var transparent = !!(params.options.transparent && params.options.transparent != "false"); + + if (Pixastic.Client.hasCanvasImageData()) { + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + var w4 = w*4; + var y = h; + + var ctx = params.canvas.getContext("2d"); + var canvasWidth = params.canvas.width; + var canvasHeight = params.canvas.height; + + var pixel = document.createElement("canvas"); + pixel.width = pixel.height = 1; + var pixelCtx = pixel.getContext("2d"); + + var copy = document.createElement("canvas"); + copy.width = w; + copy.height = h; + var copyCtx = copy.getContext("2d"); + copyCtx.drawImage(params.canvas,rect.left,rect.top,w,h, 0,0,w,h); + + var diameter = radius * 2; + + if (transparent) + ctx.clearRect(rect.left, rect.top, rect.width, rect.height); + + var noiseRadius = radius * noise; + + var dist = 1 / density; + + for (var y=0;y>0 : x; + rndY = noise ? (y+((Math.random()*2-1) * noiseRadius))>>0 : y; + + var pixX = rndX - radius; + var pixY = rndY - radius; + if (pixX < 0) pixX = 0; + if (pixY < 0) pixY = 0; + + var cx = rndX + rect.left; + var cy = rndY + rect.top; + if (cx < 0) cx = 0; + if (cx > canvasWidth) cx = canvasWidth; + if (cy < 0) cy = 0; + if (cy > canvasHeight) cy = canvasHeight; + + var diameterX = diameter; + var diameterY = diameter; + + if (diameterX + pixX > w) + diameterX = w - pixX; + if (diameterY + pixY > h) + diameterY = h - pixY; + if (diameterX < 1) diameterX = 1; + if (diameterY < 1) diameterY = 1; + + pixelCtx.drawImage(copy, pixX, pixY, diameterX, diameterY, 0, 0, 1, 1); + var data = pixelCtx.getImageData(0,0,1,1).data; + + ctx.fillStyle = "rgb(" + data[0] + "," + data[1] + "," + data[2] + ")"; + ctx.beginPath(); + ctx.arc(cx, cy, radius, 0, Math.PI*2, true); + ctx.closePath(); + ctx.fill(); + } + } + + params.useData = false; + + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData()); + } } \ No newline at end of file diff --git a/actions/posterize.js b/actions/posterize.js index a9a0cd8..1bee4b8 100755 --- a/actions/posterize.js +++ b/actions/posterize.js @@ -1,57 +1,57 @@ -/* - * Pixastic Lib - Posterize effect - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.posterize = { - - process : function(params) { - - - var numLevels = 256; - if (typeof params.options.levels != "undefined") - numLevels = parseInt(params.options.levels,10)||1; - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - - numLevels = Math.max(2,Math.min(256,numLevels)); - - var numAreas = 256 / numLevels; - var numValues = 256 / (numLevels-1); - - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - var x = w; - do { - var offset = offsetY + (x-1)*4; - - var r = numValues * ((data[offset] / numAreas)>>0); - var g = numValues * ((data[offset+1] / numAreas)>>0); - var b = numValues * ((data[offset+2] / numAreas)>>0); - - if (r > 255) r = 255; - if (g > 255) g = 255; - if (b > 255) b = 255; - - data[offset] = r; - data[offset+1] = g; - data[offset+2] = b; - - } while (--x); - } while (--y); - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } -} - - +/* + * Pixastic Lib - Posterize effect - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.posterize = { + + process : function(params) { + + + var numLevels = 256; + if (typeof params.options.levels != "undefined") + numLevels = parseInt(params.options.levels,10)||1; + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + + numLevels = Math.max(2,Math.min(256,numLevels)); + + var numAreas = 256 / numLevels; + var numValues = 256 / (numLevels-1); + + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + var x = w; + do { + var offset = offsetY + (x-1)*4; + + var r = numValues * ((data[offset] / numAreas)>>0); + var g = numValues * ((data[offset+1] / numAreas)>>0); + var b = numValues * ((data[offset+2] / numAreas)>>0); + + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + + data[offset] = r; + data[offset+1] = g; + data[offset+2] = b; + + } while (--x); + } while (--y); + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } +} + + diff --git a/actions/removenoise.js b/actions/removenoise.js index b4bcd2b..c5eca83 100755 --- a/actions/removenoise.js +++ b/actions/removenoise.js @@ -1,89 +1,89 @@ -/* - * Pixastic Lib - Remove noise - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.removenoise = { - process : function(params) { - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - - var nextY = (y == h) ? y - 1 : y; - var prevY = (y == 1) ? 0 : y-2; - - var offsetYPrev = prevY*w*4; - var offsetYNext = nextY*w*4; - - var x = w; - do { - var offset = offsetY + (x*4-4); - - var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; - var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; - - var minR, maxR, minG, maxG, minB, maxB; - - minR = maxR = data[offsetPrev]; - var r1 = data[offset-4], r2 = data[offset+4], r3 = data[offsetNext]; - if (r1 < minR) minR = r1; - if (r2 < minR) minR = r2; - if (r3 < minR) minR = r3; - if (r1 > maxR) maxR = r1; - if (r2 > maxR) maxR = r2; - if (r3 > maxR) maxR = r3; - - minG = maxG = data[offsetPrev+1]; - var g1 = data[offset-3], g2 = data[offset+5], g3 = data[offsetNext+1]; - if (g1 < minG) minG = g1; - if (g2 < minG) minG = g2; - if (g3 < minG) minG = g3; - if (g1 > maxG) maxG = g1; - if (g2 > maxG) maxG = g2; - if (g3 > maxG) maxG = g3; - - minB = maxB = data[offsetPrev+2]; - var b1 = data[offset-2], b2 = data[offset+6], b3 = data[offsetNext+2]; - if (b1 < minB) minB = b1; - if (b2 < minB) minB = b2; - if (b3 < minB) minB = b3; - if (b1 > maxB) maxB = b1; - if (b2 > maxB) maxB = b2; - if (b3 > maxB) maxB = b3; - - if (data[offset] > maxR) { - data[offset] = maxR; - } else if (data[offset] < minR) { - data[offset] = minR; - } - if (data[offset+1] > maxG) { - data[offset+1] = maxG; - } else if (data[offset+1] < minG) { - data[offset+1] = minG; - } - if (data[offset+2] > maxB) { - data[offset+2] = maxB; - } else if (data[offset+2] < minB) { - data[offset+2] = minB; - } - - } while (--x); - } while (--y); - - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } +/* + * Pixastic Lib - Remove noise - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.removenoise = { + process : function(params) { + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + + var nextY = (y == h) ? y - 1 : y; + var prevY = (y == 1) ? 0 : y-2; + + var offsetYPrev = prevY*w*4; + var offsetYNext = nextY*w*4; + + var x = w; + do { + var offset = offsetY + (x*4-4); + + var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; + var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; + + var minR, maxR, minG, maxG, minB, maxB; + + minR = maxR = data[offsetPrev]; + var r1 = data[offset-4], r2 = data[offset+4], r3 = data[offsetNext]; + if (r1 < minR) minR = r1; + if (r2 < minR) minR = r2; + if (r3 < minR) minR = r3; + if (r1 > maxR) maxR = r1; + if (r2 > maxR) maxR = r2; + if (r3 > maxR) maxR = r3; + + minG = maxG = data[offsetPrev+1]; + var g1 = data[offset-3], g2 = data[offset+5], g3 = data[offsetNext+1]; + if (g1 < minG) minG = g1; + if (g2 < minG) minG = g2; + if (g3 < minG) minG = g3; + if (g1 > maxG) maxG = g1; + if (g2 > maxG) maxG = g2; + if (g3 > maxG) maxG = g3; + + minB = maxB = data[offsetPrev+2]; + var b1 = data[offset-2], b2 = data[offset+6], b3 = data[offsetNext+2]; + if (b1 < minB) minB = b1; + if (b2 < minB) minB = b2; + if (b3 < minB) minB = b3; + if (b1 > maxB) maxB = b1; + if (b2 > maxB) maxB = b2; + if (b3 > maxB) maxB = b3; + + if (data[offset] > maxR) { + data[offset] = maxR; + } else if (data[offset] < minR) { + data[offset] = minR; + } + if (data[offset+1] > maxG) { + data[offset+1] = maxG; + } else if (data[offset+1] < minG) { + data[offset+1] = minG; + } + if (data[offset+2] > maxB) { + data[offset+2] = maxB; + } else if (data[offset+2] < minB) { + data[offset+2] = minB; + } + + } while (--x); + } while (--y); + + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } } \ No newline at end of file diff --git a/actions/resize.js b/actions/resize.js index d7a36f4..6f87636 100755 --- a/actions/resize.js +++ b/actions/resize.js @@ -1,36 +1,36 @@ -/* - * Pixastic Lib - Resize - v0.1.0 - * Copyright (c) 2009 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.resize = { - process : function(params) { - if (Pixastic.Client.hasCanvas()) { - var width = parseInt(params.options.width,10); - var height = parseInt(params.options.height,10); - var canvas = params.canvas; - - if (width < 1) width = 1; - if (width < 2) width = 2; - - var copy = document.createElement("canvas"); - copy.width = width; - copy.height = height; - - copy.getContext("2d").drawImage(canvas,0,0,width,height); - canvas.width = width; - canvas.height = height; - - canvas.getContext("2d").drawImage(copy,0,0); - - params.useData = false; - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvas(); - } -} - - +/* + * Pixastic Lib - Resize - v0.1.0 + * Copyright (c) 2009 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.resize = { + process : function(params) { + if (Pixastic.Client.hasCanvas()) { + var width = parseInt(params.options.width,10); + var height = parseInt(params.options.height,10); + var canvas = params.canvas; + + if (width < 1) width = 1; + if (width < 2) width = 2; + + var copy = document.createElement("canvas"); + copy.width = width; + copy.height = height; + + copy.getContext("2d").drawImage(canvas,0,0,width,height); + canvas.width = width; + canvas.height = height; + + canvas.getContext("2d").drawImage(copy,0,0); + + params.useData = false; + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvas(); + } +} + + diff --git a/actions/rotate.js b/actions/rotate.js index 9b03427..20d0170 100755 --- a/actions/rotate.js +++ b/actions/rotate.js @@ -1,53 +1,53 @@ -/* - * Pixastic Lib - Rotate - v0.1.0 - * Copyright (c) 2009 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.rotate = { - process : function(params) { - if (Pixastic.Client.hasCanvas()) { - var canvas = params.canvas; - - var width = params.width; - var height = params.height; - - var copy = document.createElement("canvas"); - copy.width = width; - copy.height = height; - copy.getContext("2d").drawImage(canvas,0,0,width,height); - - var angle = -parseFloat(params.options.angle) * Math.PI / 180; - - var dimAngle = angle; - if (dimAngle > Math.PI*0.5) - dimAngle = Math.PI - dimAngle; - if (dimAngle < -Math.PI*0.5) - dimAngle = -Math.PI - dimAngle; - - var diag = Math.sqrt(width*width + height*height); - - var diagAngle1 = Math.abs(dimAngle) - Math.abs(Math.atan2(height, width)); - var diagAngle2 = Math.abs(dimAngle) + Math.abs(Math.atan2(height, width)); - - var newWidth = Math.abs(Math.cos(diagAngle1) * diag); - var newHeight = Math.abs(Math.sin(diagAngle2) * diag); - - canvas.width = newWidth; - canvas.height = newHeight; - - var ctx = canvas.getContext("2d"); - ctx.translate(newWidth/2, newHeight/2); - ctx.rotate(angle); - ctx.drawImage(copy,-width/2,-height/2); - - params.useData = false; - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvas(); - } -} - - +/* + * Pixastic Lib - Rotate - v0.1.0 + * Copyright (c) 2009 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.rotate = { + process : function(params) { + if (Pixastic.Client.hasCanvas()) { + var canvas = params.canvas; + + var width = params.width; + var height = params.height; + + var copy = document.createElement("canvas"); + copy.width = width; + copy.height = height; + copy.getContext("2d").drawImage(canvas,0,0,width,height); + + var angle = -parseFloat(params.options.angle) * Math.PI / 180; + + var dimAngle = angle; + if (dimAngle > Math.PI*0.5) + dimAngle = Math.PI - dimAngle; + if (dimAngle < -Math.PI*0.5) + dimAngle = -Math.PI - dimAngle; + + var diag = Math.sqrt(width*width + height*height); + + var diagAngle1 = Math.abs(dimAngle) - Math.abs(Math.atan2(height, width)); + var diagAngle2 = Math.abs(dimAngle) + Math.abs(Math.atan2(height, width)); + + var newWidth = Math.abs(Math.cos(diagAngle1) * diag); + var newHeight = Math.abs(Math.sin(diagAngle2) * diag); + + canvas.width = newWidth; + canvas.height = newHeight; + + var ctx = canvas.getContext("2d"); + ctx.translate(newWidth/2, newHeight/2); + ctx.rotate(angle); + ctx.drawImage(copy,-width/2,-height/2); + + params.useData = false; + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvas(); + } +} + + diff --git a/actions/sepia.js b/actions/sepia.js index fc6b214..5131f2d 100755 --- a/actions/sepia.js +++ b/actions/sepia.js @@ -1,60 +1,60 @@ -/* - * Pixastic Lib - Sepia filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.sepia = { - - process : function(params) { - var mode = (parseInt(params.options.mode,10)||0); - if (mode < 0) mode = 0; - if (mode > 1) mode = 1; - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - var x = w; - do { - var offset = offsetY + (x-1)*4; - - if (mode) { - // a bit faster, but not as good - var d = data[offset] * 0.299 + data[offset+1] * 0.587 + data[offset+2] * 0.114; - var r = (d + 39); - var g = (d + 14); - var b = (d - 36); - } else { - // Microsoft - var or = data[offset]; - var og = data[offset+1]; - var ob = data[offset+2]; - - var r = (or * 0.393 + og * 0.769 + ob * 0.189); - var g = (or * 0.349 + og * 0.686 + ob * 0.168); - var b = (or * 0.272 + og * 0.534 + ob * 0.131); - } - - if (r < 0) r = 0; if (r > 255) r = 255; - if (g < 0) g = 0; if (g > 255) g = 255; - if (b < 0) b = 0; if (b > 255) b = 255; - - data[offset] = r; - data[offset+1] = g; - data[offset+2] = b; - - } while (--x); - } while (--y); - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } +/* + * Pixastic Lib - Sepia filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.sepia = { + + process : function(params) { + var mode = (parseInt(params.options.mode,10)||0); + if (mode < 0) mode = 0; + if (mode > 1) mode = 1; + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + var x = w; + do { + var offset = offsetY + (x-1)*4; + + if (mode) { + // a bit faster, but not as good + var d = data[offset] * 0.299 + data[offset+1] * 0.587 + data[offset+2] * 0.114; + var r = (d + 39); + var g = (d + 14); + var b = (d - 36); + } else { + // Microsoft + var or = data[offset]; + var og = data[offset+1]; + var ob = data[offset+2]; + + var r = (or * 0.393 + og * 0.769 + ob * 0.189); + var g = (or * 0.349 + og * 0.686 + ob * 0.168); + var b = (or * 0.272 + og * 0.534 + ob * 0.131); + } + + if (r < 0) r = 0; if (r > 255) r = 255; + if (g < 0) g = 0; if (g > 255) g = 255; + if (b < 0) b = 0; if (b > 255) b = 255; + + data[offset] = r; + data[offset+1] = g; + data[offset+2] = b; + + } while (--x); + } while (--y); + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } } \ No newline at end of file diff --git a/actions/sharpen.js b/actions/sharpen.js index 64438b7..cbf7ba9 100755 --- a/actions/sharpen.js +++ b/actions/sharpen.js @@ -1,110 +1,110 @@ -/* - * Pixastic Lib - Sharpen filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.sharpen = { - process : function(params) { - - var strength = 0; - if (typeof params.options.amount != "undefined") - strength = parseFloat(params.options.amount)||0; - - if (strength < 0) strength = 0; - if (strength > 1) strength = 1; - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var dataCopy = Pixastic.prepareData(params, true) - - var mul = 15; - var mulOther = 1 + 3*strength; - - var kernel = [ - [0, -mulOther, 0], - [-mulOther, mul, -mulOther], - [0, -mulOther, 0] - ]; - - var weight = 0; - for (var i=0;i<3;i++) { - for (var j=0;j<3;j++) { - weight += kernel[i][j]; - } - } - - weight = 1 / weight; - - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - - mul *= weight; - mulOther *= weight; - - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - - var nextY = (y == h) ? y - 1 : y; - var prevY = (y == 1) ? 0 : y-2; - - var offsetYPrev = prevY*w4; - var offsetYNext = nextY*w4; - - var x = w; - do { - var offset = offsetY + (x*4-4); - - var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; - var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; - - var r = (( - - dataCopy[offsetPrev] - - dataCopy[offset-4] - - dataCopy[offset+4] - - dataCopy[offsetNext]) * mulOther - + dataCopy[offset] * mul - ); - - var g = (( - - dataCopy[offsetPrev+1] - - dataCopy[offset-3] - - dataCopy[offset+5] - - dataCopy[offsetNext+1]) * mulOther - + dataCopy[offset+1] * mul - ); - - var b = (( - - dataCopy[offsetPrev+2] - - dataCopy[offset-2] - - dataCopy[offset+6] - - dataCopy[offsetNext+2]) * mulOther - + dataCopy[offset+2] * mul - ); - - - if (r < 0 ) r = 0; - if (g < 0 ) g = 0; - if (b < 0 ) b = 0; - if (r > 255 ) r = 255; - if (g > 255 ) g = 255; - if (b > 255 ) b = 255; - - data[offset] = r; - data[offset+1] = g; - data[offset+2] = b; - - } while (--x); - } while (--y); - - return true; - - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } -} +/* + * Pixastic Lib - Sharpen filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.sharpen = { + process : function(params) { + + var strength = 0; + if (typeof params.options.amount != "undefined") + strength = parseFloat(params.options.amount)||0; + + if (strength < 0) strength = 0; + if (strength > 1) strength = 1; + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var dataCopy = Pixastic.prepareData(params, true) + + var mul = 15; + var mulOther = 1 + 3*strength; + + var kernel = [ + [0, -mulOther, 0], + [-mulOther, mul, -mulOther], + [0, -mulOther, 0] + ]; + + var weight = 0; + for (var i=0;i<3;i++) { + for (var j=0;j<3;j++) { + weight += kernel[i][j]; + } + } + + weight = 1 / weight; + + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + + mul *= weight; + mulOther *= weight; + + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + + var nextY = (y == h) ? y - 1 : y; + var prevY = (y == 1) ? 0 : y-2; + + var offsetYPrev = prevY*w4; + var offsetYNext = nextY*w4; + + var x = w; + do { + var offset = offsetY + (x*4-4); + + var offsetPrev = offsetYPrev + ((x == 1) ? 0 : x-2) * 4; + var offsetNext = offsetYNext + ((x == w) ? x-1 : x) * 4; + + var r = (( + - dataCopy[offsetPrev] + - dataCopy[offset-4] + - dataCopy[offset+4] + - dataCopy[offsetNext]) * mulOther + + dataCopy[offset] * mul + ); + + var g = (( + - dataCopy[offsetPrev+1] + - dataCopy[offset-3] + - dataCopy[offset+5] + - dataCopy[offsetNext+1]) * mulOther + + dataCopy[offset+1] * mul + ); + + var b = (( + - dataCopy[offsetPrev+2] + - dataCopy[offset-2] + - dataCopy[offset+6] + - dataCopy[offsetNext+2]) * mulOther + + dataCopy[offset+2] * mul + ); + + + if (r < 0 ) r = 0; + if (g < 0 ) g = 0; + if (b < 0 ) b = 0; + if (r > 255 ) r = 255; + if (g > 255 ) g = 255; + if (b > 255 ) b = 255; + + data[offset] = r; + data[offset+1] = g; + data[offset+2] = b; + + } while (--x); + } while (--y); + + return true; + + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } +} diff --git a/actions/solarize.js b/actions/solarize.js index 5be38df..634c4b7 100755 --- a/actions/solarize.js +++ b/actions/solarize.js @@ -1,45 +1,45 @@ -/* - * Pixastic Lib - Solarize filter - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -Pixastic.Actions.solarize = { - - process : function(params) { - var useAverage = !!(params.options.average && params.options.average != "false"); - - if (Pixastic.Client.hasCanvasImageData()) { - var data = Pixastic.prepareData(params); - var rect = params.options.rect; - var w = rect.width; - var h = rect.height; - var w4 = w*4; - var y = h; - do { - var offsetY = (y-1)*w4; - var x = w; - do { - var offset = offsetY + (x-1)*4; - - var r = data[offset]; - var g = data[offset+1]; - var b = data[offset+2]; - - if (r > 127) r = 255 - r; - if (g > 127) g = 255 - g; - if (b > 127) b = 255 - b; - - data[offset] = r; - data[offset+1] = g; - data[offset+2] = b; - - } while (--x); - } while (--y); - return true; - } - }, - checkSupport : function() { - return (Pixastic.Client.hasCanvasImageData()); - } +/* + * Pixastic Lib - Solarize filter - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +Pixastic.Actions.solarize = { + + process : function(params) { + var useAverage = !!(params.options.average && params.options.average != "false"); + + if (Pixastic.Client.hasCanvasImageData()) { + var data = Pixastic.prepareData(params); + var rect = params.options.rect; + var w = rect.width; + var h = rect.height; + var w4 = w*4; + var y = h; + do { + var offsetY = (y-1)*w4; + var x = w; + do { + var offset = offsetY + (x-1)*4; + + var r = data[offset]; + var g = data[offset+1]; + var b = data[offset+2]; + + if (r > 127) r = 255 - r; + if (g > 127) g = 255 - g; + if (b > 127) b = 255 - b; + + data[offset] = r; + data[offset+1] = g; + data[offset+2] = b; + + } while (--x); + } while (--y); + return true; + } + }, + checkSupport : function() { + return (Pixastic.Client.hasCanvasImageData()); + } } \ No newline at end of file diff --git a/actions/unsharpmask.js b/actions/unsharpmask.js index 44d13f4..b26701d 100755 --- a/actions/unsharpmask.js +++ b/actions/unsharpmask.js @@ -1,111 +1,111 @@ -/* - * Pixastic Lib - USM - v0.1.0 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - - -Pixastic.Actions.unsharpmask = { - process : function(params) { - - var amount = (parseFloat(params.options.amount)||0); - var blurAmount = parseFloat(params.options.radius)||0; - var threshold = parseFloat(params.options.threshold)||0; - - amount = Math.min(500,Math.max(0,amount)) / 2; - blurAmount = Math.min(5,Math.max(0,blurAmount)) / 10; - threshold = Math.min(255,Math.max(0,threshold)); - - threshold--; - var thresholdNeg = -threshold; - - amount *= 0.016; - amount++; - - if (Pixastic.Client.hasCanvasImageData()) { - var rect = params.options.rect; - - var blurCanvas = document.createElement("canvas"); - blurCanvas.width = params.width; - blurCanvas.height = params.height; - var blurCtx = blurCanvas.getContext("2d"); - blurCtx.drawImage(params.canvas,0,0); - - var scale = 2; - var smallWidth = Math.round(params.width / scale); - var smallHeight = Math.round(params.height / scale); - - var copy = document.createElement("canvas"); - copy.width = smallWidth; - copy.height = smallHeight; - - var steps = Math.round(blurAmount * 20); - - var copyCtx = copy.getContext("2d"); - for (var i=0;i threshold || difR < thresholdNeg) { - var blurR = blurData[offset]; - blurR = amount * difR + blurR; - data[offset] = blurR > 255 ? 255 : (blurR < 0 ? 0 : blurR); - } - - var difG = data[offset+1] - blurData[offset+1]; - if (difG > threshold || difG < thresholdNeg) { - var blurG = blurData[offset+1]; - blurG = amount * difG + blurG; - data[offset+1] = blurG > 255 ? 255 : (blurG < 0 ? 0 : blurG); - } - - var difB = data[offset+2] - blurData[offset+2]; - if (difB > threshold || difB < thresholdNeg) { - var blurB = blurData[offset+2]; - blurB = amount * difB + blurB; - data[offset+2] = blurB > 255 ? 255 : (blurB < 0 ? 0 : blurB); - } - - } while (--x); - } while (--y); - - return true; - } - }, - checkSupport : function() { - return Pixastic.Client.hasCanvasImageData(); - } -} - - - +/* + * Pixastic Lib - USM - v0.1.0 + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + + +Pixastic.Actions.unsharpmask = { + process : function(params) { + + var amount = (parseFloat(params.options.amount)||0); + var blurAmount = parseFloat(params.options.radius)||0; + var threshold = parseFloat(params.options.threshold)||0; + + amount = Math.min(500,Math.max(0,amount)) / 2; + blurAmount = Math.min(5,Math.max(0,blurAmount)) / 10; + threshold = Math.min(255,Math.max(0,threshold)); + + threshold--; + var thresholdNeg = -threshold; + + amount *= 0.016; + amount++; + + if (Pixastic.Client.hasCanvasImageData()) { + var rect = params.options.rect; + + var blurCanvas = document.createElement("canvas"); + blurCanvas.width = params.width; + blurCanvas.height = params.height; + var blurCtx = blurCanvas.getContext("2d"); + blurCtx.drawImage(params.canvas,0,0); + + var scale = 2; + var smallWidth = Math.round(params.width / scale); + var smallHeight = Math.round(params.height / scale); + + var copy = document.createElement("canvas"); + copy.width = smallWidth; + copy.height = smallHeight; + + var steps = Math.round(blurAmount * 20); + + var copyCtx = copy.getContext("2d"); + for (var i=0;i threshold || difR < thresholdNeg) { + var blurR = blurData[offset]; + blurR = amount * difR + blurR; + data[offset] = blurR > 255 ? 255 : (blurR < 0 ? 0 : blurR); + } + + var difG = data[offset+1] - blurData[offset+1]; + if (difG > threshold || difG < thresholdNeg) { + var blurG = blurData[offset+1]; + blurG = amount * difG + blurG; + data[offset+1] = blurG > 255 ? 255 : (blurG < 0 ? 0 : blurG); + } + + var difB = data[offset+2] - blurData[offset+2]; + if (difB > threshold || difB < thresholdNeg) { + var blurB = blurData[offset+2]; + blurB = amount * difB + blurB; + data[offset+2] = blurB > 255 ? 255 : (blurB < 0 ? 0 : blurB); + } + + } while (--x); + } while (--y); + + return true; + } + }, + checkSupport : function() { + return Pixastic.Client.hasCanvasImageData(); + } +} + + + diff --git a/license.txt b/license.txt index 13679b3..06f9651 100755 --- a/license.txt +++ b/license.txt @@ -1,469 +1,469 @@ - MOZILLA PUBLIC LICENSE - Version 1.1 - - --------------- - -1. Definitions. - - 1.0.1. "Commercial Use" means distribution or otherwise making the - Covered Code available to a third party. - - 1.1. "Contributor" means each entity that creates or contributes to - the creation of Modifications. - - 1.2. "Contributor Version" means the combination of the Original - Code, prior Modifications used by a Contributor, and the Modifications - made by that particular Contributor. - - 1.3. "Covered Code" means the Original Code or Modifications or the - combination of the Original Code and Modifications, in each case - including portions thereof. - - 1.4. "Electronic Distribution Mechanism" means a mechanism generally - accepted in the software development community for the electronic - transfer of data. - - 1.5. "Executable" means Covered Code in any form other than Source - Code. - - 1.6. "Initial Developer" means the individual or entity identified - as the Initial Developer in the Source Code notice required by Exhibit - A. - - 1.7. "Larger Work" means a work which combines Covered Code or - portions thereof with code not governed by the terms of this License. - - 1.8. "License" means this document. - - 1.8.1. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed herein. - - 1.9. "Modifications" means any addition to or deletion from the - substance or structure of either the Original Code or any previous - Modifications. When Covered Code is released as a series of files, a - Modification is: - A. Any addition to or deletion from the contents of a file - containing Original Code or previous Modifications. - - B. Any new file that contains any part of the Original Code or - previous Modifications. - - 1.10. "Original Code" means Source Code of computer software code - which is described in the Source Code notice required by Exhibit A as - Original Code, and which, at the time of its release under this - License is not already Covered Code governed by this License. - - 1.10.1. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, process, - and apparatus claims, in any patent Licensable by grantor. - - 1.11. "Source Code" means the preferred form of the Covered Code for - making modifications to it, including all modules it contains, plus - any associated interface definition files, scripts used to control - compilation and installation of an Executable, or source code - differential comparisons against either the Original Code or another - well known, available Covered Code of the Contributor's choice. The - Source Code can be in a compressed or archival form, provided the - appropriate decompression or de-archiving software is widely available - for no charge. - - 1.12. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms of, this - License or a future version of this License issued under Section 6.1. - For legal entities, "You" includes any entity which controls, is - controlled by, or is under common control with You. For purposes of - this definition, "control" means (a) the power, direct or indirect, - to cause the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty percent - (50%) of the outstanding shares or beneficial ownership of such - entity. - -2. Source Code License. - - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, royalty-free, - non-exclusive license, subject to third party intellectual property - claims: - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer to use, reproduce, - modify, display, perform, sublicense and distribute the Original - Code (or portions thereof) with or without Modifications, and/or - as part of a Larger Work; and - - (b) under Patents Claims infringed by the making, using or - selling of Original Code, to make, have made, use, practice, - sell, and offer for sale, and/or otherwise dispose of the - Original Code (or portions thereof). - - (c) the licenses granted in this Section 2.1(a) and (b) are - effective on the date Initial Developer first distributes - Original Code under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: 1) for code that You delete from the Original Code; 2) - separate from the Original Code; or 3) for infringements caused - by: i) the modification of the Original Code or ii) the - combination of the Original Code with other software or devices. - - 2.2. Contributor Grant. - Subject to third party intellectual property claims, each Contributor - hereby grants You a world-wide, royalty-free, non-exclusive license - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor, to use, reproduce, modify, - display, perform, sublicense and distribute the Modifications - created by such Contributor (or portions thereof) either on an - unmodified basis, with other Modifications, as Covered Code - and/or as part of a Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either alone - and/or in combination with its Contributor Version (or portions - of such combination), to make, use, sell, offer for sale, have - made, and/or otherwise dispose of: 1) Modifications made by that - Contributor (or portions thereof); and 2) the combination of - Modifications made by that Contributor with its Contributor - Version (or portions of such combination). - - (c) the licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first makes Commercial Use of - the Covered Code. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: 1) for any code that Contributor has deleted from the - Contributor Version; 2) separate from the Contributor Version; - 3) for infringements caused by: i) third party modifications of - Contributor Version or ii) the combination of Modifications made - by that Contributor with other software (except as part of the - Contributor Version) or other devices; or 4) under Patent Claims - infringed by Covered Code in the absence of Modifications made by - that Contributor. - -3. Distribution Obligations. - - 3.1. Application of License. - The Modifications which You create or to which You contribute are - governed by the terms of this License, including without limitation - Section 2.2. The Source Code version of Covered Code may be - distributed only under the terms of this License or a future version - of this License released under Section 6.1, and You must include a - copy of this License with every copy of the Source Code You - distribute. You may not offer or impose any terms on any Source Code - version that alters or restricts the applicable version of this - License or the recipients' rights hereunder. However, You may include - an additional document offering the additional rights described in - Section 3.5. - - 3.2. Availability of Source Code. - Any Modification which You create or to which You contribute must be - made available in Source Code form under the terms of this License - either on the same media as an Executable version or via an accepted - Electronic Distribution Mechanism to anyone to whom you made an - Executable version available; and if made available via Electronic - Distribution Mechanism, must remain available for at least twelve (12) - months after the date it initially became available, or at least six - (6) months after a subsequent version of that particular Modification - has been made available to such recipients. You are responsible for - ensuring that the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a third party. - - 3.3. Description of Modifications. - You must cause all Covered Code to which You contribute to contain a - file documenting the changes You made to create that Covered Code and - the date of any change. You must include a prominent statement that - the Modification is derived, directly or indirectly, from Original - Code provided by the Initial Developer and including the name of the - Initial Developer in (a) the Source Code, and (b) in any notice in an - Executable version or related documentation in which You describe the - origin or ownership of the Covered Code. - - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If Contributor has knowledge that a license under a third party's - intellectual property rights is required to exercise the rights - granted by such Contributor under Sections 2.1 or 2.2, - Contributor must include a text file with the Source Code - distribution titled "LEGAL" which describes the claim and the - party making the claim in sufficient detail that a recipient will - know whom to contact. If Contributor obtains such knowledge after - the Modification is made available as described in Section 3.2, - Contributor shall promptly modify the LEGAL file in all copies - Contributor makes available thereafter and shall take other steps - (such as notifying appropriate mailing lists or newsgroups) - reasonably calculated to inform those who received the Covered - Code that new knowledge has been obtained. - - (b) Contributor APIs. - If Contributor's Modifications include an application programming - interface and Contributor has knowledge of patent licenses which - are reasonably necessary to implement that API, Contributor must - also include this information in the LEGAL file. - - (c) Representations. - Contributor represents that, except as disclosed pursuant to - Section 3.4(a) above, Contributor believes that Contributor's - Modifications are Contributor's original creation(s) and/or - Contributor has sufficient rights to grant the rights conveyed by - this License. - - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each file of the Source - Code. If it is not possible to put such notice in a particular Source - Code file due to its structure, then You must include such notice in a - location (such as a relevant directory) where a user would be likely - to look for such a notice. If You created one or more Modification(s) - You may add your name as a Contributor to the notice described in - Exhibit A. You must also duplicate this License in any documentation - for the Source Code where You describe recipients' rights or ownership - rights relating to Covered Code. You may choose to offer, and to - charge a fee for, warranty, support, indemnity or liability - obligations to one or more recipients of Covered Code. However, You - may do so only on Your own behalf, and not on behalf of the Initial - Developer or any Contributor. You must make it absolutely clear than - any such warranty, support, indemnity or liability obligation is - offered by You alone, and You hereby agree to indemnify the Initial - Developer and every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of warranty, - support, indemnity or liability terms You offer. - - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form only if the - requirements of Section 3.1-3.5 have been met for that Covered Code, - and if You include a notice stating that the Source Code version of - the Covered Code is available under the terms of this License, - including a description of how and where You have fulfilled the - obligations of Section 3.2. The notice must be conspicuously included - in any notice in an Executable version, related documentation or - collateral in which You describe recipients' rights relating to the - Covered Code. You may distribute the Executable version of Covered - Code or ownership rights under a license of Your choice, which may - contain terms different from this License, provided that You are in - compliance with the terms of this License and that the license for the - Executable version does not attempt to limit or alter the recipient's - rights in the Source Code version from the rights set forth in this - License. If You distribute the Executable version under a different - license You must make it absolutely clear that any terms which differ - from this License are offered by You alone, not by the Initial - Developer or any Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred by - the Initial Developer or such Contributor as a result of any such - terms You offer. - - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code with other code - not governed by the terms of this License and distribute the Larger - Work as a single product. In such a case, You must make sure the - requirements of this License are fulfilled for the Covered Code. - -4. Inability to Comply Due to Statute or Regulation. - - If it is impossible for You to comply with any of the terms of this - License with respect to some or all of the Covered Code due to - statute, judicial order, or regulation then You must: (a) comply with - the terms of this License to the maximum extent possible; and (b) - describe the limitations and the code they affect. Such description - must be included in the LEGAL file described in Section 3.4 and must - be included with all distributions of the Source Code. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Application of this License. - - This License applies to code to which the Initial Developer has - attached the notice in Exhibit A and to related Covered Code. - -6. Versions of the License. - - 6.1. New Versions. - Netscape Communications Corporation ("Netscape") may publish revised - and/or new versions of the License from time to time. Each version - will be given a distinguishing version number. - - 6.2. Effect of New Versions. - Once Covered Code has been published under a particular version of the - License, You may always continue to use it under the terms of that - version. You may also choose to use such Covered Code under the terms - of any subsequent version of the License published by Netscape. No one - other than Netscape has the right to modify the terms applicable to - Covered Code created under this License. - - 6.3. Derivative Works. - If You create or use a modified version of this License (which you may - only do in order to apply it to code which is not already Covered Code - governed by this License), You must (a) rename Your license so that - the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", - "MPL", "NPL" or any confusingly similar phrase do not appear in your - license (except to note that your license differs from this License) - and (b) otherwise make it clear that Your version of the license - contains terms which differ from the Mozilla Public License and - Netscape Public License. (Filling in the name of the Initial - Developer, Original Code or Contributor in the notice described in - Exhibit A shall not of themselves be deemed to be modifications of - this License.) - -7. DISCLAIMER OF WARRANTY. - - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF - DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. - THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE - IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, - YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE - COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER - OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -8. TERMINATION. - - 8.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to cure - such breach within 30 days of becoming aware of the breach. All - sublicenses to the Covered Code which are properly granted shall - survive any termination of this License. Provisions which, by their - nature, must remain in effect beyond the termination of this License - shall survive. - - 8.2. If You initiate litigation by asserting a patent infringement - claim (excluding declatory judgment actions) against Initial Developer - or a Contributor (the Initial Developer or Contributor against whom - You file such action is referred to as "Participant") alleging that: - - (a) such Participant's Contributor Version directly or indirectly - infringes any patent, then any and all rights granted by such - Participant to You under Sections 2.1 and/or 2.2 of this License - shall, upon 60 days notice from Participant terminate prospectively, - unless if within 60 days after receipt of notice You either: (i) - agree in writing to pay Participant a mutually agreeable reasonable - royalty for Your past and future use of Modifications made by such - Participant, or (ii) withdraw Your litigation claim with respect to - the Contributor Version against such Participant. If within 60 days - of notice, a reasonable royalty and payment arrangement are not - mutually agreed upon in writing by the parties or the litigation claim - is not withdrawn, the rights granted by Participant to You under - Sections 2.1 and/or 2.2 automatically terminate at the expiration of - the 60 day notice period specified above. - - (b) any software, hardware, or device, other than such Participant's - Contributor Version, directly or indirectly infringes any patent, then - any rights granted to You by such Participant under Sections 2.1(b) - and 2.2(b) are revoked effective as of the date You first made, used, - sold, distributed, or had made, Modifications made by that - Participant. - - 8.3. If You assert a patent infringement claim against Participant - alleging that such Participant's Contributor Version directly or - indirectly infringes any patent where such claim is resolved (such as - by license or settlement) prior to the initiation of patent - infringement litigation, then the reasonable value of the licenses - granted by such Participant under Sections 2.1 or 2.2 shall be taken - into account in determining the amount or value of any payment or - license. - - 8.4. In the event of termination under Sections 8.1 or 8.2 above, - all end user license agreements (excluding distributors and resellers) - which have been validly granted by You or any distributor hereunder - prior to termination shall survive termination. - -9. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL - DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, - OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR - ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY - CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, - WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY - RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW - PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE - EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO - THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -10. U.S. GOVERNMENT END USERS. - - The Covered Code is a "commercial item," as that term is defined in - 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer - software" and "commercial computer software documentation," as such - terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 - C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), - all U.S. Government End Users acquire Covered Code with only those - rights set forth herein. - -11. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed by - California law provisions (except to the extent applicable law, if - any, provides otherwise), excluding its conflict-of-law provisions. - With respect to disputes in which at least one party is a citizen of, - or an entity chartered or registered to do business in the United - States of America, any litigation relating to this License shall be - subject to the jurisdiction of the Federal Courts of the Northern - District of California, with venue lying in Santa Clara County, - California, with the losing party responsible for costs, including - without limitation, court costs and reasonable attorneys' fees and - expenses. The application of the United Nations Convention on - Contracts for the International Sale of Goods is expressly excluded. - Any law or regulation which provides that the language of a contract - shall be construed against the drafter shall not apply to this - License. - -12. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or indirectly, - out of its utilization of rights under this License and You agree to - work with Initial Developer and Contributors to distribute such - responsibility on an equitable basis. Nothing herein is intended or - shall be deemed to constitute any admission of liability. - -13. MULTIPLE-LICENSED CODE. - - Initial Developer may designate portions of the Covered Code as - "Multiple-Licensed". "Multiple-Licensed" means that the Initial - Developer permits you to utilize portions of the Covered Code under - Your choice of the NPL or the alternative licenses, if any, specified - by the Initial Developer in the file described in Exhibit A. - -EXHIBIT A -Mozilla Public License. - - ``The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - - The Original Code is ______________________________________. - - The Initial Developer of the Original Code is ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. - - Contributor(s): ______________________________________. - - Alternatively, the contents of this file may be used under the terms - of the _____ license (the "[___] License"), in which case the - provisions of [______] License are applicable instead of those - above. If you wish to allow use of your version of this file only - under the terms of the [____] License and not to allow others to use - your version of this file under the MPL, indicate your decision by - deleting the provisions above and replace them with the notice and - other provisions required by the [___] License. If you do not delete - the provisions above, a recipient may use your version of this file - under either the MPL or the [___] License." - - [NOTE: The text of this Exhibit A may differ slightly from the text of - the notices in the Source Code files of the Original Code. You should - use the text of this Exhibit A rather than the text found in the - Original Code Source Code for Your Modifications.] + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] diff --git a/pixastic.core.js b/pixastic.core.js index 68943b6..f616e07 100755 --- a/pixastic.core.js +++ b/pixastic.core.js @@ -1,435 +1,435 @@ -/* - * Pixastic Lib - Core Functions - v0.1.3 - * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ - * License: [http://www.pixastic.com/lib/license.txt] - */ - -var Pixastic = (function() { - - - function addEvent(el, event, handler) { - if (el.addEventListener) - el.addEventListener(event, handler, false); - else if (el.attachEvent) - el.attachEvent("on" + event, handler); - } - - function onready(handler) { - var handlerDone = false; - var execHandler = function() { - if (!handlerDone) { - handlerDone = true; - handler(); - } - } - document.write("<"+"script defer src=\"//:\" id=\"__onload_ie_pixastic__\">"); - var script = document.getElementById("__onload_ie_pixastic__"); - script.onreadystatechange = function() { - if (script.readyState == "complete") { - script.parentNode.removeChild(script); - execHandler(); - } - } - if (document.addEventListener) - document.addEventListener("DOMContentLoaded", execHandler, false); - addEvent(window, "load", execHandler); - } - - function init() { - var imgEls = getElementsByClass("pixastic", null, "img"); - var canvasEls = getElementsByClass("pixastic", null, "canvas"); - var elements = imgEls.concat(canvasEls); - for (var i=0;i -1) { - var tmp = actionName; - actionName = tmp.substr(0, tmp.indexOf("(")); - var arg = tmp.match(/\((.*?)\)/); - if (arg[1]) { - arg = arg[1].split(";"); - for (var a=0;a"); + var script = document.getElementById("__onload_ie_pixastic__"); + script.onreadystatechange = function() { + if (script.readyState == "complete") { + script.parentNode.removeChild(script); + execHandler(); + } + } + if (document.addEventListener) + document.addEventListener("DOMContentLoaded", execHandler, false); + addEvent(window, "load", execHandler); + } + + function init() { + var imgEls = getElementsByClass("pixastic", null, "img"); + var canvasEls = getElementsByClass("pixastic", null, "canvas"); + var elements = imgEls.concat(canvasEls); + for (var i=0;i -1) { + var tmp = actionName; + actionName = tmp.substr(0, tmp.indexOf("(")); + var arg = tmp.match(/\((.*?)\)/); + if (arg[1]) { + arg = arg[1].split(";"); + for (var a=0;a 0) - return jQuery(newElements); - else - return this; - }; - -}; +/* + * Pixastic Lib - jQuery plugin + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * License: [http://www.pixastic.com/lib/license.txt] + */ + +if (typeof jQuery != "undefined" && jQuery && jQuery.fn) { + jQuery.fn.pixastic = function(action, options) { + var newElements = []; + this.each( + function () { + if (this.tagName.toLowerCase() == "img" && !this.complete) { + return; + } + var res = Pixastic.process(this, action, options); + if (res) { + newElements.push(res); + } + } + ); + if (newElements.length > 0) + return jQuery(newElements); + else + return this; + }; + +};