diff --git a/ajax/libs/camanjs/4.0.0/caman.full.js b/ajax/libs/camanjs/4.0.0/caman.full.js new file mode 100755 index 000000000..acd9f36f6 --- /dev/null +++ b/ajax/libs/camanjs/4.0.0/caman.full.js @@ -0,0 +1,3186 @@ +// Generated by CoffeeScript 1.4.0 +(function() { + var $, Analyze, Blender, Calculate, Caman, CamanParser, Canvas, Convert, Event, Fiber, Filter, IO, Image, Layer, Log, Logger, PixelInfo, Plugin, Renderer, Root, Store, Util, fs, slice, vignetteFilters, + __hasProp = {}.hasOwnProperty, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __slice = [].slice; + + slice = Array.prototype.slice; + + $ = function(sel, root) { + if (root == null) { + root = document; + } + if (typeof sel === "object" || (typeof exports !== "undefined" && exports !== null)) { + return sel; + } + return root.querySelector(sel); + }; + + Util = (function() { + + function Util() {} + + Util.uniqid = (function() { + var id; + id = 0; + return { + get: function() { + return id++; + } + }; + })(); + + Util.extend = function(obj) { + var copy, dest, prop, src, _i, _len; + dest = obj; + src = slice.call(arguments, 1); + for (_i = 0, _len = src.length; _i < _len; _i++) { + copy = src[_i]; + for (prop in copy) { + if (!__hasProp.call(copy, prop)) continue; + dest[prop] = copy[prop]; + } + } + return dest; + }; + + Util.clampRGB = function(val) { + if (val < 0) { + return 0; + } + if (val > 255) { + return 255; + } + return val; + }; + + Util.copyAttributes = function(from, to, opts) { + var attr, _i, _len, _ref, _ref1, _results; + if (opts == null) { + opts = {}; + } + _ref = from.attributes; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + attr = _ref[_i]; + if ((opts.except != null) && (_ref1 = attr.nodeName, __indexOf.call(opts.except, _ref1) >= 0)) { + continue; + } + _results.push(to.setAttribute(attr.nodeName, attr.nodeValue)); + } + return _results; + }; + + return Util; + + })(); + + if (typeof exports !== "undefined" && exports !== null) { + Root = exports; + Canvas = require('canvas'); + Image = Canvas.Image; + Fiber = require('fibers'); + fs = require('fs'); + } else { + Root = window; + } + + Root.Caman = Caman = (function() { + + Caman.version = { + release: "4.0.0", + date: "1/6/13" + }; + + Caman.DEBUG = false; + + Caman.NodeJS = typeof exports !== "undefined" && exports !== null; + + Caman.autoload = !Caman.NodeJS; + + Caman.crossOrigin = "anonymous"; + + Caman.toString = function() { + return "Version " + Caman.version.release + ", Released " + Caman.version.date; + }; + + Caman.remoteProxy = ""; + + Caman.proxyParam = "camanProxyUrl"; + + Caman.getAttrId = function(canvas) { + if (typeof canvas === "string") { + canvas = $(canvas); + } + if (!((canvas != null) && (canvas.getAttribute != null))) { + return null; + } + return canvas.getAttribute('data-caman-id'); + }; + + function Caman() { + var args, callback, id, + _this = this; + if (arguments.length === 0) { + throw "Invalid arguments"; + } + if (this instanceof Caman) { + this.finishInit = this.finishInit.bind(this); + this.imageLoaded = this.imageLoaded.bind(this); + args = arguments[0]; + if (!Caman.NodeJS) { + id = parseInt(Caman.getAttrId(args[0]), 10); + callback = typeof args[1] === "function" ? args[1] : typeof args[2] === "function" ? args[2] : function() {}; + if (!isNaN(id) && Store.has(id)) { + return Store.execute(id, callback); + } + } + this.id = Util.uniqid.get(); + this.originalPixelData = []; + this.pixelStack = []; + this.layerStack = []; + this.canvasQueue = []; + this.currentLayer = null; + this.scaled = false; + this.analyze = new Analyze(this); + this.renderer = new Renderer(this); + this.domIsLoaded(function() { + _this.parseArguments(args); + return _this.setup(); + }); + return this; + } else { + return new Caman(arguments); + } + } + + Caman.prototype.domIsLoaded = function(cb) { + var listener, + _this = this; + if (Caman.NodeJS) { + return setTimeout(function() { + return cb.call(_this); + }, 0); + } else { + if (document.readyState === "complete") { + Log.debug("DOM initialized"); + return setTimeout(function() { + return cb.call(_this); + }, 0); + } else { + listener = function() { + if (document.readyState === "complete") { + Log.debug("DOM initialized"); + return cb.call(_this); + } + }; + return document.addEventListener("readystatechange", listener, false); + } + } + }; + + Caman.prototype.parseArguments = function(args) { + if (args.length === 0) { + throw "Invalid arguments given"; + } + this.initObj = null; + this.initType = null; + this.imageUrl = null; + this.callback = function() {}; + this.setInitObject(args[0]); + if (args.length === 1) { + return; + } + switch (typeof args[1]) { + case "string": + this.imageUrl = args[1]; + break; + case "function": + this.callback = args[1]; + } + if (args.length === 2) { + return; + } + return this.callback = args[2]; + }; + + Caman.prototype.setInitObject = function(obj) { + if (Caman.NodeJS) { + this.initObj = obj; + this.initType = 'node'; + return; + } + if (typeof obj === "object") { + this.initObj = obj; + } else { + this.initObj = $(obj); + } + return this.initType = this.initObj.nodeName.toLowerCase(); + }; + + Caman.prototype.setup = function() { + switch (this.initType) { + case "node": + return this.initNode(); + case "img": + return this.initImage(); + case "canvas": + return this.initCanvas(); + } + }; + + Caman.prototype.initNode = function() { + var _this = this; + Log.debug("Initializing for NodeJS"); + this.image = new Image(); + this.image.onload = function() { + Log.debug("Image loaded. Width = " + _this.image.width + ", Height = " + _this.image.height); + _this.canvas = new Canvas(_this.image.width, _this.image.height); + return _this.finishInit(); + }; + this.image.onerror = function(err) { + throw err; + }; + return this.image.src = this.initObj; + }; + + Caman.prototype.initImage = function() { + this.image = this.initObj; + this.canvas = document.createElement('canvas'); + this.context = this.canvas.getContext('2d'); + Util.copyAttributes(this.image, this.canvas, { + except: ['src'] + }); + this.image.parentNode.replaceChild(this.canvas, this.image); + this.imageAdjustments(); + return this.waitForImageLoaded(); + }; + + Caman.prototype.initCanvas = function() { + this.canvas = this.initObj; + this.context = this.canvas.getContext('2d'); + if (this.imageUrl != null) { + this.image = document.createElement('img'); + this.image.src = this.imageUrl; + this.imageAdjustments(); + return this.waitForImageLoaded(); + } else { + return this.finishInit(); + } + }; + + Caman.prototype.imageAdjustments = function() { + if (this.needsHiDPISwap()) { + Log.debug(this.image.src, "->", this.hiDPIReplacement()); + this.swapped = true; + this.image.src = this.hiDPIReplacement(); + } + if (IO.isRemote(this.image)) { + this.image.src = IO.proxyUrl(this.image.src); + return Log.debug("Remote image detected, using URL = " + this.image.src); + } + }; + + Caman.prototype.waitForImageLoaded = function() { + if (this.image.complete) { + return this.imageLoaded(); + } else { + return this.image.onload = this.imageLoaded; + } + }; + + Caman.prototype.imageLoaded = function() { + Log.debug("Image loaded. Width = " + this.image.width + ", Height = " + this.image.height); + if (this.swapped) { + this.canvas.width = this.image.width / this.hiDPIRatio(); + this.canvas.height = this.image.height / this.hiDPIRatio(); + } else { + this.canvas.width = this.image.width; + this.canvas.height = this.image.height; + } + return this.finishInit(); + }; + + Caman.prototype.finishInit = function() { + var pixel, _i, _len, _ref; + if (this.context == null) { + this.context = this.canvas.getContext('2d'); + } + this.originalWidth = this.width = this.canvas.width; + this.originalHeight = this.height = this.canvas.height; + this.hiDPIAdjustments(); + this.assignId(); + if (this.image != null) { + this.context.drawImage(this.image, 0, 0, this.image.width, this.image.height, 0, 0, this.originalWidth, this.originalHeight); + } + this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); + this.pixelData = this.imageData.data; + _ref = this.pixelData; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + pixel = _ref[_i]; + this.originalPixelData.push(pixel); + } + this.dimensions = { + width: this.canvas.width, + height: this.canvas.height + }; + Store.put(this.id, this); + return this.callback.call(this, this); + }; + + Caman.prototype.assignId = function() { + if (Caman.NodeJS || this.canvas.getAttribute('data-caman-id')) { + return; + } + return this.canvas.setAttribute('data-caman-id', this.id); + }; + + Caman.prototype.hiDPIDisabled = function() { + return this.canvas.getAttribute('data-caman-hidpi-disabled') !== null; + }; + + Caman.prototype.hiDPIAdjustments = function() { + var ratio; + if (Caman.NodeJS || this.hiDPIDisabled()) { + return; + } + ratio = this.hiDPIRatio(); + if (ratio !== 1) { + Log.debug("HiDPI ratio = " + ratio); + this.scaled = true; + this.originalWidth = this.canvas.width; + this.originalHeight = this.canvas.height; + this.canvas.width = this.originalWidth * ratio; + this.canvas.height = this.originalHeight * ratio; + this.canvas.style.width = "" + this.originalWidth + "px"; + this.canvas.style.height = "" + this.originalHeight + "px"; + this.context.scale(ratio, ratio); + this.width = this.canvas.width; + return this.height = this.canvas.height; + } + }; + + Caman.prototype.hiDPIRatio = function() { + var backingStoreRatio, devicePixelRatio; + devicePixelRatio = window.devicePixelRatio || 1; + backingStoreRatio = this.context.webkitBackingStorePixelRatio || this.context.mozBackingStorePixelRatio || this.context.msBackingStorePixelRatio || this.context.oBackingStorePixelRatio || this.context.backingStorePixelRatio || 1; + return devicePixelRatio / backingStoreRatio; + }; + + Caman.prototype.hiDPICapable = function() { + return window.devicePixelRatio !== 1; + }; + + Caman.prototype.needsHiDPISwap = function() { + if (this.hiDPIDisabled() || !this.hiDPICapable()) { + return false; + } + return this.hiDPIReplacement() !== null; + }; + + Caman.prototype.hiDPIReplacement = function() { + if (this.image == null) { + return null; + } + return this.image.getAttribute('data-caman-hidpi'); + }; + + Caman.prototype.replaceCanvas = function(newCanvas) { + var oldCanvas; + oldCanvas = this.canvas; + this.canvas = newCanvas; + oldCanvas.parentNode.replaceChild(this.canvas, oldCanvas); + return this.finishInit(); + }; + + Caman.prototype.render = function(callback) { + var _this = this; + if (callback == null) { + callback = function() {}; + } + Event.trigger(this, "renderStart"); + return this.renderer.execute(function() { + _this.context.putImageData(_this.imageData, 0, 0); + return callback.call(_this); + }); + }; + + Caman.prototype.revert = function(ready) { + var i, pixel, _i, _len, _ref; + if (ready == null) { + ready = function() {}; + } + _ref = this.originalPixelData; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + pixel = _ref[i]; + this.pixelData[i] = pixel; + } + this.context.putImageData(this.imageData, 0, 0); + return ready.call(this); + }; + + Caman.prototype.process = function(name, processFn) { + this.renderer.add({ + type: Filter.Type.Single, + name: name, + processFn: processFn + }); + return this; + }; + + Caman.prototype.processKernel = function(name, adjust, divisor, bias) { + var i, _i, _ref; + if (!divisor) { + divisor = 0; + for (i = _i = 0, _ref = adjust.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + divisor += adjust[i]; + } + } + this.renderer.add({ + type: Filter.Type.Kernel, + name: name, + adjust: adjust, + divisor: divisor, + bias: bias || 0 + }); + return this; + }; + + Caman.prototype.processPlugin = function(plugin, args) { + this.renderer.add({ + type: Filter.Type.Plugin, + plugin: plugin, + args: args + }); + return this; + }; + + Caman.prototype.newLayer = function(callback) { + var layer; + layer = new Layer(this); + this.canvasQueue.push(layer); + this.renderer.add({ + type: Filter.Type.LayerDequeue + }); + callback.call(layer); + this.renderer.add({ + type: Filter.Type.LayerFinished + }); + return this; + }; + + Caman.prototype.executeLayer = function(layer) { + return this.pushContext(layer); + }; + + Caman.prototype.pushContext = function(layer) { + this.layerStack.push(this.currentLayer); + this.pixelStack.push(this.pixelData); + this.currentLayer = layer; + return this.pixelData = layer.pixelData; + }; + + Caman.prototype.popContext = function() { + this.pixelData = this.pixelStack.pop(); + return this.currentLayer = this.layerStack.pop(); + }; + + Caman.prototype.applyCurrentLayer = function() { + return this.currentLayer.applyToParent(); + }; + + return Caman; + + })(); + + Analyze = (function() { + + function Analyze(c) { + this.c = c; + } + + Analyze.prototype.calculateLevels = function() { + var i, levels, numPixels, _i, _j, _k, _ref; + levels = { + r: {}, + g: {}, + b: {} + }; + for (i = _i = 0; _i <= 255; i = ++_i) { + levels.r[i] = 0; + levels.g[i] = 0; + levels.b[i] = 0; + } + for (i = _j = 0, _ref = this.c.pixelData.length; _j < _ref; i = _j += 4) { + levels.r[this.c.pixelData[i]]++; + levels.g[this.c.pixelData[i + 1]]++; + levels.b[this.c.pixelData[i + 2]]++; + } + numPixels = this.c.pixelData.length / 4; + for (i = _k = 0; _k <= 255; i = ++_k) { + levels.r[i] /= numPixels; + levels.g[i] /= numPixels; + levels.b[i] /= numPixels; + } + return levels; + }; + + return Analyze; + + })(); + + Caman.DOMUpdated = function() { + var img, imgs, parser, _i, _len, _results; + imgs = document.querySelectorAll("img[data-caman]"); + if (!(imgs.length > 0)) { + return; + } + _results = []; + for (_i = 0, _len = imgs.length; _i < _len; _i++) { + img = imgs[_i]; + _results.push(parser = new CamanParser(img, function() { + this.parse(); + return this.execute(); + })); + } + return _results; + }; + + if (Caman.autoload) { + (function() { + if (document.readyState === "complete") { + return Caman.DOMUpdated(); + } else { + return document.addEventListener("DOMContentLoaded", Caman.DOMUpdated, false); + } + })(); + } + + CamanParser = (function() { + var INST_REGEX; + + INST_REGEX = "(\\w+)\\((.*?)\\)"; + + function CamanParser(ele, ready) { + this.dataStr = ele.getAttribute('data-caman'); + this.caman = Caman(ele, ready.bind(this)); + } + + CamanParser.prototype.parse = function() { + var args, filter, func, inst, instFunc, m, r, unparsedInstructions, _i, _len, _ref, _results; + this.ele = this.caman.canvas; + r = new RegExp(INST_REGEX, 'g'); + unparsedInstructions = this.dataStr.match(r); + if (!(unparsedInstructions.length > 0)) { + return; + } + r = new RegExp(INST_REGEX); + _results = []; + for (_i = 0, _len = unparsedInstructions.length; _i < _len; _i++) { + inst = unparsedInstructions[_i]; + _ref = inst.match(r), m = _ref[0], filter = _ref[1], args = _ref[2]; + instFunc = new Function("return function() { this." + filter + "(" + args + "); };"); + try { + func = instFunc(); + _results.push(func.call(this.caman)); + } catch (e) { + _results.push(Log.debug(e)); + } + } + return _results; + }; + + CamanParser.prototype.execute = function() { + var ele; + ele = this.ele; + return this.caman.render(function() { + return ele.parentNode.replaceChild(this.toImage(), ele); + }); + }; + + return CamanParser; + + })(); + + Caman.Blender = Blender = (function() { + + function Blender() {} + + Blender.blenders = {}; + + Blender.register = function(name, func) { + return this.blenders[name] = func; + }; + + Blender.execute = function(name, rgbaLayer, rgbaParent) { + return this.blenders[name](rgbaLayer, rgbaParent); + }; + + return Blender; + + })(); + + Caman.Calculate = Calculate = (function() { + + function Calculate() {} + + Calculate.distance = function(x1, y1, x2, y2) { + return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + }; + + Calculate.randomRange = function(min, max, getFloat) { + var rand; + if (getFloat == null) { + getFloat = false; + } + rand = min + (Math.random() * (max - min)); + if (getFloat) { + return rand.toFixed(getFloat); + } else { + return Math.round(rand); + } + }; + + Calculate.luminance = function(rgba) { + return (0.299 * rgba.r) + (0.587 * rgba.g) + (0.114 * rgba.b); + }; + + Calculate.bezier = function(start, ctrl1, ctrl2, end, lowBound, highBound) { + var Ax, Ay, Bx, By, Cx, Cy, bezier, curveX, curveY, i, j, leftCoord, rightCoord, t, x0, x1, x2, x3, y0, y1, y2, y3, _i, _j, _k, _ref, _ref1; + x0 = start[0]; + y0 = start[1]; + x1 = ctrl1[0]; + y1 = ctrl1[1]; + x2 = ctrl2[0]; + y2 = ctrl2[1]; + x3 = end[0]; + y3 = end[1]; + bezier = {}; + Cx = parseInt(3 * (x1 - x0), 10); + Bx = 3 * (x2 - x1) - Cx; + Ax = x3 - x0 - Cx - Bx; + Cy = 3 * (y1 - y0); + By = 3 * (y2 - y1) - Cy; + Ay = y3 - y0 - Cy - By; + for (i = _i = 0; _i < 1000; i = ++_i) { + t = i / 1000; + curveX = Math.round((Ax * Math.pow(t, 3)) + (Bx * Math.pow(t, 2)) + (Cx * t) + x0); + curveY = Math.round((Ay * Math.pow(t, 3)) + (By * Math.pow(t, 2)) + (Cy * t) + y0); + if (lowBound && curveY < lowBound) { + curveY = lowBound; + } else if (highBound && curveY > highBound) { + curveY = highBound; + } + bezier[curveX] = curveY; + } + if (bezier.length < end[0] + 1) { + for (i = _j = 0, _ref = end[0]; 0 <= _ref ? _j <= _ref : _j >= _ref; i = 0 <= _ref ? ++_j : --_j) { + if (!(bezier[i] != null)) { + leftCoord = [i - 1, bezier[i - 1]]; + for (j = _k = i, _ref1 = end[0]; i <= _ref1 ? _k <= _ref1 : _k >= _ref1; j = i <= _ref1 ? ++_k : --_k) { + if (bezier[j] != null) { + rightCoord = [j, bezier[j]]; + break; + } + } + bezier[i] = leftCoord[1] + ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * (i - leftCoord[0]); + } + } + } + if (!(bezier[end[0]] != null)) { + bezier[end[0]] = bezier[end[0] - 1]; + } + return bezier; + }; + + return Calculate; + + })(); + + Convert = (function() { + + function Convert() {} + + Convert.hexToRGB = function(hex) { + var b, g, r; + if (hex.charAt(0) === "#") { + hex = hex.substr(1); + } + r = parseInt(hex.substr(0, 2), 16); + g = parseInt(hex.substr(2, 2), 16); + b = parseInt(hex.substr(4, 2), 16); + return { + r: r, + g: g, + b: b + }; + }; + + Convert.rgbToHSL = function(r, g, b) { + var d, h, l, max, min, s; + if (typeof r === "object") { + g = r.g; + b = r.b; + r = r.r; + } + r /= 255; + g /= 255; + b /= 255; + max = Math.max(r, g, b); + min = Math.min(r, g, b); + l = (max + min) / 2; + if (max === min) { + h = s = 0; + } else { + d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + h = (function() { + switch (max) { + case r: + return (g - b) / d + (g < b ? 6 : 0); + case g: + return (b - r) / d + 2; + case b: + return (r - g) / d + 4; + } + })(); + h /= 6; + } + return { + h: h, + s: s, + l: l + }; + }; + + Convert.hslToRGB = function(h, s, l) { + var b, g, p, q, r; + if (typeof h === "object") { + s = h.s; + l = h.l; + h = h.h; + } + if (s === 0) { + r = g = b = l; + } else { + q = l < 0.5 ? l * (1 + s) : l + s - l * s; + p = 2 * l - q; + r = this.hueToRGB(p, q, h + 1 / 3); + g = this.hueToRGB(p, q, h); + b = this.hueToRGB(p, q, h - 1 / 3); + } + return { + r: r * 255, + g: g * 255, + b: b * 255 + }; + }; + + Convert.hueToRGB = function(p, q, t) { + if (t < 0) { + t += 1; + } + if (t > 1) { + t -= 1; + } + if (t < 1 / 6) { + return p + (q - p) * 6 * t; + } + if (t < 1 / 2) { + return q; + } + if (t < 2 / 3) { + return p + (q - p) * (2 / 3 - t) * 6; + } + return p; + }; + + Convert.rgbToHSV = function(r, g, b) { + var d, h, max, min, s, v; + r /= 255; + g /= 255; + b /= 255; + max = Math.max(r, g, b); + min = Math.min(r, g, b); + v = max; + d = max - min; + s = max === 0 ? 0 : d / max; + if (max === min) { + h = 0; + } else { + h = (function() { + switch (max) { + case r: + return (g - b) / d + (g < b ? 6 : 0); + case g: + return (b - r) / d + 2; + case b: + return (r - g) / d + 4; + } + })(); + h /= 6; + } + return { + h: h, + s: s, + v: v + }; + }; + + Convert.hsvToRGB = function(h, s, v) { + var b, f, g, i, p, q, r, t; + i = Math.floor(h * 6); + f = h * 6 - i; + p = v * (1 - s); + q = v * (1 - f * s); + t = v * (1 - (1 - f) * s); + switch (i % 6) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + case 5: + r = v; + g = p; + b = q; + } + return { + r: r * 255, + g: g * 255, + b: b * 255 + }; + }; + + Convert.rgbToXYZ = function(r, g, b) { + var x, y, z; + r /= 255; + g /= 255; + b /= 255; + if (r > 0.04045) { + r = Math.pow((r + 0.055) / 1.055, 2.4); + } else { + r /= 12.92; + } + if (g > 0.04045) { + g = Math.pow((g + 0.055) / 1.055, 2.4); + } else { + g /= 12.92; + } + if (b > 0.04045) { + b = Math.pow((b + 0.055) / 1.055, 2.4); + } else { + b /= 12.92; + } + x = r * 0.4124 + g * 0.3576 + b * 0.1805; + y = r * 0.2126 + g * 0.7152 + b * 0.0722; + z = r * 0.0193 + g * 0.1192 + b * 0.9505; + return { + x: x * 100, + y: y * 100, + z: z * 100 + }; + }; + + Convert.xyzToRGB = function(x, y, z) { + var b, g, r; + x /= 100; + y /= 100; + z /= 100; + r = (3.2406 * x) + (-1.5372 * y) + (-0.4986 * z); + g = (-0.9689 * x) + (1.8758 * y) + (0.0415 * z); + b = (0.0557 * x) + (-0.2040 * y) + (1.0570 * z); + if (r > 0.0031308) { + r = (1.055 * Math.pow(r, 0.4166666667)) - 0.055; + } else { + r *= 12.92; + } + if (g > 0.0031308) { + g = (1.055 * Math.pow(g, 0.4166666667)) - 0.055; + } else { + g *= 12.92; + } + if (b > 0.0031308) { + b = (1.055 * Math.pow(b, 0.4166666667)) - 0.055; + } else { + b *= 12.92; + } + return { + r: r * 255, + g: g * 255, + b: b * 255 + }; + }; + + Convert.xyzToLab = function(x, y, z) { + var a, b, l, whiteX, whiteY, whiteZ; + if (typeof x === "object") { + y = x.y; + z = x.z; + x = x.x; + } + whiteX = 95.047; + whiteY = 100.0; + whiteZ = 108.883; + x /= whiteX; + y /= whiteY; + z /= whiteZ; + if (x > 0.008856451679) { + x = Math.pow(x, 0.3333333333); + } else { + x = (7.787037037 * x) + 0.1379310345; + } + if (y > 0.008856451679) { + y = Math.pow(y, 0.3333333333); + } else { + y = (7.787037037 * y) + 0.1379310345; + } + if (z > 0.008856451679) { + z = Math.pow(z, 0.3333333333); + } else { + z = (7.787037037 * z) + 0.1379310345; + } + l = 116 * y - 16; + a = 500 * (x - y); + b = 200 * (y - z); + return { + l: l, + a: a, + b: b + }; + }; + + Convert.labToXYZ = function(l, a, b) { + var x, y, z; + if (typeof l === "object") { + a = l.a; + b = l.b; + l = l.l; + } + y = (l + 16) / 116; + x = y + (a / 500); + z = y - (b / 200); + if (x > 0.2068965517) { + x = x * x * x; + } else { + x = 0.1284185493 * (x - 0.1379310345); + } + if (y > 0.2068965517) { + y = y * y * y; + } else { + y = 0.1284185493 * (y - 0.1379310345); + } + if (z > 0.2068965517) { + z = z * z * z; + } else { + z = 0.1284185493 * (z - 0.1379310345); + } + return { + x: x * 95.047, + y: y * 100.0, + z: z * 108.883 + }; + }; + + Convert.rgbToLab = function(r, g, b) { + var xyz; + if (typeof r === "object") { + g = r.g; + b = r.b; + r = r.r; + } + xyz = this.rgbToXYZ(r, g, b); + return this.xyzToLab(xyz); + }; + + Convert.labToRGB = function(l, a, b) {}; + + return Convert; + + })(); + + Event = (function() { + + function Event() {} + + Event.events = {}; + + Event.types = ["processStart", "processComplete", "renderStart", "renderFinished", "blockStarted", "blockFinished"]; + + Event.trigger = function(target, type, data) { + var event, _i, _len, _ref, _results; + if (this.events[type] && this.events[type].length) { + _ref = this.events[type]; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + event = _ref[_i]; + if (event.target === null || target.id === event.target.id) { + _results.push(event.fn.call(target, data)); + } else { + _results.push(void 0); + } + } + return _results; + } + }; + + Event.listen = function(target, type, fn) { + var _fn, _type; + if (typeof target === "string") { + _type = target; + _fn = type; + target = null; + type = _type; + fn = _fn; + } + if (__indexOf.call(this.types, type) < 0) { + return false; + } + if (!this.events[type]) { + this.events[type] = []; + } + this.events[type].push({ + target: target, + fn: fn + }); + return true; + }; + + return Event; + + })(); + + Caman.Event = Event; + + Caman.Filter = Filter = (function() { + + function Filter() {} + + Filter.Type = { + Single: 1, + Kernel: 2, + LayerDequeue: 3, + LayerFinished: 4, + LoadOverlay: 5, + Plugin: 6 + }; + + Filter.register = function(name, filterFunc) { + return Caman.prototype[name] = filterFunc; + }; + + return Filter; + + })(); + + Caman.IO = IO = (function() { + + function IO() {} + + IO.domainRegex = /(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/; + + IO.isRemote = function(img) { + var matches; + if (img == null) { + return false; + } + if (this.corsEnabled(img)) { + return false; + } + matches = img.src.match(this.domainRegex); + if (matches) { + return matches[1] !== document.domain; + } else { + return false; + } + }; + + IO.corsEnabled = function(img) { + var _ref; + return (img.crossOrigin != null) && ((_ref = img.crossOrigin.toLowerCase()) === 'anonymous' || _ref === 'use-credentials'); + }; + + IO.proxyUrl = function(src) { + return "" + Caman.remoteProxy + "?" + Caman.proxyParam + "=" + (encodeURIComponent(src)); + }; + + IO.useProxy = function(lang) { + var langToExt; + langToExt = { + ruby: 'rb', + python: 'py', + perl: 'pl', + javascript: 'js' + }; + lang = lang.toLowerCase(); + if (langToExt[lang] != null) { + lang = langToExt[lang]; + } + return "proxies/caman_proxy." + lang; + }; + + return IO; + + })(); + + Caman.prototype.save = function() { + if (typeof exports !== "undefined" && exports !== null) { + return this.nodeSave.apply(this, arguments); + } else { + return this.browserSave.apply(this, arguments); + } + }; + + Caman.prototype.browserSave = function(type) { + var image; + if (type == null) { + type = "png"; + } + type = type.toLowerCase(); + image = this.toBase64(type).replace("image/" + type, "image/octet-stream"); + return document.location.href = image; + }; + + Caman.prototype.nodeSave = function(file, overwrite) { + var stats; + if (overwrite == null) { + overwrite = true; + } + try { + stats = fs.statSync(file); + if (stats.isFile() && !overwrite) { + return false; + } + } catch (e) { + Log.debug("Creating output file " + file); + } + return fs.writeFile(file, this.canvas.toBuffer(), function() { + return Log.debug("Finished writing to " + file); + }); + }; + + Caman.prototype.toImage = function(type) { + var img; + img = document.createElement('img'); + img.src = this.toBase64(type); + img.width = this.dimensions.width; + img.height = this.dimensions.height; + if (window.devicePixelRatio) { + img.width /= window.devicePixelRatio; + img.height /= window.devicePixelRatio; + } + return img; + }; + + Caman.prototype.toBase64 = function(type) { + if (type == null) { + type = "png"; + } + type = type.toLowerCase(); + return this.canvas.toDataURL("image/" + type); + }; + + Layer = (function() { + + function Layer(c) { + this.c = c; + this.filter = this.c; + this.options = { + blendingMode: 'normal', + opacity: 1.0 + }; + this.layerID = Util.uniqid.get(); + this.canvas = typeof exports !== "undefined" && exports !== null ? new Canvas() : document.createElement('canvas'); + this.canvas.width = this.c.dimensions.width; + this.canvas.height = this.c.dimensions.height; + this.context = this.canvas.getContext('2d'); + this.context.createImageData(this.canvas.width, this.canvas.height); + this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); + this.pixelData = this.imageData.data; + } + + Layer.prototype.newLayer = function(cb) { + return this.c.newLayer.call(this.c, cb); + }; + + Layer.prototype.setBlendingMode = function(mode) { + this.options.blendingMode = mode; + return this; + }; + + Layer.prototype.opacity = function(opacity) { + this.options.opacity = opacity / 100; + return this; + }; + + Layer.prototype.copyParent = function() { + var i, parentData, _i, _ref; + parentData = this.c.pixelData; + for (i = _i = 0, _ref = this.c.pixelData.length; _i < _ref; i = _i += 4) { + this.pixelData[i] = parentData[i]; + this.pixelData[i + 1] = parentData[i + 1]; + this.pixelData[i + 2] = parentData[i + 2]; + this.pixelData[i + 3] = parentData[i + 3]; + } + return this; + }; + + Layer.prototype.fillColor = function() { + return this.c.fillColor.apply(this.c, arguments); + }; + + Layer.prototype.overlayImage = function(image) { + if (typeof image === "object") { + image = image.src; + } else if (typeof image === "string" && image[0] === "#") { + image = $(image).src; + } + if (!image) { + return this; + } + this.c.renderQueue.push({ + type: Filter.Type.LoadOverlay, + src: image, + layer: this + }); + return this; + }; + + Layer.prototype.applyToParent = function() { + var i, layerData, parentData, result, rgbaLayer, rgbaParent, _i, _ref, _results; + parentData = this.c.pixelStack[this.c.pixelStack.length - 1]; + layerData = this.c.pixelData; + _results = []; + for (i = _i = 0, _ref = layerData.length; _i < _ref; i = _i += 4) { + rgbaParent = { + r: parentData[i], + g: parentData[i + 1], + b: parentData[i + 2], + a: parentData[i + 3] + }; + rgbaLayer = { + r: layerData[i], + g: layerData[i + 1], + b: layerData[i + 2], + a: layerData[i + 3] + }; + result = Blender.execute(this.options.blendingMode, rgbaLayer, rgbaParent); + result.r = Util.clampRGB(result.r); + result.g = Util.clampRGB(result.g); + result.b = Util.clampRGB(result.b); + if (!(result.a != null)) { + result.a = rgbaLayer.a; + } + parentData[i] = rgbaParent.r - ((rgbaParent.r - result.r) * (this.options.opacity * (result.a / 255))); + parentData[i + 1] = rgbaParent.g - ((rgbaParent.g - result.g) * (this.options.opacity * (result.a / 255))); + _results.push(parentData[i + 2] = rgbaParent.b - ((rgbaParent.b - result.b) * (this.options.opacity * (result.a / 255)))); + } + return _results; + }; + + return Layer; + + })(); + + Logger = (function() { + + function Logger() { + var name, _i, _len, _ref; + _ref = ['log', 'info', 'warn', 'error']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + this[name] = (function(name) { + return function() { + if (!Caman.DEBUG) { + return; + } + return console[name].apply(console, arguments); + }; + })(name); + } + this.debug = this.log; + } + + return Logger; + + })(); + + Log = new Logger(); + + PixelInfo = (function() { + + function PixelInfo(c) { + this.c = c; + this.loc = 0; + } + + PixelInfo.prototype.locationXY = function() { + var x, y; + y = this.c.dimensions.height - Math.floor(this.loc / (this.c.dimensions.width * 4)); + x = (this.loc % (this.c.dimensions.width * 4)) / 4; + return { + x: x, + y: y + }; + }; + + PixelInfo.prototype.getPixelRelative = function(horiz, vert) { + var newLoc; + newLoc = this.loc + (this.c.dimensions.width * 4 * (vert * -1)) + (4 * horiz); + if (newLoc > this.c.pixelData.length || newLoc < 0) { + return { + r: 0, + g: 0, + b: 0, + a: 0 + }; + } + return { + r: this.c.pixelData[newLoc], + g: this.c.pixelData[newLoc + 1], + b: this.c.pixelData[newLoc + 2], + a: this.c.pixelData[newLoc + 3] + }; + }; + + PixelInfo.prototype.putPixelRelative = function(horiz, vert, rgba) { + var nowLoc; + nowLoc = this.loc + (this.c.dimensions.width * 4 * (vert * -1)) + (4 * horiz); + if (newLoc > this.c.pixelData.length || newLoc < 0) { + return; + } + this.c.pixelData[newLoc] = rgba.r; + this.c.pixelData[newLoc + 1] = rgba.g; + this.c.pixelData[newLoc + 2] = rgba.b; + this.c.pixelData[newLoc + 3] = rgba.a; + return true; + }; + + PixelInfo.prototype.getPixel = function(x, y) { + var loc; + loc = (y * this.c.dimensions.width + x) * 4; + return { + r: this.c.pixelData[loc], + g: this.c.pixelData[loc + 1], + b: this.c.pixelData[loc + 2], + a: this.c.pixelData[loc + 3] + }; + }; + + PixelInfo.prototype.putPixel = function(x, y, rgba) { + var loc; + loc = (y * this.c.dimensions.width + x) * 4; + this.c.pixelData[loc] = rgba.r; + this.c.pixelData[loc + 1] = rgba.g; + this.c.pixelData[loc + 2] = rgba.b; + return this.c.pixelData[loc + 3] = rgba.a; + }; + + return PixelInfo; + + })(); + + Plugin = (function() { + + function Plugin() {} + + Plugin.plugins = {}; + + Plugin.register = function(name, plugin) { + return this.plugins[name] = plugin; + }; + + Plugin.execute = function(context, name, args) { + return this.plugins[name].apply(context, args); + }; + + return Plugin; + + })(); + + Caman.Plugin = Plugin; + + Caman.Renderer = Renderer = (function() { + + Renderer.Blocks = Caman.NodeJS ? require('os').cpus().length : 4; + + function Renderer(c) { + this.c = c; + this.processNext = __bind(this.processNext, this); + + this.renderQueue = []; + this.modPixelData = null; + } + + Renderer.prototype.add = function(job) { + if (job == null) { + return; + } + return this.renderQueue.push(job); + }; + + Renderer.prototype.processNext = function() { + var layer; + if (this.renderQueue.length === 0) { + Event.trigger(this, "renderFinished"); + if (this.finishedFn != null) { + this.finishedFn.call(this.c); + } + return this; + } + this.currentJob = this.renderQueue.shift(); + switch (this.currentJob.type) { + case Filter.Type.LayerDequeue: + layer = this.c.canvasQueue.shift(); + this.c.executeLayer(layer); + return this.processNext(); + case Filter.Type.LayerFinished: + this.c.applyCurrentLayer(); + this.c.popContext(); + return this.processNext(); + case Filter.Type.LoadOverlay: + return this.loadOverlay(this.currentJob.layer, this.currentJob.src); + case Filter.Type.Plugin: + return this.executePlugin(); + default: + return this.executeFilter(); + } + }; + + Renderer.prototype.execute = function(callback) { + this.finishedFn = callback; + this.modPixelData = new Uint8Array(this.c.pixelData.length); + return this.processNext(); + }; + + Renderer.prototype.eachBlock = function(fn) { + var blockN, blockPixelLength, end, f, i, lastBlockN, n, start, _i, _ref, _results, + _this = this; + this.blocksDone = 0; + n = this.c.pixelData.length; + blockPixelLength = Math.floor((n / 4) / Renderer.Blocks); + blockN = blockPixelLength * 4; + lastBlockN = blockN + ((n / 4) % Renderer.Blocks) * 4; + _results = []; + for (i = _i = 0, _ref = Renderer.Blocks; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + start = i * blockN; + end = start + (i === Renderer.Blocks - 1 ? lastBlockN : blockN); + if (Caman.NodeJS) { + f = Fiber(function() { + return fn.call(_this, i, start, end); + }); + _results.push(f.run()); + } else { + _results.push(setTimeout((function(i, start, end) { + return function() { + return fn.call(_this, i, start, end); + }; + })(i, start, end), 0)); + } + } + return _results; + }; + + Renderer.prototype.executeFilter = function() { + Event.trigger(this.c, "processStart", this.currentJob); + if (this.currentJob.type === Filter.Type.Single) { + return this.eachBlock(this.renderBlock); + } else { + return this.eachBlock(this.renderKernel); + } + }; + + Renderer.prototype.executePlugin = function() { + Log.debug("Executing plugin " + this.currentJob.plugin); + Plugin.execute(this.c, this.currentJob.plugin, this.currentJob.args); + Log.debug("Plugin " + this.currentJob.plugin + " finished!"); + return this.processNext(); + }; + + Renderer.prototype.renderBlock = function(bnum, start, end) { + var data, i, pixelInfo, res, _i; + Log.debug("Block #" + bnum + " - Filter: " + this.currentJob.name + ", Start: " + start + ", End: " + end); + Event.trigger(this.c, "blockStarted", { + blockNum: bnum, + totalBlocks: Renderer.Blocks, + startPixel: start, + endPixel: end + }); + data = { + r: 0, + g: 0, + b: 0, + a: 0 + }; + pixelInfo = new PixelInfo(this.c); + for (i = _i = start; _i < end; i = _i += 4) { + pixelInfo.loc = i; + data.r = this.c.pixelData[i]; + data.g = this.c.pixelData[i + 1]; + data.b = this.c.pixelData[i + 2]; + data.a = this.c.pixelData[i + 3]; + res = this.currentJob.processFn.call(pixelInfo, data); + if (!(res.a != null)) { + res.a = data.a; + } + this.c.pixelData[i] = Util.clampRGB(res.r); + this.c.pixelData[i + 1] = Util.clampRGB(res.g); + this.c.pixelData[i + 2] = Util.clampRGB(res.b); + this.c.pixelData[i + 3] = Util.clampRGB(res.a); + } + this.blockFinished(bnum); + if (Caman.NodeJS) { + return Fiber["yield"](); + } + }; + + Renderer.prototype.renderKernel = function(bnum, start, end) { + var adjust, adjustSize, bias, builder, builderIndex, divisor, i, j, k, kernel, n, name, pixel, pixelInfo, res, _i, _j, _k; + name = this.currentJob.name; + bias = this.currentJob.bias; + divisor = this.currentJob.divisor; + n = this.c.pixelData.length; + adjust = this.currentJob.adjust; + adjustSize = Math.sqrt(adjust.length); + kernel = []; + Log.debug("Rendering kernel - Filter: " + this.currentJob.name); + start = Math.max(start, this.c.dimensions.width * 4 * ((adjustSize - 1) / 2)); + end = Math.min(end, n - (this.c.dimensions.width * 4 * ((adjustSize - 1) / 2))); + builder = (adjustSize - 1) / 2; + pixelInfo = new PixelInfo(this.c); + for (i = _i = start; _i < end; i = _i += 4) { + pixelInfo.loc = i; + builderIndex = 0; + for (j = _j = -builder; -builder <= builder ? _j <= builder : _j >= builder; j = -builder <= builder ? ++_j : --_j) { + for (k = _k = builder; builder <= -builder ? _k <= -builder : _k >= -builder; k = builder <= -builder ? ++_k : --_k) { + pixel = pixelInfo.getPixelRelative(j, k); + kernel[builderIndex * 3] = pixel.r; + kernel[builderIndex * 3 + 1] = pixel.g; + kernel[builderIndex * 3 + 2] = pixel.b; + builderIndex++; + } + } + res = this.processKernel(adjust, kernel, divisor, bias); + this.modPixelData[i] = Util.clampRGB(res.r); + this.modPixelData[i + 1] = Util.clampRGB(res.g); + this.modPixelData[i + 2] = Util.clampRGB(res.b); + this.modPixelData[i + 3] = this.c.pixelData[i + 3]; + } + this.blockFinished(bnum); + if (Caman.NodeJS) { + return Fiber["yield"](); + } + }; + + Renderer.prototype.blockFinished = function(bnum) { + var i, _i, _ref; + if (bnum >= 0) { + Log.debug("Block #" + bnum + " finished! Filter: " + this.currentJob.name); + } + this.blocksDone++; + Event.trigger(this.c, "blockFinished", { + blockNum: bnum, + blocksFinished: this.blocksDone, + totalBlocks: Renderer.Blocks + }); + if (this.blocksDone === Renderer.Blocks) { + if (this.currentJob.type === Filter.Type.Kernel) { + for (i = _i = 0, _ref = this.c.pixelData.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + this.c.pixelData[i] = this.modPixelData[i]; + } + } + if (bnum >= 0) { + Log.debug("Filter " + this.currentJob.name + " finished!"); + } + Event.trigger(this.c, "processComplete", this.currentJob); + return this.processNext(); + } + }; + + Renderer.prototype.processKernel = function(adjust, kernel, divisor, bias) { + var i, val, _i, _ref; + val = { + r: 0, + g: 0, + b: 0 + }; + for (i = _i = 0, _ref = adjust.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + val.r += adjust[i] * kernel[i * 3]; + val.g += adjust[i] * kernel[i * 3 + 1]; + val.b += adjust[i] * kernel[i * 3 + 2]; + } + val.r = (val.r / divisor) + bias; + val.g = (val.g / divisor) + bias; + val.b = (val.b / divisor) + bias; + return val; + }; + + Renderer.prototype.loadOverlay = function(layer, src) { + var img, proxyUrl, + _this = this; + img = document.createElement('img'); + img.onload = function() { + layer.context.drawImage(img, 0, 0, _this.c.dimensions.width, _this.c.dimensions.height); + layer.imageData = layer.context.getImageData(0, 0, _this.c.dimensions.width, _this.c.dimensions.height); + layer.pixelData = layer.imageData.data; + _this.c.pixelData = layer.pixelData; + return _this.processNext(); + }; + proxyUrl = IO.remoteCheck(src); + return img.src = proxyUrl != null ? proxyUrl : src; + }; + + return Renderer; + + })(); + + Caman.Store = Store = (function() { + + function Store() {} + + Store.items = {}; + + Store.has = function(search) { + return this.items[search] != null; + }; + + Store.get = function(search) { + return this.items[search]; + }; + + Store.put = function(name, obj) { + return this.items[name] = obj; + }; + + Store.execute = function(search, callback) { + var _this = this; + setTimeout(function() { + return callback.call(_this.get(search), _this.get(search)); + }, 0); + return this.get(search); + }; + + Store.flush = function(name) { + if (name == null) { + name = false; + } + if (name) { + return delete this.items[name]; + } else { + return this.items = {}; + } + }; + + return Store; + + })(); + + Blender.register("normal", function(rgbaLayer, rgbaParent) { + return { + r: rgbaLayer.r, + g: rgbaLayer.g, + b: rgbaLayer.b + }; + }); + + Blender.register("multiply", function(rgbaLayer, rgbaParent) { + return { + r: (rgbaLayer.r * rgbaParent.r) / 255, + g: (rgbaLayer.g * rgbaParent.g) / 255, + b: (rgbaLayer.b * rgbaParent.b) / 255 + }; + }); + + Blender.register("screen", function(rgbaLayer, rgbaParent) { + return { + r: 255 - (((255 - rgbaLayer.r) * (255 - rgbaParent.r)) / 255), + g: 255 - (((255 - rgbaLayer.g) * (255 - rgbaParent.g)) / 255), + b: 255 - (((255 - rgbaLayer.b) * (255 - rgbaParent.b)) / 255) + }; + }); + + Blender.register("overlay", function(rgbaLayer, rgbaParent) { + var result; + result = {}; + result.r = rgbaParent.r > 128 ? 255 - 2 * (255 - rgbaLayer.r) * (255 - rgbaParent.r) / 255 : (rgbaParent.r * rgbaLayer.r * 2) / 255; + result.g = rgbaParent.g > 128 ? 255 - 2 * (255 - rgbaLayer.g) * (255 - rgbaParent.g) / 255 : (rgbaParent.g * rgbaLayer.g * 2) / 255; + result.b = rgbaParent.b > 128 ? 255 - 2 * (255 - rgbaLayer.b) * (255 - rgbaParent.b) / 255 : (rgbaParent.b * rgbaLayer.b * 2) / 255; + return result; + }); + + Blender.register("difference", function(rgbaLayer, rgbaParent) { + return { + r: rgbaLayer.r - rgbaParent.r, + g: rgbaLayer.g - rgbaParent.g, + b: rgbaLayer.b - rgbaParent.b + }; + }); + + Blender.register("addition", function(rgbaLayer, rgbaParent) { + return { + r: rgbaParent.r + rgbaLayer.r, + g: rgbaParent.g + rgbaLayer.g, + b: rgbaParent.b + rgbaLayer.b + }; + }); + + Blender.register("exclusion", function(rgbaLayer, rgbaParent) { + return { + r: 128 - 2 * (rgbaParent.r - 128) * (rgbaLayer.r - 128) / 255, + g: 128 - 2 * (rgbaParent.g - 128) * (rgbaLayer.g - 128) / 255, + b: 128 - 2 * (rgbaParent.b - 128) * (rgbaLayer.b - 128) / 255 + }; + }); + + Blender.register("softLight", function(rgbaLayer, rgbaParent) { + var result; + result = {}; + result.r = rgbaParent.r > 128 ? 255 - ((255 - rgbaParent.r) * (255 - (rgbaLayer.r - 128))) / 255 : (rgbaParent.r * (rgbaLayer.r + 128)) / 255; + result.g = rgbaParent.g > 128 ? 255 - ((255 - rgbaParent.g) * (255 - (rgbaLayer.g - 128))) / 255 : (rgbaParent.g * (rgbaLayer.g + 128)) / 255; + result.b = rgbaParent.b > 128 ? 255 - ((255 - rgbaParent.b) * (255 - (rgbaLayer.b - 128))) / 255 : (rgbaParent.b * (rgbaLayer.b + 128)) / 255; + return result; + }); + + Blender.register("lighten", function(rgbaLayer, rgbaParent) { + return { + r: rgbaParent.r > rgbaLayer.r ? rgbaParent.r : rgbaLayer.r, + g: rgbaParent.g > rgbaLayer.g ? rgbaParent.g : rgbaLayer.g, + b: rgbaParent.b > rgbaLayer.b ? rgbaParent.b : rgbaLayer.b + }; + }); + + Blender.register("darken", function(rgbaLayer, rgbaParent) { + return { + r: rgbaParent.r > rgbaLayer.r ? rgbaLayer.r : rgbaParent.r, + g: rgbaParent.g > rgbaLayer.g ? rgbaLayer.g : rgbaParent.g, + b: rgbaParent.b > rgbaLayer.b ? rgbaLayer.b : rgbaParent.b + }; + }); + + Filter.register("fillColor", function() { + var color; + if (arguments.length === 1) { + color = Convert.hexToRGB(arguments[0]); + } else { + color = { + r: arguments[0], + g: arguments[1], + b: arguments[2] + }; + } + return this.process("fillColor", function(rgba) { + rgba.r = color.r; + rgba.g = color.g; + rgba.b = color.b; + rgba.a = 255; + return rgba; + }); + }); + + Filter.register("brightness", function(adjust) { + adjust = Math.floor(255 * (adjust / 100)); + return this.process("brightness", function(rgba) { + rgba.r += adjust; + rgba.g += adjust; + rgba.b += adjust; + return rgba; + }); + }); + + Filter.register("saturation", function(adjust) { + adjust *= -0.01; + return this.process("saturation", function(rgba) { + var max; + max = Math.max(rgba.r, rgba.g, rgba.b); + if (rgba.r !== max) { + rgba.r += (max - rgba.r) * adjust; + } + if (rgba.g !== max) { + rgba.g += (max - rgba.g) * adjust; + } + if (rgba.b !== max) { + rgba.b += (max - rgba.b) * adjust; + } + return rgba; + }); + }); + + Filter.register("vibrance", function(adjust) { + adjust *= -1; + return this.process("vibrance", function(rgba) { + var amt, avg, max; + max = Math.max(rgba.r, rgba.g, rgba.b); + avg = (rgba.r + rgba.g + rgba.b) / 3; + amt = ((Math.abs(max - avg) * 2 / 255) * adjust) / 100; + if (rgba.r !== max) { + rgba.r += (max - rgba.r) * amt; + } + if (rgba.g !== max) { + rgba.g += (max - rgba.g) * amt; + } + if (rgba.b !== max) { + rgba.b += (max - rgba.b) * amt; + } + return rgba; + }); + }); + + Filter.register("greyscale", function(adjust) { + return this.process("greyscale", function(rgba) { + var avg; + avg = Calculate.luminance(rgba); + rgba.r = avg; + rgba.g = avg; + rgba.b = avg; + return rgba; + }); + }); + + Filter.register("contrast", function(adjust) { + adjust = Math.pow((adjust + 100) / 100, 2); + return this.process("contrast", function(rgba) { + rgba.r /= 255; + rgba.r -= 0.5; + rgba.r *= adjust; + rgba.r += 0.5; + rgba.r *= 255; + rgba.g /= 255; + rgba.g -= 0.5; + rgba.g *= adjust; + rgba.g += 0.5; + rgba.g *= 255; + rgba.b /= 255; + rgba.b -= 0.5; + rgba.b *= adjust; + rgba.b += 0.5; + rgba.b *= 255; + return rgba; + }); + }); + + Filter.register("hue", function(adjust) { + return this.process("hue", function(rgba) { + var h, hsv, rgb; + hsv = Convert.rgbToHSV(rgba.r, rgba.g, rgba.b); + h = hsv.h * 100; + h += Math.abs(adjust); + h = h % 100; + h /= 100; + hsv.h = h; + rgb = Convert.hsvToRGB(hsv.h, hsv.s, hsv.v); + rgb.a = rgba.a; + return rgb; + }); + }); + + Filter.register("colorize", function() { + var level, rgb; + if (arguments.length === 2) { + rgb = Convert.hexToRGB(arguments[0]); + level = arguments[1]; + } else if (arguments.length === 4) { + rgb = { + r: arguments[0], + g: arguments[1], + b: arguments[2] + }; + level = arguments[3]; + } + return this.process("colorize", function(rgba) { + rgba.r -= (rgba.r - rgb.r) * (level / 100); + rgba.g -= (rgba.g - rgb.g) * (level / 100); + rgba.b -= (rgba.b - rgb.b) * (level / 100); + return rgba; + }); + }); + + Filter.register("invert", function() { + return this.process("invert", function(rgba) { + rgba.r = 255 - rgba.r; + rgba.g = 255 - rgba.g; + rgba.b = 255 - rgba.b; + return rgba; + }); + }); + + Filter.register("sepia", function(adjust) { + if (adjust == null) { + adjust = 100; + } + adjust /= 100; + return this.process("sepia", function(rgba) { + rgba.r = Math.min(255, (rgba.r * (1 - (0.607 * adjust))) + (rgba.g * (0.769 * adjust)) + (rgba.b * (0.189 * adjust))); + rgba.g = Math.min(255, (rgba.r * (0.349 * adjust)) + (rgba.g * (1 - (0.314 * adjust))) + (rgba.b * (0.168 * adjust))); + rgba.b = Math.min(255, (rgba.r * (0.272 * adjust)) + (rgba.g * (0.534 * adjust)) + (rgba.b * (1 - (0.869 * adjust)))); + return rgba; + }); + }); + + Filter.register("gamma", function(adjust) { + return this.process("gamma", function(rgba) { + rgba.r = Math.pow(rgba.r / 255, adjust) * 255; + rgba.g = Math.pow(rgba.g / 255, adjust) * 255; + rgba.b = Math.pow(rgba.b / 255, adjust) * 255; + return rgba; + }); + }); + + Filter.register("noise", function(adjust) { + adjust = Math.abs(adjust) * 2.55; + return this.process("noise", function(rgba) { + var rand; + rand = Calculate.randomRange(adjust * -1, adjust); + rgba.r += rand; + rgba.g += rand; + rgba.b += rand; + return rgba; + }); + }); + + Filter.register("clip", function(adjust) { + adjust = Math.abs(adjust) * 2.55; + return this.process("clip", function(rgba) { + if (rgba.r > 255 - adjust) { + rgba.r = 255; + } else if (rgba.r < adjust) { + rgba.r = 0; + } + if (rgba.g > 255 - adjust) { + rgba.g = 255; + } else if (rgba.g < adjust) { + rgba.g = 0; + } + if (rgba.b > 255 - adjust) { + rgba.b = 255; + } else if (rgba.b < adjust) { + rgba.b = 0; + } + return rgba; + }); + }); + + Filter.register("channels", function(options) { + var chan, value; + if (typeof options !== "object") { + return this; + } + for (chan in options) { + if (!__hasProp.call(options, chan)) continue; + value = options[chan]; + if (value === 0) { + delete options[chan]; + continue; + } + options[chan] /= 100; + } + if (options.length === 0) { + return this; + } + return this.process("channels", function(rgba) { + if (options.red != null) { + if (options.red > 0) { + rgba.r += (255 - rgba.r) * options.red; + } else { + rgba.r -= rgba.r * Math.abs(options.red); + } + } + if (options.green != null) { + if (options.green > 0) { + rgba.g += (255 - rgba.g) * options.green; + } else { + rgba.g -= rgba.g * Math.abs(options.green); + } + } + if (options.blue != null) { + if (options.blue > 0) { + rgba.b += (255 - rgba.b) * options.blue; + } else { + rgba.b -= rgba.b * Math.abs(options.blue); + } + } + return rgba; + }); + }); + + Filter.register("curves", function() { + var bezier, chans, cps, ctrl1, ctrl2, end, i, start, _i, _j, _ref, _ref1; + chans = arguments[0], cps = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + if (typeof chans === "string") { + chans = chans.split(""); + } + if (chans[0] === "v") { + chans = ['r', 'g', 'b']; + } + if (cps.length < 3 || cps.length > 4) { + throw "Invalid number of arguments to curves filter"; + } + start = cps[0]; + ctrl1 = cps[1]; + ctrl2 = cps.length === 4 ? cps[2] : cps[1]; + end = cps[cps.length - 1]; + bezier = Calculate.bezier(start, ctrl1, ctrl2, end, 0, 255); + if (start[0] > 0) { + for (i = _i = 0, _ref = start[0]; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + bezier[i] = start[1]; + } + } + if (end[0] < 255) { + for (i = _j = _ref1 = end[0]; _ref1 <= 255 ? _j <= 255 : _j >= 255; i = _ref1 <= 255 ? ++_j : --_j) { + bezier[i] = end[1]; + } + } + return this.process("curves", function(rgba) { + var _k, _ref2; + for (i = _k = 0, _ref2 = chans.length; 0 <= _ref2 ? _k < _ref2 : _k > _ref2; i = 0 <= _ref2 ? ++_k : --_k) { + rgba[chans[i]] = bezier[rgba[chans[i]]]; + } + return rgba; + }); + }); + + Filter.register("exposure", function(adjust) { + var ctrl1, ctrl2, p; + p = Math.abs(adjust) / 100; + ctrl1 = [0, 255 * p]; + ctrl2 = [255 - (255 * p), 255]; + if (adjust < 0) { + ctrl1 = ctrl1.reverse(); + ctrl2 = ctrl2.reverse(); + } + return this.curves('rgb', [0, 0], ctrl1, ctrl2, [255, 255]); + }); + + Caman.Filter.register("boxBlur", function() { + return this.processKernel("Box Blur", [1, 1, 1, 1, 1, 1, 1, 1, 1]); + }); + + Caman.Filter.register("heavyRadialBlur", function() { + return this.processKernel("Heavy Radial Blur", [0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0]); + }); + + Caman.Filter.register("gaussianBlur", function() { + return this.processKernel("Gaussian Blur", [1, 4, 6, 4, 1, 4, 16, 24, 16, 4, 6, 24, 36, 24, 6, 4, 16, 24, 16, 4, 1, 4, 6, 4, 1]); + }); + + Caman.Filter.register("motionBlur", function(degrees) { + var kernel; + if (degrees === 0 || degrees === 180) { + kernel = [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0]; + } else if ((degrees > 0 && degrees < 90) || (degrees > 180 && degrees < 270)) { + kernel = [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0]; + } else if (degrees === 90 || degrees === 270) { + kernel = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } else { + kernel = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]; + } + return this.processKernel("Motion Blur", kernel); + }); + + Caman.Filter.register("sharpen", function(amt) { + if (amt == null) { + amt = 100; + } + amt /= 100; + return this.processKernel("Sharpen", [0, -amt, 0, -amt, 4 * amt + 1, -amt, 0, -amt, 0]); + }); + + vignetteFilters = { + brightness: function(rgba, amt, opts) { + rgba.r = rgba.r - (rgba.r * amt * opts.strength); + rgba.g = rgba.g - (rgba.g * amt * opts.strength); + rgba.b = rgba.b - (rgba.b * amt * opts.strength); + return rgba; + }, + gamma: function(rgba, amt, opts) { + rgba.r = Math.pow(rgba.r / 255, Math.max(10 * amt * opts.strength, 1)) * 255; + rgba.g = Math.pow(rgba.g / 255, Math.max(10 * amt * opts.strength, 1)) * 255; + rgba.b = Math.pow(rgba.b / 255, Math.max(10 * amt * opts.strength, 1)) * 255; + return rgba; + }, + colorize: function(rgba, amt, opts) { + rgba.r -= (rgba.r - opts.color.r) * amt; + rgba.g -= (rgba.g - opts.color.g) * amt; + rgba.b -= (rgba.b - opts.color.b) * amt; + return rgba; + } + }; + + Filter.register("vignette", function(size, strength) { + var bezier, center, end, start; + if (strength == null) { + strength = 60; + } + if (typeof size === "string" && size.substr(-1) === "%") { + if (this.dimensions.height > this.dimensions.width) { + size = this.dimensions.width * (parseInt(size.substr(0, size.length - 1), 10) / 100); + } else { + size = this.dimensions.height * (parseInt(size.substr(0, size.length - 1), 10) / 100); + } + } + strength /= 100; + center = [this.dimensions.width / 2, this.dimensions.height / 2]; + start = Math.sqrt(Math.pow(center[0], 2) + Math.pow(center[1], 2)); + end = start - size; + bezier = Calculate.bezier([0, 1], [30, 30], [70, 60], [100, 80]); + return this.process("vignette", function(rgba) { + var dist, div, loc; + loc = this.locationXY(); + dist = Calculate.distance(loc.x, loc.y, center[0], center[1]); + if (dist > end) { + div = Math.max(1, (bezier[Math.round(((dist - end) / size) * 100)] / 10) * strength); + rgba.r = Math.pow(rgba.r / 255, div) * 255; + rgba.g = Math.pow(rgba.g / 255, div) * 255; + rgba.b = Math.pow(rgba.b / 255, div) * 255; + } + return rgba; + }); + }); + + Filter.register("rectangularVignette", function(opts) { + var defaults, dim, percent, size, _i, _len, _ref; + defaults = { + strength: 50, + cornerRadius: 0, + method: 'brightness', + color: { + r: 0, + g: 0, + b: 0 + } + }; + opts = Util.extend(defaults, opts); + if (!opts.size) { + return this; + } else if (typeof opts.size === "string") { + percent = parseInt(opts.size, 10) / 100; + opts.size = { + width: this.dimensions.width * percent, + height: this.dimensions.height * percent + }; + } else if (typeof opts.size === "object") { + _ref = ["width", "height"]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + dim = _ref[_i]; + if (typeof opts.size[dim] === "string") { + opts.size[dim] = this.dimensions[dim] * (parseInt(opts.size[dim], 10) / 100); + } + } + } else if (opts.size === "number") { + size = opts.size; + opts.size = { + width: size, + height: size + }; + } + if (typeof opts.cornerRadius === "string") { + opts.cornerRadius = (opts.size.width / 2) * (parseInt(opts.cornerRadius, 10) / 100); + } + opts.strength /= 100; + opts.size.width = Math.floor(opts.size.width); + opts.size.height = Math.floor(opts.size.height); + opts.image = { + width: this.dimensions.width, + height: this.dimensions.height + }; + if (opts.method === "colorize" && typeof opts.color === "string") { + opts.color = Convert.hexToRGB(opts.color); + } + opts.coords = { + left: (this.dimensions.width - opts.size.width) / 2, + right: this.dimensions.width - opts.coords.left, + bottom: (this.dimensions.height - opts.size.height) / 2, + top: this.dimensions.height - opts.coords.bottom + }; + opts.corners = [ + { + x: opts.coords.left + opts.cornerRadius, + y: opts.coords.top - opts.cornerRadius + }, { + x: opts.coords.right - opts.cornerRadius, + y: opts.coords.top - opts.cornerRadius + }, { + x: opts.coords.right - opts.cornerRadius, + y: opts.coords.bottom + opts.cornerRadius + }, { + x: opts.coords.left + opts.cornerRadius, + y: opts.coords.bottom + opts.cornerRadius + } + ]; + opts.maxDist = Calculate.distance(0, 0, opts.corners[3].x, opts.corners[3].y) - opts.cornerRadius; + return this.process("rectangularVignette", function(rgba) { + var amt, loc, radialDist; + loc = this.locationXY(); + if ((loc.x > opts.corners[0].x && loc.x < opts.corners[1].x) && (loc.y > opts.coords.bottom && loc.y < opts.coords.top)) { + return rgba; + } + if ((loc.x > opts.coords.left && loc.x < opts.coords.right) && (loc.y > opts.corners[3].y && loc.y < opts.corners[2].y)) { + return rgba; + } + if (loc.x > opts.corners[0].x && loc.x < opts.corners[1].x && loc.y > opts.coords.top) { + amt = (loc.y - opts.coords.top) / opts.maxDist; + } else if (loc.y > opts.corners[2].y && loc.y < opts.corners[1].y && loc.x > opts.coords.right) { + amt = (loc.x - opts.coords.right) / opts.maxDist; + } else if (loc.x > opts.corners[0].x && loc.x < opts.corners[1].x && loc.y < opts.coords.bottom) { + amt = (opts.coords.bottom - loc.y) / opts.maxDist; + } else if (loc.y > opts.corners[2].y && loc.y < opts.corners[1].y && loc.x < opts.coords.left) { + amt = (opts.coords.left - loc.x) / opts.maxDist; + } else if (loc.x <= opts.corners[0].x && loc.y >= opts.corners[0].y) { + radialDist = Caman.distance(loc.x, loc.y, opts.corners[0].x, opts.corners[0].y); + amt = (radialDist - opts.cornerRadius) / opts.maxDist; + } else if (loc.x >= opts.corners[1].x && loc.y >= opts.corners[1].y) { + radialDist = Caman.distance(loc.x, loc.y, opts.corners[1].x, opts.corners[1].y); + amt = (radialDist - opts.cornerRadius) / opts.maxDist; + } else if (loc.x >= opts.corners[2].x && loc.y <= opts.corners[2].y) { + radialDist = Caman.distance(loc.x, loc.y, opts.corners[2].x, opts.corners[2].y); + amt = (radialDist - opts.cornerRadius) / opts.maxDist; + } else if (loc.x <= opts.corners[3].x && loc.y <= opts.corners[3].y) { + radialDist = Caman.distance(loc.x, loc.y, opts.corners[3].x, opts.corners[3].y); + amt = (radialDist - opts.cornerRadius) / opts.maxDist; + } + if (amt < 0) { + return rgba; + } + return vignetteFilters[opts.method](rgba, amt, opts); + }); + }); + + /* + CompoundBlur - Blurring with varying radii for Canvas + + Version: 0.1 + Author: Mario Klingemann + Contact: mario@quasimondo.com + Website: http://www.quasimondo.com/StackBlurForCanvas + Twitter: @quasimondo + Modified By: Ryan LeFevre (@meltingice) + + In case you find this class useful - especially in commercial projects - + I am not totally unhappy for a small donation to my PayPal account + mario@quasimondo.de + + Copyright (c) 2011 Mario Klingemann + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + + + (function() { + var BlurStack, getLinearGradientMap, getRadialGradientMap, mul_table, shg_table; + mul_table = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259]; + shg_table = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24]; + getLinearGradientMap = function(width, height, centerX, centerY, angle, length, mirrored) { + var cnv, context, gradient, x1, x2, y1, y2; + cnv = typeof exports !== "undefined" && exports !== null ? new Canvas() : document.createElement('canvas'); + cnv.width = width; + cnv.height = height; + x1 = centerX + Math.cos(angle) * length * 0.5; + y1 = centerY + Math.sin(angle) * length * 0.5; + x2 = centerX - Math.cos(angle) * length * 0.5; + y2 = centerY - Math.sin(angle) * length * 0.5; + context = cnv.getContext("2d"); + gradient = context.createLinearGradient(x1, y1, x2, y2); + if (!mirrored) { + gradient.addColorStop(0, "white"); + gradient.addColorStop(1, "black"); + } else { + gradient.addColorStop(0, "white"); + gradient.addColorStop(0.5, "black"); + gradient.addColorStop(1, "white"); + } + context.fillStyle = gradient; + context.fillRect(0, 0, width, height); + return context.getImageData(0, 0, width, height); + }; + getRadialGradientMap = function(width, height, centerX, centerY, radius1, radius2) { + var cnv, context, gradient; + cnv = typeof exports !== "undefined" && exports !== null ? new Canvas() : document.createElement('canvas'); + cnv.width = width; + cnv.height = height; + context = cnv.getContext("2d"); + gradient = context.createRadialGradient(centerX, centerY, radius1, centerX, centerY, radius2); + gradient.addColorStop(1, "white"); + gradient.addColorStop(0, "black"); + context.fillStyle = gradient; + context.fillRect(0, 0, width, height); + return context.getImageData(0, 0, width, height); + }; + BlurStack = function() { + this.r = 0; + this.g = 0; + this.b = 0; + this.a = 0; + return this.next = null; + }; + Caman.Plugin.register("compoundBlur", function(radiusData, radius, increaseFactor, blurLevels) { + var b_in_sum, b_out_sum, b_sum, blend, currentIndex, div, g_in_sum, g_out_sum, g_sum, height, heightMinus1, i, iblend, idx, imagePixels, index, iradius, lookupValue, mul_sum, p, pb, pg, pixels, pr, r_in_sum, r_out_sum, r_sum, radiusPixels, radiusPlus1, rbs, shg_sum, stack, stackEnd, stackIn, stackOut, stackStart, steps, sumFactor, w4, wh, wh4, width, widthMinus1, x, y, yi, yp, yw, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r; + width = this.dimensions.width; + height = this.dimensions.height; + imagePixels = this.pixelData; + radiusPixels = radiusData.data; + wh = width * height; + wh4 = wh << 2; + pixels = []; + for (i = _i = 0; 0 <= wh4 ? _i < wh4 : _i > wh4; i = 0 <= wh4 ? ++_i : --_i) { + pixels[i] = imagePixels[i]; + } + currentIndex = 0; + steps = blurLevels; + blurLevels -= 1; + while (steps-- >= 0) { + iradius = (radius + 0.5) | 0; + if (iradius === 0) { + continue; + } + if (iradius > 256) { + iradius = 256; + } + div = iradius + iradius + 1; + w4 = width << 2; + widthMinus1 = width - 1; + heightMinus1 = height - 1; + radiusPlus1 = iradius + 1; + sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2; + stackStart = new BlurStack(); + stackEnd = void 0; + stack = stackStart; + for (i = _j = 1; 1 <= div ? _j < div : _j > div; i = 1 <= div ? ++_j : --_j) { + stack = stack.next = new BlurStack(); + if (i === radiusPlus1) { + stackEnd = stack; + } + } + stack.next = stackStart; + stackIn = null; + stackOut = null; + yw = yi = 0; + mul_sum = mul_table[iradius]; + shg_sum = shg_table[iradius]; + for (y = _k = 0; 0 <= height ? _k < height : _k > height; y = 0 <= height ? ++_k : --_k) { + r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0; + r_out_sum = radiusPlus1 * (pr = pixels[yi]); + g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]); + b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]); + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + stack = stackStart; + for (i = _l = 0; 0 <= radiusPlus1 ? _l < radiusPlus1 : _l > radiusPlus1; i = 0 <= radiusPlus1 ? ++_l : --_l) { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack = stack.next; + } + for (i = _m = 1; 1 <= radiusPlus1 ? _m < radiusPlus1 : _m > radiusPlus1; i = 1 <= radiusPlus1 ? ++_m : --_m) { + p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2); + r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i); + g_sum += (stack.g = (pg = pixels[p + 1])) * rbs; + b_sum += (stack.b = (pb = pixels[p + 2])) * rbs; + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + stack = stack.next; + } + stackIn = stackStart; + stackOut = stackEnd; + for (x = _n = 0; 0 <= width ? _n < width : _n > width; x = 0 <= width ? ++_n : --_n) { + pixels[yi] = (r_sum * mul_sum) >> shg_sum; + pixels[yi + 1] = (g_sum * mul_sum) >> shg_sum; + pixels[yi + 2] = (b_sum * mul_sum) >> shg_sum; + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + p = (yw + ((p = x + radiusPlus1) < widthMinus1 ? p : widthMinus1)) << 2; + r_in_sum += (stackIn.r = pixels[p]); + g_in_sum += (stackIn.g = pixels[p + 1]); + b_in_sum += (stackIn.b = pixels[p + 2]); + r_sum += r_in_sum; + g_sum += g_in_sum; + b_sum += b_in_sum; + stackIn = stackIn.next; + r_out_sum += (pr = stackOut.r); + g_out_sum += (pg = stackOut.g); + b_out_sum += (pb = stackOut.b); + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + stackOut = stackOut.next; + yi += 4; + } + yw += width; + } + for (x = _o = 0; 0 <= width ? _o < width : _o > width; x = 0 <= width ? ++_o : --_o) { + g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0; + yi = x << 2; + r_out_sum = radiusPlus1 * (pr = pixels[yi]); + g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]); + b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]); + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + stack = stackStart; + for (i = _p = 0; 0 <= radiusPlus1 ? _p < radiusPlus1 : _p > radiusPlus1; i = 0 <= radiusPlus1 ? ++_p : --_p) { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack = stack.next; + } + yp = width; + for (i = _q = 1; 1 <= radiusPlus1 ? _q < radiusPlus1 : _q > radiusPlus1; i = 1 <= radiusPlus1 ? ++_q : --_q) { + yi = (yp + x) << 2; + r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i); + g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs; + b_sum += (stack.b = (pb = pixels[yi + 2])) * rbs; + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + stack = stack.next; + if (i < heightMinus1) { + yp += width; + } + } + yi = x; + stackIn = stackStart; + stackOut = stackEnd; + for (y = _r = 0; 0 <= height ? _r < height : _r > height; y = 0 <= height ? ++_r : --_r) { + p = yi << 2; + pixels[p] = (r_sum * mul_sum) >> shg_sum; + pixels[p + 1] = (g_sum * mul_sum) >> shg_sum; + pixels[p + 2] = (b_sum * mul_sum) >> shg_sum; + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2; + r_sum += (r_in_sum += (stackIn.r = pixels[p])); + g_sum += (g_in_sum += (stackIn.g = pixels[p + 1])); + b_sum += (b_in_sum += (stackIn.b = pixels[p + 2])); + stackIn = stackIn.next; + r_out_sum += (pr = stackOut.r); + g_out_sum += (pg = stackOut.g); + b_out_sum += (pb = stackOut.b); + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + stackOut = stackOut.next; + yi += width; + } + } + radius *= increaseFactor; + i = wh; + while (--i > -1) { + idx = i << 2; + lookupValue = (radiusPixels[idx + 2] & 0xff) / 255.0 * blurLevels; + index = lookupValue | 0; + if (index === currentIndex) { + blend = 256.0 * (lookupValue - (lookupValue | 0)); + iblend = 256 - blend; + imagePixels[idx] = (imagePixels[idx] * iblend + pixels[idx] * blend) >> 8; + imagePixels[idx + 1] = (imagePixels[idx + 1] * iblend + pixels[idx + 1] * blend) >> 8; + imagePixels[idx + 2] = (imagePixels[idx + 2] * iblend + pixels[idx + 2] * blend) >> 8; + } else if (index === currentIndex + 1) { + imagePixels[idx] = pixels[idx]; + imagePixels[idx + 1] = pixels[idx + 1]; + imagePixels[idx + 2] = pixels[idx + 2]; + } + } + currentIndex++; + } + return this; + }); + Caman.Filter.register("tiltShift", function(opts) { + var defaults, gradient; + defaults = { + center: { + x: this.dimensions.width / 2, + y: this.dimensions.height / 2 + }, + angle: 45, + focusWidth: 200, + startRadius: 3, + radiusFactor: 1.5, + steps: 3 + }; + opts = Util.extend(defaults, opts); + opts.angle *= Math.PI / 180; + gradient = getLinearGradientMap(this.dimensions.width, this.dimensions.height, opts.center.x, opts.center.y, opts.angle, opts.focusWidth, true); + return this.processPlugin("compoundBlur", [gradient, opts.startRadius, opts.radiusFactor, opts.steps]); + }); + return Caman.Filter.register("radialBlur", function(opts) { + var defaults, gradient, radius1, radius2; + defaults = { + size: 50, + center: { + x: this.dimensions.width / 2, + y: this.dimensions.height / 2 + }, + startRadius: 3, + radiusFactor: 1.5, + steps: 3, + radius: null + }; + opts = Util.extend(defaults, opts); + if (!opts.radius) { + opts.radius = this.dimensions.width < this.dimensions.height ? this.dimensions.height : this.dimensions.width; + } + radius1 = (opts.radius / 2) - opts.size; + radius2 = opts.radius / 2; + gradient = getRadialGradientMap(this.dimensions.width, this.dimensions.height, opts.center.x, opts.center.y, radius1, radius2); + return this.processPlugin("compoundBlur", [gradient, opts.startRadius, opts.radiusFactor, opts.steps]); + }); + })(); + + Caman.Filter.register("edgeEnhance", function() { + return this.processKernel("Edge Enhance", [0, 0, 0, -1, 1, 0, 0, 0, 0]); + }); + + Caman.Filter.register("edgeDetect", function() { + return this.processKernel("Edge Detect", [-1, -1, -1, -1, 8, -1, -1, -1, -1]); + }); + + Caman.Filter.register("emboss", function() { + return this.processKernel("Emboss", [-2, -1, 0, -1, 1, 1, 0, 1, 2]); + }); + + Caman.Filter.register("posterize", function(adjust) { + var numOfAreas, numOfValues; + numOfAreas = 256 / adjust; + numOfValues = 255 / (adjust - 1); + return this.process("posterize", function(rgba) { + rgba.r = Math.floor(Math.floor(rgba.r / numOfAreas) * numOfValues); + rgba.g = Math.floor(Math.floor(rgba.g / numOfAreas) * numOfValues); + rgba.b = Math.floor(Math.floor(rgba.b / numOfAreas) * numOfValues); + return rgba; + }); + }); + + Caman.Filter.register("vintage", function(vignette) { + if (vignette == null) { + vignette = true; + } + this.greyscale(); + this.contrast(5); + this.noise(3); + this.sepia(100); + this.channels({ + red: 8, + blue: 2, + green: 4 + }); + this.gamma(0.87); + if (vignette) { + return this.vignette("40%", 30); + } + }); + + Caman.Filter.register("lomo", function(vignette) { + if (vignette == null) { + vignette = true; + } + this.brightness(15); + this.exposure(15); + this.curves('rgb', [0, 0], [200, 0], [155, 255], [255, 255]); + this.saturation(-20); + this.gamma(1.8); + if (vignette) { + this.vignette("50%", 60); + } + return this.brightness(5); + }); + + Caman.Filter.register("clarity", function(grey) { + if (grey == null) { + grey = false; + } + this.vibrance(20); + this.curves('rgb', [5, 0], [130, 150], [190, 220], [250, 255]); + this.sharpen(15); + this.vignette("45%", 20); + if (grey) { + this.greyscale(); + this.contrast(4); + } + return this; + }); + + Caman.Filter.register("sinCity", function() { + this.contrast(100); + this.brightness(15); + this.exposure(10); + this.posterize(80); + this.clip(30); + return this.greyscale(); + }); + + Caman.Filter.register("sunrise", function() { + this.exposure(3.5); + this.saturation(-5); + this.vibrance(50); + this.sepia(60); + this.colorize("#e87b22", 10); + this.channels({ + red: 8, + blue: 8 + }); + this.contrast(5); + this.gamma(1.2); + return this.vignette("55%", 25); + }); + + Caman.Filter.register("crossProcess", function() { + this.exposure(5); + this.colorize("#e87b22", 4); + this.sepia(20); + this.channels({ + blue: 8, + red: 3 + }); + this.curves('b', [0, 0], [100, 150], [180, 180], [255, 255]); + this.contrast(15); + this.vibrance(75); + return this.gamma(1.6); + }); + + Caman.Filter.register("orangePeel", function() { + this.curves('rgb', [0, 0], [100, 50], [140, 200], [255, 255]); + this.vibrance(-30); + this.saturation(-30); + this.colorize('#ff9000', 30); + this.contrast(-5); + return this.gamma(1.4); + }); + + Caman.Filter.register("love", function() { + this.brightness(5); + this.exposure(8); + this.contrast(4); + this.colorize('#c42007', 30); + this.vibrance(50); + return this.gamma(1.3); + }); + + Caman.Filter.register("grungy", function() { + this.gamma(1.5); + this.clip(25); + this.saturation(-60); + this.contrast(5); + this.noise(5); + return this.vignette("50%", 30); + }); + + Caman.Filter.register("jarques", function() { + this.saturation(-35); + this.curves('b', [20, 0], [90, 120], [186, 144], [255, 230]); + this.curves('r', [0, 0], [144, 90], [138, 120], [255, 255]); + this.curves('g', [10, 0], [115, 105], [148, 100], [255, 248]); + this.curves('rgb', [0, 0], [120, 100], [128, 140], [255, 255]); + return this.sharpen(20); + }); + + Caman.Filter.register("pinhole", function() { + this.greyscale(); + this.sepia(10); + this.exposure(10); + this.contrast(15); + return this.vignette("60%", 35); + }); + + Caman.Filter.register("oldBoot", function() { + this.saturation(-20); + this.vibrance(-50); + this.gamma(1.1); + this.sepia(30); + this.channels({ + red: -10, + blue: 5 + }); + this.curves('rgb', [0, 0], [80, 50], [128, 230], [255, 255]); + return this.vignette("60%", 30); + }); + + Caman.Filter.register("glowingSun", function(vignette) { + if (vignette == null) { + vignette = true; + } + this.brightness(10); + this.newLayer(function() { + this.setBlendingMode("multiply"); + this.opacity(80); + this.copyParent(); + this.filter.gamma(0.8); + this.filter.contrast(50); + return this.filter.exposure(10); + }); + this.newLayer(function() { + this.setBlendingMode("softLight"); + this.opacity(80); + return this.fillColor("#f49600"); + }); + this.exposure(20); + this.gamma(0.8); + if (vignette) { + return this.vignette("45%", 20); + } + }); + + Caman.Filter.register("hazyDays", function() { + this.gamma(1.2); + this.newLayer(function() { + this.setBlendingMode("overlay"); + this.opacity(60); + this.copyParent(); + this.filter.channels({ + red: 5 + }); + return this.filter.stackBlur(15); + }); + this.newLayer(function() { + this.setBlendingMode("addition"); + this.opacity(40); + return this.fillColor("#6899ba"); + }); + this.newLayer(function() { + this.setBlendingMode("multiply"); + this.opacity(35); + this.copyParent(); + this.filter.brightness(40); + this.filter.vibrance(40); + this.filter.exposure(30); + this.filter.contrast(15); + this.filter.curves('r', [0, 40], [128, 128], [128, 128], [255, 215]); + this.filter.curves('g', [0, 40], [128, 128], [128, 128], [255, 215]); + this.filter.curves('b', [0, 40], [128, 128], [128, 128], [255, 215]); + return this.filter.stackBlur(5); + }); + this.curves('r', [20, 0], [128, 158], [128, 128], [235, 255]); + this.curves('g', [20, 0], [128, 128], [128, 128], [235, 255]); + this.curves('b', [20, 0], [128, 108], [128, 128], [235, 255]); + return this.vignette("45%", 20); + }); + + Caman.Filter.register("herMajesty", function() { + this.brightness(40); + this.colorize("#ea1c5d", 10); + this.curves('b', [0, 10], [128, 180], [190, 190], [255, 255]); + this.newLayer(function() { + this.setBlendingMode('overlay'); + this.opacity(50); + this.copyParent(); + this.filter.gamma(0.7); + return this.newLayer(function() { + this.setBlendingMode('normal'); + this.opacity(60); + return this.fillColor('#ea1c5d'); + }); + }); + this.newLayer(function() { + this.setBlendingMode('multiply'); + this.opacity(60); + this.copyParent(); + this.filter.saturation(50); + this.filter.hue(90); + return this.filter.contrast(10); + }); + this.gamma(1.4); + this.vibrance(-30); + this.newLayer(function() { + this.opacity(10); + return this.fillColor('#e5f0ff'); + }); + return this; + }); + + Caman.Filter.register("nostalgia", function() { + this.saturation(20); + this.gamma(1.4); + this.greyscale(); + this.contrast(5); + this.sepia(100); + this.channels({ + red: 8, + blue: 2, + green: 4 + }); + this.gamma(0.8); + this.contrast(5); + this.exposure(10); + this.newLayer(function() { + this.setBlendingMode('overlay'); + this.copyParent(); + this.opacity(55); + return this.filter.stackBlur(10); + }); + return this.vignette("50%", 30); + }); + + Caman.Filter.register("hemingway", function() { + this.greyscale(); + this.contrast(10); + this.gamma(0.9); + this.newLayer(function() { + this.setBlendingMode("multiply"); + this.opacity(40); + this.copyParent(); + this.filter.exposure(15); + this.filter.contrast(15); + return this.filter.channels({ + green: 10, + red: 5 + }); + }); + this.sepia(30); + this.curves('rgb', [0, 10], [120, 90], [180, 200], [235, 255]); + this.channels({ + red: 5, + green: -2 + }); + return this.exposure(15); + }); + + Caman.Filter.register("concentrate", function() { + this.sharpen(40); + this.saturation(-50); + this.channels({ + red: 3 + }); + this.newLayer(function() { + this.setBlendingMode("multiply"); + this.opacity(80); + this.copyParent(); + this.filter.sharpen(5); + this.filter.contrast(50); + this.filter.exposure(10); + return this.filter.channels({ + blue: 5 + }); + }); + return this.brightness(10); + }); + + Caman.Plugin.register("crop", function(width, height, x, y) { + var canvas, ctx; + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + if (typeof exports !== "undefined" && exports !== null) { + canvas = new Canvas(width, height); + } else { + canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + } + ctx = canvas.getContext('2d'); + ctx.drawImage(this.canvas, x, y, width, height, 0, 0, width, height); + return this.replaceCanvas(canvas); + }); + + Caman.Plugin.register("resize", function(newDims) { + var canvas, ctx; + if (newDims == null) { + newDims = null; + } + if (newDims === null || (!(newDims.width != null) && !(newDims.height != null))) { + Log.error("Invalid or missing dimensions given for resize"); + return; + } + if (!(newDims.width != null)) { + newDims.width = this.canvas.width * newDims.height / this.canvas.height; + } else if (!(newDims.height != null)) { + newDims.height = this.canvas.height * newDims.width / this.canvas.width; + } + if (typeof exports !== "undefined" && exports !== null) { + canvas = new Canvas(newDims.width, newDims.height); + } else { + canvas = document.createElement('canvas'); + canvas.width = newDims.width; + canvas.height = newDims.height; + } + ctx = canvas.getContext('2d'); + ctx.drawImage(this.canvas, 0, 0, this.canvas.width, this.canvas.height, 0, 0, newDims.width, newDims.height); + return this.replaceCanvas(canvas); + }); + + Caman.Filter.register("crop", function(width, height, x, y) { + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + return this.processPlugin("crop", Array.prototype.slice.call(arguments, 0)); + }); + + Caman.Filter.register("resize", function(width, height) { + return this.processPlugin("resize", Array.prototype.slice.call(arguments, 0)); + }); + + /* + StackBlur - a fast almost Gaussian Blur For Canvas v0.31 modified for CamanJS + + Version: 0.31 + Author: Mario Klingemann + Contact: mario@quasimondo.com + Website: http://www.quasimondo.com/StackBlurForCanvas + Twitter: @quasimondo + Modified By: Ryan LeFevre (@meltingice) + + In case you find this class useful - especially in commercial projects - + I am not totally unhappy for a small donation to my PayPal account + mario@quasimondo.de + + Or support me on flattr: + https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript + + Copyright (c) 2010 Mario Klingemann + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ + + + (function() { + var BlurStack, mul_table, shg_table; + mul_table = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259]; + shg_table = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24]; + BlurStack = function() { + this.r = 0; + this.g = 0; + this.b = 0; + this.a = 0; + return this.next = null; + }; + Caman.Plugin.register("stackBlur", function(radius) { + var b_in_sum, b_out_sum, b_sum, div, g_in_sum, g_out_sum, g_sum, height, heightMinus1, i, mul_sum, p, pb, pg, pixels, pr, r_in_sum, r_out_sum, r_sum, radiusPlus1, rbs, shg_sum, stack, stackEnd, stackIn, stackOut, stackStart, sumFactor, w4, width, widthMinus1, x, y, yi, yp, yw, _i, _j, _k, _l, _m, _n, _o, _p, _q; + if (isNaN(radius) || radius < 1) { + return; + } + radius |= 0; + pixels = this.pixelData; + width = this.dimensions.width; + height = this.dimensions.height; + div = radius + radius + 1; + w4 = width << 2; + widthMinus1 = width - 1; + heightMinus1 = height - 1; + radiusPlus1 = radius + 1; + sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2; + stackStart = new BlurStack(); + stack = stackStart; + for (i = _i = 1; 1 <= div ? _i < div : _i > div; i = 1 <= div ? ++_i : --_i) { + stack = stack.next = new BlurStack(); + if (i === radiusPlus1) { + stackEnd = stack; + } + } + stack.next = stackStart; + stackIn = null; + stackOut = null; + yw = yi = 0; + mul_sum = mul_table[radius]; + shg_sum = shg_table[radius]; + for (y = _j = 0; 0 <= height ? _j < height : _j > height; y = 0 <= height ? ++_j : --_j) { + r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0; + r_out_sum = radiusPlus1 * (pr = pixels[yi]); + g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]); + b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]); + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + stack = stackStart; + for (i = _k = 0; 0 <= radiusPlus1 ? _k < radiusPlus1 : _k > radiusPlus1; i = 0 <= radiusPlus1 ? ++_k : --_k) { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack = stack.next; + } + for (i = _l = 1; 1 <= radiusPlus1 ? _l < radiusPlus1 : _l > radiusPlus1; i = 1 <= radiusPlus1 ? ++_l : --_l) { + p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2); + r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i); + g_sum += (stack.g = (pg = pixels[p + 1])) * rbs; + b_sum += (stack.b = (pb = pixels[p + 2])) * rbs; + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + stack = stack.next; + } + stackIn = stackStart; + stackOut = stackEnd; + for (x = _m = 0; 0 <= width ? _m < width : _m > width; x = 0 <= width ? ++_m : --_m) { + pixels[yi] = (r_sum * mul_sum) >> shg_sum; + pixels[yi + 1] = (g_sum * mul_sum) >> shg_sum; + pixels[yi + 2] = (b_sum * mul_sum) >> shg_sum; + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2; + r_in_sum += (stackIn.r = pixels[p]); + g_in_sum += (stackIn.g = pixels[p + 1]); + b_in_sum += (stackIn.b = pixels[p + 2]); + r_sum += r_in_sum; + g_sum += g_in_sum; + b_sum += b_in_sum; + stackIn = stackIn.next; + r_out_sum += (pr = stackOut.r); + g_out_sum += (pg = stackOut.g); + b_out_sum += (pb = stackOut.b); + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + stackOut = stackOut.next; + yi += 4; + } + yw += width; + } + for (x = _n = 0; 0 <= width ? _n < width : _n > width; x = 0 <= width ? ++_n : --_n) { + g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0; + yi = x << 2; + r_out_sum = radiusPlus1 * (pr = pixels[yi]); + g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]); + b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]); + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + stack = stackStart; + for (i = _o = 0; 0 <= radiusPlus1 ? _o < radiusPlus1 : _o > radiusPlus1; i = 0 <= radiusPlus1 ? ++_o : --_o) { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack = stack.next; + } + yp = width; + for (i = _p = 1; 1 <= radius ? _p <= radius : _p >= radius; i = 1 <= radius ? ++_p : --_p) { + yi = (yp + x) << 2; + r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i); + g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs; + b_sum += (stack.b = (pb = pixels[yi + 2])) * rbs; + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + stack = stack.next; + if (i < heightMinus1) { + yp += width; + } + } + yi = x; + stackIn = stackStart; + stackOut = stackEnd; + for (y = _q = 0; 0 <= height ? _q < height : _q > height; y = 0 <= height ? ++_q : --_q) { + p = yi << 2; + pixels[p] = (r_sum * mul_sum) >> shg_sum; + pixels[p + 1] = (g_sum * mul_sum) >> shg_sum; + pixels[p + 2] = (b_sum * mul_sum) >> shg_sum; + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2; + r_sum += (r_in_sum += (stackIn.r = pixels[p])); + g_sum += (g_in_sum += (stackIn.g = pixels[p + 1])); + b_sum += (b_in_sum += (stackIn.b = pixels[p + 2])); + stackIn = stackIn.next; + r_out_sum += (pr = stackOut.r); + g_out_sum += (pg = stackOut.g); + b_out_sum += (pb = stackOut.b); + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + stackOut = stackOut.next; + yi += width; + } + } + return this; + }); + return Caman.Filter.register("stackBlur", function(radius) { + return this.processPlugin("stackBlur", [radius]); + }); + })(); + + Caman.Filter.register("threshold", function(adjust) { + return this.process("threshold", function(rgba) { + var luminance; + luminance = (0.2126 * rgba.r) + (0.7152 * rgba.g) + (0.0722 * rgba.b); + if (luminance < adjust) { + rgba.r = 0; + rgba.g = 0; + rgba.b = 0; + } else { + rgba.r = 255; + rgba.g = 255; + rgba.b = 255; + } + return rgba; + }); + }); + +}).call(this); diff --git a/ajax/libs/camanjs/4.0.0/caman.full.min.js b/ajax/libs/camanjs/4.0.0/caman.full.min.js new file mode 100755 index 000000000..c09dc61f0 --- /dev/null +++ b/ajax/libs/camanjs/4.0.0/caman.full.min.js @@ -0,0 +1,203 @@ + +(function(){var $,Analyze,Blender,Calculate,Caman,CamanParser,Canvas,Convert,Event,Fiber,Filter,IO,Image,Layer,Log,Logger,PixelInfo,Plugin,Renderer,Root,Store,Util,fs,slice,vignetteFilters,__hasProp={}.hasOwnProperty,__indexOf=[].indexOf||function(item){for(var i=0,l=this.length;i255){return 255;} +return val;};Util.copyAttributes=function(from,to,opts){var attr,_i,_len,_ref,_ref1,_results;if(opts==null){opts={};} +_ref=from.attributes;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){attr=_ref[_i];if((opts.except!=null)&&(_ref1=attr.nodeName,__indexOf.call(opts.except,_ref1)>=0)){continue;} +_results.push(to.setAttribute(attr.nodeName,attr.nodeValue));} +return _results;};return Util;})();if(typeof exports!=="undefined"&&exports!==null){Root=exports;Canvas=require('canvas');Image=Canvas.Image;Fiber=require('fibers');fs=require('fs');}else{Root=window;} +Root.Caman=Caman=(function(){Caman.version={release:"4.0.0",date:"1/6/13"};Caman.DEBUG=false;Caman.NodeJS=typeof exports!=="undefined"&&exports!==null;Caman.autoload=!Caman.NodeJS;Caman.crossOrigin="anonymous";Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.remoteProxy="";Caman.proxyParam="camanProxyUrl";Caman.getAttrId=function(canvas){if(typeof canvas==="string"){canvas=$(canvas);} +if(!((canvas!=null)&&(canvas.getAttribute!=null))){return null;} +return canvas.getAttribute('data-caman-id');};function Caman(){var args,callback,id,_this=this;if(arguments.length===0){throw"Invalid arguments";} +if(this instanceof Caman){this.finishInit=this.finishInit.bind(this);this.imageLoaded=this.imageLoaded.bind(this);args=arguments[0];if(!Caman.NodeJS){id=parseInt(Caman.getAttrId(args[0]),10);callback=typeof args[1]==="function"?args[1]:typeof args[2]==="function"?args[2]:function(){};if(!isNaN(id)&&Store.has(id)){return Store.execute(id,callback);}} +this.id=Util.uniqid.get();this.originalPixelData=[];this.pixelStack=[];this.layerStack=[];this.canvasQueue=[];this.currentLayer=null;this.scaled=false;this.analyze=new Analyze(this);this.renderer=new Renderer(this);this.domIsLoaded(function(){_this.parseArguments(args);return _this.setup();});return this;}else{return new Caman(arguments);}} +Caman.prototype.domIsLoaded=function(cb){var listener,_this=this;if(Caman.NodeJS){return setTimeout(function(){return cb.call(_this);},0);}else{if(document.readyState==="complete"){Log.debug("DOM initialized");return setTimeout(function(){return cb.call(_this);},0);}else{listener=function(){if(document.readyState==="complete"){Log.debug("DOM initialized");return cb.call(_this);}};return document.addEventListener("readystatechange",listener,false);}}};Caman.prototype.parseArguments=function(args){if(args.length===0){throw"Invalid arguments given";} +this.initObj=null;this.initType=null;this.imageUrl=null;this.callback=function(){};this.setInitObject(args[0]);if(args.length===1){return;} +switch(typeof args[1]){case"string":this.imageUrl=args[1];break;case"function":this.callback=args[1];} +if(args.length===2){return;} +return this.callback=args[2];};Caman.prototype.setInitObject=function(obj){if(Caman.NodeJS){this.initObj=obj;this.initType='node';return;} +if(typeof obj==="object"){this.initObj=obj;}else{this.initObj=$(obj);} +return this.initType=this.initObj.nodeName.toLowerCase();};Caman.prototype.setup=function(){switch(this.initType){case"node":return this.initNode();case"img":return this.initImage();case"canvas":return this.initCanvas();}};Caman.prototype.initNode=function(){var _this=this;Log.debug("Initializing for NodeJS");this.image=new Image();this.image.onload=function(){Log.debug("Image loaded. Width = "+_this.image.width+", Height = "+_this.image.height);_this.canvas=new Canvas(_this.image.width,_this.image.height);return _this.finishInit();};this.image.onerror=function(err){throw err;};return this.image.src=this.initObj;};Caman.prototype.initImage=function(){this.image=this.initObj;this.canvas=document.createElement('canvas');this.context=this.canvas.getContext('2d');Util.copyAttributes(this.image,this.canvas,{except:['src']});this.image.parentNode.replaceChild(this.canvas,this.image);this.imageAdjustments();return this.waitForImageLoaded();};Caman.prototype.initCanvas=function(){this.canvas=this.initObj;this.context=this.canvas.getContext('2d');if(this.imageUrl!=null){this.image=document.createElement('img');this.image.src=this.imageUrl;this.imageAdjustments();return this.waitForImageLoaded();}else{return this.finishInit();}};Caman.prototype.imageAdjustments=function(){if(this.needsHiDPISwap()){Log.debug(this.image.src,"->",this.hiDPIReplacement());this.swapped=true;this.image.src=this.hiDPIReplacement();} +if(IO.isRemote(this.image)){this.image.src=IO.proxyUrl(this.image.src);return Log.debug("Remote image detected, using URL = "+this.image.src);}};Caman.prototype.waitForImageLoaded=function(){if(this.image.complete){return this.imageLoaded();}else{return this.image.onload=this.imageLoaded;}};Caman.prototype.imageLoaded=function(){Log.debug("Image loaded. Width = "+this.image.width+", Height = "+this.image.height);if(this.swapped){this.canvas.width=this.image.width/this.hiDPIRatio();this.canvas.height=this.image.height/this.hiDPIRatio();}else{this.canvas.width=this.image.width;this.canvas.height=this.image.height;} +return this.finishInit();};Caman.prototype.finishInit=function(){var pixel,_i,_len,_ref;if(this.context==null){this.context=this.canvas.getContext('2d');} +this.originalWidth=this.width=this.canvas.width;this.originalHeight=this.height=this.canvas.height;this.hiDPIAdjustments();this.assignId();if(this.image!=null){this.context.drawImage(this.image,0,0,this.image.width,this.image.height,0,0,this.originalWidth,this.originalHeight);} +this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;_ref=this.pixelData;for(_i=0,_len=_ref.length;_i<_len;_i++){pixel=_ref[_i];this.originalPixelData.push(pixel);} +this.dimensions={width:this.canvas.width,height:this.canvas.height};Store.put(this.id,this);return this.callback.call(this,this);};Caman.prototype.assignId=function(){if(Caman.NodeJS||this.canvas.getAttribute('data-caman-id')){return;} +return this.canvas.setAttribute('data-caman-id',this.id);};Caman.prototype.hiDPIDisabled=function(){return this.canvas.getAttribute('data-caman-hidpi-disabled')!==null;};Caman.prototype.hiDPIAdjustments=function(){var ratio;if(Caman.NodeJS||this.hiDPIDisabled()){return;} +ratio=this.hiDPIRatio();if(ratio!==1){Log.debug("HiDPI ratio = "+ratio);this.scaled=true;this.originalWidth=this.canvas.width;this.originalHeight=this.canvas.height;this.canvas.width=this.originalWidth*ratio;this.canvas.height=this.originalHeight*ratio;this.canvas.style.width=""+this.originalWidth+"px";this.canvas.style.height=""+this.originalHeight+"px";this.context.scale(ratio,ratio);this.width=this.canvas.width;return this.height=this.canvas.height;}};Caman.prototype.hiDPIRatio=function(){var backingStoreRatio,devicePixelRatio;devicePixelRatio=window.devicePixelRatio||1;backingStoreRatio=this.context.webkitBackingStorePixelRatio||this.context.mozBackingStorePixelRatio||this.context.msBackingStorePixelRatio||this.context.oBackingStorePixelRatio||this.context.backingStorePixelRatio||1;return devicePixelRatio/backingStoreRatio;};Caman.prototype.hiDPICapable=function(){return window.devicePixelRatio!==1;};Caman.prototype.needsHiDPISwap=function(){if(this.hiDPIDisabled()||!this.hiDPICapable()){return false;} +return this.hiDPIReplacement()!==null;};Caman.prototype.hiDPIReplacement=function(){if(this.image==null){return null;} +return this.image.getAttribute('data-caman-hidpi');};Caman.prototype.replaceCanvas=function(newCanvas){var oldCanvas;oldCanvas=this.canvas;this.canvas=newCanvas;oldCanvas.parentNode.replaceChild(this.canvas,oldCanvas);return this.finishInit();};Caman.prototype.render=function(callback){var _this=this;if(callback==null){callback=function(){};} +Event.trigger(this,"renderStart");return this.renderer.execute(function(){_this.context.putImageData(_this.imageData,0,0);return callback.call(_this);});};Caman.prototype.revert=function(ready){var i,pixel,_i,_len,_ref;if(ready==null){ready=function(){};} +_ref=this.originalPixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.pixelData[i]=pixel;} +this.context.putImageData(this.imageData,0,0);return ready.call(this);};Caman.prototype.process=function(name,processFn){this.renderer.add({type:Filter.Type.Single,name:name,processFn:processFn});return this;};Caman.prototype.processKernel=function(name,adjust,divisor,bias){var i,_i,_ref;if(!divisor){divisor=0;for(i=_i=0,_ref=adjust.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){divisor+=adjust[i];}} +this.renderer.add({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias||0});return this;};Caman.prototype.processPlugin=function(plugin,args){this.renderer.add({type:Filter.Type.Plugin,plugin:plugin,args:args});return this;};Caman.prototype.newLayer=function(callback){var layer;layer=new Layer(this);this.canvasQueue.push(layer);this.renderer.add({type:Filter.Type.LayerDequeue});callback.call(layer);this.renderer.add({type:Filter.Type.LayerFinished});return this;};Caman.prototype.executeLayer=function(layer){return this.pushContext(layer);};Caman.prototype.pushContext=function(layer){this.layerStack.push(this.currentLayer);this.pixelStack.push(this.pixelData);this.currentLayer=layer;return this.pixelData=layer.pixelData;};Caman.prototype.popContext=function(){this.pixelData=this.pixelStack.pop();return this.currentLayer=this.layerStack.pop();};Caman.prototype.applyCurrentLayer=function(){return this.currentLayer.applyToParent();};return Caman;})();Analyze=(function(){function Analyze(c){this.c=c;} +Analyze.prototype.calculateLevels=function(){var i,levels,numPixels,_i,_j,_k,_ref;levels={r:{},g:{},b:{}};for(i=_i=0;_i<=255;i=++_i){levels.r[i]=0;levels.g[i]=0;levels.b[i]=0;} +for(i=_j=0,_ref=this.c.pixelData.length;_j<_ref;i=_j+=4){levels.r[this.c.pixelData[i]]++;levels.g[this.c.pixelData[i+1]]++;levels.b[this.c.pixelData[i+2]]++;} +numPixels=this.c.pixelData.length/4;for(i=_k=0;_k<=255;i=++_k){levels.r[i]/=numPixels;levels.g[i]/=numPixels;levels.b[i]/=numPixels;} +return levels;};return Analyze;})();Caman.DOMUpdated=function(){var img,imgs,parser,_i,_len,_results;imgs=document.querySelectorAll("img[data-caman]");if(!(imgs.length>0)){return;} +_results=[];for(_i=0,_len=imgs.length;_i<_len;_i++){img=imgs[_i];_results.push(parser=new CamanParser(img,function(){this.parse();return this.execute();}));} +return _results;};if(Caman.autoload){(function(){if(document.readyState==="complete"){return Caman.DOMUpdated();}else{return document.addEventListener("DOMContentLoaded",Caman.DOMUpdated,false);}})();} +CamanParser=(function(){var INST_REGEX;INST_REGEX="(\\w+)\\((.*?)\\)";function CamanParser(ele,ready){this.dataStr=ele.getAttribute('data-caman');this.caman=Caman(ele,ready.bind(this));} +CamanParser.prototype.parse=function(){var args,filter,func,inst,instFunc,m,r,unparsedInstructions,_i,_len,_ref,_results;this.ele=this.caman.canvas;r=new RegExp(INST_REGEX,'g');unparsedInstructions=this.dataStr.match(r);if(!(unparsedInstructions.length>0)){return;} +r=new RegExp(INST_REGEX);_results=[];for(_i=0,_len=unparsedInstructions.length;_i<_len;_i++){inst=unparsedInstructions[_i];_ref=inst.match(r),m=_ref[0],filter=_ref[1],args=_ref[2];instFunc=new Function("return function() { this."+filter+"("+args+"); };");try{func=instFunc();_results.push(func.call(this.caman));}catch(e){_results.push(Log.debug(e));}} +return _results;};CamanParser.prototype.execute=function(){var ele;ele=this.ele;return this.caman.render(function(){return ele.parentNode.replaceChild(this.toImage(),ele);});};return CamanParser;})();Caman.Blender=Blender=(function(){function Blender(){} +Blender.blenders={};Blender.register=function(name,func){return this.blenders[name]=func;};Blender.execute=function(name,rgbaLayer,rgbaParent){return this.blenders[name](rgbaLayer,rgbaParent);};return Blender;})();Caman.Calculate=Calculate=(function(){function Calculate(){} +Calculate.distance=function(x1,y1,x2,y2){return Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));};Calculate.randomRange=function(min,max,getFloat){var rand;if(getFloat==null){getFloat=false;} +rand=min+(Math.random()*(max-min));if(getFloat){return rand.toFixed(getFloat);}else{return Math.round(rand);}};Calculate.luminance=function(rgba){return(0.299*rgba.r)+(0.587*rgba.g)+(0.114*rgba.b);};Calculate.bezier=function(start,ctrl1,ctrl2,end,lowBound,highBound){var Ax,Ay,Bx,By,Cx,Cy,bezier,curveX,curveY,i,j,leftCoord,rightCoord,t,x0,x1,x2,x3,y0,y1,y2,y3,_i,_j,_k,_ref,_ref1;x0=start[0];y0=start[1];x1=ctrl1[0];y1=ctrl1[1];x2=ctrl2[0];y2=ctrl2[1];x3=end[0];y3=end[1];bezier={};Cx=parseInt(3*(x1-x0),10);Bx=3*(x2-x1)-Cx;Ax=x3-x0-Cx-Bx;Cy=3*(y1-y0);By=3*(y2-y1)-Cy;Ay=y3-y0-Cy-By;for(i=_i=0;_i<1000;i=++_i){t=i/1000;curveX=Math.round((Ax*Math.pow(t,3))+(Bx*Math.pow(t,2))+(Cx*t)+x0);curveY=Math.round((Ay*Math.pow(t,3))+(By*Math.pow(t,2))+(Cy*t)+y0);if(lowBound&&curveYhighBound){curveY=highBound;} +bezier[curveX]=curveY;} +if(bezier.length=_ref;i=0<=_ref?++_j:--_j){if(!(bezier[i]!=null)){leftCoord=[i-1,bezier[i-1]];for(j=_k=i,_ref1=end[0];i<=_ref1?_k<=_ref1:_k>=_ref1;j=i<=_ref1?++_k:--_k){if(bezier[j]!=null){rightCoord=[j,bezier[j]];break;}} +bezier[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}}} +if(!(bezier[end[0]]!=null)){bezier[end[0]]=bezier[end[0]-1];} +return bezier;};return Calculate;})();Convert=(function(){function Convert(){} +Convert.hexToRGB=function(hex){var b,g,r;if(hex.charAt(0)==="#"){hex=hex.substr(1);} +r=parseInt(hex.substr(0,2),16);g=parseInt(hex.substr(2,2),16);b=parseInt(hex.substr(4,2),16);return{r:r,g:g,b:b};};Convert.rgbToHSL=function(r,g,b){var d,h,l,max,min,s;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} +r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);l=(max+min)/2;if(max===min){h=s=0;}else{d=max-min;s=l>0.5?d/(2-max-min):d/(max+min);h=(function(){switch(max){case r:return(g-b)/d+(g1){t-=1;} +if(t<1/6){return p+(q-p)*6*t;} +if(t<1/2){return q;} +if(t<2/3){return p+(q-p)*(2/3-t)*6;} +return p;};Convert.rgbToHSV=function(r,g,b){var d,h,max,min,s,v;r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);v=max;d=max-min;s=max===0?0:d/max;if(max===min){h=0;}else{h=(function(){switch(max){case r:return(g-b)/d+(g0.04045){r=Math.pow((r+0.055)/1.055,2.4);}else{r/=12.92;} +if(g>0.04045){g=Math.pow((g+0.055)/1.055,2.4);}else{g/=12.92;} +if(b>0.04045){b=Math.pow((b+0.055)/1.055,2.4);}else{b/=12.92;} +x=r*0.4124+g*0.3576+b*0.1805;y=r*0.2126+g*0.7152+b*0.0722;z=r*0.0193+g*0.1192+b*0.9505;return{x:x*100,y:y*100,z:z*100};};Convert.xyzToRGB=function(x,y,z){var b,g,r;x/=100;y/=100;z/=100;r=(3.2406*x)+(-1.5372*y)+(-0.4986*z);g=(-0.9689*x)+(1.8758*y)+(0.0415*z);b=(0.0557*x)+(-0.2040*y)+(1.0570*z);if(r>0.0031308){r=(1.055*Math.pow(r,0.4166666667))-0.055;}else{r*=12.92;} +if(g>0.0031308){g=(1.055*Math.pow(g,0.4166666667))-0.055;}else{g*=12.92;} +if(b>0.0031308){b=(1.055*Math.pow(b,0.4166666667))-0.055;}else{b*=12.92;} +return{r:r*255,g:g*255,b:b*255};};Convert.xyzToLab=function(x,y,z){var a,b,l,whiteX,whiteY,whiteZ;if(typeof x==="object"){y=x.y;z=x.z;x=x.x;} +whiteX=95.047;whiteY=100.0;whiteZ=108.883;x/=whiteX;y/=whiteY;z/=whiteZ;if(x>0.008856451679){x=Math.pow(x,0.3333333333);}else{x=(7.787037037*x)+0.1379310345;} +if(y>0.008856451679){y=Math.pow(y,0.3333333333);}else{y=(7.787037037*y)+0.1379310345;} +if(z>0.008856451679){z=Math.pow(z,0.3333333333);}else{z=(7.787037037*z)+0.1379310345;} +l=116*y-16;a=500*(x-y);b=200*(y-z);return{l:l,a:a,b:b};};Convert.labToXYZ=function(l,a,b){var x,y,z;if(typeof l==="object"){a=l.a;b=l.b;l=l.l;} +y=(l+16)/116;x=y+(a/500);z=y-(b/200);if(x>0.2068965517){x=x*x*x;}else{x=0.1284185493*(x-0.1379310345);} +if(y>0.2068965517){y=y*y*y;}else{y=0.1284185493*(y-0.1379310345);} +if(z>0.2068965517){z=z*z*z;}else{z=0.1284185493*(z-0.1379310345);} +return{x:x*95.047,y:y*100.0,z:z*108.883};};Convert.rgbToLab=function(r,g,b){var xyz;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} +xyz=this.rgbToXYZ(r,g,b);return this.xyzToLab(xyz);};Convert.labToRGB=function(l,a,b){};return Convert;})();Event=(function(){function Event(){} +Event.events={};Event.types=["processStart","processComplete","renderStart","renderFinished","blockStarted","blockFinished"];Event.trigger=function(target,type,data){var event,_i,_len,_ref,_results;if(this.events[type]&&this.events[type].length){_ref=this.events[type];_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){event=_ref[_i];if(event.target===null||target.id===event.target.id){_results.push(event.fn.call(target,data));}else{_results.push(void 0);}} +return _results;}};Event.listen=function(target,type,fn){var _fn,_type;if(typeof target==="string"){_type=target;_fn=type;target=null;type=_type;fn=_fn;} +if(__indexOf.call(this.types,type)<0){return false;} +if(!this.events[type]){this.events[type]=[];} +this.events[type].push({target:target,fn:fn});return true;};return Event;})();Caman.Event=Event;Caman.Filter=Filter=(function(){function Filter(){} +Filter.Type={Single:1,Kernel:2,LayerDequeue:3,LayerFinished:4,LoadOverlay:5,Plugin:6};Filter.register=function(name,filterFunc){return Caman.prototype[name]=filterFunc;};return Filter;})();Caman.IO=IO=(function(){function IO(){} +IO.domainRegex=/(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/;IO.isRemote=function(img){var matches;if(img==null){return false;} +if(this.corsEnabled(img)){return false;} +matches=img.src.match(this.domainRegex);if(matches){return matches[1]!==document.domain;}else{return false;}};IO.corsEnabled=function(img){var _ref;return(img.crossOrigin!=null)&&((_ref=img.crossOrigin.toLowerCase())==='anonymous'||_ref==='use-credentials');};IO.proxyUrl=function(src){return""+Caman.remoteProxy+"?"+Caman.proxyParam+"="+(encodeURIComponent(src));};IO.useProxy=function(lang){var langToExt;langToExt={ruby:'rb',python:'py',perl:'pl',javascript:'js'};lang=lang.toLowerCase();if(langToExt[lang]!=null){lang=langToExt[lang];} +return"proxies/caman_proxy."+lang;};return IO;})();Caman.prototype.save=function(){if(typeof exports!=="undefined"&&exports!==null){return this.nodeSave.apply(this,arguments);}else{return this.browserSave.apply(this,arguments);}};Caman.prototype.browserSave=function(type){var image;if(type==null){type="png";} +type=type.toLowerCase();image=this.toBase64(type).replace("image/"+type,"image/octet-stream");return document.location.href=image;};Caman.prototype.nodeSave=function(file,overwrite){var stats;if(overwrite==null){overwrite=true;} +try{stats=fs.statSync(file);if(stats.isFile()&&!overwrite){return false;}}catch(e){Log.debug("Creating output file "+file);} +return fs.writeFile(file,this.canvas.toBuffer(),function(){return Log.debug("Finished writing to "+file);});};Caman.prototype.toImage=function(type){var img;img=document.createElement('img');img.src=this.toBase64(type);img.width=this.dimensions.width;img.height=this.dimensions.height;if(window.devicePixelRatio){img.width/=window.devicePixelRatio;img.height/=window.devicePixelRatio;} +return img;};Caman.prototype.toBase64=function(type){if(type==null){type="png";} +type=type.toLowerCase();return this.canvas.toDataURL("image/"+type);};Layer=(function(){function Layer(c){this.c=c;this.filter=this.c;this.options={blendingMode:'normal',opacity:1.0};this.layerID=Util.uniqid.get();this.canvas=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');this.canvas.width=this.c.dimensions.width;this.canvas.height=this.c.dimensions.height;this.context=this.canvas.getContext('2d');this.context.createImageData(this.canvas.width,this.canvas.height);this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;} +Layer.prototype.newLayer=function(cb){return this.c.newLayer.call(this.c,cb);};Layer.prototype.setBlendingMode=function(mode){this.options.blendingMode=mode;return this;};Layer.prototype.opacity=function(opacity){this.options.opacity=opacity/100;return this;};Layer.prototype.copyParent=function(){var i,parentData,_i,_ref;parentData=this.c.pixelData;for(i=_i=0,_ref=this.c.pixelData.length;_i<_ref;i=_i+=4){this.pixelData[i]=parentData[i];this.pixelData[i+1]=parentData[i+1];this.pixelData[i+2]=parentData[i+2];this.pixelData[i+3]=parentData[i+3];} +return this;};Layer.prototype.fillColor=function(){return this.c.fillColor.apply(this.c,arguments);};Layer.prototype.overlayImage=function(image){if(typeof image==="object"){image=image.src;}else if(typeof image==="string"&&image[0]==="#"){image=$(image).src;} +if(!image){return this;} +this.c.renderQueue.push({type:Filter.Type.LoadOverlay,src:image,layer:this});return this;};Layer.prototype.applyToParent=function(){var i,layerData,parentData,result,rgbaLayer,rgbaParent,_i,_ref,_results;parentData=this.c.pixelStack[this.c.pixelStack.length-1];layerData=this.c.pixelData;_results=[];for(i=_i=0,_ref=layerData.length;_i<_ref;i=_i+=4){rgbaParent={r:parentData[i],g:parentData[i+1],b:parentData[i+2],a:parentData[i+3]};rgbaLayer={r:layerData[i],g:layerData[i+1],b:layerData[i+2],a:layerData[i+3]};result=Blender.execute(this.options.blendingMode,rgbaLayer,rgbaParent);result.r=Util.clampRGB(result.r);result.g=Util.clampRGB(result.g);result.b=Util.clampRGB(result.b);if(!(result.a!=null)){result.a=rgbaLayer.a;} +parentData[i]=rgbaParent.r-((rgbaParent.r-result.r)*(this.options.opacity*(result.a/255)));parentData[i+1]=rgbaParent.g-((rgbaParent.g-result.g)*(this.options.opacity*(result.a/255)));_results.push(parentData[i+2]=rgbaParent.b-((rgbaParent.b-result.b)*(this.options.opacity*(result.a/255))));} +return _results;};return Layer;})();Logger=(function(){function Logger(){var name,_i,_len,_ref;_ref=['log','info','warn','error'];for(_i=0,_len=_ref.length;_i<_len;_i++){name=_ref[_i];this[name]=(function(name){return function(){if(!Caman.DEBUG){return;} +return console[name].apply(console,arguments);};})(name);} +this.debug=this.log;} +return Logger;})();Log=new Logger();PixelInfo=(function(){function PixelInfo(c){this.c=c;this.loc=0;} +PixelInfo.prototype.locationXY=function(){var x,y;y=this.c.dimensions.height-Math.floor(this.loc/(this.c.dimensions.width*4));x=(this.loc%(this.c.dimensions.width*4))/4;return{x:x,y:y};};PixelInfo.prototype.getPixelRelative=function(horiz,vert){var newLoc;newLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return{r:0,g:0,b:0,a:0};} +return{r:this.c.pixelData[newLoc],g:this.c.pixelData[newLoc+1],b:this.c.pixelData[newLoc+2],a:this.c.pixelData[newLoc+3]};};PixelInfo.prototype.putPixelRelative=function(horiz,vert,rgba){var nowLoc;nowLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return;} +this.c.pixelData[newLoc]=rgba.r;this.c.pixelData[newLoc+1]=rgba.g;this.c.pixelData[newLoc+2]=rgba.b;this.c.pixelData[newLoc+3]=rgba.a;return true;};PixelInfo.prototype.getPixel=function(x,y){var loc;loc=(y*this.c.dimensions.width+x)*4;return{r:this.c.pixelData[loc],g:this.c.pixelData[loc+1],b:this.c.pixelData[loc+2],a:this.c.pixelData[loc+3]};};PixelInfo.prototype.putPixel=function(x,y,rgba){var loc;loc=(y*this.c.dimensions.width+x)*4;this.c.pixelData[loc]=rgba.r;this.c.pixelData[loc+1]=rgba.g;this.c.pixelData[loc+2]=rgba.b;return this.c.pixelData[loc+3]=rgba.a;};return PixelInfo;})();Plugin=(function(){function Plugin(){} +Plugin.plugins={};Plugin.register=function(name,plugin){return this.plugins[name]=plugin;};Plugin.execute=function(context,name,args){return this.plugins[name].apply(context,args);};return Plugin;})();Caman.Plugin=Plugin;Caman.Renderer=Renderer=(function(){Renderer.Blocks=Caman.NodeJS?require('os').cpus().length:4;function Renderer(c){this.c=c;this.processNext=__bind(this.processNext,this);this.renderQueue=[];this.modPixelData=null;} +Renderer.prototype.add=function(job){if(job==null){return;} +return this.renderQueue.push(job);};Renderer.prototype.processNext=function(){var layer;if(this.renderQueue.length===0){Event.trigger(this,"renderFinished");if(this.finishedFn!=null){this.finishedFn.call(this.c);} +return this;} +this.currentJob=this.renderQueue.shift();switch(this.currentJob.type){case Filter.Type.LayerDequeue:layer=this.c.canvasQueue.shift();this.c.executeLayer(layer);return this.processNext();case Filter.Type.LayerFinished:this.c.applyCurrentLayer();this.c.popContext();return this.processNext();case Filter.Type.LoadOverlay:return this.loadOverlay(this.currentJob.layer,this.currentJob.src);case Filter.Type.Plugin:return this.executePlugin();default:return this.executeFilter();}};Renderer.prototype.execute=function(callback){this.finishedFn=callback;this.modPixelData=new Uint8Array(this.c.pixelData.length);return this.processNext();};Renderer.prototype.eachBlock=function(fn){var blockN,blockPixelLength,end,f,i,lastBlockN,n,start,_i,_ref,_results,_this=this;this.blocksDone=0;n=this.c.pixelData.length;blockPixelLength=Math.floor((n/4)/Renderer.Blocks);blockN=blockPixelLength*4;lastBlockN=blockN+((n/4)%Renderer.Blocks)*4;_results=[];for(i=_i=0,_ref=Renderer.Blocks;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){start=i*blockN;end=start+(i===Renderer.Blocks-1?lastBlockN:blockN);if(Caman.NodeJS){f=Fiber(function(){return fn.call(_this,i,start,end);});_results.push(f.run());}else{_results.push(setTimeout((function(i,start,end){return function(){return fn.call(_this,i,start,end);};})(i,start,end),0));}} +return _results;};Renderer.prototype.executeFilter=function(){Event.trigger(this.c,"processStart",this.currentJob);if(this.currentJob.type===Filter.Type.Single){return this.eachBlock(this.renderBlock);}else{return this.eachBlock(this.renderKernel);}};Renderer.prototype.executePlugin=function(){Log.debug("Executing plugin "+this.currentJob.plugin);Plugin.execute(this.c,this.currentJob.plugin,this.currentJob.args);Log.debug("Plugin "+this.currentJob.plugin+" finished!");return this.processNext();};Renderer.prototype.renderBlock=function(bnum,start,end){var data,i,pixelInfo,res,_i;Log.debug("Block #"+bnum+" - Filter: "+this.currentJob.name+", Start: "+start+", End: "+end);Event.trigger(this.c,"blockStarted",{blockNum:bnum,totalBlocks:Renderer.Blocks,startPixel:start,endPixel:end});data={r:0,g:0,b:0,a:0};pixelInfo=new PixelInfo(this.c);for(i=_i=start;_i=builder;j=-builder<=builder?++_j:--_j){for(k=_k=builder;builder<=-builder?_k<=-builder:_k>=-builder;k=builder<=-builder?++_k:--_k){pixel=pixelInfo.getPixelRelative(j,k);kernel[builderIndex*3]=pixel.r;kernel[builderIndex*3+1]=pixel.g;kernel[builderIndex*3+2]=pixel.b;builderIndex++;}} +res=this.processKernel(adjust,kernel,divisor,bias);this.modPixelData[i]=Util.clampRGB(res.r);this.modPixelData[i+1]=Util.clampRGB(res.g);this.modPixelData[i+2]=Util.clampRGB(res.b);this.modPixelData[i+3]=this.c.pixelData[i+3];} +this.blockFinished(bnum);if(Caman.NodeJS){return Fiber["yield"]();}};Renderer.prototype.blockFinished=function(bnum){var i,_i,_ref;if(bnum>=0){Log.debug("Block #"+bnum+" finished! Filter: "+this.currentJob.name);} +this.blocksDone++;Event.trigger(this.c,"blockFinished",{blockNum:bnum,blocksFinished:this.blocksDone,totalBlocks:Renderer.Blocks});if(this.blocksDone===Renderer.Blocks){if(this.currentJob.type===Filter.Type.Kernel){for(i=_i=0,_ref=this.c.pixelData.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){this.c.pixelData[i]=this.modPixelData[i];}} +if(bnum>=0){Log.debug("Filter "+this.currentJob.name+" finished!");} +Event.trigger(this.c,"processComplete",this.currentJob);return this.processNext();}};Renderer.prototype.processKernel=function(adjust,kernel,divisor,bias){var i,val,_i,_ref;val={r:0,g:0,b:0};for(i=_i=0,_ref=adjust.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){val.r+=adjust[i]*kernel[i*3];val.g+=adjust[i]*kernel[i*3+1];val.b+=adjust[i]*kernel[i*3+2];} +val.r=(val.r/divisor)+bias;val.g=(val.g/divisor)+bias;val.b=(val.b/divisor)+bias;return val;};Renderer.prototype.loadOverlay=function(layer,src){var img,proxyUrl,_this=this;img=document.createElement('img');img.onload=function(){layer.context.drawImage(img,0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.imageData=layer.context.getImageData(0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.pixelData=layer.imageData.data;_this.c.pixelData=layer.pixelData;return _this.processNext();};proxyUrl=IO.remoteCheck(src);return img.src=proxyUrl!=null?proxyUrl:src;};return Renderer;})();Caman.Store=Store=(function(){function Store(){} +Store.items={};Store.has=function(search){return this.items[search]!=null;};Store.get=function(search){return this.items[search];};Store.put=function(name,obj){return this.items[name]=obj;};Store.execute=function(search,callback){var _this=this;setTimeout(function(){return callback.call(_this.get(search),_this.get(search));},0);return this.get(search);};Store.flush=function(name){if(name==null){name=false;} +if(name){return delete this.items[name];}else{return this.items={};}};return Store;})();Blender.register("normal",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r,g:rgbaLayer.g,b:rgbaLayer.b};});Blender.register("multiply",function(rgbaLayer,rgbaParent){return{r:(rgbaLayer.r*rgbaParent.r)/255,g:(rgbaLayer.g*rgbaParent.g)/255,b:(rgbaLayer.b*rgbaParent.b)/255};});Blender.register("screen",function(rgbaLayer,rgbaParent){return{r:255-(((255-rgbaLayer.r)*(255-rgbaParent.r))/255),g:255-(((255-rgbaLayer.g)*(255-rgbaParent.g))/255),b:255-(((255-rgbaLayer.b)*(255-rgbaParent.b))/255)};});Blender.register("overlay",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-2*(255-rgbaLayer.r)*(255-rgbaParent.r)/255:(rgbaParent.r*rgbaLayer.r*2)/255;result.g=rgbaParent.g>128?255-2*(255-rgbaLayer.g)*(255-rgbaParent.g)/255:(rgbaParent.g*rgbaLayer.g*2)/255;result.b=rgbaParent.b>128?255-2*(255-rgbaLayer.b)*(255-rgbaParent.b)/255:(rgbaParent.b*rgbaLayer.b*2)/255;return result;});Blender.register("difference",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r-rgbaParent.r,g:rgbaLayer.g-rgbaParent.g,b:rgbaLayer.b-rgbaParent.b};});Blender.register("addition",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r+rgbaLayer.r,g:rgbaParent.g+rgbaLayer.g,b:rgbaParent.b+rgbaLayer.b};});Blender.register("exclusion",function(rgbaLayer,rgbaParent){return{r:128-2*(rgbaParent.r-128)*(rgbaLayer.r-128)/255,g:128-2*(rgbaParent.g-128)*(rgbaLayer.g-128)/255,b:128-2*(rgbaParent.b-128)*(rgbaLayer.b-128)/255};});Blender.register("softLight",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-((255-rgbaParent.r)*(255-(rgbaLayer.r-128)))/255:(rgbaParent.r*(rgbaLayer.r+128))/255;result.g=rgbaParent.g>128?255-((255-rgbaParent.g)*(255-(rgbaLayer.g-128)))/255:(rgbaParent.g*(rgbaLayer.g+128))/255;result.b=rgbaParent.b>128?255-((255-rgbaParent.b)*(255-(rgbaLayer.b-128)))/255:(rgbaParent.b*(rgbaLayer.b+128))/255;return result;});Blender.register("lighten",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaParent.r:rgbaLayer.r,g:rgbaParent.g>rgbaLayer.g?rgbaParent.g:rgbaLayer.g,b:rgbaParent.b>rgbaLayer.b?rgbaParent.b:rgbaLayer.b};});Blender.register("darken",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaLayer.r:rgbaParent.r,g:rgbaParent.g>rgbaLayer.g?rgbaLayer.g:rgbaParent.g,b:rgbaParent.b>rgbaLayer.b?rgbaLayer.b:rgbaParent.b};});Filter.register("fillColor",function(){var color;if(arguments.length===1){color=Convert.hexToRGB(arguments[0]);}else{color={r:arguments[0],g:arguments[1],b:arguments[2]};} +return this.process("fillColor",function(rgba){rgba.r=color.r;rgba.g=color.g;rgba.b=color.b;rgba.a=255;return rgba;});});Filter.register("brightness",function(adjust){adjust=Math.floor(255*(adjust/100));return this.process("brightness",function(rgba){rgba.r+=adjust;rgba.g+=adjust;rgba.b+=adjust;return rgba;});});Filter.register("saturation",function(adjust){adjust*=-0.01;return this.process("saturation",function(rgba){var max;max=Math.max(rgba.r,rgba.g,rgba.b);if(rgba.r!==max){rgba.r+=(max-rgba.r)*adjust;} +if(rgba.g!==max){rgba.g+=(max-rgba.g)*adjust;} +if(rgba.b!==max){rgba.b+=(max-rgba.b)*adjust;} +return rgba;});});Filter.register("vibrance",function(adjust){adjust*=-1;return this.process("vibrance",function(rgba){var amt,avg,max;max=Math.max(rgba.r,rgba.g,rgba.b);avg=(rgba.r+rgba.g+rgba.b)/3;amt=((Math.abs(max-avg)*2/255)*adjust)/100;if(rgba.r!==max){rgba.r+=(max-rgba.r)*amt;} +if(rgba.g!==max){rgba.g+=(max-rgba.g)*amt;} +if(rgba.b!==max){rgba.b+=(max-rgba.b)*amt;} +return rgba;});});Filter.register("greyscale",function(adjust){return this.process("greyscale",function(rgba){var avg;avg=Calculate.luminance(rgba);rgba.r=avg;rgba.g=avg;rgba.b=avg;return rgba;});});Filter.register("contrast",function(adjust){adjust=Math.pow((adjust+100)/100,2);return this.process("contrast",function(rgba){rgba.r/=255;rgba.r-=0.5;rgba.r*=adjust;rgba.r+=0.5;rgba.r*=255;rgba.g/=255;rgba.g-=0.5;rgba.g*=adjust;rgba.g+=0.5;rgba.g*=255;rgba.b/=255;rgba.b-=0.5;rgba.b*=adjust;rgba.b+=0.5;rgba.b*=255;return rgba;});});Filter.register("hue",function(adjust){return this.process("hue",function(rgba){var h,hsv,rgb;hsv=Convert.rgbToHSV(rgba.r,rgba.g,rgba.b);h=hsv.h*100;h+=Math.abs(adjust);h=h%100;h/=100;hsv.h=h;rgb=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v);rgb.a=rgba.a;return rgb;});});Filter.register("colorize",function(){var level,rgb;if(arguments.length===2){rgb=Convert.hexToRGB(arguments[0]);level=arguments[1];}else if(arguments.length===4){rgb={r:arguments[0],g:arguments[1],b:arguments[2]};level=arguments[3];} +return this.process("colorize",function(rgba){rgba.r-=(rgba.r-rgb.r)*(level/100);rgba.g-=(rgba.g-rgb.g)*(level/100);rgba.b-=(rgba.b-rgb.b)*(level/100);return rgba;});});Filter.register("invert",function(){return this.process("invert",function(rgba){rgba.r=255-rgba.r;rgba.g=255-rgba.g;rgba.b=255-rgba.b;return rgba;});});Filter.register("sepia",function(adjust){if(adjust==null){adjust=100;} +adjust/=100;return this.process("sepia",function(rgba){rgba.r=Math.min(255,(rgba.r*(1-(0.607*adjust)))+(rgba.g*(0.769*adjust))+(rgba.b*(0.189*adjust)));rgba.g=Math.min(255,(rgba.r*(0.349*adjust))+(rgba.g*(1-(0.314*adjust)))+(rgba.b*(0.168*adjust)));rgba.b=Math.min(255,(rgba.r*(0.272*adjust))+(rgba.g*(0.534*adjust))+(rgba.b*(1-(0.869*adjust))));return rgba;});});Filter.register("gamma",function(adjust){return this.process("gamma",function(rgba){rgba.r=Math.pow(rgba.r/255,adjust)*255;rgba.g=Math.pow(rgba.g/255,adjust)*255;rgba.b=Math.pow(rgba.b/255,adjust)*255;return rgba;});});Filter.register("noise",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("noise",function(rgba){var rand;rand=Calculate.randomRange(adjust*-1,adjust);rgba.r+=rand;rgba.g+=rand;rgba.b+=rand;return rgba;});});Filter.register("clip",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("clip",function(rgba){if(rgba.r>255-adjust){rgba.r=255;}else if(rgba.r255-adjust){rgba.g=255;}else if(rgba.g255-adjust){rgba.b=255;}else if(rgba.b0){rgba.r+=(255-rgba.r)*options.red;}else{rgba.r-=rgba.r*Math.abs(options.red);}} +if(options.green!=null){if(options.green>0){rgba.g+=(255-rgba.g)*options.green;}else{rgba.g-=rgba.g*Math.abs(options.green);}} +if(options.blue!=null){if(options.blue>0){rgba.b+=(255-rgba.b)*options.blue;}else{rgba.b-=rgba.b*Math.abs(options.blue);}} +return rgba;});});Filter.register("curves",function(){var bezier,chans,cps,ctrl1,ctrl2,end,i,start,_i,_j,_ref,_ref1;chans=arguments[0],cps=2<=arguments.length?__slice.call(arguments,1):[];if(typeof chans==="string"){chans=chans.split("");} +if(chans[0]==="v"){chans=['r','g','b'];} +if(cps.length<3||cps.length>4){throw"Invalid number of arguments to curves filter";} +start=cps[0];ctrl1=cps[1];ctrl2=cps.length===4?cps[2]:cps[1];end=cps[cps.length-1];bezier=Calculate.bezier(start,ctrl1,ctrl2,end,0,255);if(start[0]>0){for(i=_i=0,_ref=start[0];0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){bezier[i]=start[1];}} +if(end[0]<255){for(i=_j=_ref1=end[0];_ref1<=255?_j<=255:_j>=255;i=_ref1<=255?++_j:--_j){bezier[i]=end[1];}} +return this.process("curves",function(rgba){var _k,_ref2;for(i=_k=0,_ref2=chans.length;0<=_ref2?_k<_ref2:_k>_ref2;i=0<=_ref2?++_k:--_k){rgba[chans[i]]=bezier[rgba[chans[i]]];} +return rgba;});});Filter.register("exposure",function(adjust){var ctrl1,ctrl2,p;p=Math.abs(adjust)/100;ctrl1=[0,255*p];ctrl2=[255-(255*p),255];if(adjust<0){ctrl1=ctrl1.reverse();ctrl2=ctrl2.reverse();} +return this.curves('rgb',[0,0],ctrl1,ctrl2,[255,255]);});Caman.Filter.register("boxBlur",function(){return this.processKernel("Box Blur",[1,1,1,1,1,1,1,1,1]);});Caman.Filter.register("heavyRadialBlur",function(){return this.processKernel("Heavy Radial Blur",[0,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,0,0]);});Caman.Filter.register("gaussianBlur",function(){return this.processKernel("Gaussian Blur",[1,4,6,4,1,4,16,24,16,4,6,24,36,24,6,4,16,24,16,4,1,4,6,4,1]);});Caman.Filter.register("motionBlur",function(degrees){var kernel;if(degrees===0||degrees===180){kernel=[0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0];}else if((degrees>0&°rees<90)||(degrees>180&°rees<270)){kernel=[0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0];}else if(degrees===90||degrees===270){kernel=[0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0];}else{kernel=[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1];} +return this.processKernel("Motion Blur",kernel);});Caman.Filter.register("sharpen",function(amt){if(amt==null){amt=100;} +amt/=100;return this.processKernel("Sharpen",[0,-amt,0,-amt,4*amt+1,-amt,0,-amt,0]);});vignetteFilters={brightness:function(rgba,amt,opts){rgba.r=rgba.r-(rgba.r*amt*opts.strength);rgba.g=rgba.g-(rgba.g*amt*opts.strength);rgba.b=rgba.b-(rgba.b*amt*opts.strength);return rgba;},gamma:function(rgba,amt,opts){rgba.r=Math.pow(rgba.r/255,Math.max(10*amt*opts.strength,1))*255;rgba.g=Math.pow(rgba.g/255,Math.max(10*amt*opts.strength,1))*255;rgba.b=Math.pow(rgba.b/255,Math.max(10*amt*opts.strength,1))*255;return rgba;},colorize:function(rgba,amt,opts){rgba.r-=(rgba.r-opts.color.r)*amt;rgba.g-=(rgba.g-opts.color.g)*amt;rgba.b-=(rgba.b-opts.color.b)*amt;return rgba;}};Filter.register("vignette",function(size,strength){var bezier,center,end,start;if(strength==null){strength=60;} +if(typeof size==="string"&&size.substr(-1)==="%"){if(this.dimensions.height>this.dimensions.width){size=this.dimensions.width*(parseInt(size.substr(0,size.length-1),10)/100);}else{size=this.dimensions.height*(parseInt(size.substr(0,size.length-1),10)/100);}} +strength/=100;center=[this.dimensions.width/2,this.dimensions.height/2];start=Math.sqrt(Math.pow(center[0],2)+Math.pow(center[1],2));end=start-size;bezier=Calculate.bezier([0,1],[30,30],[70,60],[100,80]);return this.process("vignette",function(rgba){var dist,div,loc;loc=this.locationXY();dist=Calculate.distance(loc.x,loc.y,center[0],center[1]);if(dist>end){div=Math.max(1,(bezier[Math.round(((dist-end)/size)*100)]/10)*strength);rgba.r=Math.pow(rgba.r/255,div)*255;rgba.g=Math.pow(rgba.g/255,div)*255;rgba.b=Math.pow(rgba.b/255,div)*255;} +return rgba;});});Filter.register("rectangularVignette",function(opts){var defaults,dim,percent,size,_i,_len,_ref;defaults={strength:50,cornerRadius:0,method:'brightness',color:{r:0,g:0,b:0}};opts=Util.extend(defaults,opts);if(!opts.size){return this;}else if(typeof opts.size==="string"){percent=parseInt(opts.size,10)/100;opts.size={width:this.dimensions.width*percent,height:this.dimensions.height*percent};}else if(typeof opts.size==="object"){_ref=["width","height"];for(_i=0,_len=_ref.length;_i<_len;_i++){dim=_ref[_i];if(typeof opts.size[dim]==="string"){opts.size[dim]=this.dimensions[dim]*(parseInt(opts.size[dim],10)/100);}}}else if(opts.size==="number"){size=opts.size;opts.size={width:size,height:size};} +if(typeof opts.cornerRadius==="string"){opts.cornerRadius=(opts.size.width/2)*(parseInt(opts.cornerRadius,10)/100);} +opts.strength/=100;opts.size.width=Math.floor(opts.size.width);opts.size.height=Math.floor(opts.size.height);opts.image={width:this.dimensions.width,height:this.dimensions.height};if(opts.method==="colorize"&&typeof opts.color==="string"){opts.color=Convert.hexToRGB(opts.color);} +opts.coords={left:(this.dimensions.width-opts.size.width)/2,right:this.dimensions.width-opts.coords.left,bottom:(this.dimensions.height-opts.size.height)/2,top:this.dimensions.height-opts.coords.bottom};opts.corners=[{x:opts.coords.left+opts.cornerRadius,y:opts.coords.top-opts.cornerRadius},{x:opts.coords.right-opts.cornerRadius,y:opts.coords.top-opts.cornerRadius},{x:opts.coords.right-opts.cornerRadius,y:opts.coords.bottom+opts.cornerRadius},{x:opts.coords.left+opts.cornerRadius,y:opts.coords.bottom+opts.cornerRadius}];opts.maxDist=Calculate.distance(0,0,opts.corners[3].x,opts.corners[3].y)-opts.cornerRadius;return this.process("rectangularVignette",function(rgba){var amt,loc,radialDist;loc=this.locationXY();if((loc.x>opts.corners[0].x&&loc.xopts.coords.bottom&&loc.yopts.coords.left&&loc.xopts.corners[3].y&&loc.yopts.corners[0].x&&loc.xopts.coords.top){amt=(loc.y-opts.coords.top)/opts.maxDist;}else if(loc.y>opts.corners[2].y&&loc.yopts.coords.right){amt=(loc.x-opts.coords.right)/opts.maxDist;}else if(loc.x>opts.corners[0].x&&loc.xopts.corners[2].y&&loc.y=opts.corners[0].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[0].x,opts.corners[0].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x>=opts.corners[1].x&&loc.y>=opts.corners[1].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[1].x,opts.corners[1].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x>=opts.corners[2].x&&loc.y<=opts.corners[2].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[2].x,opts.corners[2].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x<=opts.corners[3].x&&loc.y<=opts.corners[3].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[3].x,opts.corners[3].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;} +if(amt<0){return rgba;} +return vignetteFilters[opts.method](rgba,amt,opts);});});(function(){var BlurStack,getLinearGradientMap,getRadialGradientMap,mul_table,shg_table;mul_table=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];shg_table=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];getLinearGradientMap=function(width,height,centerX,centerY,angle,length,mirrored){var cnv,context,gradient,x1,x2,y1,y2;cnv=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');cnv.width=width;cnv.height=height;x1=centerX+Math.cos(angle)*length*0.5;y1=centerY+Math.sin(angle)*length*0.5;x2=centerX-Math.cos(angle)*length*0.5;y2=centerY-Math.sin(angle)*length*0.5;context=cnv.getContext("2d");gradient=context.createLinearGradient(x1,y1,x2,y2);if(!mirrored){gradient.addColorStop(0,"white");gradient.addColorStop(1,"black");}else{gradient.addColorStop(0,"white");gradient.addColorStop(0.5,"black");gradient.addColorStop(1,"white");} +context.fillStyle=gradient;context.fillRect(0,0,width,height);return context.getImageData(0,0,width,height);};getRadialGradientMap=function(width,height,centerX,centerY,radius1,radius2){var cnv,context,gradient;cnv=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');cnv.width=width;cnv.height=height;context=cnv.getContext("2d");gradient=context.createRadialGradient(centerX,centerY,radius1,centerX,centerY,radius2);gradient.addColorStop(1,"white");gradient.addColorStop(0,"black");context.fillStyle=gradient;context.fillRect(0,0,width,height);return context.getImageData(0,0,width,height);};BlurStack=function(){this.r=0;this.g=0;this.b=0;this.a=0;return this.next=null;};Caman.Plugin.register("compoundBlur",function(radiusData,radius,increaseFactor,blurLevels){var b_in_sum,b_out_sum,b_sum,blend,currentIndex,div,g_in_sum,g_out_sum,g_sum,height,heightMinus1,i,iblend,idx,imagePixels,index,iradius,lookupValue,mul_sum,p,pb,pg,pixels,pr,r_in_sum,r_out_sum,r_sum,radiusPixels,radiusPlus1,rbs,shg_sum,stack,stackEnd,stackIn,stackOut,stackStart,steps,sumFactor,w4,wh,wh4,width,widthMinus1,x,y,yi,yp,yw,_i,_j,_k,_l,_m,_n,_o,_p,_q,_r;width=this.dimensions.width;height=this.dimensions.height;imagePixels=this.pixelData;radiusPixels=radiusData.data;wh=width*height;wh4=wh<<2;pixels=[];for(i=_i=0;0<=wh4?_iwh4;i=0<=wh4?++_i:--_i){pixels[i]=imagePixels[i];} +currentIndex=0;steps=blurLevels;blurLevels-=1;while(steps-->=0){iradius=(radius+0.5)|0;if(iradius===0){continue;} +if(iradius>256){iradius=256;} +div=iradius+iradius+1;w4=width<<2;widthMinus1=width-1;heightMinus1=height-1;radiusPlus1=iradius+1;sumFactor=radiusPlus1*(radiusPlus1+1)/2;stackStart=new BlurStack();stackEnd=void 0;stack=stackStart;for(i=_j=1;1<=div?_jdiv;i=1<=div?++_j:--_j){stack=stack.next=new BlurStack();if(i===radiusPlus1){stackEnd=stack;}} +stack.next=stackStart;stackIn=null;stackOut=null;yw=yi=0;mul_sum=mul_table[iradius];shg_sum=shg_table[iradius];for(y=_k=0;0<=height?_kheight;y=0<=height?++_k:--_k){r_in_sum=g_in_sum=b_in_sum=r_sum=g_sum=b_sum=0;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_l=0;0<=radiusPlus1?_lradiusPlus1;i=0<=radiusPlus1?++_l:--_l){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +for(i=_m=1;1<=radiusPlus1?_mradiusPlus1;i=1<=radiusPlus1?++_m:--_m){p=yi+((widthMinus1width;x=0<=width?++_n:--_n){pixels[yi]=(r_sum*mul_sum)>>shg_sum;pixels[yi+1]=(g_sum*mul_sum)>>shg_sum;pixels[yi+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(yw+((p=x+radiusPlus1)width;x=0<=width?++_o:--_o){g_in_sum=b_in_sum=r_in_sum=g_sum=b_sum=r_sum=0;yi=x<<2;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_p=0;0<=radiusPlus1?_pradiusPlus1;i=0<=radiusPlus1?++_p:--_p){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +yp=width;for(i=_q=1;1<=radiusPlus1?_qradiusPlus1;i=1<=radiusPlus1?++_q:--_q){yi=(yp+x)<<2;r_sum+=(stack.r=(pr=pixels[yi]))*(rbs=radiusPlus1-i);g_sum+=(stack.g=(pg=pixels[yi+1]))*rbs;b_sum+=(stack.b=(pb=pixels[yi+2]))*rbs;r_in_sum+=pr;g_in_sum+=pg;b_in_sum+=pb;stack=stack.next;if(iheight;y=0<=height?++_r:--_r){p=yi<<2;pixels[p]=(r_sum*mul_sum)>>shg_sum;pixels[p+1]=(g_sum*mul_sum)>>shg_sum;pixels[p+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(x+(((p=y+radiusPlus1)-1){idx=i<<2;lookupValue=(radiusPixels[idx+2]&0xff)/255.0*blurLevels;index=lookupValue|0;if(index===currentIndex){blend=256.0*(lookupValue-(lookupValue|0));iblend=256-blend;imagePixels[idx]=(imagePixels[idx]*iblend+pixels[idx]*blend)>>8;imagePixels[idx+1]=(imagePixels[idx+1]*iblend+pixels[idx+1]*blend)>>8;imagePixels[idx+2]=(imagePixels[idx+2]*iblend+pixels[idx+2]*blend)>>8;}else if(index===currentIndex+1){imagePixels[idx]=pixels[idx];imagePixels[idx+1]=pixels[idx+1];imagePixels[idx+2]=pixels[idx+2];}} +currentIndex++;} +return this;});Caman.Filter.register("tiltShift",function(opts){var defaults,gradient;defaults={center:{x:this.dimensions.width/2,y:this.dimensions.height/2},angle:45,focusWidth:200,startRadius:3,radiusFactor:1.5,steps:3};opts=Util.extend(defaults,opts);opts.angle*=Math.PI/180;gradient=getLinearGradientMap(this.dimensions.width,this.dimensions.height,opts.center.x,opts.center.y,opts.angle,opts.focusWidth,true);return this.processPlugin("compoundBlur",[gradient,opts.startRadius,opts.radiusFactor,opts.steps]);});return Caman.Filter.register("radialBlur",function(opts){var defaults,gradient,radius1,radius2;defaults={size:50,center:{x:this.dimensions.width/2,y:this.dimensions.height/2},startRadius:3,radiusFactor:1.5,steps:3,radius:null};opts=Util.extend(defaults,opts);if(!opts.radius){opts.radius=this.dimensions.widthdiv;i=1<=div?++_i:--_i){stack=stack.next=new BlurStack();if(i===radiusPlus1){stackEnd=stack;}} +stack.next=stackStart;stackIn=null;stackOut=null;yw=yi=0;mul_sum=mul_table[radius];shg_sum=shg_table[radius];for(y=_j=0;0<=height?_jheight;y=0<=height?++_j:--_j){r_in_sum=g_in_sum=b_in_sum=r_sum=g_sum=b_sum=0;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_k=0;0<=radiusPlus1?_kradiusPlus1;i=0<=radiusPlus1?++_k:--_k){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +for(i=_l=1;1<=radiusPlus1?_lradiusPlus1;i=1<=radiusPlus1?++_l:--_l){p=yi+((widthMinus1width;x=0<=width?++_m:--_m){pixels[yi]=(r_sum*mul_sum)>>shg_sum;pixels[yi+1]=(g_sum*mul_sum)>>shg_sum;pixels[yi+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(yw+((p=x+radius+1)width;x=0<=width?++_n:--_n){g_in_sum=b_in_sum=r_in_sum=g_sum=b_sum=r_sum=0;yi=x<<2;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_o=0;0<=radiusPlus1?_oradiusPlus1;i=0<=radiusPlus1?++_o:--_o){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +yp=width;for(i=_p=1;1<=radius?_p<=radius:_p>=radius;i=1<=radius?++_p:--_p){yi=(yp+x)<<2;r_sum+=(stack.r=(pr=pixels[yi]))*(rbs=radiusPlus1-i);g_sum+=(stack.g=(pg=pixels[yi+1]))*rbs;b_sum+=(stack.b=(pb=pixels[yi+2]))*rbs;r_in_sum+=pr;g_in_sum+=pg;b_in_sum+=pb;stack=stack.next;if(iheight;y=0<=height?++_q:--_q){p=yi<<2;pixels[p]=(r_sum*mul_sum)>>shg_sum;pixels[p+1]=(g_sum*mul_sum)>>shg_sum;pixels[p+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(x+(((p=y+radiusPlus1)35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(A(){J $,5l,2j,2I,G,4W,49,1V,2y,6c,P,2V,5d,3g,27,5U,3v,2m,1L,7y,2L,1N,69,4O,8k,7G={}.eR,7H=[].eQ||A(9k){1a(J i=0,l=o.1c;iD){u D}u 2G};1N.bd=A(9j,72,E){J 63,H,1G,M,2U,1C;C(E==N){E={}}M=9j.eO;1C=[];1a(H=0,1G=M.1c;H<1G;H++){63=M[H];C((E.83!=N)&&(2U=63.84,7H.1R(E.83,2U)>=0)){6a}1C.2z(72.aV(63.84,63.eJ))}u 1C};u 1N})();C(1s 2i!=="3P"&&2i!==N){7y=2i;49=6O(\'K\');5d=49.5d;6c=6O(\'eH\');69=6O(\'69\')}U{7y=5i}7y.G=G=(A(){G.85={aI:"4.0.0",aQ:"1/6/13"};G.b3=2S;G.33=1s 2i!=="3P"&&2i!==N;G.bb=!G.33;G.8a="98";G.eF=A(){u"eD "+G.85.aI+", es "+G.85.aQ};G.9A="";G.a2="er";G.as=A(K){C(1s K==="3J"){K=$(K)}C(!((K!=N)&&(K.5I!=N))){u N}u K.5I(\'1X-3w-2B\')};A G(){J 1K,2s,2B,1t=o;C(1u.1c===0){78"76 1u";}C(o ep G){o.4R=o.4R.8p(o);o.5W=o.5W.8p(o);1K=1u[0];C(!G.33){2B=3M(G.as(1K[0]),10);2s=1s 1K[1]==="A"?1K[1]:1s 1K[2]==="A"?1K[2]:A(){};C(!9D(2B)&&2L.9J(2B)){u 2L.3I(2B,2s)}}o.2B=1N.7R.4L();o.8r=[];o.6l=[];o.8s=[];o.8t=[];o.61=N;o.aO=2S;o.eo=1T 5l(o);o.4U=1T 1L(o);o.aY(A(){1t.aZ(1K);u 1t.b0()});u o}U{u 1T G(1u)}}G.T.aY=A(cb){J 8u,1t=o;C(G.33){u 7n(A(){u cb.1R(1t)},0)}U{C(2n.8A==="6N"){27.2o("99 9b");u 7n(A(){u cb.1R(1t)},0)}U{8u=A(){C(2n.8A==="6N"){27.2o("99 9b");u cb.1R(1t)}};u 2n.9d("ei",8u,2S)}}};G.T.aZ=A(1K){C(1K.1c===0){78"76 1u 9f";}o.4m=N;o.6C=N;o.6t=N;o.2s=A(){};o.9z(1K[0]);C(1K.1c===1){u}57(1s 1K[1]){1Y"3J":o.6t=1K[1];4K;1Y"A":o.2s=1K[1]}C(1K.1c===2){u}u o.2s=1K[2]};G.T.9z=A(44){C(G.33){o.4m=44;o.6C=\'9S\';u}C(1s 44==="3N"){o.4m=44}U{o.4m=$(44)}u o.6C=o.4m.84.62()};G.T.b0=A(){57(o.6C){1Y"9S":u o.ae();1Y"1A":u o.ai();1Y"K":u o.ap()}};G.T.ae=A(){J 1t=o;27.2o("ef 1a 33");o.1b=1T 5d();o.1b.8D=A(){27.2o("5d ax. aD = "+1t.1b.F+", aJ = "+1t.1b.I);1t.K=1T 49(1t.1b.F,1t.1b.I);u 1t.4R()};o.1b.ee=A(aN){78 aN;};u o.1b.1Q=o.4m};G.T.ai=A(){o.1b=o.4m;o.K=2n.3O(\'K\');o.1q=o.K.4h(\'2d\');1N.bd(o.1b,o.K,{83:[\'1Q\']});o.1b.8J.8K(o.K,o.1b);o.8L();u o.8M()};G.T.ap=A(){o.K=o.4m;o.1q=o.K.4h(\'2d\');C(o.6t!=N){o.1b=2n.3O(\'1A\');o.1b.1Q=o.6t;o.8L();u o.8M()}U{u o.4R()}};G.T.8L=A(){C(o.b4()){27.2o(o.1b.1Q,"->",o.6p());o.b8=3R;o.1b.1Q=o.6p()}C(2V.ba(o.1b)){o.1b.1Q=2V.5z(o.1b.1Q);u 27.2o("e9 1b e8, e6 e2 = "+o.1b.1Q)}};G.T.8M=A(){C(o.1b.6N){u o.5W()}U{u o.1b.8D=o.5W}};G.T.5W=A(){27.2o("5d ax. aD = "+o.1b.F+", aJ = "+o.1b.I);C(o.b8){o.K.F=o.1b.F/o.7o();o.K.I=o.1b.I/o.7o()}U{o.K.F=o.1b.F;o.K.I=o.1b.I}u o.4R()};G.T.4R=A(){J 3u,H,1G,M;C(o.1q==N){o.1q=o.K.4h(\'2d\')}o.6j=o.F=o.K.F;o.5Y=o.I=o.K.I;o.9h();o.9i();C(o.1b!=N){o.1q.6n(o.1b,0,0,o.1b.F,o.1b.I,0,0,o.6j,o.5Y)}o.4j=o.1q.66(0,0,o.K.F,o.K.I);o.Y=o.4j.1X;M=o.Y;1a(H=0,1G=M.1c;H<1G;H++){3u=M[H];o.8r.2z(3u)}o.1d={F:o.K.F,I:o.K.I};2L.9B(o.2B,o);u o.2s.1R(o,o)};G.T.9i=A(){C(G.33||o.K.5I(\'1X-3w-2B\')){u}u o.K.aV(\'1X-3w-2B\',o.2B)};G.T.8V=A(){u o.K.5I(\'1X-3w-9E-e0\')!==N};G.T.9h=A(){J 3V;C(G.33||o.8V()){u}3V=o.7o();C(3V!==1){27.2o("dZ 3V = "+3V);o.aO=3R;o.6j=o.K.F;o.5Y=o.K.I;o.K.F=o.6j*3V;o.K.I=o.5Y*3V;o.K.a7.F=""+o.6j+"a8";o.K.a7.I=""+o.5Y+"a8";o.1q.dY(3V,3V);o.F=o.K.F;u o.I=o.K.I}};G.T.7o=A(){J 8T,4p;4p=5i.4p||1;8T=o.1q.dS||o.1q.dO||o.1q.dN||o.1q.dM||o.1q.dL||1;u 4p/8T};G.T.at=A(){u 5i.4p!==1};G.T.b4=A(){C(o.8V()||!o.at()){u 2S}u o.6p()!==N};G.T.6p=A(){C(o.1b==N){u N}u o.1b.5I(\'1X-3w-9E\')};G.T.8S=A(aw){J 6x;6x=o.K;o.K=aw;6x.8J.8K(o.K,6x);u o.4R()};G.T.aA=A(2s){J 1t=o;C(2s==N){2s=A(){}}2y.4S(o,"aE");u o.4U.3I(A(){1t.1q.aF(1t.4j,0,0);u 2s.1R(1t)})};G.T.dJ=A(5H){J i,3u,H,1G,M;C(5H==N){5H=A(){}}M=o.8r;1a(i=H=0,1G=M.1c;H<1G;i=++H){3u=M[i];o.Y[i]=3u}o.1q.aF(o.4j,0,0);u 5H.1R(o)};G.T.29=A(1k,7B){o.4U.5E({1m:P.2X.8R,1k:1k,7B:7B});u o};G.T.3t=A(1k,L,2N,3m){J i,H,M;C(!2N){2N=0;1a(i=H=0,M=L.1c;0<=M?HM;i=0<=M?++H:--H){2N+=L[i]}}o.4U.5E({1m:P.2X.8Q,1k:1k,L:L,2N:2N,3m:3m||0});u o};G.T.5B=A(3Q,1K){o.4U.5E({1m:P.2X.2m,3Q:3Q,1K:1K});u o};G.T.2J=A(2s){J 1W;1W=1T 3g(o);o.8t.2z(1W);o.4U.5E({1m:P.2X.8O});2s.1R(1W);o.4U.5E({1m:P.2X.8N});u o};G.T.bm=A(1W){u o.bn(1W)};G.T.bn=A(1W){o.8s.2z(o.61);o.6l.2z(o.Y);o.61=1W;u o.Y=1W.Y};G.T.bo=A(){o.Y=o.6l.br();u o.61=o.8s.br()};G.T.bs=A(){u o.61.bH()};u G})();5l=(A(){A 5l(c){o.c=c}5l.T.dH=A(){J i,37,5O,H,1o,1n,M;37={r:{},g:{},b:{}};1a(i=H=0;H<=D;i=++H){37.r[i]=0;37.g[i]=0;37.b[i]=0}1a(i=1o=0,M=o.c.Y.1c;1o0)){u}1C=[];1a(H=0,1G=5R.1c;H<1G;H++){1A=5R[H];1C.2z(9l=1T 4W(1A,A(){o.9x();u o.3I()}))}u 1C};C(G.bb){(A(){C(2n.8A==="6N"){u G.8I()}U{u 2n.9d("dF",G.8I,2S)}})()}4W=(A(){J 6B;6B="(\\\\w+)\\\\((.*?)\\\\)";A 4W(3W,5H){o.9C=3W.5I(\'1X-3w\');o.3w=G(3W,5H.8p(o))}4W.T.9x=A(){J 1K,1w,5Z,8H,8G,m,r,64,H,1G,M,1C;o.3W=o.3w.K;r=1T a5(6B,\'g\');64=o.9C.8F(r);C(!(64.1c>0)){u}r=1T a5(6B);1C=[];1a(H=0,1G=64.1c;H<1G;H++){8H=64[H];M=8H.8F(r),m=M[0],1w=M[1],1K=M[2];8G=1T dE("u A() { o."+1w+"("+1K+"); };");a9{5Z=8G();1C.2z(5Z.1R(o.3w))}aa(e){1C.2z(27.2o(e))}}u 1C};4W.T.3I=A(){J 3W;3W=o.3W;u o.3w.aA(A(){u 3W.8J.8K(o.af(),3W)})};u 4W})();G.2j=2j=(A(){A 2j(){}2j.8E={};2j.Q=A(1k,5Z){u o.8E[1k]=5Z};2j.3I=A(1k,W,R){u o.8E[1k](W,R)};u 2j})();G.2I=2I=(A(){A 2I(){}2I.4X=A(41,42,4v,4B){u O.8C(O.1D(4v-41,2)+O.1D(4B-42,2))};2I.aB=A(2e,1f,6m){J 3Z;C(6m==N){6m=2S}3Z=2e+(O.dD()*(1f-2e));C(6m){u 3Z.dC(6m)}U{u O.6A(3Z)}};2I.5S=A(B){u(0.8B*B.r)+(0.dB*B.g)+(0.dA*B.b)};2I.1M=A(1E,3s,3n,1p,6X,6Y){J 8z,8y,79,7b,65,6e,1M,8x,4N,i,j,5f,7m,t,5L,41,4v,8w,5N,42,4B,8v,H,1o,1n,M,2U;5L=1E[0];5N=1E[1];41=3s[0];42=3s[1];4v=3n[0];4B=3n[1];8w=1p[0];8v=1p[1];1M={};65=3M(3*(41-5L),10);79=3*(4v-41)-65;8z=8w-5L-65-79;6e=3*(42-5N);7b=3*(4B-42)-6e;8y=8v-5N-6e-7b;1a(i=H=0;H<9g;i=++H){t=i/9g;8x=O.6A((8z*O.1D(t,3))+(79*O.1D(t,2))+(65*t)+5L);4N=O.6A((8y*O.1D(t,3))+(7b*O.1D(t,2))+(6e*t)+5N);C(6X&&4N<6X){4N=6X}U C(6Y&&4N>6Y){4N=6Y}1M[8x]=4N}C(1M.1c<1p[0]+1){1a(i=1o=0,M=1p[0];0<=M?1o<=M:1o>=M;i=0<=M?++1o:--1o){C(!(1M[i]!=N)){5f=[i-1,1M[i-1]];1a(j=1n=i,2U=1p[0];i<=2U?1n<=2U:1n>=2U;j=i<=2U?++1n:--1n){C(1M[j]!=N){7m=[j,1M[j]];4K}}1M[i]=5f[1]+((7m[1]-5f[1])/(7m[0]-5f[0]))*(i-5f[0])}}}C(!(1M[1p[0]]!=N)){1M[1p[0]]=1M[1p[0]-1]}u 1M};u 2I})();1V=(A(){A 1V(){}1V.7v=A(4J){J b,g,r;C(4J.dz(0)==="#"){4J=4J.4H(1)}r=3M(4J.4H(0,2),16);g=3M(4J.4H(2,2),16);b=3M(4J.4H(4,2),16);u{r:r,g:g,b:b}};1V.dy=A(r,g,b){J d,h,l,1f,2e,s;C(1s r==="3N"){g=r.g;b=r.b;r=r.r}r/=D;g/=D;b/=D;1f=O.1f(r,g,b);2e=O.2e(r,g,b);l=(1f+2e)/2;C(1f===2e){h=s=0}U{d=1f-2e;s=l>0.5?d/(2-1f-2e):d/(1f+2e);h=(A(){57(1f){1Y r:u(g-b)/d+(g1){t-=1}C(t<1/6){u p+(q-p)*6*t}C(t<1/2){u q}C(t<2/3){u p+(q-p)*(2/3-t)*6}u p};1V.9I=A(r,g,b){J d,h,1f,2e,s,v;r/=D;g/=D;b/=D;1f=O.1f(r,g,b);2e=O.2e(r,g,b);v=1f;d=1f-2e;s=1f===0?0:d/1f;C(1f===2e){h=0}U{h=(A(){57(1f){1Y r:u(g-b)/d+(g0.8q){r=O.1D((r+0.3k)/1.3k,2.4)}U{r/=12.92}C(g>0.8q){g=O.1D((g+0.3k)/1.3k,2.4)}U{g/=12.92}C(b>0.8q){b=O.1D((b+0.3k)/1.3k,2.4)}U{b/=12.92}x=r*0.dw+g*0.dv+b*0.du;y=r*0.aj+g*0.ak+b*0.al;z=r*0.dt+g*0.ds+b*0.dr;u{x:x*1h,y:y*1h,z:z*1h}};1V.dq=A(x,y,z){J b,g,r;x/=1h;y/=1h;z/=1h;r=(3.bS*x)+(-1.do*y)+(-0.dn*z);g=(-0.dm*x)+(1.dl*y)+(0.dk*z);b=(0.dj*x)+(-0.di*y)+(1.dh*z);C(r>0.8n){r=(1.3k*O.1D(r,0.8m))-0.3k}U{r*=12.92}C(g>0.8n){g=(1.3k*O.1D(g,0.8m))-0.3k}U{g*=12.92}C(b>0.8n){b=(1.3k*O.1D(b,0.8m))-0.3k}U{b*=12.92}u{r:r*D,g:g*D,b:b*D}};1V.aK=A(x,y,z){J a,b,l,8l,7D,8j;C(1s x==="3N"){y=x.y;z=x.z;x=x.x}8l=95.aP;7D=1h.0;8j=8i.aR;x/=8l;y/=7D;z/=8j;C(x>0.8h){x=O.1D(x,0.8g)}U{x=(7.8f*x)+0.5q}C(y>0.8h){y=O.1D(y,0.8g)}U{y=(7.8f*y)+0.5q}C(z>0.8h){z=O.1D(z,0.8g)}U{z=(7.8f*z)+0.5q}l=b1*y-16;a=b2*(x-y);b=4Y*(y-z);u{l:l,a:a,b:b}};1V.dg=A(l,a,b){J x,y,z;C(1s l==="3N"){a=l.a;b=l.b;l=l.l}y=(l+16)/b1;x=y+(a/b2);z=y-(b/4Y);C(x>0.8e){x=x*x*x}U{x=0.8d*(x-0.5q)}C(y>0.8e){y=y*y*y}U{y=0.8d*(y-0.5q)}C(z>0.8e){z=z*z*z}U{z=0.8d*(z-0.5q)}u{x:x*95.aP,y:y*1h.0,z:z*8i.aR}};1V.df=A(r,g,b){J 8b;C(1s r==="3N"){g=r.g;b=r.b;r=r.r}8b=o.a1(r,g,b);u o.aK(8b)};1V.de=A(l,a,b){};u 1V})();2y=(A(){A 2y(){}2y.4M={};2y.be=["bh","bi","aE","bk","bl","68"];2y.4S=A(3x,1m,1X){J 6g,H,1G,M,1C;C(o.4M[1m]&&o.4M[1m].1c){M=o.4M[1m];1C=[];1a(H=0,1G=M.1c;H<1G;H++){6g=M[H];C(6g.3x===N||3x.2B===6g.3x.2B){1C.2z(6g.3E.1R(3x,1X))}U{1C.2z(bp 0)}}u 1C}};2y.dd=A(3x,1m,3E){J 89,88;C(1s 3x==="3J"){88=3x;89=1m;3x=N;1m=88;3E=89}C(7H.1R(o.be,1m)<0){u 2S}C(!o.4M[1m]){o.4M[1m]=[]}o.4M[1m].2z({3x:3x,3E:3E});u 3R};u 2y})();G.2y=2y;G.P=P=(A(){A P(){}P.2X={8R:1,8Q:2,8O:3,8N:4,86:5,2m:6};P.Q=A(1k,8X){u G.T[1k]=8X};u P})();G.2V=2V=(A(){A 2V(){}2V.97=/(?:(?:dc|db):\\/\\/)((?:\\w+)\\.(?:(?:\\w|\\.)+))/;2V.ba=A(1A){J 6z;C(1A==N){u 2S}C(o.9c(1A)){u 2S}6z=1A.1Q.8F(o.97);C(6z){u 6z[1]!==2n.da}U{u 2S}};2V.9c=A(1A){J M;u(1A.8a!=N)&&((M=1A.8a.62())===\'98\'||M===\'d9-d8\')};2V.5z=A(1Q){u""+G.9A+"?"+G.a2+"="+(d7(1Q))};2V.d6=A(4D){J 6J;6J={d5:\'d4\',d3:\'d2\',d1:\'d0\',cZ:\'cY\'};4D=4D.62();C(6J[4D]!=N){4D=6J[4D]}u"cX/cW."+4D};u 2V})();G.T.cV=A(){C(1s 2i!=="3P"&&2i!==N){u o.9F.5a(o,1u)}U{u o.9G.5a(o,1u)}};G.T.9G=A(1m){J 1b;C(1m==N){1m="9H"}1m=1m.62();1b=o.8W(1m).cU("1b/"+1m,"1b/cT-cS");u 2n.cR.cQ=1b};G.T.9F=A(5b,74){J 81;C(74==N){74=3R}a9{81=69.cP(5b);C(81.cO()&&!74){u 2S}}aa(e){27.2o("eU cM 5b "+5b)}u 69.cL(5b,o.K.cK(),A(){u 27.2o("cJ cI 72 "+5b)})};G.T.af=A(1m){J 1A;1A=2n.3O(\'1A\');1A.1Q=o.8W(1m);1A.F=o.1d.F;1A.I=o.1d.I;C(5i.4p){1A.F/=5i.4p;1A.I/=5i.4p}u 1A};G.T.8W=A(1m){C(1m==N){1m="9H"}1m=1m.62();u o.K.cH("1b/"+1m)};3g=(A(){A 3g(c){o.c=c;o.1w=o.c;o.1F={7X:\'7W\',2b:1.0};o.cG=1N.7R.4L();o.K=1s 2i!=="3P"&&2i!==N?1T 49():2n.3O(\'K\');o.K.F=o.c.1d.F;o.K.I=o.c.1d.I;o.1q=o.K.4h(\'2d\');o.1q.cE(o.K.F,o.K.I);o.4j=o.1q.66(0,0,o.K.F,o.K.I);o.Y=o.4j.1X}3g.T.2J=A(cb){u o.c.2J.1R(o.c,cb)};3g.T.3a=A(ao){o.1F.7X=ao;u o};3g.T.2b=A(2b){o.1F.2b=2b/1h;u o};3g.T.43=A(){J i,2H,H,M;2H=o.c.Y;1a(i=H=0,M=o.c.Y.1c;Ho.c.Y.1c||2K<0){u{r:0,g:0,b:0,a:0}}u{r:o.c.Y[2K],g:o.c.Y[2K+1],b:o.c.Y[2K+2],a:o.c.Y[2K+3]}};3v.T.cA=A(7x,7z,B){J aH;aH=o.S+(o.c.1d.F*4*(7z*-1))+(4*7x);C(2K>o.c.Y.1c||2K<0){u}o.c.Y[2K]=B.r;o.c.Y[2K+1]=B.g;o.c.Y[2K+2]=B.b;o.c.Y[2K+3]=B.a;u 3R};3v.T.cz=A(x,y){J S;S=(y*o.c.1d.F+x)*4;u{r:o.c.Y[S],g:o.c.Y[S+1],b:o.c.Y[S+2],a:o.c.Y[S+3]}};3v.T.cy=A(x,y,B){J S;S=(y*o.c.1d.F+x)*4;o.c.Y[S]=B.r;o.c.Y[S+1]=B.g;o.c.Y[S+2]=B.b;u o.c.Y[S+3]=B.a};u 3v})();2m=(A(){A 2m(){}2m.7S={};2m.Q=A(1k,3Q){u o.7S[1k]=3Q};2m.3I=A(1q,1k,1K){u o.7S[1k].5a(1q,1K)};u 2m})();G.2m=2m;G.1L=1L=(A(){1L.4x=G.33?6O(\'cx\').cw().1c:4;A 1L(c){o.c=c;o.48=au(o.48,o);o.5M=[];o.4T=N}1L.T.5E=A(7Q){C(7Q==N){u}u o.5M.2z(7Q)};1L.T.48=A(){J 1W;C(o.5M.1c===0){2y.4S(o,"bk");C(o.7P!=N){o.7P.1R(o.c)}u o}o.1Z=o.5M.aS();57(o.1Z.1m){1Y P.2X.8O:1W=o.c.8t.aS();o.c.bm(1W);u o.48();1Y P.2X.8N:o.c.bs();o.c.bo();u o.48();1Y P.2X.86:u o.aT(o.1Z.1W,o.1Z.1Q);1Y P.2X.2m:u o.aU();cv:u o.aW()}};1L.T.3I=A(2s){o.7P=2s;o.4T=1T cu(o.c.Y.1c);u o.48()};1L.T.7O=A(3E){J 67,7N,1p,f,i,7M,n,1E,H,M,1C,1t=o;o.6D=0;n=o.c.Y.1c;7N=O.34((n/4)/1L.4x);67=7N*4;7M=67+((n/4)%1L.4x)*4;1C=[];1a(i=H=0,M=1L.4x;0<=M?HM;i=0<=M?++H:--H){1E=i*67;1p=1E+(i===1L.4x-1?7M:67);C(G.33){f=6c(A(){u 3E.1R(1t,i,1E,1p)});1C.2z(f.ct())}U{1C.2z(7n((A(i,1E,1p){u A(){u 3E.1R(1t,i,1E,1p)}})(i,1E,1p),0))}}u 1C};1L.T.aW=A(){2y.4S(o.c,"bh",o.1Z);C(o.1Z.1m===P.2X.8R){u o.7O(o.b5)}U{u o.7O(o.b6)}};1L.T.aU=A(){27.2o("cs 3Q "+o.1Z.3Q);2m.3I(o.c,o.1Z.3Q,o.1Z.1K);27.2o("2m "+o.1Z.3Q+" 7L!");u o.48()};1L.T.b5=A(3p,1E,1p){J 1X,i,4u,2W,H;27.2o("bc #"+3p+" - P: "+o.1Z.1k+", cr: "+1E+", cq: "+1p);2y.4S(o.c,"bl",{bf:3p,bg:1L.4x,cp:1E,co:1p});1X={r:0,g:0,b:0,a:0};4u=1T 3v(o.c);1a(i=H=1E;H<1p;i=H+=4){4u.S=i;1X.r=o.c.Y[i];1X.g=o.c.Y[i+1];1X.b=o.c.Y[i+2];1X.a=o.c.Y[i+3];2W=o.1Z.7B.1R(4u,1X);C(!(2W.a!=N)){2W.a=1X.a}o.c.Y[i]=1N.3o(2W.r);o.c.Y[i+1]=1N.3o(2W.g);o.c.Y[i+2]=1N.3o(2W.b);o.c.Y[i+3]=1N.3o(2W.a)}o.68(3p);C(G.33){u 6c["bj"]()}};1L.T.b6=A(3p,1E,1p){J L,6k,3m,2E,5c,2N,i,j,k,2v,n,1k,3u,4u,2W,H,1o,1n;1k=o.1Z.1k;3m=o.1Z.3m;2N=o.1Z.2N;n=o.c.Y.1c;L=o.1Z.L;6k=O.8C(L.1c);2v=[];27.2o("cn 2v - P: "+o.1Z.1k);1E=O.1f(1E,o.c.1d.F*4*((6k-1)/2));1p=O.2e(1p,n-(o.c.1d.F*4*((6k-1)/2)));2E=(6k-1)/2;4u=1T 3v(o.c);1a(i=H=1E;H<1p;i=H+=4){4u.S=i;5c=0;1a(j=1o=-2E;-2E<=2E?1o<=2E:1o>=2E;j=-2E<=2E?++1o:--1o){1a(k=1n=2E;2E<=-2E?1n<=-2E:1n>=-2E;k=2E<=-2E?++1n:--1n){3u=4u.aC(j,k);2v[5c*3]=3u.r;2v[5c*3+1]=3u.g;2v[5c*3+2]=3u.b;5c++}}2W=o.3t(L,2v,2N,3m);o.4T[i]=1N.3o(2W.r);o.4T[i+1]=1N.3o(2W.g);o.4T[i+2]=1N.3o(2W.b);o.4T[i+3]=o.c.Y[i+3]}o.68(3p);C(G.33){u 6c["bj"]()}};1L.T.68=A(3p){J i,H,M;C(3p>=0){27.2o("bc #"+3p+" 7L! P: "+o.1Z.1k)}o.6D++;2y.4S(o.c,"68",{bf:3p,cm:o.6D,bg:1L.4x});C(o.6D===1L.4x){C(o.1Z.1m===P.2X.8Q){1a(i=H=0,M=o.c.Y.1c;0<=M?HM;i=0<=M?++H:--H){o.c.Y[i]=o.4T[i]}}C(3p>=0){27.2o("P "+o.1Z.1k+" 7L!")}2y.4S(o.c,"bi",o.1Z);u o.48()}};1L.T.3t=A(L,2v,2N,3m){J i,2G,H,M;2G={r:0,g:0,b:0};1a(i=H=0,M=L.1c;0<=M?HM;i=0<=M?++H:--H){2G.r+=L[i]*2v[i*3];2G.g+=L[i]*2v[i*3+1];2G.b+=L[i]*2v[i*3+2]}2G.r=(2G.r/2N)+3m;2G.g=(2G.g/2N)+3m;2G.b=(2G.b/2N)+3m;u 2G};1L.T.aT=A(1W,1Q){J 1A,5z,1t=o;1A=2n.3O(\'1A\');1A.8D=A(){1W.1q.6n(1A,0,0,1t.c.1d.F,1t.c.1d.I);1W.4j=1W.1q.66(0,0,1t.c.1d.F,1t.c.1d.I);1W.Y=1W.4j.1X;1t.c.Y=1W.Y;u 1t.48()};5z=2V.cl(1Q);u 1A.1Q=5z!=N?5z:1Q};u 1L})();G.2L=2L=(A(){A 2L(){}2L.5e={};2L.9J=A(4i){u o.5e[4i]!=N};2L.4L=A(4i){u o.5e[4i]};2L.9B=A(1k,44){u o.5e[1k]=44};2L.3I=A(4i,2s){J 1t=o;7n(A(){u 2s.1R(1t.4L(4i),1t.4L(4i))},0);u o.4L(4i)};2L.ck=A(1k){C(1k==N){1k=2S}C(1k){u bu o.5e[1k]}U{u o.5e={}}};u 2L})();2j.Q("7W",A(W,R){u{r:W.r,g:W.g,b:W.b}});2j.Q("5g",A(W,R){u{r:(W.r*R.r)/D,g:(W.g*R.g)/D,b:(W.b*R.b)/D}});2j.Q("cj",A(W,R){u{r:D-(((D-W.r)*(D-R.r))/D),g:D-(((D-W.g)*(D-R.g))/D),b:D-(((D-W.b)*(D-R.b))/D)}});2j.Q("6V",A(W,R){J 1z;1z={};1z.r=R.r>1e?D-2*(D-W.r)*(D-R.r)/D:(R.r*W.r*2)/D;1z.g=R.g>1e?D-2*(D-W.g)*(D-R.g)/D:(R.g*W.g*2)/D;1z.b=R.b>1e?D-2*(D-W.b)*(D-R.b)/D:(R.b*W.b*2)/D;u 1z});2j.Q("ci",A(W,R){u{r:W.r-R.r,g:W.g-R.g,b:W.b-R.b}});2j.Q("8Z",A(W,R){u{r:R.r+W.r,g:R.g+W.g,b:R.b+W.b}});2j.Q("ch",A(W,R){u{r:1e-2*(R.r-1e)*(W.r-1e)/D,g:1e-2*(R.g-1e)*(W.g-1e)/D,b:1e-2*(R.b-1e)*(W.b-1e)/D}});2j.Q("93",A(W,R){J 1z;1z={};1z.r=R.r>1e?D-((D-R.r)*(D-(W.r-1e)))/D:(R.r*(W.r+1e))/D;1z.g=R.g>1e?D-((D-R.g)*(D-(W.g-1e)))/D:(R.g*(W.g+1e))/D;1z.b=R.b>1e?D-((D-R.b)*(D-(W.b-1e)))/D:(R.b*(W.b+1e))/D;u 1z});2j.Q("cg",A(W,R){u{r:R.r>W.r?R.r:W.r,g:R.g>W.g?R.g:W.g,b:R.b>W.b?R.b:W.b}});2j.Q("cf",A(W,R){u{r:R.r>W.r?W.r:R.r,g:R.g>W.g?W.g:R.g,b:R.b>W.b?W.b:R.b}});P.Q("4r",A(){J 2T;C(1u.1c===1){2T=1V.7v(1u[0])}U{2T={r:1u[0],g:1u[1],b:1u[2]}}u o.29("4r",A(B){B.r=2T.r;B.g=2T.g;B.b=2T.b;B.a=D;u B})});P.Q("31",A(L){L=O.34(D*(L/1h));u o.29("31",A(B){B.r+=L;B.g+=L;B.b+=L;u B})});P.Q("3q",A(L){L*=-0.ce;u o.29("3q",A(B){J 1f;1f=O.1f(B.r,B.g,B.b);C(B.r!==1f){B.r+=(1f-B.r)*L}C(B.g!==1f){B.g+=(1f-B.g)*L}C(B.b!==1f){B.b+=(1f-B.b)*L}u B})});P.Q("3G",A(L){L*=-1;u o.29("3G",A(B){J 1j,4d,1f;1f=O.1f(B.r,B.g,B.b);4d=(B.r+B.g+B.b)/3;1j=((O.4a(1f-4d)*2/D)*L)/1h;C(B.r!==1f){B.r+=(1f-B.r)*1j}C(B.g!==1f){B.g+=(1f-B.g)*1j}C(B.b!==1f){B.b+=(1f-B.b)*1j}u B})});P.Q("4q",A(L){u o.29("4q",A(B){J 4d;4d=2I.5S(B);B.r=4d;B.g=4d;B.b=4d;u B})});P.Q("2f",A(L){L=O.1D((L+1h)/1h,2);u o.29("2f",A(B){B.r/=D;B.r-=0.5;B.r*=L;B.r+=0.5;B.r*=D;B.g/=D;B.g-=0.5;B.g*=L;B.g+=0.5;B.g*=D;B.b/=D;B.b-=0.5;B.b*=L;B.b+=0.5;B.b*=D;u B})});P.Q("7F",A(L){u o.29("7F",A(B){J h,4F,2u;4F=1V.9I(B.r,B.g,B.b);h=4F.h*1h;h+=O.4a(L);h=h%1h;h/=1h;4F.h=h;2u=1V.9N(4F.h,4F.s,4F.v);2u.a=B.a;u 2u})});P.Q("3T",A(){J 5s,2u;C(1u.1c===2){2u=1V.7v(1u[0]);5s=1u[1]}U C(1u.1c===4){2u={r:1u[0],g:1u[1],b:1u[2]};5s=1u[3]}u o.29("3T",A(B){B.r-=(B.r-2u.r)*(5s/1h);B.g-=(B.g-2u.g)*(5s/1h);B.b-=(B.b-2u.b)*(5s/1h);u B})});P.Q("9m",A(){u o.29("9m",A(B){B.r=D-B.r;B.g=D-B.g;B.b=D-B.b;u B})});P.Q("3S",A(L){C(L==N){L=1h}L/=1h;u o.29("3S",A(B){B.r=O.2e(D,(B.r*(1-(0.cd*L)))+(B.g*(0.cc*L))+(B.b*(0.ca*L)));B.g=O.2e(D,(B.r*(0.c9*L))+(B.g*(1-(0.c8*L)))+(B.b*(0.c7*L)));B.b=O.2e(D,(B.r*(0.c6*L))+(B.g*(0.c5*L))+(B.b*(1-(0.c4*L))));u B})});P.Q("2g",A(L){u o.29("2g",A(B){B.r=O.1D(B.r/D,L)*D;B.g=O.1D(B.g/D,L)*D;B.b=O.1D(B.b/D,L)*D;u B})});P.Q("7f",A(L){L=O.4a(L)*2.55;u o.29("7f",A(B){J 3Z;3Z=2I.aB(L*-1,L);B.r+=3Z;B.g+=3Z;B.b+=3Z;u B})});P.Q("7g",A(L){L=O.4a(L)*2.55;u o.29("7g",A(B){C(B.r>D-L){B.r=D}U C(B.rD-L){B.g=D}U C(B.gD-L){B.b=D}U C(B.b0){B.r+=(D-B.r)*1F.2Y}U{B.r-=B.r*O.4a(1F.2Y)}}C(1F.4e!=N){C(1F.4e>0){B.g+=(D-B.g)*1F.4e}U{B.g-=B.g*O.4a(1F.4e)}}C(1F.3z!=N){C(1F.3z>0){B.b+=(D-B.b)*1F.3z}U{B.b-=B.b*O.4a(1F.3z)}}u B})});P.Q("26",A(){J 1M,3L,3r,3s,3n,1p,i,1E,H,1o,M,2U;3L=1u[0],3r=2<=1u.1c?aL.1R(1u,1):[];C(1s 3L==="3J"){3L=3L.c3("")}C(3L[0]==="v"){3L=[\'r\',\'g\',\'b\']}C(3r.1c<3||3r.1c>4){78"76 9L c2 1u 72 26 1w";}1E=3r[0];3s=3r[1];3n=3r.1c===4?3r[2]:3r[1];1p=3r[3r.1c-1];1M=2I.1M(1E,3s,3n,1p,0,D);C(1E[0]>0){1a(i=H=0,M=1E[0];0<=M?HM;i=0<=M?++H:--H){1M[i]=1E[1]}}C(1p[0]=D;i=2U<=D?++1o:--1o){1M[i]=1p[1]}}u o.29("26",A(B){J 1n,5C;1a(i=1n=0,5C=3L.1c;0<=5C?1n<5C:1n>5C;i=0<=5C?++1n:--1n){B[3L[i]]=1M[B[3L[i]]]}u B})});P.Q("2M",A(L){J 3s,3n,p;p=O.4a(L)/1h;3s=[0,D*p];3n=[D-(D*p),D];C(L<0){3s=3s.9P();3n=3n.9P()}u o.26(\'2u\',[0,0],3s,3n,[D,D])});G.P.Q("c1",A(){u o.3t("c0 7r",[1,1,1,1,1,1,1,1,1])});G.P.Q("bZ",A(){u o.3t("bY bX 7r",[0,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,0,0])});G.P.Q("bW",A(){u o.3t("bV 7r",[1,4,6,4,1,4,16,24,16,4,6,24,36,24,6,4,16,24,16,4,1,4,6,4,1])});G.P.Q("bU",A(3Y){J 2v;C(3Y===0||3Y===4G){2v=[0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0]}U C((3Y>0&&3Y<90)||(3Y>4G&&3Yo.1d.F){1l=o.1d.F*(3M(1l.4H(0,1l.1c-1),10)/1h)}U{1l=o.1d.I*(3M(1l.4H(0,1l.1c-1),10)/1h)}}2R/=1h;39=[o.1d.F/2,o.1d.I/2];1E=O.8C(O.1D(39[0],2)+O.1D(39[1],2));1p=1E-1l;1M=2I.1M([0,1],[30,30],[70,60],[1h,80]);u o.29("1O",A(B){J 7a,2w,S;S=o.7T();7a=2I.4X(S.x,S.y,39[0],39[1]);C(7a>1p){2w=O.1f(1,(1M[O.6A(((7a-1p)/1l)*1h)]/10)*2R);B.r=O.1D(B.r/D,2w)*D;B.g=O.1D(B.g/D,2w)*D;B.b=O.1D(B.b/D,2w)*D}u B})});P.Q("ah",A(E){J 3U,5k,6R,1l,H,1G,M;3U={2R:50,2t:0,7K:\'31\',2T:{r:0,g:0,b:0}};E=1N.7t(3U,E);C(!E.1l){u o}U C(1s E.1l==="3J"){6R=3M(E.1l,10)/1h;E.1l={F:o.1d.F*6R,I:o.1d.I*6R}}U C(1s E.1l==="3N"){M=["F","I"];1a(H=0,1G=M.1c;H<1G;H++){5k=M[H];C(1s E.1l[5k]==="3J"){E.1l[5k]=o.1d[5k]*(3M(E.1l[5k],10)/1h)}}}U C(E.1l==="9L"){1l=E.1l;E.1l={F:1l,I:1l}}C(1s E.2t==="3J"){E.2t=(E.1l.F/2)*(3M(E.2t,10)/1h)}E.2R/=1h;E.1l.F=O.34(E.1l.F);E.1l.I=O.34(E.1l.I);E.1b={F:o.1d.F,I:o.1d.I};C(E.7K==="3T"&&1s E.2T==="3J"){E.2T=1V.7v(E.2T)}E.1S={4Q:(o.1d.F-E.1l.F)/2,51:o.1d.F-E.1S.4Q,4V:(o.1d.I-E.1l.I)/2,5o:o.1d.I-E.1S.4V};E.1r=[{x:E.1S.4Q+E.2t,y:E.1S.5o-E.2t},{x:E.1S.51-E.2t,y:E.1S.5o-E.2t},{x:E.1S.51-E.2t,y:E.1S.4V+E.2t},{x:E.1S.4Q+E.2t,y:E.1S.4V+E.2t}];E.47=2I.4X(0,0,E.1r[3].x,E.1r[3].y)-E.2t;u o.29("ah",A(B){J 1j,S,46;S=o.7T();C((S.x>E.1r[0].x&&S.xE.1S.4V&&S.yE.1S.4Q&&S.xE.1r[3].y&&S.yE.1r[0].x&&S.xE.1S.5o){1j=(S.y-E.1S.5o)/E.47}U C(S.y>E.1r[2].y&&S.yE.1S.51){1j=(S.x-E.1S.51)/E.47}U C(S.x>E.1r[0].x&&S.xE.1r[2].y&&S.y=E.1r[0].y){46=G.4X(S.x,S.y,E.1r[0].x,E.1r[0].y);1j=(46-E.2t)/E.47}U C(S.x>=E.1r[1].x&&S.y>=E.1r[1].y){46=G.4X(S.x,S.y,E.1r[1].x,E.1r[1].y);1j=(46-E.2t)/E.47}U C(S.x>=E.1r[2].x&&S.y<=E.1r[2].y){46=G.4X(S.x,S.y,E.1r[2].x,E.1r[2].y);1j=(46-E.2t)/E.47}U C(S.x<=E.1r[3].x&&S.y<=E.1r[3].y){46=G.4X(S.x,S.y,E.1r[3].x,E.1r[3].y);1j=(46-E.2t)/E.47}C(1j<0){u B}u 8k[E.7K](B,1j,E)})});(A(){J 4t,7U,7V,58,59;58=[2x,2x,2Q,2x,3j,2Q,3l,2x,3K,3j,3h,2Q,3D,3l,3F,2x,4c,3K,4b,3j,4z,3h,4y,2Q,4w,3D,4s,3l,2O,3F,4o,2x,5r,4c,3H,3K,5u,4b,5x,3j,2O,4z,5y,3h,4A,4y,4n,2Q,5F,4w,5G,3D,54,4s,5A,3l,5t,2O,5m,3F,5j,4o,3C,2x,7u,5r,7s,4c,7p,3H,7h,3K,77,5u,6Z,4b,4l,5x,6G,3j,56,2O,7w,4z,7l,5y,4g,3h,3C,4A,7d,4y,6U,4n,6Q,2Q,6I,5F,3H,4w,6w,5G,6u,3D,6s,54,6r,4s,4l,5A,5v,3l,7A,5t,7q,2O,7j,5m,6P,3F,5D,5j,4g,4o,6q,3C,7c,2x,bv,7u,bw,5r,4n,7s,bx,4c,by,7p,bz,3H,bA,7h,bB,3K,bC,77,bD,5u,bE,6Z,bF,4b,bG,4l,6M,5x,5v,6G,7i,3j,bJ,56,bK,2O,bL,7w,bM,4z,6K,7l,5D,5y,bO,4g,bP,3h,bQ,3C,bR,4A,ad,7d,a6,4y,a4,6U,a0,4n,9Z,6Q,9X,2Q,9W,6I,9V,5F,9U,3H,9T,4w,9R,6w,9Q,5G,9M,6u,9K,3D,9w,6s,9v,54,9u,6r,9t,4s,9s,4l,6M,5A,9r,5v,9q,3l,7i,7A,9p,5t,56,7q,9o,2O,9a,7j,96,5m,8B,6P,6K,3F,94,5D,91,5j,8Y,4g,bI,4o,3h,6q,bt,3C,bq,7c,4A];59=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];7U=A(F,I,52,53,4k,1c,aG){J 3A,1q,2h,41,4v,42,4B;3A=1s 2i!=="3P"&&2i!==N?1T 49():2n.3O(\'K\');3A.F=F;3A.I=I;41=52+O.ar(4k)*1c*0.5;42=53+O.am(4k)*1c*0.5;4v=52-O.ar(4k)*1c*0.5;4B=53-O.am(4k)*1c*0.5;1q=3A.4h("2d");2h=1q.cF(41,42,4v,4B);C(!aG){2h.4E(0,"7e");2h.4E(1,"7Y")}U{2h.4E(0,"7e");2h.4E(0.5,"7Y");2h.4E(1,"7e")}1q.ac=2h;1q.ab(0,0,F,I);u 1q.66(0,0,F,I)};7V=A(F,I,52,53,6d,6b){J 3A,1q,2h;3A=1s 2i!=="3P"&&2i!==N?1T 49():2n.3O(\'K\');3A.F=F;3A.I=I;1q=3A.4h("2d");2h=1q.cN(52,53,6d,52,53,6b);2h.4E(1,"7e");2h.4E(0,"7Y");1q.ac=2h;1q.ab(0,0,F,I);u 1q.66(0,0,F,I)};4t=A(){o.r=0;o.g=0;o.b=0;o.a=0;u o.1U=N};G.2m.Q("7Z",A(9Y,1P,9O,71){J 2c,2k,1J,5h,5X,2w,28,2p,1H,I,3y,i,5T,2l,3b,6H,3B,5P,2C,p,1v,1x,V,1y,2a,2r,1I,8o,X,2P,2F,Z,3X,1i,1B,2D,4P,2A,6T,6S,5J,F,32,x,y,1g,4C,4f,H,1o,1n,3i,3f,3e,3d,3c,2Z,5p;F=o.1d.F;I=o.1d.I;3b=o.Y;8o=9Y.1X;6S=F*I;5J=6S<<2;V=[];1a(i=H=0;0<=5J?H<5J:H>5J;i=0<=5J?++H:--H){V[i]=3b[i]}5X=0;4P=71;71-=1;9n(4P-->=0){3B=(1P+0.5)|0;C(3B===0){6a}C(3B>6h){3B=6h}2w=3B+3B+1;6T=F<<2;32=F-1;3y=I-1;X=3B+1;2A=X*(X+1)/2;2D=1T 4t();3X=bp 0;Z=2D;1a(i=1o=1;1<=2w?1o<2w:1o>2w;i=1<=2w?++1o:--1o){Z=Z.1U=1T 4t();C(i===X){3X=Z}}Z.1U=2D;1i=N;1B=N;4f=1g=0;2C=58[3B];2F=59[3B];1a(y=1n=0;0<=I?1nI;y=0<=I?++1n:--1n){2a=28=2c=1I=1H=1J=0;2r=X*(1y=V[1g]);2p=X*(1x=V[1g+1]);2k=X*(1v=V[1g+2]);1I+=2A*1y;1H+=2A*1x;1J+=2A*1v;Z=2D;1a(i=3i=0;0<=X?3iX;i=0<=X?++3i:--3i){Z.r=1y;Z.g=1x;Z.b=1v;Z=Z.1U}1a(i=3f=1;1<=X?3fX;i=1<=X?++3f:--3f){p=1g+((32F;x=0<=F?++3e:--3e){V[1g]=(1I*2C)>>2F;V[1g+1]=(1H*2C)>>2F;V[1g+2]=(1J*2C)>>2F;1I-=2r;1H-=2p;1J-=2k;2r-=1i.r;2p-=1i.g;2k-=1i.b;p=(4f+((p=x+X)<32?p:32))<<2;2a+=(1i.r=V[p]);28+=(1i.g=V[p+1]);2c+=(1i.b=V[p+2]);1I+=2a;1H+=28;1J+=2c;1i=1i.1U;2r+=(1y=1B.r);2p+=(1x=1B.g);2k+=(1v=1B.b);2a-=1y;28-=1x;2c-=1v;1B=1B.1U;1g+=4}4f+=F}1a(x=3d=0;0<=F?3dF;x=0<=F?++3d:--3d){28=2c=2a=1H=1J=1I=0;1g=x<<2;2r=X*(1y=V[1g]);2p=X*(1x=V[1g+1]);2k=X*(1v=V[1g+2]);1I+=2A*1y;1H+=2A*1x;1J+=2A*1v;Z=2D;1a(i=3c=0;0<=X?3cX;i=0<=X?++3c:--3c){Z.r=1y;Z.g=1x;Z.b=1v;Z=Z.1U}4C=F;1a(i=2Z=1;1<=X?2ZX;i=1<=X?++2Z:--2Z){1g=(4C+x)<<2;1I+=(Z.r=(1y=V[1g]))*(2P=X-i);1H+=(Z.g=(1x=V[1g+1]))*2P;1J+=(Z.b=(1v=V[1g+2]))*2P;2a+=1y;28+=1x;2c+=1v;Z=Z.1U;C(i<3y){4C+=F}}1g=x;1i=2D;1B=3X;1a(y=5p=0;0<=I?5pI;y=0<=I?++5p:--5p){p=1g<<2;V[p]=(1I*2C)>>2F;V[p+1]=(1H*2C)>>2F;V[p+2]=(1J*2C)>>2F;1I-=2r;1H-=2p;1J-=2k;2r-=1i.r;2p-=1i.g;2k-=1i.b;p=(x+(((p=y+X)<3y?p:3y)*F))<<2;1I+=(2a+=(1i.r=V[p]));1H+=(28+=(1i.g=V[p+1]));1J+=(2c+=(1i.b=V[p+2]));1i=1i.1U;2r+=(1y=1B.r);2p+=(1x=1B.g);2k+=(1v=1B.b);2a-=1y;28-=1x;2c-=1v;1B=1B.1U;1g+=F}}1P*=9O;i=6S;9n(--i>-1){2l=i<<2;5P=(8o[2l+2]&dI)/D.0*71;6H=5P|0;C(6H===5X){5h=6h.0*(5P-(5P|0));5T=6h-5h;3b[2l]=(3b[2l]*5T+V[2l]*5h)>>8;3b[2l+1]=(3b[2l+1]*5T+V[2l+1]*5h)>>8;3b[2l+2]=(3b[2l+2]*5T+V[2l+2]*5h)>>8}U C(6H===5X+1){3b[2l]=V[2l];3b[2l+1]=V[2l+1];3b[2l+2]=V[2l+2]}}5X++}u o});G.P.Q("dK",A(E){J 3U,2h;3U={39:{x:o.1d.F/2,y:o.1d.I/2},4k:45,aq:4Y,6o:3,7C:1.5,4P:3};E=1N.7t(3U,E);E.4k*=O.dP/4G;2h=7U(o.1d.F,o.1d.I,E.39.x,E.39.y,E.4k,E.aq,3R);u o.5B("7Z",[2h,E.6o,E.7C,E.4P])});u G.P.Q("dQ",A(E){J 3U,2h,6d,6b;3U={1l:50,39:{x:o.1d.F/2,y:o.1d.I/2},6o:3,7C:1.5,4P:3,1P:N};E=1N.7t(3U,E);C(!E.1P){E.1P=o.1d.F2w;i=1<=2w?++H:--H){Z=Z.1U=1T 4t();C(i===X){3X=Z}}Z.1U=2D;1i=N;1B=N;4f=1g=0;2C=58[1P];2F=59[1P];1a(y=1o=0;0<=I?1oI;y=0<=I?++1o:--1o){2a=28=2c=1I=1H=1J=0;2r=X*(1y=V[1g]);2p=X*(1x=V[1g+1]);2k=X*(1v=V[1g+2]);1I+=2A*1y;1H+=2A*1x;1J+=2A*1v;Z=2D;1a(i=1n=0;0<=X?1nX;i=0<=X?++1n:--1n){Z.r=1y;Z.g=1x;Z.b=1v;Z=Z.1U}1a(i=3i=1;1<=X?3iX;i=1<=X?++3i:--3i){p=1g+((32F;x=0<=F?++3f:--3f){V[1g]=(1I*2C)>>2F;V[1g+1]=(1H*2C)>>2F;V[1g+2]=(1J*2C)>>2F;1I-=2r;1H-=2p;1J-=2k;2r-=1i.r;2p-=1i.g;2k-=1i.b;p=(4f+((p=x+1P+1)<32?p:32))<<2;2a+=(1i.r=V[p]);28+=(1i.g=V[p+1]);2c+=(1i.b=V[p+2]);1I+=2a;1H+=28;1J+=2c;1i=1i.1U;2r+=(1y=1B.r);2p+=(1x=1B.g);2k+=(1v=1B.b);2a-=1y;28-=1x;2c-=1v;1B=1B.1U;1g+=4}4f+=F}1a(x=3e=0;0<=F?3eF;x=0<=F?++3e:--3e){28=2c=2a=1H=1J=1I=0;1g=x<<2;2r=X*(1y=V[1g]);2p=X*(1x=V[1g+1]);2k=X*(1v=V[1g+2]);1I+=2A*1y;1H+=2A*1x;1J+=2A*1v;Z=2D;1a(i=3d=0;0<=X?3dX;i=0<=X?++3d:--3d){Z.r=1y;Z.g=1x;Z.b=1v;Z=Z.1U}4C=F;1a(i=3c=1;1<=1P?3c<=1P:3c>=1P;i=1<=1P?++3c:--3c){1g=(4C+x)<<2;1I+=(Z.r=(1y=V[1g]))*(2P=X-i);1H+=(Z.g=(1x=V[1g+1]))*2P;1J+=(Z.b=(1v=V[1g+2]))*2P;2a+=1y;28+=1x;2c+=1v;Z=Z.1U;C(i<3y){4C+=F}}1g=x;1i=2D;1B=3X;1a(y=2Z=0;0<=I?2ZI;y=0<=I?++2Z:--2Z){p=1g<<2;V[p]=(1I*2C)>>2F;V[p+1]=(1H*2C)>>2F;V[p+2]=(1J*2C)>>2F;1I-=2r;1H-=2p;1J-=2k;2r-=1i.r;2p-=1i.g;2k-=1i.b;p=(x+(((p=y+X)<3y?p:3y)*F))<<2;1I+=(2a+=(1i.r=V[p]));1H+=(28+=(1i.g=V[p+1]));1J+=(2c+=(1i.b=V[p+2]));1i=1i.1U;2r+=(1y=1B.r);2p+=(1x=1B.g);2k+=(1v=1B.b);2a-=1y;28-=1x;2c-=1v;1B=1B.1U;1g+=F}}u o});u G.P.Q("5n",A(1P){u o.5B("5n",[1P])})})();G.P.Q("b7",A(L){u o.29("b7",A(B){J 5S;5S=(0.aj*B.r)+(0.ak*B.g)+(0.al*B.b);C(5S 255) { + return 255; + } + return val; + }; + + Util.copyAttributes = function(from, to, opts) { + var attr, _i, _len, _ref, _ref1, _results; + if (opts == null) { + opts = {}; + } + _ref = from.attributes; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + attr = _ref[_i]; + if ((opts.except != null) && (_ref1 = attr.nodeName, __indexOf.call(opts.except, _ref1) >= 0)) { + continue; + } + _results.push(to.setAttribute(attr.nodeName, attr.nodeValue)); + } + return _results; + }; + + return Util; + + })(); + + if (typeof exports !== "undefined" && exports !== null) { + Root = exports; + Canvas = require('canvas'); + Image = Canvas.Image; + Fiber = require('fibers'); + fs = require('fs'); + } else { + Root = window; + } + + Root.Caman = Caman = (function() { + + Caman.version = { + release: "4.0.0", + date: "1/6/13" + }; + + Caman.DEBUG = false; + + Caman.NodeJS = typeof exports !== "undefined" && exports !== null; + + Caman.autoload = !Caman.NodeJS; + + Caman.crossOrigin = "anonymous"; + + Caman.toString = function() { + return "Version " + Caman.version.release + ", Released " + Caman.version.date; + }; + + Caman.remoteProxy = ""; + + Caman.proxyParam = "camanProxyUrl"; + + Caman.getAttrId = function(canvas) { + if (typeof canvas === "string") { + canvas = $(canvas); + } + if (!((canvas != null) && (canvas.getAttribute != null))) { + return null; + } + return canvas.getAttribute('data-caman-id'); + }; + + function Caman() { + var args, callback, id, + _this = this; + if (arguments.length === 0) { + throw "Invalid arguments"; + } + if (this instanceof Caman) { + this.finishInit = this.finishInit.bind(this); + this.imageLoaded = this.imageLoaded.bind(this); + args = arguments[0]; + if (!Caman.NodeJS) { + id = parseInt(Caman.getAttrId(args[0]), 10); + callback = typeof args[1] === "function" ? args[1] : typeof args[2] === "function" ? args[2] : function() {}; + if (!isNaN(id) && Store.has(id)) { + return Store.execute(id, callback); + } + } + this.id = Util.uniqid.get(); + this.originalPixelData = []; + this.pixelStack = []; + this.layerStack = []; + this.canvasQueue = []; + this.currentLayer = null; + this.scaled = false; + this.analyze = new Analyze(this); + this.renderer = new Renderer(this); + this.domIsLoaded(function() { + _this.parseArguments(args); + return _this.setup(); + }); + return this; + } else { + return new Caman(arguments); + } + } + + Caman.prototype.domIsLoaded = function(cb) { + var listener, + _this = this; + if (Caman.NodeJS) { + return setTimeout(function() { + return cb.call(_this); + }, 0); + } else { + if (document.readyState === "complete") { + Log.debug("DOM initialized"); + return setTimeout(function() { + return cb.call(_this); + }, 0); + } else { + listener = function() { + if (document.readyState === "complete") { + Log.debug("DOM initialized"); + return cb.call(_this); + } + }; + return document.addEventListener("readystatechange", listener, false); + } + } + }; + + Caman.prototype.parseArguments = function(args) { + if (args.length === 0) { + throw "Invalid arguments given"; + } + this.initObj = null; + this.initType = null; + this.imageUrl = null; + this.callback = function() {}; + this.setInitObject(args[0]); + if (args.length === 1) { + return; + } + switch (typeof args[1]) { + case "string": + this.imageUrl = args[1]; + break; + case "function": + this.callback = args[1]; + } + if (args.length === 2) { + return; + } + return this.callback = args[2]; + }; + + Caman.prototype.setInitObject = function(obj) { + if (Caman.NodeJS) { + this.initObj = obj; + this.initType = 'node'; + return; + } + if (typeof obj === "object") { + this.initObj = obj; + } else { + this.initObj = $(obj); + } + return this.initType = this.initObj.nodeName.toLowerCase(); + }; + + Caman.prototype.setup = function() { + switch (this.initType) { + case "node": + return this.initNode(); + case "img": + return this.initImage(); + case "canvas": + return this.initCanvas(); + } + }; + + Caman.prototype.initNode = function() { + var _this = this; + Log.debug("Initializing for NodeJS"); + this.image = new Image(); + this.image.onload = function() { + Log.debug("Image loaded. Width = " + _this.image.width + ", Height = " + _this.image.height); + _this.canvas = new Canvas(_this.image.width, _this.image.height); + return _this.finishInit(); + }; + this.image.onerror = function(err) { + throw err; + }; + return this.image.src = this.initObj; + }; + + Caman.prototype.initImage = function() { + this.image = this.initObj; + this.canvas = document.createElement('canvas'); + this.context = this.canvas.getContext('2d'); + Util.copyAttributes(this.image, this.canvas, { + except: ['src'] + }); + this.image.parentNode.replaceChild(this.canvas, this.image); + this.imageAdjustments(); + return this.waitForImageLoaded(); + }; + + Caman.prototype.initCanvas = function() { + this.canvas = this.initObj; + this.context = this.canvas.getContext('2d'); + if (this.imageUrl != null) { + this.image = document.createElement('img'); + this.image.src = this.imageUrl; + this.imageAdjustments(); + return this.waitForImageLoaded(); + } else { + return this.finishInit(); + } + }; + + Caman.prototype.imageAdjustments = function() { + if (this.needsHiDPISwap()) { + Log.debug(this.image.src, "->", this.hiDPIReplacement()); + this.swapped = true; + this.image.src = this.hiDPIReplacement(); + } + if (IO.isRemote(this.image)) { + this.image.src = IO.proxyUrl(this.image.src); + return Log.debug("Remote image detected, using URL = " + this.image.src); + } + }; + + Caman.prototype.waitForImageLoaded = function() { + if (this.image.complete) { + return this.imageLoaded(); + } else { + return this.image.onload = this.imageLoaded; + } + }; + + Caman.prototype.imageLoaded = function() { + Log.debug("Image loaded. Width = " + this.image.width + ", Height = " + this.image.height); + if (this.swapped) { + this.canvas.width = this.image.width / this.hiDPIRatio(); + this.canvas.height = this.image.height / this.hiDPIRatio(); + } else { + this.canvas.width = this.image.width; + this.canvas.height = this.image.height; + } + return this.finishInit(); + }; + + Caman.prototype.finishInit = function() { + var pixel, _i, _len, _ref; + if (this.context == null) { + this.context = this.canvas.getContext('2d'); + } + this.originalWidth = this.width = this.canvas.width; + this.originalHeight = this.height = this.canvas.height; + this.hiDPIAdjustments(); + this.assignId(); + if (this.image != null) { + this.context.drawImage(this.image, 0, 0, this.image.width, this.image.height, 0, 0, this.originalWidth, this.originalHeight); + } + this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); + this.pixelData = this.imageData.data; + _ref = this.pixelData; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + pixel = _ref[_i]; + this.originalPixelData.push(pixel); + } + this.dimensions = { + width: this.canvas.width, + height: this.canvas.height + }; + Store.put(this.id, this); + return this.callback.call(this, this); + }; + + Caman.prototype.assignId = function() { + if (Caman.NodeJS || this.canvas.getAttribute('data-caman-id')) { + return; + } + return this.canvas.setAttribute('data-caman-id', this.id); + }; + + Caman.prototype.hiDPIDisabled = function() { + return this.canvas.getAttribute('data-caman-hidpi-disabled') !== null; + }; + + Caman.prototype.hiDPIAdjustments = function() { + var ratio; + if (Caman.NodeJS || this.hiDPIDisabled()) { + return; + } + ratio = this.hiDPIRatio(); + if (ratio !== 1) { + Log.debug("HiDPI ratio = " + ratio); + this.scaled = true; + this.originalWidth = this.canvas.width; + this.originalHeight = this.canvas.height; + this.canvas.width = this.originalWidth * ratio; + this.canvas.height = this.originalHeight * ratio; + this.canvas.style.width = "" + this.originalWidth + "px"; + this.canvas.style.height = "" + this.originalHeight + "px"; + this.context.scale(ratio, ratio); + this.width = this.canvas.width; + return this.height = this.canvas.height; + } + }; + + Caman.prototype.hiDPIRatio = function() { + var backingStoreRatio, devicePixelRatio; + devicePixelRatio = window.devicePixelRatio || 1; + backingStoreRatio = this.context.webkitBackingStorePixelRatio || this.context.mozBackingStorePixelRatio || this.context.msBackingStorePixelRatio || this.context.oBackingStorePixelRatio || this.context.backingStorePixelRatio || 1; + return devicePixelRatio / backingStoreRatio; + }; + + Caman.prototype.hiDPICapable = function() { + return window.devicePixelRatio !== 1; + }; + + Caman.prototype.needsHiDPISwap = function() { + if (this.hiDPIDisabled() || !this.hiDPICapable()) { + return false; + } + return this.hiDPIReplacement() !== null; + }; + + Caman.prototype.hiDPIReplacement = function() { + if (this.image == null) { + return null; + } + return this.image.getAttribute('data-caman-hidpi'); + }; + + Caman.prototype.replaceCanvas = function(newCanvas) { + var oldCanvas; + oldCanvas = this.canvas; + this.canvas = newCanvas; + oldCanvas.parentNode.replaceChild(this.canvas, oldCanvas); + return this.finishInit(); + }; + + Caman.prototype.render = function(callback) { + var _this = this; + if (callback == null) { + callback = function() {}; + } + Event.trigger(this, "renderStart"); + return this.renderer.execute(function() { + _this.context.putImageData(_this.imageData, 0, 0); + return callback.call(_this); + }); + }; + + Caman.prototype.revert = function(ready) { + var i, pixel, _i, _len, _ref; + if (ready == null) { + ready = function() {}; + } + _ref = this.originalPixelData; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + pixel = _ref[i]; + this.pixelData[i] = pixel; + } + this.context.putImageData(this.imageData, 0, 0); + return ready.call(this); + }; + + Caman.prototype.process = function(name, processFn) { + this.renderer.add({ + type: Filter.Type.Single, + name: name, + processFn: processFn + }); + return this; + }; + + Caman.prototype.processKernel = function(name, adjust, divisor, bias) { + var i, _i, _ref; + if (!divisor) { + divisor = 0; + for (i = _i = 0, _ref = adjust.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + divisor += adjust[i]; + } + } + this.renderer.add({ + type: Filter.Type.Kernel, + name: name, + adjust: adjust, + divisor: divisor, + bias: bias || 0 + }); + return this; + }; + + Caman.prototype.processPlugin = function(plugin, args) { + this.renderer.add({ + type: Filter.Type.Plugin, + plugin: plugin, + args: args + }); + return this; + }; + + Caman.prototype.newLayer = function(callback) { + var layer; + layer = new Layer(this); + this.canvasQueue.push(layer); + this.renderer.add({ + type: Filter.Type.LayerDequeue + }); + callback.call(layer); + this.renderer.add({ + type: Filter.Type.LayerFinished + }); + return this; + }; + + Caman.prototype.executeLayer = function(layer) { + return this.pushContext(layer); + }; + + Caman.prototype.pushContext = function(layer) { + this.layerStack.push(this.currentLayer); + this.pixelStack.push(this.pixelData); + this.currentLayer = layer; + return this.pixelData = layer.pixelData; + }; + + Caman.prototype.popContext = function() { + this.pixelData = this.pixelStack.pop(); + return this.currentLayer = this.layerStack.pop(); + }; + + Caman.prototype.applyCurrentLayer = function() { + return this.currentLayer.applyToParent(); + }; + + return Caman; + + })(); + + Analyze = (function() { + + function Analyze(c) { + this.c = c; + } + + Analyze.prototype.calculateLevels = function() { + var i, levels, numPixels, _i, _j, _k, _ref; + levels = { + r: {}, + g: {}, + b: {} + }; + for (i = _i = 0; _i <= 255; i = ++_i) { + levels.r[i] = 0; + levels.g[i] = 0; + levels.b[i] = 0; + } + for (i = _j = 0, _ref = this.c.pixelData.length; _j < _ref; i = _j += 4) { + levels.r[this.c.pixelData[i]]++; + levels.g[this.c.pixelData[i + 1]]++; + levels.b[this.c.pixelData[i + 2]]++; + } + numPixels = this.c.pixelData.length / 4; + for (i = _k = 0; _k <= 255; i = ++_k) { + levels.r[i] /= numPixels; + levels.g[i] /= numPixels; + levels.b[i] /= numPixels; + } + return levels; + }; + + return Analyze; + + })(); + + Caman.DOMUpdated = function() { + var img, imgs, parser, _i, _len, _results; + imgs = document.querySelectorAll("img[data-caman]"); + if (!(imgs.length > 0)) { + return; + } + _results = []; + for (_i = 0, _len = imgs.length; _i < _len; _i++) { + img = imgs[_i]; + _results.push(parser = new CamanParser(img, function() { + this.parse(); + return this.execute(); + })); + } + return _results; + }; + + if (Caman.autoload) { + (function() { + if (document.readyState === "complete") { + return Caman.DOMUpdated(); + } else { + return document.addEventListener("DOMContentLoaded", Caman.DOMUpdated, false); + } + })(); + } + + CamanParser = (function() { + var INST_REGEX; + + INST_REGEX = "(\\w+)\\((.*?)\\)"; + + function CamanParser(ele, ready) { + this.dataStr = ele.getAttribute('data-caman'); + this.caman = Caman(ele, ready.bind(this)); + } + + CamanParser.prototype.parse = function() { + var args, filter, func, inst, instFunc, m, r, unparsedInstructions, _i, _len, _ref, _results; + this.ele = this.caman.canvas; + r = new RegExp(INST_REGEX, 'g'); + unparsedInstructions = this.dataStr.match(r); + if (!(unparsedInstructions.length > 0)) { + return; + } + r = new RegExp(INST_REGEX); + _results = []; + for (_i = 0, _len = unparsedInstructions.length; _i < _len; _i++) { + inst = unparsedInstructions[_i]; + _ref = inst.match(r), m = _ref[0], filter = _ref[1], args = _ref[2]; + instFunc = new Function("return function() { this." + filter + "(" + args + "); };"); + try { + func = instFunc(); + _results.push(func.call(this.caman)); + } catch (e) { + _results.push(Log.debug(e)); + } + } + return _results; + }; + + CamanParser.prototype.execute = function() { + var ele; + ele = this.ele; + return this.caman.render(function() { + return ele.parentNode.replaceChild(this.toImage(), ele); + }); + }; + + return CamanParser; + + })(); + + Caman.Blender = Blender = (function() { + + function Blender() {} + + Blender.blenders = {}; + + Blender.register = function(name, func) { + return this.blenders[name] = func; + }; + + Blender.execute = function(name, rgbaLayer, rgbaParent) { + return this.blenders[name](rgbaLayer, rgbaParent); + }; + + return Blender; + + })(); + + Caman.Calculate = Calculate = (function() { + + function Calculate() {} + + Calculate.distance = function(x1, y1, x2, y2) { + return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + }; + + Calculate.randomRange = function(min, max, getFloat) { + var rand; + if (getFloat == null) { + getFloat = false; + } + rand = min + (Math.random() * (max - min)); + if (getFloat) { + return rand.toFixed(getFloat); + } else { + return Math.round(rand); + } + }; + + Calculate.luminance = function(rgba) { + return (0.299 * rgba.r) + (0.587 * rgba.g) + (0.114 * rgba.b); + }; + + Calculate.bezier = function(start, ctrl1, ctrl2, end, lowBound, highBound) { + var Ax, Ay, Bx, By, Cx, Cy, bezier, curveX, curveY, i, j, leftCoord, rightCoord, t, x0, x1, x2, x3, y0, y1, y2, y3, _i, _j, _k, _ref, _ref1; + x0 = start[0]; + y0 = start[1]; + x1 = ctrl1[0]; + y1 = ctrl1[1]; + x2 = ctrl2[0]; + y2 = ctrl2[1]; + x3 = end[0]; + y3 = end[1]; + bezier = {}; + Cx = parseInt(3 * (x1 - x0), 10); + Bx = 3 * (x2 - x1) - Cx; + Ax = x3 - x0 - Cx - Bx; + Cy = 3 * (y1 - y0); + By = 3 * (y2 - y1) - Cy; + Ay = y3 - y0 - Cy - By; + for (i = _i = 0; _i < 1000; i = ++_i) { + t = i / 1000; + curveX = Math.round((Ax * Math.pow(t, 3)) + (Bx * Math.pow(t, 2)) + (Cx * t) + x0); + curveY = Math.round((Ay * Math.pow(t, 3)) + (By * Math.pow(t, 2)) + (Cy * t) + y0); + if (lowBound && curveY < lowBound) { + curveY = lowBound; + } else if (highBound && curveY > highBound) { + curveY = highBound; + } + bezier[curveX] = curveY; + } + if (bezier.length < end[0] + 1) { + for (i = _j = 0, _ref = end[0]; 0 <= _ref ? _j <= _ref : _j >= _ref; i = 0 <= _ref ? ++_j : --_j) { + if (!(bezier[i] != null)) { + leftCoord = [i - 1, bezier[i - 1]]; + for (j = _k = i, _ref1 = end[0]; i <= _ref1 ? _k <= _ref1 : _k >= _ref1; j = i <= _ref1 ? ++_k : --_k) { + if (bezier[j] != null) { + rightCoord = [j, bezier[j]]; + break; + } + } + bezier[i] = leftCoord[1] + ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * (i - leftCoord[0]); + } + } + } + if (!(bezier[end[0]] != null)) { + bezier[end[0]] = bezier[end[0] - 1]; + } + return bezier; + }; + + return Calculate; + + })(); + + Convert = (function() { + + function Convert() {} + + Convert.hexToRGB = function(hex) { + var b, g, r; + if (hex.charAt(0) === "#") { + hex = hex.substr(1); + } + r = parseInt(hex.substr(0, 2), 16); + g = parseInt(hex.substr(2, 2), 16); + b = parseInt(hex.substr(4, 2), 16); + return { + r: r, + g: g, + b: b + }; + }; + + Convert.rgbToHSL = function(r, g, b) { + var d, h, l, max, min, s; + if (typeof r === "object") { + g = r.g; + b = r.b; + r = r.r; + } + r /= 255; + g /= 255; + b /= 255; + max = Math.max(r, g, b); + min = Math.min(r, g, b); + l = (max + min) / 2; + if (max === min) { + h = s = 0; + } else { + d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + h = (function() { + switch (max) { + case r: + return (g - b) / d + (g < b ? 6 : 0); + case g: + return (b - r) / d + 2; + case b: + return (r - g) / d + 4; + } + })(); + h /= 6; + } + return { + h: h, + s: s, + l: l + }; + }; + + Convert.hslToRGB = function(h, s, l) { + var b, g, p, q, r; + if (typeof h === "object") { + s = h.s; + l = h.l; + h = h.h; + } + if (s === 0) { + r = g = b = l; + } else { + q = l < 0.5 ? l * (1 + s) : l + s - l * s; + p = 2 * l - q; + r = this.hueToRGB(p, q, h + 1 / 3); + g = this.hueToRGB(p, q, h); + b = this.hueToRGB(p, q, h - 1 / 3); + } + return { + r: r * 255, + g: g * 255, + b: b * 255 + }; + }; + + Convert.hueToRGB = function(p, q, t) { + if (t < 0) { + t += 1; + } + if (t > 1) { + t -= 1; + } + if (t < 1 / 6) { + return p + (q - p) * 6 * t; + } + if (t < 1 / 2) { + return q; + } + if (t < 2 / 3) { + return p + (q - p) * (2 / 3 - t) * 6; + } + return p; + }; + + Convert.rgbToHSV = function(r, g, b) { + var d, h, max, min, s, v; + r /= 255; + g /= 255; + b /= 255; + max = Math.max(r, g, b); + min = Math.min(r, g, b); + v = max; + d = max - min; + s = max === 0 ? 0 : d / max; + if (max === min) { + h = 0; + } else { + h = (function() { + switch (max) { + case r: + return (g - b) / d + (g < b ? 6 : 0); + case g: + return (b - r) / d + 2; + case b: + return (r - g) / d + 4; + } + })(); + h /= 6; + } + return { + h: h, + s: s, + v: v + }; + }; + + Convert.hsvToRGB = function(h, s, v) { + var b, f, g, i, p, q, r, t; + i = Math.floor(h * 6); + f = h * 6 - i; + p = v * (1 - s); + q = v * (1 - f * s); + t = v * (1 - (1 - f) * s); + switch (i % 6) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + case 5: + r = v; + g = p; + b = q; + } + return { + r: r * 255, + g: g * 255, + b: b * 255 + }; + }; + + Convert.rgbToXYZ = function(r, g, b) { + var x, y, z; + r /= 255; + g /= 255; + b /= 255; + if (r > 0.04045) { + r = Math.pow((r + 0.055) / 1.055, 2.4); + } else { + r /= 12.92; + } + if (g > 0.04045) { + g = Math.pow((g + 0.055) / 1.055, 2.4); + } else { + g /= 12.92; + } + if (b > 0.04045) { + b = Math.pow((b + 0.055) / 1.055, 2.4); + } else { + b /= 12.92; + } + x = r * 0.4124 + g * 0.3576 + b * 0.1805; + y = r * 0.2126 + g * 0.7152 + b * 0.0722; + z = r * 0.0193 + g * 0.1192 + b * 0.9505; + return { + x: x * 100, + y: y * 100, + z: z * 100 + }; + }; + + Convert.xyzToRGB = function(x, y, z) { + var b, g, r; + x /= 100; + y /= 100; + z /= 100; + r = (3.2406 * x) + (-1.5372 * y) + (-0.4986 * z); + g = (-0.9689 * x) + (1.8758 * y) + (0.0415 * z); + b = (0.0557 * x) + (-0.2040 * y) + (1.0570 * z); + if (r > 0.0031308) { + r = (1.055 * Math.pow(r, 0.4166666667)) - 0.055; + } else { + r *= 12.92; + } + if (g > 0.0031308) { + g = (1.055 * Math.pow(g, 0.4166666667)) - 0.055; + } else { + g *= 12.92; + } + if (b > 0.0031308) { + b = (1.055 * Math.pow(b, 0.4166666667)) - 0.055; + } else { + b *= 12.92; + } + return { + r: r * 255, + g: g * 255, + b: b * 255 + }; + }; + + Convert.xyzToLab = function(x, y, z) { + var a, b, l, whiteX, whiteY, whiteZ; + if (typeof x === "object") { + y = x.y; + z = x.z; + x = x.x; + } + whiteX = 95.047; + whiteY = 100.0; + whiteZ = 108.883; + x /= whiteX; + y /= whiteY; + z /= whiteZ; + if (x > 0.008856451679) { + x = Math.pow(x, 0.3333333333); + } else { + x = (7.787037037 * x) + 0.1379310345; + } + if (y > 0.008856451679) { + y = Math.pow(y, 0.3333333333); + } else { + y = (7.787037037 * y) + 0.1379310345; + } + if (z > 0.008856451679) { + z = Math.pow(z, 0.3333333333); + } else { + z = (7.787037037 * z) + 0.1379310345; + } + l = 116 * y - 16; + a = 500 * (x - y); + b = 200 * (y - z); + return { + l: l, + a: a, + b: b + }; + }; + + Convert.labToXYZ = function(l, a, b) { + var x, y, z; + if (typeof l === "object") { + a = l.a; + b = l.b; + l = l.l; + } + y = (l + 16) / 116; + x = y + (a / 500); + z = y - (b / 200); + if (x > 0.2068965517) { + x = x * x * x; + } else { + x = 0.1284185493 * (x - 0.1379310345); + } + if (y > 0.2068965517) { + y = y * y * y; + } else { + y = 0.1284185493 * (y - 0.1379310345); + } + if (z > 0.2068965517) { + z = z * z * z; + } else { + z = 0.1284185493 * (z - 0.1379310345); + } + return { + x: x * 95.047, + y: y * 100.0, + z: z * 108.883 + }; + }; + + Convert.rgbToLab = function(r, g, b) { + var xyz; + if (typeof r === "object") { + g = r.g; + b = r.b; + r = r.r; + } + xyz = this.rgbToXYZ(r, g, b); + return this.xyzToLab(xyz); + }; + + Convert.labToRGB = function(l, a, b) {}; + + return Convert; + + })(); + + Event = (function() { + + function Event() {} + + Event.events = {}; + + Event.types = ["processStart", "processComplete", "renderStart", "renderFinished", "blockStarted", "blockFinished"]; + + Event.trigger = function(target, type, data) { + var event, _i, _len, _ref, _results; + if (this.events[type] && this.events[type].length) { + _ref = this.events[type]; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + event = _ref[_i]; + if (event.target === null || target.id === event.target.id) { + _results.push(event.fn.call(target, data)); + } else { + _results.push(void 0); + } + } + return _results; + } + }; + + Event.listen = function(target, type, fn) { + var _fn, _type; + if (typeof target === "string") { + _type = target; + _fn = type; + target = null; + type = _type; + fn = _fn; + } + if (__indexOf.call(this.types, type) < 0) { + return false; + } + if (!this.events[type]) { + this.events[type] = []; + } + this.events[type].push({ + target: target, + fn: fn + }); + return true; + }; + + return Event; + + })(); + + Caman.Event = Event; + + Caman.Filter = Filter = (function() { + + function Filter() {} + + Filter.Type = { + Single: 1, + Kernel: 2, + LayerDequeue: 3, + LayerFinished: 4, + LoadOverlay: 5, + Plugin: 6 + }; + + Filter.register = function(name, filterFunc) { + return Caman.prototype[name] = filterFunc; + }; + + return Filter; + + })(); + + Caman.IO = IO = (function() { + + function IO() {} + + IO.domainRegex = /(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/; + + IO.isRemote = function(img) { + var matches; + if (img == null) { + return false; + } + if (this.corsEnabled(img)) { + return false; + } + matches = img.src.match(this.domainRegex); + if (matches) { + return matches[1] !== document.domain; + } else { + return false; + } + }; + + IO.corsEnabled = function(img) { + var _ref; + return (img.crossOrigin != null) && ((_ref = img.crossOrigin.toLowerCase()) === 'anonymous' || _ref === 'use-credentials'); + }; + + IO.proxyUrl = function(src) { + return "" + Caman.remoteProxy + "?" + Caman.proxyParam + "=" + (encodeURIComponent(src)); + }; + + IO.useProxy = function(lang) { + var langToExt; + langToExt = { + ruby: 'rb', + python: 'py', + perl: 'pl', + javascript: 'js' + }; + lang = lang.toLowerCase(); + if (langToExt[lang] != null) { + lang = langToExt[lang]; + } + return "proxies/caman_proxy." + lang; + }; + + return IO; + + })(); + + Caman.prototype.save = function() { + if (typeof exports !== "undefined" && exports !== null) { + return this.nodeSave.apply(this, arguments); + } else { + return this.browserSave.apply(this, arguments); + } + }; + + Caman.prototype.browserSave = function(type) { + var image; + if (type == null) { + type = "png"; + } + type = type.toLowerCase(); + image = this.toBase64(type).replace("image/" + type, "image/octet-stream"); + return document.location.href = image; + }; + + Caman.prototype.nodeSave = function(file, overwrite) { + var stats; + if (overwrite == null) { + overwrite = true; + } + try { + stats = fs.statSync(file); + if (stats.isFile() && !overwrite) { + return false; + } + } catch (e) { + Log.debug("Creating output file " + file); + } + return fs.writeFile(file, this.canvas.toBuffer(), function() { + return Log.debug("Finished writing to " + file); + }); + }; + + Caman.prototype.toImage = function(type) { + var img; + img = document.createElement('img'); + img.src = this.toBase64(type); + img.width = this.dimensions.width; + img.height = this.dimensions.height; + if (window.devicePixelRatio) { + img.width /= window.devicePixelRatio; + img.height /= window.devicePixelRatio; + } + return img; + }; + + Caman.prototype.toBase64 = function(type) { + if (type == null) { + type = "png"; + } + type = type.toLowerCase(); + return this.canvas.toDataURL("image/" + type); + }; + + Layer = (function() { + + function Layer(c) { + this.c = c; + this.filter = this.c; + this.options = { + blendingMode: 'normal', + opacity: 1.0 + }; + this.layerID = Util.uniqid.get(); + this.canvas = typeof exports !== "undefined" && exports !== null ? new Canvas() : document.createElement('canvas'); + this.canvas.width = this.c.dimensions.width; + this.canvas.height = this.c.dimensions.height; + this.context = this.canvas.getContext('2d'); + this.context.createImageData(this.canvas.width, this.canvas.height); + this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); + this.pixelData = this.imageData.data; + } + + Layer.prototype.newLayer = function(cb) { + return this.c.newLayer.call(this.c, cb); + }; + + Layer.prototype.setBlendingMode = function(mode) { + this.options.blendingMode = mode; + return this; + }; + + Layer.prototype.opacity = function(opacity) { + this.options.opacity = opacity / 100; + return this; + }; + + Layer.prototype.copyParent = function() { + var i, parentData, _i, _ref; + parentData = this.c.pixelData; + for (i = _i = 0, _ref = this.c.pixelData.length; _i < _ref; i = _i += 4) { + this.pixelData[i] = parentData[i]; + this.pixelData[i + 1] = parentData[i + 1]; + this.pixelData[i + 2] = parentData[i + 2]; + this.pixelData[i + 3] = parentData[i + 3]; + } + return this; + }; + + Layer.prototype.fillColor = function() { + return this.c.fillColor.apply(this.c, arguments); + }; + + Layer.prototype.overlayImage = function(image) { + if (typeof image === "object") { + image = image.src; + } else if (typeof image === "string" && image[0] === "#") { + image = $(image).src; + } + if (!image) { + return this; + } + this.c.renderQueue.push({ + type: Filter.Type.LoadOverlay, + src: image, + layer: this + }); + return this; + }; + + Layer.prototype.applyToParent = function() { + var i, layerData, parentData, result, rgbaLayer, rgbaParent, _i, _ref, _results; + parentData = this.c.pixelStack[this.c.pixelStack.length - 1]; + layerData = this.c.pixelData; + _results = []; + for (i = _i = 0, _ref = layerData.length; _i < _ref; i = _i += 4) { + rgbaParent = { + r: parentData[i], + g: parentData[i + 1], + b: parentData[i + 2], + a: parentData[i + 3] + }; + rgbaLayer = { + r: layerData[i], + g: layerData[i + 1], + b: layerData[i + 2], + a: layerData[i + 3] + }; + result = Blender.execute(this.options.blendingMode, rgbaLayer, rgbaParent); + result.r = Util.clampRGB(result.r); + result.g = Util.clampRGB(result.g); + result.b = Util.clampRGB(result.b); + if (!(result.a != null)) { + result.a = rgbaLayer.a; + } + parentData[i] = rgbaParent.r - ((rgbaParent.r - result.r) * (this.options.opacity * (result.a / 255))); + parentData[i + 1] = rgbaParent.g - ((rgbaParent.g - result.g) * (this.options.opacity * (result.a / 255))); + _results.push(parentData[i + 2] = rgbaParent.b - ((rgbaParent.b - result.b) * (this.options.opacity * (result.a / 255)))); + } + return _results; + }; + + return Layer; + + })(); + + Logger = (function() { + + function Logger() { + var name, _i, _len, _ref; + _ref = ['log', 'info', 'warn', 'error']; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + this[name] = (function(name) { + return function() { + if (!Caman.DEBUG) { + return; + } + return console[name].apply(console, arguments); + }; + })(name); + } + this.debug = this.log; + } + + return Logger; + + })(); + + Log = new Logger(); + + PixelInfo = (function() { + + function PixelInfo(c) { + this.c = c; + this.loc = 0; + } + + PixelInfo.prototype.locationXY = function() { + var x, y; + y = this.c.dimensions.height - Math.floor(this.loc / (this.c.dimensions.width * 4)); + x = (this.loc % (this.c.dimensions.width * 4)) / 4; + return { + x: x, + y: y + }; + }; + + PixelInfo.prototype.getPixelRelative = function(horiz, vert) { + var newLoc; + newLoc = this.loc + (this.c.dimensions.width * 4 * (vert * -1)) + (4 * horiz); + if (newLoc > this.c.pixelData.length || newLoc < 0) { + return { + r: 0, + g: 0, + b: 0, + a: 0 + }; + } + return { + r: this.c.pixelData[newLoc], + g: this.c.pixelData[newLoc + 1], + b: this.c.pixelData[newLoc + 2], + a: this.c.pixelData[newLoc + 3] + }; + }; + + PixelInfo.prototype.putPixelRelative = function(horiz, vert, rgba) { + var nowLoc; + nowLoc = this.loc + (this.c.dimensions.width * 4 * (vert * -1)) + (4 * horiz); + if (newLoc > this.c.pixelData.length || newLoc < 0) { + return; + } + this.c.pixelData[newLoc] = rgba.r; + this.c.pixelData[newLoc + 1] = rgba.g; + this.c.pixelData[newLoc + 2] = rgba.b; + this.c.pixelData[newLoc + 3] = rgba.a; + return true; + }; + + PixelInfo.prototype.getPixel = function(x, y) { + var loc; + loc = (y * this.c.dimensions.width + x) * 4; + return { + r: this.c.pixelData[loc], + g: this.c.pixelData[loc + 1], + b: this.c.pixelData[loc + 2], + a: this.c.pixelData[loc + 3] + }; + }; + + PixelInfo.prototype.putPixel = function(x, y, rgba) { + var loc; + loc = (y * this.c.dimensions.width + x) * 4; + this.c.pixelData[loc] = rgba.r; + this.c.pixelData[loc + 1] = rgba.g; + this.c.pixelData[loc + 2] = rgba.b; + return this.c.pixelData[loc + 3] = rgba.a; + }; + + return PixelInfo; + + })(); + + Plugin = (function() { + + function Plugin() {} + + Plugin.plugins = {}; + + Plugin.register = function(name, plugin) { + return this.plugins[name] = plugin; + }; + + Plugin.execute = function(context, name, args) { + return this.plugins[name].apply(context, args); + }; + + return Plugin; + + })(); + + Caman.Plugin = Plugin; + + Caman.Renderer = Renderer = (function() { + + Renderer.Blocks = Caman.NodeJS ? require('os').cpus().length : 4; + + function Renderer(c) { + this.c = c; + this.processNext = __bind(this.processNext, this); + + this.renderQueue = []; + this.modPixelData = null; + } + + Renderer.prototype.add = function(job) { + if (job == null) { + return; + } + return this.renderQueue.push(job); + }; + + Renderer.prototype.processNext = function() { + var layer; + if (this.renderQueue.length === 0) { + Event.trigger(this, "renderFinished"); + if (this.finishedFn != null) { + this.finishedFn.call(this.c); + } + return this; + } + this.currentJob = this.renderQueue.shift(); + switch (this.currentJob.type) { + case Filter.Type.LayerDequeue: + layer = this.c.canvasQueue.shift(); + this.c.executeLayer(layer); + return this.processNext(); + case Filter.Type.LayerFinished: + this.c.applyCurrentLayer(); + this.c.popContext(); + return this.processNext(); + case Filter.Type.LoadOverlay: + return this.loadOverlay(this.currentJob.layer, this.currentJob.src); + case Filter.Type.Plugin: + return this.executePlugin(); + default: + return this.executeFilter(); + } + }; + + Renderer.prototype.execute = function(callback) { + this.finishedFn = callback; + this.modPixelData = new Uint8Array(this.c.pixelData.length); + return this.processNext(); + }; + + Renderer.prototype.eachBlock = function(fn) { + var blockN, blockPixelLength, end, f, i, lastBlockN, n, start, _i, _ref, _results, + _this = this; + this.blocksDone = 0; + n = this.c.pixelData.length; + blockPixelLength = Math.floor((n / 4) / Renderer.Blocks); + blockN = blockPixelLength * 4; + lastBlockN = blockN + ((n / 4) % Renderer.Blocks) * 4; + _results = []; + for (i = _i = 0, _ref = Renderer.Blocks; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + start = i * blockN; + end = start + (i === Renderer.Blocks - 1 ? lastBlockN : blockN); + if (Caman.NodeJS) { + f = Fiber(function() { + return fn.call(_this, i, start, end); + }); + _results.push(f.run()); + } else { + _results.push(setTimeout((function(i, start, end) { + return function() { + return fn.call(_this, i, start, end); + }; + })(i, start, end), 0)); + } + } + return _results; + }; + + Renderer.prototype.executeFilter = function() { + Event.trigger(this.c, "processStart", this.currentJob); + if (this.currentJob.type === Filter.Type.Single) { + return this.eachBlock(this.renderBlock); + } else { + return this.eachBlock(this.renderKernel); + } + }; + + Renderer.prototype.executePlugin = function() { + Log.debug("Executing plugin " + this.currentJob.plugin); + Plugin.execute(this.c, this.currentJob.plugin, this.currentJob.args); + Log.debug("Plugin " + this.currentJob.plugin + " finished!"); + return this.processNext(); + }; + + Renderer.prototype.renderBlock = function(bnum, start, end) { + var data, i, pixelInfo, res, _i; + Log.debug("Block #" + bnum + " - Filter: " + this.currentJob.name + ", Start: " + start + ", End: " + end); + Event.trigger(this.c, "blockStarted", { + blockNum: bnum, + totalBlocks: Renderer.Blocks, + startPixel: start, + endPixel: end + }); + data = { + r: 0, + g: 0, + b: 0, + a: 0 + }; + pixelInfo = new PixelInfo(this.c); + for (i = _i = start; _i < end; i = _i += 4) { + pixelInfo.loc = i; + data.r = this.c.pixelData[i]; + data.g = this.c.pixelData[i + 1]; + data.b = this.c.pixelData[i + 2]; + data.a = this.c.pixelData[i + 3]; + res = this.currentJob.processFn.call(pixelInfo, data); + if (!(res.a != null)) { + res.a = data.a; + } + this.c.pixelData[i] = Util.clampRGB(res.r); + this.c.pixelData[i + 1] = Util.clampRGB(res.g); + this.c.pixelData[i + 2] = Util.clampRGB(res.b); + this.c.pixelData[i + 3] = Util.clampRGB(res.a); + } + this.blockFinished(bnum); + if (Caman.NodeJS) { + return Fiber["yield"](); + } + }; + + Renderer.prototype.renderKernel = function(bnum, start, end) { + var adjust, adjustSize, bias, builder, builderIndex, divisor, i, j, k, kernel, n, name, pixel, pixelInfo, res, _i, _j, _k; + name = this.currentJob.name; + bias = this.currentJob.bias; + divisor = this.currentJob.divisor; + n = this.c.pixelData.length; + adjust = this.currentJob.adjust; + adjustSize = Math.sqrt(adjust.length); + kernel = []; + Log.debug("Rendering kernel - Filter: " + this.currentJob.name); + start = Math.max(start, this.c.dimensions.width * 4 * ((adjustSize - 1) / 2)); + end = Math.min(end, n - (this.c.dimensions.width * 4 * ((adjustSize - 1) / 2))); + builder = (adjustSize - 1) / 2; + pixelInfo = new PixelInfo(this.c); + for (i = _i = start; _i < end; i = _i += 4) { + pixelInfo.loc = i; + builderIndex = 0; + for (j = _j = -builder; -builder <= builder ? _j <= builder : _j >= builder; j = -builder <= builder ? ++_j : --_j) { + for (k = _k = builder; builder <= -builder ? _k <= -builder : _k >= -builder; k = builder <= -builder ? ++_k : --_k) { + pixel = pixelInfo.getPixelRelative(j, k); + kernel[builderIndex * 3] = pixel.r; + kernel[builderIndex * 3 + 1] = pixel.g; + kernel[builderIndex * 3 + 2] = pixel.b; + builderIndex++; + } + } + res = this.processKernel(adjust, kernel, divisor, bias); + this.modPixelData[i] = Util.clampRGB(res.r); + this.modPixelData[i + 1] = Util.clampRGB(res.g); + this.modPixelData[i + 2] = Util.clampRGB(res.b); + this.modPixelData[i + 3] = this.c.pixelData[i + 3]; + } + this.blockFinished(bnum); + if (Caman.NodeJS) { + return Fiber["yield"](); + } + }; + + Renderer.prototype.blockFinished = function(bnum) { + var i, _i, _ref; + if (bnum >= 0) { + Log.debug("Block #" + bnum + " finished! Filter: " + this.currentJob.name); + } + this.blocksDone++; + Event.trigger(this.c, "blockFinished", { + blockNum: bnum, + blocksFinished: this.blocksDone, + totalBlocks: Renderer.Blocks + }); + if (this.blocksDone === Renderer.Blocks) { + if (this.currentJob.type === Filter.Type.Kernel) { + for (i = _i = 0, _ref = this.c.pixelData.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + this.c.pixelData[i] = this.modPixelData[i]; + } + } + if (bnum >= 0) { + Log.debug("Filter " + this.currentJob.name + " finished!"); + } + Event.trigger(this.c, "processComplete", this.currentJob); + return this.processNext(); + } + }; + + Renderer.prototype.processKernel = function(adjust, kernel, divisor, bias) { + var i, val, _i, _ref; + val = { + r: 0, + g: 0, + b: 0 + }; + for (i = _i = 0, _ref = adjust.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + val.r += adjust[i] * kernel[i * 3]; + val.g += adjust[i] * kernel[i * 3 + 1]; + val.b += adjust[i] * kernel[i * 3 + 2]; + } + val.r = (val.r / divisor) + bias; + val.g = (val.g / divisor) + bias; + val.b = (val.b / divisor) + bias; + return val; + }; + + Renderer.prototype.loadOverlay = function(layer, src) { + var img, proxyUrl, + _this = this; + img = document.createElement('img'); + img.onload = function() { + layer.context.drawImage(img, 0, 0, _this.c.dimensions.width, _this.c.dimensions.height); + layer.imageData = layer.context.getImageData(0, 0, _this.c.dimensions.width, _this.c.dimensions.height); + layer.pixelData = layer.imageData.data; + _this.c.pixelData = layer.pixelData; + return _this.processNext(); + }; + proxyUrl = IO.remoteCheck(src); + return img.src = proxyUrl != null ? proxyUrl : src; + }; + + return Renderer; + + })(); + + Caman.Store = Store = (function() { + + function Store() {} + + Store.items = {}; + + Store.has = function(search) { + return this.items[search] != null; + }; + + Store.get = function(search) { + return this.items[search]; + }; + + Store.put = function(name, obj) { + return this.items[name] = obj; + }; + + Store.execute = function(search, callback) { + var _this = this; + setTimeout(function() { + return callback.call(_this.get(search), _this.get(search)); + }, 0); + return this.get(search); + }; + + Store.flush = function(name) { + if (name == null) { + name = false; + } + if (name) { + return delete this.items[name]; + } else { + return this.items = {}; + } + }; + + return Store; + + })(); + + Blender.register("normal", function(rgbaLayer, rgbaParent) { + return { + r: rgbaLayer.r, + g: rgbaLayer.g, + b: rgbaLayer.b + }; + }); + + Blender.register("multiply", function(rgbaLayer, rgbaParent) { + return { + r: (rgbaLayer.r * rgbaParent.r) / 255, + g: (rgbaLayer.g * rgbaParent.g) / 255, + b: (rgbaLayer.b * rgbaParent.b) / 255 + }; + }); + + Blender.register("screen", function(rgbaLayer, rgbaParent) { + return { + r: 255 - (((255 - rgbaLayer.r) * (255 - rgbaParent.r)) / 255), + g: 255 - (((255 - rgbaLayer.g) * (255 - rgbaParent.g)) / 255), + b: 255 - (((255 - rgbaLayer.b) * (255 - rgbaParent.b)) / 255) + }; + }); + + Blender.register("overlay", function(rgbaLayer, rgbaParent) { + var result; + result = {}; + result.r = rgbaParent.r > 128 ? 255 - 2 * (255 - rgbaLayer.r) * (255 - rgbaParent.r) / 255 : (rgbaParent.r * rgbaLayer.r * 2) / 255; + result.g = rgbaParent.g > 128 ? 255 - 2 * (255 - rgbaLayer.g) * (255 - rgbaParent.g) / 255 : (rgbaParent.g * rgbaLayer.g * 2) / 255; + result.b = rgbaParent.b > 128 ? 255 - 2 * (255 - rgbaLayer.b) * (255 - rgbaParent.b) / 255 : (rgbaParent.b * rgbaLayer.b * 2) / 255; + return result; + }); + + Blender.register("difference", function(rgbaLayer, rgbaParent) { + return { + r: rgbaLayer.r - rgbaParent.r, + g: rgbaLayer.g - rgbaParent.g, + b: rgbaLayer.b - rgbaParent.b + }; + }); + + Blender.register("addition", function(rgbaLayer, rgbaParent) { + return { + r: rgbaParent.r + rgbaLayer.r, + g: rgbaParent.g + rgbaLayer.g, + b: rgbaParent.b + rgbaLayer.b + }; + }); + + Blender.register("exclusion", function(rgbaLayer, rgbaParent) { + return { + r: 128 - 2 * (rgbaParent.r - 128) * (rgbaLayer.r - 128) / 255, + g: 128 - 2 * (rgbaParent.g - 128) * (rgbaLayer.g - 128) / 255, + b: 128 - 2 * (rgbaParent.b - 128) * (rgbaLayer.b - 128) / 255 + }; + }); + + Blender.register("softLight", function(rgbaLayer, rgbaParent) { + var result; + result = {}; + result.r = rgbaParent.r > 128 ? 255 - ((255 - rgbaParent.r) * (255 - (rgbaLayer.r - 128))) / 255 : (rgbaParent.r * (rgbaLayer.r + 128)) / 255; + result.g = rgbaParent.g > 128 ? 255 - ((255 - rgbaParent.g) * (255 - (rgbaLayer.g - 128))) / 255 : (rgbaParent.g * (rgbaLayer.g + 128)) / 255; + result.b = rgbaParent.b > 128 ? 255 - ((255 - rgbaParent.b) * (255 - (rgbaLayer.b - 128))) / 255 : (rgbaParent.b * (rgbaLayer.b + 128)) / 255; + return result; + }); + + Blender.register("lighten", function(rgbaLayer, rgbaParent) { + return { + r: rgbaParent.r > rgbaLayer.r ? rgbaParent.r : rgbaLayer.r, + g: rgbaParent.g > rgbaLayer.g ? rgbaParent.g : rgbaLayer.g, + b: rgbaParent.b > rgbaLayer.b ? rgbaParent.b : rgbaLayer.b + }; + }); + + Blender.register("darken", function(rgbaLayer, rgbaParent) { + return { + r: rgbaParent.r > rgbaLayer.r ? rgbaLayer.r : rgbaParent.r, + g: rgbaParent.g > rgbaLayer.g ? rgbaLayer.g : rgbaParent.g, + b: rgbaParent.b > rgbaLayer.b ? rgbaLayer.b : rgbaParent.b + }; + }); + + Filter.register("fillColor", function() { + var color; + if (arguments.length === 1) { + color = Convert.hexToRGB(arguments[0]); + } else { + color = { + r: arguments[0], + g: arguments[1], + b: arguments[2] + }; + } + return this.process("fillColor", function(rgba) { + rgba.r = color.r; + rgba.g = color.g; + rgba.b = color.b; + rgba.a = 255; + return rgba; + }); + }); + + Filter.register("brightness", function(adjust) { + adjust = Math.floor(255 * (adjust / 100)); + return this.process("brightness", function(rgba) { + rgba.r += adjust; + rgba.g += adjust; + rgba.b += adjust; + return rgba; + }); + }); + + Filter.register("saturation", function(adjust) { + adjust *= -0.01; + return this.process("saturation", function(rgba) { + var max; + max = Math.max(rgba.r, rgba.g, rgba.b); + if (rgba.r !== max) { + rgba.r += (max - rgba.r) * adjust; + } + if (rgba.g !== max) { + rgba.g += (max - rgba.g) * adjust; + } + if (rgba.b !== max) { + rgba.b += (max - rgba.b) * adjust; + } + return rgba; + }); + }); + + Filter.register("vibrance", function(adjust) { + adjust *= -1; + return this.process("vibrance", function(rgba) { + var amt, avg, max; + max = Math.max(rgba.r, rgba.g, rgba.b); + avg = (rgba.r + rgba.g + rgba.b) / 3; + amt = ((Math.abs(max - avg) * 2 / 255) * adjust) / 100; + if (rgba.r !== max) { + rgba.r += (max - rgba.r) * amt; + } + if (rgba.g !== max) { + rgba.g += (max - rgba.g) * amt; + } + if (rgba.b !== max) { + rgba.b += (max - rgba.b) * amt; + } + return rgba; + }); + }); + + Filter.register("greyscale", function(adjust) { + return this.process("greyscale", function(rgba) { + var avg; + avg = Calculate.luminance(rgba); + rgba.r = avg; + rgba.g = avg; + rgba.b = avg; + return rgba; + }); + }); + + Filter.register("contrast", function(adjust) { + adjust = Math.pow((adjust + 100) / 100, 2); + return this.process("contrast", function(rgba) { + rgba.r /= 255; + rgba.r -= 0.5; + rgba.r *= adjust; + rgba.r += 0.5; + rgba.r *= 255; + rgba.g /= 255; + rgba.g -= 0.5; + rgba.g *= adjust; + rgba.g += 0.5; + rgba.g *= 255; + rgba.b /= 255; + rgba.b -= 0.5; + rgba.b *= adjust; + rgba.b += 0.5; + rgba.b *= 255; + return rgba; + }); + }); + + Filter.register("hue", function(adjust) { + return this.process("hue", function(rgba) { + var h, hsv, rgb; + hsv = Convert.rgbToHSV(rgba.r, rgba.g, rgba.b); + h = hsv.h * 100; + h += Math.abs(adjust); + h = h % 100; + h /= 100; + hsv.h = h; + rgb = Convert.hsvToRGB(hsv.h, hsv.s, hsv.v); + rgb.a = rgba.a; + return rgb; + }); + }); + + Filter.register("colorize", function() { + var level, rgb; + if (arguments.length === 2) { + rgb = Convert.hexToRGB(arguments[0]); + level = arguments[1]; + } else if (arguments.length === 4) { + rgb = { + r: arguments[0], + g: arguments[1], + b: arguments[2] + }; + level = arguments[3]; + } + return this.process("colorize", function(rgba) { + rgba.r -= (rgba.r - rgb.r) * (level / 100); + rgba.g -= (rgba.g - rgb.g) * (level / 100); + rgba.b -= (rgba.b - rgb.b) * (level / 100); + return rgba; + }); + }); + + Filter.register("invert", function() { + return this.process("invert", function(rgba) { + rgba.r = 255 - rgba.r; + rgba.g = 255 - rgba.g; + rgba.b = 255 - rgba.b; + return rgba; + }); + }); + + Filter.register("sepia", function(adjust) { + if (adjust == null) { + adjust = 100; + } + adjust /= 100; + return this.process("sepia", function(rgba) { + rgba.r = Math.min(255, (rgba.r * (1 - (0.607 * adjust))) + (rgba.g * (0.769 * adjust)) + (rgba.b * (0.189 * adjust))); + rgba.g = Math.min(255, (rgba.r * (0.349 * adjust)) + (rgba.g * (1 - (0.314 * adjust))) + (rgba.b * (0.168 * adjust))); + rgba.b = Math.min(255, (rgba.r * (0.272 * adjust)) + (rgba.g * (0.534 * adjust)) + (rgba.b * (1 - (0.869 * adjust)))); + return rgba; + }); + }); + + Filter.register("gamma", function(adjust) { + return this.process("gamma", function(rgba) { + rgba.r = Math.pow(rgba.r / 255, adjust) * 255; + rgba.g = Math.pow(rgba.g / 255, adjust) * 255; + rgba.b = Math.pow(rgba.b / 255, adjust) * 255; + return rgba; + }); + }); + + Filter.register("noise", function(adjust) { + adjust = Math.abs(adjust) * 2.55; + return this.process("noise", function(rgba) { + var rand; + rand = Calculate.randomRange(adjust * -1, adjust); + rgba.r += rand; + rgba.g += rand; + rgba.b += rand; + return rgba; + }); + }); + + Filter.register("clip", function(adjust) { + adjust = Math.abs(adjust) * 2.55; + return this.process("clip", function(rgba) { + if (rgba.r > 255 - adjust) { + rgba.r = 255; + } else if (rgba.r < adjust) { + rgba.r = 0; + } + if (rgba.g > 255 - adjust) { + rgba.g = 255; + } else if (rgba.g < adjust) { + rgba.g = 0; + } + if (rgba.b > 255 - adjust) { + rgba.b = 255; + } else if (rgba.b < adjust) { + rgba.b = 0; + } + return rgba; + }); + }); + + Filter.register("channels", function(options) { + var chan, value; + if (typeof options !== "object") { + return this; + } + for (chan in options) { + if (!__hasProp.call(options, chan)) continue; + value = options[chan]; + if (value === 0) { + delete options[chan]; + continue; + } + options[chan] /= 100; + } + if (options.length === 0) { + return this; + } + return this.process("channels", function(rgba) { + if (options.red != null) { + if (options.red > 0) { + rgba.r += (255 - rgba.r) * options.red; + } else { + rgba.r -= rgba.r * Math.abs(options.red); + } + } + if (options.green != null) { + if (options.green > 0) { + rgba.g += (255 - rgba.g) * options.green; + } else { + rgba.g -= rgba.g * Math.abs(options.green); + } + } + if (options.blue != null) { + if (options.blue > 0) { + rgba.b += (255 - rgba.b) * options.blue; + } else { + rgba.b -= rgba.b * Math.abs(options.blue); + } + } + return rgba; + }); + }); + + Filter.register("curves", function() { + var bezier, chans, cps, ctrl1, ctrl2, end, i, start, _i, _j, _ref, _ref1; + chans = arguments[0], cps = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + if (typeof chans === "string") { + chans = chans.split(""); + } + if (chans[0] === "v") { + chans = ['r', 'g', 'b']; + } + if (cps.length < 3 || cps.length > 4) { + throw "Invalid number of arguments to curves filter"; + } + start = cps[0]; + ctrl1 = cps[1]; + ctrl2 = cps.length === 4 ? cps[2] : cps[1]; + end = cps[cps.length - 1]; + bezier = Calculate.bezier(start, ctrl1, ctrl2, end, 0, 255); + if (start[0] > 0) { + for (i = _i = 0, _ref = start[0]; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + bezier[i] = start[1]; + } + } + if (end[0] < 255) { + for (i = _j = _ref1 = end[0]; _ref1 <= 255 ? _j <= 255 : _j >= 255; i = _ref1 <= 255 ? ++_j : --_j) { + bezier[i] = end[1]; + } + } + return this.process("curves", function(rgba) { + var _k, _ref2; + for (i = _k = 0, _ref2 = chans.length; 0 <= _ref2 ? _k < _ref2 : _k > _ref2; i = 0 <= _ref2 ? ++_k : --_k) { + rgba[chans[i]] = bezier[rgba[chans[i]]]; + } + return rgba; + }); + }); + + Filter.register("exposure", function(adjust) { + var ctrl1, ctrl2, p; + p = Math.abs(adjust) / 100; + ctrl1 = [0, 255 * p]; + ctrl2 = [255 - (255 * p), 255]; + if (adjust < 0) { + ctrl1 = ctrl1.reverse(); + ctrl2 = ctrl2.reverse(); + } + return this.curves('rgb', [0, 0], ctrl1, ctrl2, [255, 255]); + }); + +}).call(this); diff --git a/ajax/libs/camanjs/4.0.0/caman.min.js b/ajax/libs/camanjs/4.0.0/caman.min.js new file mode 100755 index 000000000..3d6e57714 --- /dev/null +++ b/ajax/libs/camanjs/4.0.0/caman.min.js @@ -0,0 +1,151 @@ + +(function(){var $,Analyze,Blender,Calculate,Caman,CamanParser,Canvas,Convert,Event,Fiber,Filter,IO,Image,Layer,Log,Logger,PixelInfo,Plugin,Renderer,Root,Store,Util,fs,slice,__hasProp={}.hasOwnProperty,__indexOf=[].indexOf||function(item){for(var i=0,l=this.length;i255){return 255;} +return val;};Util.copyAttributes=function(from,to,opts){var attr,_i,_len,_ref,_ref1,_results;if(opts==null){opts={};} +_ref=from.attributes;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){attr=_ref[_i];if((opts.except!=null)&&(_ref1=attr.nodeName,__indexOf.call(opts.except,_ref1)>=0)){continue;} +_results.push(to.setAttribute(attr.nodeName,attr.nodeValue));} +return _results;};return Util;})();if(typeof exports!=="undefined"&&exports!==null){Root=exports;Canvas=require('canvas');Image=Canvas.Image;Fiber=require('fibers');fs=require('fs');}else{Root=window;} +Root.Caman=Caman=(function(){Caman.version={release:"4.0.0",date:"1/6/13"};Caman.DEBUG=false;Caman.NodeJS=typeof exports!=="undefined"&&exports!==null;Caman.autoload=!Caman.NodeJS;Caman.crossOrigin="anonymous";Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.remoteProxy="";Caman.proxyParam="camanProxyUrl";Caman.getAttrId=function(canvas){if(typeof canvas==="string"){canvas=$(canvas);} +if(!((canvas!=null)&&(canvas.getAttribute!=null))){return null;} +return canvas.getAttribute('data-caman-id');};function Caman(){var args,callback,id,_this=this;if(arguments.length===0){throw"Invalid arguments";} +if(this instanceof Caman){this.finishInit=this.finishInit.bind(this);this.imageLoaded=this.imageLoaded.bind(this);args=arguments[0];if(!Caman.NodeJS){id=parseInt(Caman.getAttrId(args[0]),10);callback=typeof args[1]==="function"?args[1]:typeof args[2]==="function"?args[2]:function(){};if(!isNaN(id)&&Store.has(id)){return Store.execute(id,callback);}} +this.id=Util.uniqid.get();this.originalPixelData=[];this.pixelStack=[];this.layerStack=[];this.canvasQueue=[];this.currentLayer=null;this.scaled=false;this.analyze=new Analyze(this);this.renderer=new Renderer(this);this.domIsLoaded(function(){_this.parseArguments(args);return _this.setup();});return this;}else{return new Caman(arguments);}} +Caman.prototype.domIsLoaded=function(cb){var listener,_this=this;if(Caman.NodeJS){return setTimeout(function(){return cb.call(_this);},0);}else{if(document.readyState==="complete"){Log.debug("DOM initialized");return setTimeout(function(){return cb.call(_this);},0);}else{listener=function(){if(document.readyState==="complete"){Log.debug("DOM initialized");return cb.call(_this);}};return document.addEventListener("readystatechange",listener,false);}}};Caman.prototype.parseArguments=function(args){if(args.length===0){throw"Invalid arguments given";} +this.initObj=null;this.initType=null;this.imageUrl=null;this.callback=function(){};this.setInitObject(args[0]);if(args.length===1){return;} +switch(typeof args[1]){case"string":this.imageUrl=args[1];break;case"function":this.callback=args[1];} +if(args.length===2){return;} +return this.callback=args[2];};Caman.prototype.setInitObject=function(obj){if(Caman.NodeJS){this.initObj=obj;this.initType='node';return;} +if(typeof obj==="object"){this.initObj=obj;}else{this.initObj=$(obj);} +return this.initType=this.initObj.nodeName.toLowerCase();};Caman.prototype.setup=function(){switch(this.initType){case"node":return this.initNode();case"img":return this.initImage();case"canvas":return this.initCanvas();}};Caman.prototype.initNode=function(){var _this=this;Log.debug("Initializing for NodeJS");this.image=new Image();this.image.onload=function(){Log.debug("Image loaded. Width = "+_this.image.width+", Height = "+_this.image.height);_this.canvas=new Canvas(_this.image.width,_this.image.height);return _this.finishInit();};this.image.onerror=function(err){throw err;};return this.image.src=this.initObj;};Caman.prototype.initImage=function(){this.image=this.initObj;this.canvas=document.createElement('canvas');this.context=this.canvas.getContext('2d');Util.copyAttributes(this.image,this.canvas,{except:['src']});this.image.parentNode.replaceChild(this.canvas,this.image);this.imageAdjustments();return this.waitForImageLoaded();};Caman.prototype.initCanvas=function(){this.canvas=this.initObj;this.context=this.canvas.getContext('2d');if(this.imageUrl!=null){this.image=document.createElement('img');this.image.src=this.imageUrl;this.imageAdjustments();return this.waitForImageLoaded();}else{return this.finishInit();}};Caman.prototype.imageAdjustments=function(){if(this.needsHiDPISwap()){Log.debug(this.image.src,"->",this.hiDPIReplacement());this.swapped=true;this.image.src=this.hiDPIReplacement();} +if(IO.isRemote(this.image)){this.image.src=IO.proxyUrl(this.image.src);return Log.debug("Remote image detected, using URL = "+this.image.src);}};Caman.prototype.waitForImageLoaded=function(){if(this.image.complete){return this.imageLoaded();}else{return this.image.onload=this.imageLoaded;}};Caman.prototype.imageLoaded=function(){Log.debug("Image loaded. Width = "+this.image.width+", Height = "+this.image.height);if(this.swapped){this.canvas.width=this.image.width/this.hiDPIRatio();this.canvas.height=this.image.height/this.hiDPIRatio();}else{this.canvas.width=this.image.width;this.canvas.height=this.image.height;} +return this.finishInit();};Caman.prototype.finishInit=function(){var pixel,_i,_len,_ref;if(this.context==null){this.context=this.canvas.getContext('2d');} +this.originalWidth=this.width=this.canvas.width;this.originalHeight=this.height=this.canvas.height;this.hiDPIAdjustments();this.assignId();if(this.image!=null){this.context.drawImage(this.image,0,0,this.image.width,this.image.height,0,0,this.originalWidth,this.originalHeight);} +this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;_ref=this.pixelData;for(_i=0,_len=_ref.length;_i<_len;_i++){pixel=_ref[_i];this.originalPixelData.push(pixel);} +this.dimensions={width:this.canvas.width,height:this.canvas.height};Store.put(this.id,this);return this.callback.call(this,this);};Caman.prototype.assignId=function(){if(Caman.NodeJS||this.canvas.getAttribute('data-caman-id')){return;} +return this.canvas.setAttribute('data-caman-id',this.id);};Caman.prototype.hiDPIDisabled=function(){return this.canvas.getAttribute('data-caman-hidpi-disabled')!==null;};Caman.prototype.hiDPIAdjustments=function(){var ratio;if(Caman.NodeJS||this.hiDPIDisabled()){return;} +ratio=this.hiDPIRatio();if(ratio!==1){Log.debug("HiDPI ratio = "+ratio);this.scaled=true;this.originalWidth=this.canvas.width;this.originalHeight=this.canvas.height;this.canvas.width=this.originalWidth*ratio;this.canvas.height=this.originalHeight*ratio;this.canvas.style.width=""+this.originalWidth+"px";this.canvas.style.height=""+this.originalHeight+"px";this.context.scale(ratio,ratio);this.width=this.canvas.width;return this.height=this.canvas.height;}};Caman.prototype.hiDPIRatio=function(){var backingStoreRatio,devicePixelRatio;devicePixelRatio=window.devicePixelRatio||1;backingStoreRatio=this.context.webkitBackingStorePixelRatio||this.context.mozBackingStorePixelRatio||this.context.msBackingStorePixelRatio||this.context.oBackingStorePixelRatio||this.context.backingStorePixelRatio||1;return devicePixelRatio/backingStoreRatio;};Caman.prototype.hiDPICapable=function(){return window.devicePixelRatio!==1;};Caman.prototype.needsHiDPISwap=function(){if(this.hiDPIDisabled()||!this.hiDPICapable()){return false;} +return this.hiDPIReplacement()!==null;};Caman.prototype.hiDPIReplacement=function(){if(this.image==null){return null;} +return this.image.getAttribute('data-caman-hidpi');};Caman.prototype.replaceCanvas=function(newCanvas){var oldCanvas;oldCanvas=this.canvas;this.canvas=newCanvas;oldCanvas.parentNode.replaceChild(this.canvas,oldCanvas);return this.finishInit();};Caman.prototype.render=function(callback){var _this=this;if(callback==null){callback=function(){};} +Event.trigger(this,"renderStart");return this.renderer.execute(function(){_this.context.putImageData(_this.imageData,0,0);return callback.call(_this);});};Caman.prototype.revert=function(ready){var i,pixel,_i,_len,_ref;if(ready==null){ready=function(){};} +_ref=this.originalPixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.pixelData[i]=pixel;} +this.context.putImageData(this.imageData,0,0);return ready.call(this);};Caman.prototype.process=function(name,processFn){this.renderer.add({type:Filter.Type.Single,name:name,processFn:processFn});return this;};Caman.prototype.processKernel=function(name,adjust,divisor,bias){var i,_i,_ref;if(!divisor){divisor=0;for(i=_i=0,_ref=adjust.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){divisor+=adjust[i];}} +this.renderer.add({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias||0});return this;};Caman.prototype.processPlugin=function(plugin,args){this.renderer.add({type:Filter.Type.Plugin,plugin:plugin,args:args});return this;};Caman.prototype.newLayer=function(callback){var layer;layer=new Layer(this);this.canvasQueue.push(layer);this.renderer.add({type:Filter.Type.LayerDequeue});callback.call(layer);this.renderer.add({type:Filter.Type.LayerFinished});return this;};Caman.prototype.executeLayer=function(layer){return this.pushContext(layer);};Caman.prototype.pushContext=function(layer){this.layerStack.push(this.currentLayer);this.pixelStack.push(this.pixelData);this.currentLayer=layer;return this.pixelData=layer.pixelData;};Caman.prototype.popContext=function(){this.pixelData=this.pixelStack.pop();return this.currentLayer=this.layerStack.pop();};Caman.prototype.applyCurrentLayer=function(){return this.currentLayer.applyToParent();};return Caman;})();Analyze=(function(){function Analyze(c){this.c=c;} +Analyze.prototype.calculateLevels=function(){var i,levels,numPixels,_i,_j,_k,_ref;levels={r:{},g:{},b:{}};for(i=_i=0;_i<=255;i=++_i){levels.r[i]=0;levels.g[i]=0;levels.b[i]=0;} +for(i=_j=0,_ref=this.c.pixelData.length;_j<_ref;i=_j+=4){levels.r[this.c.pixelData[i]]++;levels.g[this.c.pixelData[i+1]]++;levels.b[this.c.pixelData[i+2]]++;} +numPixels=this.c.pixelData.length/4;for(i=_k=0;_k<=255;i=++_k){levels.r[i]/=numPixels;levels.g[i]/=numPixels;levels.b[i]/=numPixels;} +return levels;};return Analyze;})();Caman.DOMUpdated=function(){var img,imgs,parser,_i,_len,_results;imgs=document.querySelectorAll("img[data-caman]");if(!(imgs.length>0)){return;} +_results=[];for(_i=0,_len=imgs.length;_i<_len;_i++){img=imgs[_i];_results.push(parser=new CamanParser(img,function(){this.parse();return this.execute();}));} +return _results;};if(Caman.autoload){(function(){if(document.readyState==="complete"){return Caman.DOMUpdated();}else{return document.addEventListener("DOMContentLoaded",Caman.DOMUpdated,false);}})();} +CamanParser=(function(){var INST_REGEX;INST_REGEX="(\\w+)\\((.*?)\\)";function CamanParser(ele,ready){this.dataStr=ele.getAttribute('data-caman');this.caman=Caman(ele,ready.bind(this));} +CamanParser.prototype.parse=function(){var args,filter,func,inst,instFunc,m,r,unparsedInstructions,_i,_len,_ref,_results;this.ele=this.caman.canvas;r=new RegExp(INST_REGEX,'g');unparsedInstructions=this.dataStr.match(r);if(!(unparsedInstructions.length>0)){return;} +r=new RegExp(INST_REGEX);_results=[];for(_i=0,_len=unparsedInstructions.length;_i<_len;_i++){inst=unparsedInstructions[_i];_ref=inst.match(r),m=_ref[0],filter=_ref[1],args=_ref[2];instFunc=new Function("return function() { this."+filter+"("+args+"); };");try{func=instFunc();_results.push(func.call(this.caman));}catch(e){_results.push(Log.debug(e));}} +return _results;};CamanParser.prototype.execute=function(){var ele;ele=this.ele;return this.caman.render(function(){return ele.parentNode.replaceChild(this.toImage(),ele);});};return CamanParser;})();Caman.Blender=Blender=(function(){function Blender(){} +Blender.blenders={};Blender.register=function(name,func){return this.blenders[name]=func;};Blender.execute=function(name,rgbaLayer,rgbaParent){return this.blenders[name](rgbaLayer,rgbaParent);};return Blender;})();Caman.Calculate=Calculate=(function(){function Calculate(){} +Calculate.distance=function(x1,y1,x2,y2){return Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));};Calculate.randomRange=function(min,max,getFloat){var rand;if(getFloat==null){getFloat=false;} +rand=min+(Math.random()*(max-min));if(getFloat){return rand.toFixed(getFloat);}else{return Math.round(rand);}};Calculate.luminance=function(rgba){return(0.299*rgba.r)+(0.587*rgba.g)+(0.114*rgba.b);};Calculate.bezier=function(start,ctrl1,ctrl2,end,lowBound,highBound){var Ax,Ay,Bx,By,Cx,Cy,bezier,curveX,curveY,i,j,leftCoord,rightCoord,t,x0,x1,x2,x3,y0,y1,y2,y3,_i,_j,_k,_ref,_ref1;x0=start[0];y0=start[1];x1=ctrl1[0];y1=ctrl1[1];x2=ctrl2[0];y2=ctrl2[1];x3=end[0];y3=end[1];bezier={};Cx=parseInt(3*(x1-x0),10);Bx=3*(x2-x1)-Cx;Ax=x3-x0-Cx-Bx;Cy=3*(y1-y0);By=3*(y2-y1)-Cy;Ay=y3-y0-Cy-By;for(i=_i=0;_i<1000;i=++_i){t=i/1000;curveX=Math.round((Ax*Math.pow(t,3))+(Bx*Math.pow(t,2))+(Cx*t)+x0);curveY=Math.round((Ay*Math.pow(t,3))+(By*Math.pow(t,2))+(Cy*t)+y0);if(lowBound&&curveYhighBound){curveY=highBound;} +bezier[curveX]=curveY;} +if(bezier.length=_ref;i=0<=_ref?++_j:--_j){if(!(bezier[i]!=null)){leftCoord=[i-1,bezier[i-1]];for(j=_k=i,_ref1=end[0];i<=_ref1?_k<=_ref1:_k>=_ref1;j=i<=_ref1?++_k:--_k){if(bezier[j]!=null){rightCoord=[j,bezier[j]];break;}} +bezier[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}}} +if(!(bezier[end[0]]!=null)){bezier[end[0]]=bezier[end[0]-1];} +return bezier;};return Calculate;})();Convert=(function(){function Convert(){} +Convert.hexToRGB=function(hex){var b,g,r;if(hex.charAt(0)==="#"){hex=hex.substr(1);} +r=parseInt(hex.substr(0,2),16);g=parseInt(hex.substr(2,2),16);b=parseInt(hex.substr(4,2),16);return{r:r,g:g,b:b};};Convert.rgbToHSL=function(r,g,b){var d,h,l,max,min,s;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} +r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);l=(max+min)/2;if(max===min){h=s=0;}else{d=max-min;s=l>0.5?d/(2-max-min):d/(max+min);h=(function(){switch(max){case r:return(g-b)/d+(g1){t-=1;} +if(t<1/6){return p+(q-p)*6*t;} +if(t<1/2){return q;} +if(t<2/3){return p+(q-p)*(2/3-t)*6;} +return p;};Convert.rgbToHSV=function(r,g,b){var d,h,max,min,s,v;r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);v=max;d=max-min;s=max===0?0:d/max;if(max===min){h=0;}else{h=(function(){switch(max){case r:return(g-b)/d+(g0.04045){r=Math.pow((r+0.055)/1.055,2.4);}else{r/=12.92;} +if(g>0.04045){g=Math.pow((g+0.055)/1.055,2.4);}else{g/=12.92;} +if(b>0.04045){b=Math.pow((b+0.055)/1.055,2.4);}else{b/=12.92;} +x=r*0.4124+g*0.3576+b*0.1805;y=r*0.2126+g*0.7152+b*0.0722;z=r*0.0193+g*0.1192+b*0.9505;return{x:x*100,y:y*100,z:z*100};};Convert.xyzToRGB=function(x,y,z){var b,g,r;x/=100;y/=100;z/=100;r=(3.2406*x)+(-1.5372*y)+(-0.4986*z);g=(-0.9689*x)+(1.8758*y)+(0.0415*z);b=(0.0557*x)+(-0.2040*y)+(1.0570*z);if(r>0.0031308){r=(1.055*Math.pow(r,0.4166666667))-0.055;}else{r*=12.92;} +if(g>0.0031308){g=(1.055*Math.pow(g,0.4166666667))-0.055;}else{g*=12.92;} +if(b>0.0031308){b=(1.055*Math.pow(b,0.4166666667))-0.055;}else{b*=12.92;} +return{r:r*255,g:g*255,b:b*255};};Convert.xyzToLab=function(x,y,z){var a,b,l,whiteX,whiteY,whiteZ;if(typeof x==="object"){y=x.y;z=x.z;x=x.x;} +whiteX=95.047;whiteY=100.0;whiteZ=108.883;x/=whiteX;y/=whiteY;z/=whiteZ;if(x>0.008856451679){x=Math.pow(x,0.3333333333);}else{x=(7.787037037*x)+0.1379310345;} +if(y>0.008856451679){y=Math.pow(y,0.3333333333);}else{y=(7.787037037*y)+0.1379310345;} +if(z>0.008856451679){z=Math.pow(z,0.3333333333);}else{z=(7.787037037*z)+0.1379310345;} +l=116*y-16;a=500*(x-y);b=200*(y-z);return{l:l,a:a,b:b};};Convert.labToXYZ=function(l,a,b){var x,y,z;if(typeof l==="object"){a=l.a;b=l.b;l=l.l;} +y=(l+16)/116;x=y+(a/500);z=y-(b/200);if(x>0.2068965517){x=x*x*x;}else{x=0.1284185493*(x-0.1379310345);} +if(y>0.2068965517){y=y*y*y;}else{y=0.1284185493*(y-0.1379310345);} +if(z>0.2068965517){z=z*z*z;}else{z=0.1284185493*(z-0.1379310345);} +return{x:x*95.047,y:y*100.0,z:z*108.883};};Convert.rgbToLab=function(r,g,b){var xyz;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} +xyz=this.rgbToXYZ(r,g,b);return this.xyzToLab(xyz);};Convert.labToRGB=function(l,a,b){};return Convert;})();Event=(function(){function Event(){} +Event.events={};Event.types=["processStart","processComplete","renderStart","renderFinished","blockStarted","blockFinished"];Event.trigger=function(target,type,data){var event,_i,_len,_ref,_results;if(this.events[type]&&this.events[type].length){_ref=this.events[type];_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){event=_ref[_i];if(event.target===null||target.id===event.target.id){_results.push(event.fn.call(target,data));}else{_results.push(void 0);}} +return _results;}};Event.listen=function(target,type,fn){var _fn,_type;if(typeof target==="string"){_type=target;_fn=type;target=null;type=_type;fn=_fn;} +if(__indexOf.call(this.types,type)<0){return false;} +if(!this.events[type]){this.events[type]=[];} +this.events[type].push({target:target,fn:fn});return true;};return Event;})();Caman.Event=Event;Caman.Filter=Filter=(function(){function Filter(){} +Filter.Type={Single:1,Kernel:2,LayerDequeue:3,LayerFinished:4,LoadOverlay:5,Plugin:6};Filter.register=function(name,filterFunc){return Caman.prototype[name]=filterFunc;};return Filter;})();Caman.IO=IO=(function(){function IO(){} +IO.domainRegex=/(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/;IO.isRemote=function(img){var matches;if(img==null){return false;} +if(this.corsEnabled(img)){return false;} +matches=img.src.match(this.domainRegex);if(matches){return matches[1]!==document.domain;}else{return false;}};IO.corsEnabled=function(img){var _ref;return(img.crossOrigin!=null)&&((_ref=img.crossOrigin.toLowerCase())==='anonymous'||_ref==='use-credentials');};IO.proxyUrl=function(src){return""+Caman.remoteProxy+"?"+Caman.proxyParam+"="+(encodeURIComponent(src));};IO.useProxy=function(lang){var langToExt;langToExt={ruby:'rb',python:'py',perl:'pl',javascript:'js'};lang=lang.toLowerCase();if(langToExt[lang]!=null){lang=langToExt[lang];} +return"proxies/caman_proxy."+lang;};return IO;})();Caman.prototype.save=function(){if(typeof exports!=="undefined"&&exports!==null){return this.nodeSave.apply(this,arguments);}else{return this.browserSave.apply(this,arguments);}};Caman.prototype.browserSave=function(type){var image;if(type==null){type="png";} +type=type.toLowerCase();image=this.toBase64(type).replace("image/"+type,"image/octet-stream");return document.location.href=image;};Caman.prototype.nodeSave=function(file,overwrite){var stats;if(overwrite==null){overwrite=true;} +try{stats=fs.statSync(file);if(stats.isFile()&&!overwrite){return false;}}catch(e){Log.debug("Creating output file "+file);} +return fs.writeFile(file,this.canvas.toBuffer(),function(){return Log.debug("Finished writing to "+file);});};Caman.prototype.toImage=function(type){var img;img=document.createElement('img');img.src=this.toBase64(type);img.width=this.dimensions.width;img.height=this.dimensions.height;if(window.devicePixelRatio){img.width/=window.devicePixelRatio;img.height/=window.devicePixelRatio;} +return img;};Caman.prototype.toBase64=function(type){if(type==null){type="png";} +type=type.toLowerCase();return this.canvas.toDataURL("image/"+type);};Layer=(function(){function Layer(c){this.c=c;this.filter=this.c;this.options={blendingMode:'normal',opacity:1.0};this.layerID=Util.uniqid.get();this.canvas=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');this.canvas.width=this.c.dimensions.width;this.canvas.height=this.c.dimensions.height;this.context=this.canvas.getContext('2d');this.context.createImageData(this.canvas.width,this.canvas.height);this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;} +Layer.prototype.newLayer=function(cb){return this.c.newLayer.call(this.c,cb);};Layer.prototype.setBlendingMode=function(mode){this.options.blendingMode=mode;return this;};Layer.prototype.opacity=function(opacity){this.options.opacity=opacity/100;return this;};Layer.prototype.copyParent=function(){var i,parentData,_i,_ref;parentData=this.c.pixelData;for(i=_i=0,_ref=this.c.pixelData.length;_i<_ref;i=_i+=4){this.pixelData[i]=parentData[i];this.pixelData[i+1]=parentData[i+1];this.pixelData[i+2]=parentData[i+2];this.pixelData[i+3]=parentData[i+3];} +return this;};Layer.prototype.fillColor=function(){return this.c.fillColor.apply(this.c,arguments);};Layer.prototype.overlayImage=function(image){if(typeof image==="object"){image=image.src;}else if(typeof image==="string"&&image[0]==="#"){image=$(image).src;} +if(!image){return this;} +this.c.renderQueue.push({type:Filter.Type.LoadOverlay,src:image,layer:this});return this;};Layer.prototype.applyToParent=function(){var i,layerData,parentData,result,rgbaLayer,rgbaParent,_i,_ref,_results;parentData=this.c.pixelStack[this.c.pixelStack.length-1];layerData=this.c.pixelData;_results=[];for(i=_i=0,_ref=layerData.length;_i<_ref;i=_i+=4){rgbaParent={r:parentData[i],g:parentData[i+1],b:parentData[i+2],a:parentData[i+3]};rgbaLayer={r:layerData[i],g:layerData[i+1],b:layerData[i+2],a:layerData[i+3]};result=Blender.execute(this.options.blendingMode,rgbaLayer,rgbaParent);result.r=Util.clampRGB(result.r);result.g=Util.clampRGB(result.g);result.b=Util.clampRGB(result.b);if(!(result.a!=null)){result.a=rgbaLayer.a;} +parentData[i]=rgbaParent.r-((rgbaParent.r-result.r)*(this.options.opacity*(result.a/255)));parentData[i+1]=rgbaParent.g-((rgbaParent.g-result.g)*(this.options.opacity*(result.a/255)));_results.push(parentData[i+2]=rgbaParent.b-((rgbaParent.b-result.b)*(this.options.opacity*(result.a/255))));} +return _results;};return Layer;})();Logger=(function(){function Logger(){var name,_i,_len,_ref;_ref=['log','info','warn','error'];for(_i=0,_len=_ref.length;_i<_len;_i++){name=_ref[_i];this[name]=(function(name){return function(){if(!Caman.DEBUG){return;} +return console[name].apply(console,arguments);};})(name);} +this.debug=this.log;} +return Logger;})();Log=new Logger();PixelInfo=(function(){function PixelInfo(c){this.c=c;this.loc=0;} +PixelInfo.prototype.locationXY=function(){var x,y;y=this.c.dimensions.height-Math.floor(this.loc/(this.c.dimensions.width*4));x=(this.loc%(this.c.dimensions.width*4))/4;return{x:x,y:y};};PixelInfo.prototype.getPixelRelative=function(horiz,vert){var newLoc;newLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return{r:0,g:0,b:0,a:0};} +return{r:this.c.pixelData[newLoc],g:this.c.pixelData[newLoc+1],b:this.c.pixelData[newLoc+2],a:this.c.pixelData[newLoc+3]};};PixelInfo.prototype.putPixelRelative=function(horiz,vert,rgba){var nowLoc;nowLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return;} +this.c.pixelData[newLoc]=rgba.r;this.c.pixelData[newLoc+1]=rgba.g;this.c.pixelData[newLoc+2]=rgba.b;this.c.pixelData[newLoc+3]=rgba.a;return true;};PixelInfo.prototype.getPixel=function(x,y){var loc;loc=(y*this.c.dimensions.width+x)*4;return{r:this.c.pixelData[loc],g:this.c.pixelData[loc+1],b:this.c.pixelData[loc+2],a:this.c.pixelData[loc+3]};};PixelInfo.prototype.putPixel=function(x,y,rgba){var loc;loc=(y*this.c.dimensions.width+x)*4;this.c.pixelData[loc]=rgba.r;this.c.pixelData[loc+1]=rgba.g;this.c.pixelData[loc+2]=rgba.b;return this.c.pixelData[loc+3]=rgba.a;};return PixelInfo;})();Plugin=(function(){function Plugin(){} +Plugin.plugins={};Plugin.register=function(name,plugin){return this.plugins[name]=plugin;};Plugin.execute=function(context,name,args){return this.plugins[name].apply(context,args);};return Plugin;})();Caman.Plugin=Plugin;Caman.Renderer=Renderer=(function(){Renderer.Blocks=Caman.NodeJS?require('os').cpus().length:4;function Renderer(c){this.c=c;this.processNext=__bind(this.processNext,this);this.renderQueue=[];this.modPixelData=null;} +Renderer.prototype.add=function(job){if(job==null){return;} +return this.renderQueue.push(job);};Renderer.prototype.processNext=function(){var layer;if(this.renderQueue.length===0){Event.trigger(this,"renderFinished");if(this.finishedFn!=null){this.finishedFn.call(this.c);} +return this;} +this.currentJob=this.renderQueue.shift();switch(this.currentJob.type){case Filter.Type.LayerDequeue:layer=this.c.canvasQueue.shift();this.c.executeLayer(layer);return this.processNext();case Filter.Type.LayerFinished:this.c.applyCurrentLayer();this.c.popContext();return this.processNext();case Filter.Type.LoadOverlay:return this.loadOverlay(this.currentJob.layer,this.currentJob.src);case Filter.Type.Plugin:return this.executePlugin();default:return this.executeFilter();}};Renderer.prototype.execute=function(callback){this.finishedFn=callback;this.modPixelData=new Uint8Array(this.c.pixelData.length);return this.processNext();};Renderer.prototype.eachBlock=function(fn){var blockN,blockPixelLength,end,f,i,lastBlockN,n,start,_i,_ref,_results,_this=this;this.blocksDone=0;n=this.c.pixelData.length;blockPixelLength=Math.floor((n/4)/Renderer.Blocks);blockN=blockPixelLength*4;lastBlockN=blockN+((n/4)%Renderer.Blocks)*4;_results=[];for(i=_i=0,_ref=Renderer.Blocks;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){start=i*blockN;end=start+(i===Renderer.Blocks-1?lastBlockN:blockN);if(Caman.NodeJS){f=Fiber(function(){return fn.call(_this,i,start,end);});_results.push(f.run());}else{_results.push(setTimeout((function(i,start,end){return function(){return fn.call(_this,i,start,end);};})(i,start,end),0));}} +return _results;};Renderer.prototype.executeFilter=function(){Event.trigger(this.c,"processStart",this.currentJob);if(this.currentJob.type===Filter.Type.Single){return this.eachBlock(this.renderBlock);}else{return this.eachBlock(this.renderKernel);}};Renderer.prototype.executePlugin=function(){Log.debug("Executing plugin "+this.currentJob.plugin);Plugin.execute(this.c,this.currentJob.plugin,this.currentJob.args);Log.debug("Plugin "+this.currentJob.plugin+" finished!");return this.processNext();};Renderer.prototype.renderBlock=function(bnum,start,end){var data,i,pixelInfo,res,_i;Log.debug("Block #"+bnum+" - Filter: "+this.currentJob.name+", Start: "+start+", End: "+end);Event.trigger(this.c,"blockStarted",{blockNum:bnum,totalBlocks:Renderer.Blocks,startPixel:start,endPixel:end});data={r:0,g:0,b:0,a:0};pixelInfo=new PixelInfo(this.c);for(i=_i=start;_i=builder;j=-builder<=builder?++_j:--_j){for(k=_k=builder;builder<=-builder?_k<=-builder:_k>=-builder;k=builder<=-builder?++_k:--_k){pixel=pixelInfo.getPixelRelative(j,k);kernel[builderIndex*3]=pixel.r;kernel[builderIndex*3+1]=pixel.g;kernel[builderIndex*3+2]=pixel.b;builderIndex++;}} +res=this.processKernel(adjust,kernel,divisor,bias);this.modPixelData[i]=Util.clampRGB(res.r);this.modPixelData[i+1]=Util.clampRGB(res.g);this.modPixelData[i+2]=Util.clampRGB(res.b);this.modPixelData[i+3]=this.c.pixelData[i+3];} +this.blockFinished(bnum);if(Caman.NodeJS){return Fiber["yield"]();}};Renderer.prototype.blockFinished=function(bnum){var i,_i,_ref;if(bnum>=0){Log.debug("Block #"+bnum+" finished! Filter: "+this.currentJob.name);} +this.blocksDone++;Event.trigger(this.c,"blockFinished",{blockNum:bnum,blocksFinished:this.blocksDone,totalBlocks:Renderer.Blocks});if(this.blocksDone===Renderer.Blocks){if(this.currentJob.type===Filter.Type.Kernel){for(i=_i=0,_ref=this.c.pixelData.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){this.c.pixelData[i]=this.modPixelData[i];}} +if(bnum>=0){Log.debug("Filter "+this.currentJob.name+" finished!");} +Event.trigger(this.c,"processComplete",this.currentJob);return this.processNext();}};Renderer.prototype.processKernel=function(adjust,kernel,divisor,bias){var i,val,_i,_ref;val={r:0,g:0,b:0};for(i=_i=0,_ref=adjust.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){val.r+=adjust[i]*kernel[i*3];val.g+=adjust[i]*kernel[i*3+1];val.b+=adjust[i]*kernel[i*3+2];} +val.r=(val.r/divisor)+bias;val.g=(val.g/divisor)+bias;val.b=(val.b/divisor)+bias;return val;};Renderer.prototype.loadOverlay=function(layer,src){var img,proxyUrl,_this=this;img=document.createElement('img');img.onload=function(){layer.context.drawImage(img,0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.imageData=layer.context.getImageData(0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.pixelData=layer.imageData.data;_this.c.pixelData=layer.pixelData;return _this.processNext();};proxyUrl=IO.remoteCheck(src);return img.src=proxyUrl!=null?proxyUrl:src;};return Renderer;})();Caman.Store=Store=(function(){function Store(){} +Store.items={};Store.has=function(search){return this.items[search]!=null;};Store.get=function(search){return this.items[search];};Store.put=function(name,obj){return this.items[name]=obj;};Store.execute=function(search,callback){var _this=this;setTimeout(function(){return callback.call(_this.get(search),_this.get(search));},0);return this.get(search);};Store.flush=function(name){if(name==null){name=false;} +if(name){return delete this.items[name];}else{return this.items={};}};return Store;})();Blender.register("normal",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r,g:rgbaLayer.g,b:rgbaLayer.b};});Blender.register("multiply",function(rgbaLayer,rgbaParent){return{r:(rgbaLayer.r*rgbaParent.r)/255,g:(rgbaLayer.g*rgbaParent.g)/255,b:(rgbaLayer.b*rgbaParent.b)/255};});Blender.register("screen",function(rgbaLayer,rgbaParent){return{r:255-(((255-rgbaLayer.r)*(255-rgbaParent.r))/255),g:255-(((255-rgbaLayer.g)*(255-rgbaParent.g))/255),b:255-(((255-rgbaLayer.b)*(255-rgbaParent.b))/255)};});Blender.register("overlay",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-2*(255-rgbaLayer.r)*(255-rgbaParent.r)/255:(rgbaParent.r*rgbaLayer.r*2)/255;result.g=rgbaParent.g>128?255-2*(255-rgbaLayer.g)*(255-rgbaParent.g)/255:(rgbaParent.g*rgbaLayer.g*2)/255;result.b=rgbaParent.b>128?255-2*(255-rgbaLayer.b)*(255-rgbaParent.b)/255:(rgbaParent.b*rgbaLayer.b*2)/255;return result;});Blender.register("difference",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r-rgbaParent.r,g:rgbaLayer.g-rgbaParent.g,b:rgbaLayer.b-rgbaParent.b};});Blender.register("addition",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r+rgbaLayer.r,g:rgbaParent.g+rgbaLayer.g,b:rgbaParent.b+rgbaLayer.b};});Blender.register("exclusion",function(rgbaLayer,rgbaParent){return{r:128-2*(rgbaParent.r-128)*(rgbaLayer.r-128)/255,g:128-2*(rgbaParent.g-128)*(rgbaLayer.g-128)/255,b:128-2*(rgbaParent.b-128)*(rgbaLayer.b-128)/255};});Blender.register("softLight",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-((255-rgbaParent.r)*(255-(rgbaLayer.r-128)))/255:(rgbaParent.r*(rgbaLayer.r+128))/255;result.g=rgbaParent.g>128?255-((255-rgbaParent.g)*(255-(rgbaLayer.g-128)))/255:(rgbaParent.g*(rgbaLayer.g+128))/255;result.b=rgbaParent.b>128?255-((255-rgbaParent.b)*(255-(rgbaLayer.b-128)))/255:(rgbaParent.b*(rgbaLayer.b+128))/255;return result;});Blender.register("lighten",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaParent.r:rgbaLayer.r,g:rgbaParent.g>rgbaLayer.g?rgbaParent.g:rgbaLayer.g,b:rgbaParent.b>rgbaLayer.b?rgbaParent.b:rgbaLayer.b};});Blender.register("darken",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaLayer.r:rgbaParent.r,g:rgbaParent.g>rgbaLayer.g?rgbaLayer.g:rgbaParent.g,b:rgbaParent.b>rgbaLayer.b?rgbaLayer.b:rgbaParent.b};});Filter.register("fillColor",function(){var color;if(arguments.length===1){color=Convert.hexToRGB(arguments[0]);}else{color={r:arguments[0],g:arguments[1],b:arguments[2]};} +return this.process("fillColor",function(rgba){rgba.r=color.r;rgba.g=color.g;rgba.b=color.b;rgba.a=255;return rgba;});});Filter.register("brightness",function(adjust){adjust=Math.floor(255*(adjust/100));return this.process("brightness",function(rgba){rgba.r+=adjust;rgba.g+=adjust;rgba.b+=adjust;return rgba;});});Filter.register("saturation",function(adjust){adjust*=-0.01;return this.process("saturation",function(rgba){var max;max=Math.max(rgba.r,rgba.g,rgba.b);if(rgba.r!==max){rgba.r+=(max-rgba.r)*adjust;} +if(rgba.g!==max){rgba.g+=(max-rgba.g)*adjust;} +if(rgba.b!==max){rgba.b+=(max-rgba.b)*adjust;} +return rgba;});});Filter.register("vibrance",function(adjust){adjust*=-1;return this.process("vibrance",function(rgba){var amt,avg,max;max=Math.max(rgba.r,rgba.g,rgba.b);avg=(rgba.r+rgba.g+rgba.b)/3;amt=((Math.abs(max-avg)*2/255)*adjust)/100;if(rgba.r!==max){rgba.r+=(max-rgba.r)*amt;} +if(rgba.g!==max){rgba.g+=(max-rgba.g)*amt;} +if(rgba.b!==max){rgba.b+=(max-rgba.b)*amt;} +return rgba;});});Filter.register("greyscale",function(adjust){return this.process("greyscale",function(rgba){var avg;avg=Calculate.luminance(rgba);rgba.r=avg;rgba.g=avg;rgba.b=avg;return rgba;});});Filter.register("contrast",function(adjust){adjust=Math.pow((adjust+100)/100,2);return this.process("contrast",function(rgba){rgba.r/=255;rgba.r-=0.5;rgba.r*=adjust;rgba.r+=0.5;rgba.r*=255;rgba.g/=255;rgba.g-=0.5;rgba.g*=adjust;rgba.g+=0.5;rgba.g*=255;rgba.b/=255;rgba.b-=0.5;rgba.b*=adjust;rgba.b+=0.5;rgba.b*=255;return rgba;});});Filter.register("hue",function(adjust){return this.process("hue",function(rgba){var h,hsv,rgb;hsv=Convert.rgbToHSV(rgba.r,rgba.g,rgba.b);h=hsv.h*100;h+=Math.abs(adjust);h=h%100;h/=100;hsv.h=h;rgb=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v);rgb.a=rgba.a;return rgb;});});Filter.register("colorize",function(){var level,rgb;if(arguments.length===2){rgb=Convert.hexToRGB(arguments[0]);level=arguments[1];}else if(arguments.length===4){rgb={r:arguments[0],g:arguments[1],b:arguments[2]};level=arguments[3];} +return this.process("colorize",function(rgba){rgba.r-=(rgba.r-rgb.r)*(level/100);rgba.g-=(rgba.g-rgb.g)*(level/100);rgba.b-=(rgba.b-rgb.b)*(level/100);return rgba;});});Filter.register("invert",function(){return this.process("invert",function(rgba){rgba.r=255-rgba.r;rgba.g=255-rgba.g;rgba.b=255-rgba.b;return rgba;});});Filter.register("sepia",function(adjust){if(adjust==null){adjust=100;} +adjust/=100;return this.process("sepia",function(rgba){rgba.r=Math.min(255,(rgba.r*(1-(0.607*adjust)))+(rgba.g*(0.769*adjust))+(rgba.b*(0.189*adjust)));rgba.g=Math.min(255,(rgba.r*(0.349*adjust))+(rgba.g*(1-(0.314*adjust)))+(rgba.b*(0.168*adjust)));rgba.b=Math.min(255,(rgba.r*(0.272*adjust))+(rgba.g*(0.534*adjust))+(rgba.b*(1-(0.869*adjust))));return rgba;});});Filter.register("gamma",function(adjust){return this.process("gamma",function(rgba){rgba.r=Math.pow(rgba.r/255,adjust)*255;rgba.g=Math.pow(rgba.g/255,adjust)*255;rgba.b=Math.pow(rgba.b/255,adjust)*255;return rgba;});});Filter.register("noise",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("noise",function(rgba){var rand;rand=Calculate.randomRange(adjust*-1,adjust);rgba.r+=rand;rgba.g+=rand;rgba.b+=rand;return rgba;});});Filter.register("clip",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("clip",function(rgba){if(rgba.r>255-adjust){rgba.r=255;}else if(rgba.r255-adjust){rgba.g=255;}else if(rgba.g255-adjust){rgba.b=255;}else if(rgba.b0){rgba.r+=(255-rgba.r)*options.red;}else{rgba.r-=rgba.r*Math.abs(options.red);}} +if(options.green!=null){if(options.green>0){rgba.g+=(255-rgba.g)*options.green;}else{rgba.g-=rgba.g*Math.abs(options.green);}} +if(options.blue!=null){if(options.blue>0){rgba.b+=(255-rgba.b)*options.blue;}else{rgba.b-=rgba.b*Math.abs(options.blue);}} +return rgba;});});Filter.register("curves",function(){var bezier,chans,cps,ctrl1,ctrl2,end,i,start,_i,_j,_ref,_ref1;chans=arguments[0],cps=2<=arguments.length?__slice.call(arguments,1):[];if(typeof chans==="string"){chans=chans.split("");} +if(chans[0]==="v"){chans=['r','g','b'];} +if(cps.length<3||cps.length>4){throw"Invalid number of arguments to curves filter";} +start=cps[0];ctrl1=cps[1];ctrl2=cps.length===4?cps[2]:cps[1];end=cps[cps.length-1];bezier=Calculate.bezier(start,ctrl1,ctrl2,end,0,255);if(start[0]>0){for(i=_i=0,_ref=start[0];0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){bezier[i]=start[1];}} +if(end[0]<255){for(i=_j=_ref1=end[0];_ref1<=255?_j<=255:_j>=255;i=_ref1<=255?++_j:--_j){bezier[i]=end[1];}} +return this.process("curves",function(rgba){var _k,_ref2;for(i=_k=0,_ref2=chans.length;0<=_ref2?_k<_ref2:_k>_ref2;i=0<=_ref2?++_k:--_k){rgba[chans[i]]=bezier[rgba[chans[i]]];} +return rgba;});});Filter.register("exposure",function(adjust){var ctrl1,ctrl2,p;p=Math.abs(adjust)/100;ctrl1=[0,255*p];ctrl2=[255-(255*p),255];if(adjust<0){ctrl1=ctrl1.reverse();ctrl2=ctrl2.reverse();} +return this.curves('rgb',[0,0],ctrl1,ctrl2,[255,255]);});}).call(this); \ No newline at end of file diff --git a/ajax/libs/camanjs/4.0.0/caman.pack.js b/ajax/libs/camanjs/4.0.0/caman.pack.js new file mode 100755 index 000000000..bf9e20b92 --- /dev/null +++ b/ajax/libs/camanjs/4.0.0/caman.pack.js @@ -0,0 +1 @@ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(o(){G $,2L,1x,1S,D,2w,39,1s,1E,3x,S,1P,2U,1X,1w,3f,1Y,1L,1b,3Y,1M,1m,3C,3D,5j={}.9y,5l=[].9B||o(7d){X(G i=0,l=8.P;iB){9 B}9 1F};1m.6U=o(6Q,3T,3v){G 3t,C,1c,E,1O,18;A(3v==N){3v={}}E=6Q.8Q;18=[];X(C=0,1c=E.P;C<1c;C++){3t=E[C];A((3v.5g!=N)&&(1O=3t.5f,5l.1i(3v.5g,1O)>=0)){46}18.1B(3T.6M(3t.5f,3t.8E))}9 18};9 1m})();A(1p 27!=="3B"&&27!==N){3Y=27;39=3M(\'L\');2U=39.2U;3x=3M(\'8D\');3C=3M(\'3C\')}Q{3Y=30}3Y.D=D=(o(){D.5e={6K:"4.0.0",6F:"1/6/13"};D.6E=1T;D.1V=1p 27!=="3B"&&27!==N;D.6A=!D.1V;D.5c="6w";D.89=o(){9"86 "+D.5e.6K+", 85 "+D.5e.6F};D.6o="";D.6l="7V";D.6k=o(L){A(1p L==="3o"){L=$(L)}A(!((L!=N)&&(L.2Y!=N))){9 N}9 L.2Y(\'1q-29-1D\')};o D(){G 1a,1A,1D,W=8;A(17.P===0){3S"54 17";}A(8 7L D){8.2F=8.2F.53(8);8.3n=8.3n.53(8);1a=17[0];A(!D.1V){1D=3m(D.6k(1a[0]),10);1A=1p 1a[1]==="o"?1a[1]:1p 1a[2]==="o"?1a[2]:o(){};A(!7H(1D)&&1M.6e(1D)){9 1M.2e(1D,1A)}}8.1D=1m.5h.2A();8.52=[];8.3k=[];8.50=[];8.4Y=[];8.3j=N;8.66=1T;8.9e=1I 2L(8);8.2E=1I 1b(8);8.61(o(){W.5Y(1a);9 W.5S()});9 8}Q{9 1I D(17)}}D.I.61=o(2K){G 4T,W=8;A(D.1V){9 40(o(){9 2K.1i(W)},0)}Q{A(1J.4S==="45"){1w.1z("5K 5E");9 40(o(){9 2K.1i(W)},0)}Q{4T=o(){A(1J.4S==="45"){1w.1z("5K 5E");9 2K.1i(W)}};9 1J.5t("9A",4T,1T)}}};D.I.5Y=o(1a){A(1a.P===0){3S"54 17 8A";}8.2o=N;8.4f=N;8.3H=N;8.1A=o(){};8.5p(1a[0]);A(1a.P===1){9}2W(1p 1a[1]){1l"3o":8.3H=1a[1];2v;1l"o":8.1A=1a[1]}A(1a.P===2){9}9 8.1A=1a[2]};D.I.5p=o(2h){A(D.1V){8.2o=2h;8.4f=\'5o\';9}A(1p 2h==="2l"){8.2o=2h}Q{8.2o=$(2h)}9 8.4f=8.2o.5f.3g()};D.I.5S=o(){2W(8.4f){1l"5o":9 8.5m();1l"11":9 8.7c();1l"L":9 8.7b()}};D.I.5m=o(){G W=8;1w.1z("8n X 1V");8.M=1I 2U();8.M.4G=o(){1w.1z("2U 6O. 6L = "+W.M.U+", 6D = "+W.M.14);W.L=1I 39(W.M.U,W.M.14);9 W.2F()};8.M.8a=o(6z){3S 6z;};9 8.M.1d=8.2o};D.I.7c=o(){8.M=8.2o;8.L=1J.3e(\'L\');8.1j=8.L.4b(\'2d\');1m.6U(8.M,8.L,{5g:[\'1d\']});8.M.4F.4E(8.L,8.M);8.4D();9 8.4C()};D.I.7b=o(){8.L=8.2o;8.1j=8.L.4b(\'2d\');A(8.3H!=N){8.M=1J.3e(\'11\');8.M.1d=8.3H;8.4D();9 8.4C()}Q{9 8.2F()}};D.I.4D=o(){A(8.6p()){1w.1z(8.M.1d,"->",8.3G());8.6n=3d;8.M.1d=8.3G()}A(1P.6c(8.M)){8.M.1d=1P.2I(8.M.1d);9 1w.1z("7E M 8w, 8t 8s = "+8.M.1d)}};D.I.4C=o(){A(8.M.45){9 8.3n()}Q{9 8.M.4G=8.3n}};D.I.3n=o(){1w.1z("2U 6O. 6L = "+8.M.U+", 6D = "+8.M.14);A(8.6n){8.L.U=8.M.U/8.3P();8.L.14=8.M.14/8.3P()}Q{8.L.U=8.M.U;8.L.14=8.M.14}9 8.2F()};D.I.2F=o(){G 24,C,1c,E;A(8.1j==N){8.1j=8.L.4b(\'2d\')}8.37=8.U=8.L.U;8.36=8.14=8.L.14;8.68();8.67();A(8.M!=N){8.1j.65(8.M,0,0,8.M.U,8.M.14,0,0,8.37,8.36)}8.2p=8.1j.4x(0,0,8.L.U,8.L.14);8.K=8.2p.1q;E=8.K;X(C=0,1c=E.P;C<1c;C++){24=E[C];8.52.1B(24)}8.1y={U:8.L.U,14:8.L.14};1M.5T(8.1D,8);9 8.1A.1i(8,8)};D.I.67=o(){A(D.1V||8.L.2Y(\'1q-29-1D\')){9}9 8.L.6M(\'1q-29-1D\',8.1D)};D.I.4w=o(){9 8.L.2Y(\'1q-29-5Q-82\')!==N};D.I.68=o(){G 2i;A(D.1V||8.4w()){9}2i=8.3P();A(2i!==1){1w.1z("81 2i = "+2i);8.66=3d;8.37=8.L.U;8.36=8.L.14;8.L.U=8.37*2i;8.L.14=8.36*2i;8.L.5D.U=""+8.37+"5C";8.L.5D.14=""+8.36+"5C";8.1j.7T(2i,2i);8.U=8.L.U;9 8.14=8.L.14}};D.I.3P=o(){G 4t,2r;2r=30.2r||1;4t=8.1j.7M||8.1j.8x||8.1j.8i||8.1j.8h||8.1j.8e||1;9 2r/4t};D.I.5v=o(){9 30.2r!==1};D.I.6p=o(){A(8.4w()||!8.5v()){9 1T}9 8.3G()!==N};D.I.3G=o(){A(8.M==N){9 N}9 8.M.2Y(\'1q-29-5Q\')};D.I.87=o(5q){G 3J;3J=8.L;8.L=5q;3J.4F.4E(8.L,3J);9 8.2F()};D.I.5n=o(1A){G W=8;A(1A==N){1A=o(){}}1E.2x(8,"78");9 8.2E.2e(o(){W.1j.6y(W.2p,0,0);9 1A.1i(W)})};D.I.8c=o(2V){G i,24,C,1c,E;A(2V==N){2V=o(){}}E=8.52;X(i=C=0,1c=E.P;C<1c;i=++C){24=E[i];8.K[i]=24}8.1j.6y(8.2p,0,0);9 2V.1i(8)};D.I.1G=o(T,3R){8.2E.2N({V:S.1R.4r,T:T,3R:3R});9 8};D.I.4q=o(T,F,1K,2a){G i,C,E;A(!1K){1K=0;X(i=C=0,E=F.P;0<=E?CE;i=0<=E?++C:--C){1K+=F[i]}}8.2E.2N({V:S.1R.4p,T:T,F:F,1K:1K,2a:2a||0});9 8};D.I.7U=o(2g,1a){8.2E.2N({V:S.1R.1L,2g:2g,1a:1a});9 8};D.I.4k=o(1A){G 1k;1k=1I 1X(8);8.4Y.1B(1k);8.2E.2N({V:S.1R.4j});1A.1i(1k);8.2E.2N({V:S.1R.4i});9 8};D.I.5R=o(1k){9 8.6x(1k)};D.I.6x=o(1k){8.50.1B(8.3j);8.3k.1B(8.K);8.3j=1k;9 8.K=1k.K};D.I.6i=o(){8.K=8.3k.69();9 8.3j=8.50.69()};D.I.5J=o(){9 8.3j.60()};9 D})();2L=(o(){o 2L(c){8.c=c}2L.I.8q=o(){G i,1U,3E,C,1g,1h,E;1U={r:{},g:{},b:{}};X(i=C=0;C<=B;i=++C){1U.r[i]=0;1U.g[i]=0;1U.b[i]=0}X(i=1g=0,E=8.c.K.P;1g0)){9}18=[];X(C=0,1c=3w.P;C<1c;C++){11=3w[C];18.1B(5w=1I 2w(11,o(){8.5B();9 8.2e()}))}9 18};A(D.6A){(o(){A(1J.4S==="45"){9 D.4N()}Q{9 1J.5t("7Q",D.4N,1T)}})()}2w=(o(){G 47;47="(\\\\w+)\\\\((.*?)\\\\)";o 2w(2j,2V){8.6q=2j.2Y(\'1q-29\');8.29=D(2j,2V.53(8))}2w.I.5B=o(){G 1a,3u,3s,4l,4m,m,r,3q,C,1c,E,18;8.2j=8.29.L;r=1I 5I(47,\'g\');3q=8.6q.4n(r);A(!(3q.P>0)){9}r=1I 5I(47);18=[];X(C=0,1c=3q.P;C<1c;C++){4l=3q[C];E=4l.4n(r),m=E[0],3u=E[1],1a=E[2];4m=1I 8r("9 o() { 8."+3u+"("+1a+"); };");5U{3s=4m();18.1B(3s.1i(8.29))}5V(e){18.1B(1w.1z(e))}}9 18};2w.I.2e=o(){G 2j;2j=8.2j;9 8.29.5n(o(){9 2j.4F.4E(8.6a(),2j)})};9 2w})();D.1x=1x=(o(){o 1x(){}1x.4o={};1x.Z=o(T,3s){9 8.4o[T]=3s};1x.2e=o(T,J,H){9 8.4o[T](J,H)};9 1x})();D.1S=1S=(o(){o 1S(){}1S.8b=o(2Z,31,3c,3a){9 O.5r(O.1v(3c-2Z,2)+O.1v(3a-31,2))};1S.5u=o(1t,R,35){G 2f;A(35==N){35=1T}2f=1t+(O.8k()*(R-1t));A(35){9 2f.8o(35)}Q{9 O.4s(2f)}};1S.5A=o(u){9(0.7G*u.r)+(0.7J*u.g)+(0.7K*u.b)};1S.1r=o(1e,26,21,Y,41,44){G 4u,4v,43,42,34,3l,1r,4y,2B,i,j,2P,3O,t,38,2Z,3c,4z,3b,31,3a,4A,C,1g,1h,E,1O;38=1e[0];3b=1e[1];2Z=26[0];31=26[1];3c=21[0];3a=21[1];4z=Y[0];4A=Y[1];1r={};34=3m(3*(2Z-38),10);43=3*(3c-2Z)-34;4u=4z-38-34-43;3l=3*(31-3b);42=3*(3a-31)-3l;4v=4A-3b-3l-42;X(i=C=0;C<6f;i=++C){t=i/6f;4y=O.4s((4u*O.1v(t,3))+(43*O.1v(t,2))+(34*t)+38);2B=O.4s((4v*O.1v(t,3))+(42*O.1v(t,2))+(3l*t)+3b);A(41&&2B<41){2B=41}Q A(44&&2B>44){2B=44}1r[4y]=2B}A(1r.P=E;i=0<=E?++1g:--1g){A(!(1r[i]!=N)){2P=[i-1,1r[i-1]];X(j=1h=i,1O=Y[0];i<=1O?1h<=1O:1h>=1O;j=i<=1O?++1h:--1h){A(1r[j]!=N){3O=[j,1r[j]];2v}}1r[i]=2P[1]+((3O[1]-2P[1])/(3O[0]-2P[0]))*(i-2P[0])}}}A(!(1r[Y[0]]!=N)){1r[Y[0]]=1r[Y[0]-1]}9 1r};9 1S})();1s=(o(){o 1s(){}1s.4B=o(2y){G b,g,r;A(2y.7R(0)==="#"){2y=2y.3F(1)}r=3m(2y.3F(0,2),16);g=3m(2y.3F(2,2),16);b=3m(2y.3F(4,2),16);9{r:r,g:g,b:b}};1s.7W=o(r,g,b){G d,h,l,R,1t,s;A(1p r==="2l"){g=r.g;b=r.b;r=r.r}r/=B;g/=B;b/=B;R=O.R(r,g,b);1t=O.1t(r,g,b);l=(R+1t)/2;A(R===1t){h=s=0}Q{d=R-1t;s=l>0.5?d/(2-R-1t):d/(R+1t);h=(o(){2W(R){1l r:9(g-b)/d+(g1){t-=1}A(t<1/6){9 p+(q-p)*6*t}A(t<1/2){9 q}A(t<2/3){9 p+(q-p)*(2/3-t)*6}9 p};1s.6N=o(r,g,b){G d,h,R,1t,s,v;r/=B;g/=B;b/=B;R=O.R(r,g,b);1t=O.1t(r,g,b);v=R;d=R-1t;s=R===0?0:d/R;A(R===1t){h=0}Q{h=(o(){2W(R){1l r:9(g-b)/d+(g0.4H){r=O.1v((r+0.1W)/1.1W,2.4)}Q{r/=12.92}A(g>0.4H){g=O.1v((g+0.1W)/1.1W,2.4)}Q{g/=12.92}A(b>0.4H){b=O.1v((b+0.1W)/1.1W,2.4)}Q{b/=12.92}x=r*0.8F+g*0.8J+b*0.8K;y=r*0.8M+g*0.8X+b*0.91;z=r*0.93+g*0.97+b*0.9d;9{x:x*1f,y:y*1f,z:z*1f}};1s.9F=o(x,y,z){G b,g,r;x/=1f;y/=1f;z/=1f;r=(3.7e*x)+(-1.7f*y)+(-0.7l*z);g=(-0.7m*x)+(1.7n*y)+(0.7x*z);b=(0.7y*x)+(-0.7z*y)+(1.7A*z);A(r>0.4I){r=(1.1W*O.1v(r,0.4J))-0.1W}Q{r*=12.92}A(g>0.4I){g=(1.1W*O.1v(g,0.4J))-0.1W}Q{g*=12.92}A(b>0.4I){b=(1.1W*O.1v(b,0.4J))-0.1W}Q{b*=12.92}9{r:r*B,g:g*B,b:b*B}};1s.5s=o(x,y,z){G a,b,l,4K,4L,4M;A(1p x==="2l"){y=x.y;z=x.z;x=x.x}4K=95.5x;4L=1f.0;4M=5y.5z;x/=4K;y/=4L;z/=4M;A(x>0.4g){x=O.1v(x,0.4O)}Q{x=(7.4P*x)+0.2S}A(y>0.4g){y=O.1v(y,0.4O)}Q{y=(7.4P*y)+0.2S}A(z>0.4g){z=O.1v(z,0.4O)}Q{z=(7.4P*z)+0.2S}l=5F*y-16;a=5G*(x-y);b=5H*(y-z);9{l:l,a:a,b:b}};1s.8g=o(l,a,b){G x,y,z;A(1p l==="2l"){a=l.a;b=l.b;l=l.l}y=(l+16)/5F;x=y+(a/5G);z=y-(b/5H);A(x>0.4Q){x=x*x*x}Q{x=0.4R*(x-0.2S)}A(y>0.4Q){y=y*y*y}Q{y=0.4R*(y-0.2S)}A(z>0.4Q){z=z*z*z}Q{z=0.4R*(z-0.2S)}9{x:x*95.5x,y:y*1f.0,z:z*5y.5z}};1s.8j=o(r,g,b){G 4h;A(1p r==="2l"){g=r.g;b=r.b;r=r.r}4h=8.7a(r,g,b);9 8.5s(4h)};1s.8l=o(l,a,b){};9 1s})();1E=(o(){o 1E(){}1E.2C={};1E.5L=["5M","5N","78","5O","5P","3h"];1E.2x=o(20,V,1q){G 3i,C,1c,E,18;A(8.2C[V]&&8.2C[V].P){E=8.2C[V];18=[];X(C=0,1c=E.P;C<1c;C++){3i=E[C];A(3i.20===N||20.1D===3i.20.1D){18.1B(3i.2b.1i(20,1q))}Q{18.1B(8B 0)}}9 18}};1E.8C=o(20,V,2b){G 4U,4V;A(1p 20==="3o"){4V=20;4U=V;20=N;V=4V;2b=4U}A(5l.1i(8.5L,V)<0){9 1T}A(!8.2C[V]){8.2C[V]=[]}8.2C[V].1B({20:20,2b:2b});9 3d};9 1E})();D.1E=1E;D.S=S=(o(){o S(){}S.1R={4r:1,4p:2,4j:3,4i:4,4W:5,1L:6};S.Z=o(T,5W){9 D.I[T]=5W};9 S})();D.1P=1P=(o(){o 1P(){}1P.5X=/(?:(?:8Y|8Z):\\/\\/)((?:\\w+)\\.(?:(?:\\w|\\.)+))/;1P.6c=o(11){G 3U;A(11==N){9 1T}A(8.5Z(11)){9 1T}3U=11.1d.4n(8.5X);A(3U){9 3U[1]!==1J.96}Q{9 1T}};1P.5Z=o(11){G E;9(11.5c!=N)&&((E=11.5c.3g())===\'6w\'||E===\'9H-98\')};1P.2I=o(1d){9""+D.6o+"?"+D.6l+"="+(99(1d))};1P.9c=o(2D){G 3N;3N={9f:\'9p\',9q:\'9r\',9s:\'9t\',9u:\'9v\'};2D=2D.3g();A(3N[2D]!=N){2D=3N[2D]}9"9w/9x."+2D};9 1P})();D.I.9z=o(){A(1p 27!=="3B"&&27!==N){9 8.62.2Q(8,17)}Q{9 8.63.2Q(8,17)}};D.I.63=o(V){G M;A(V==N){V="64"}V=V.3g();M=8.4X(V).7g("M/"+V,"M/7h-7i");9 1J.7j.7k=M};D.I.62=o(2X,3L){G 4Z;A(3L==N){3L=3d}5U{4Z=3C.7o(2X);A(4Z.7p()&&!3L){9 1T}}5V(e){1w.1z("7q 7r 2X "+2X)}9 3C.7s(2X,8.L.7t(),o(){9 1w.1z("7u 7v 3T "+2X)})};D.I.6a=o(V){G 11;11=1J.3e(\'11\');11.1d=8.4X(V);11.U=8.1y.U;11.14=8.1y.14;A(30.2r){11.U/=30.2r;11.14/=30.2r}9 11};D.I.4X=o(V){A(V==N){V="64"}V=V.3g();9 8.L.7w("M/"+V)};1X=(o(){o 1X(c){8.c=c;8.3u=8.c;8.19={51:\'6b\',2t:1.0};8.7B=1m.5h.2A();8.L=1p 27!=="3B"&&27!==N?1I 39():1J.3e(\'L\');8.L.U=8.c.1y.U;8.L.14=8.c.1y.14;8.1j=8.L.4b(\'2d\');8.1j.7C(8.L.U,8.L.14);8.2p=8.1j.4x(0,0,8.L.U,8.L.14);8.K=8.2p.1q}1X.I.4k=o(2K){9 8.c.4k.1i(8.c,2K)};1X.I.7D=o(6d){8.19.51=6d;9 8};1X.I.2t=o(2t){8.19.2t=2t/1f;9 8};1X.I.7F=o(){G i,1H,C,E;1H=8.c.K;X(i=C=0,E=8.c.K.P;C8.c.K.P||1N<0){9{r:0,g:0,b:0,a:0}}9{r:8.c.K[1N],g:8.c.K[1N+1],b:8.c.K[1N+2],a:8.c.K[1N+3]}};1Y.I.7X=o(4c,49,u){G 6m;6m=8.1u+(8.c.1y.U*4*(49*-1))+(4*4c);A(1N>8.c.K.P||1N<0){9}8.c.K[1N]=u.r;8.c.K[1N+1]=u.g;8.c.K[1N+2]=u.b;8.c.K[1N+3]=u.a;9 3d};1Y.I.7Z=o(x,y){G 1u;1u=(y*8.c.1y.U+x)*4;9{r:8.c.K[1u],g:8.c.K[1u+1],b:8.c.K[1u+2],a:8.c.K[1u+3]}};1Y.I.80=o(x,y,u){G 1u;1u=(y*8.c.1y.U+x)*4;8.c.K[1u]=u.r;8.c.K[1u+1]=u.g;8.c.K[1u+2]=u.b;9 8.c.K[1u+3]=u.a};9 1Y})();1L=(o(){o 1L(){}1L.56={};1L.Z=o(T,2g){9 8.56[T]=2g};1L.2e=o(1j,T,1a){9 8.56[T].2Q(1j,1a)};9 1L})();D.1L=1L;D.1b=1b=(o(){1b.2u=D.1V?3M(\'83\').84().P:4;o 1b(c){8.c=c;8.2k=79(8.2k,8);8.33=[];8.2G=N}1b.I.2N=o(57){A(57==N){9}9 8.33.1B(57)};1b.I.2k=o(){G 1k;A(8.33.P===0){1E.2x(8,"5O");A(8.58!=N){8.58.1i(8.c)}9 8}8.1o=8.33.6r();2W(8.1o.V){1l S.1R.4j:1k=8.c.4Y.6r();8.c.5R(1k);9 8.2k();1l S.1R.4i:8.c.5J();8.c.6i();9 8.2k();1l S.1R.4W:9 8.6s(8.1o.1k,8.1o.1d);1l S.1R.1L:9 8.6t();8d:9 8.6u()}};1b.I.2e=o(1A){8.58=1A;8.2G=1I 8f(8.c.K.P);9 8.2k()};1b.I.59=o(2b){G 3p,5a,Y,f,i,5b,n,1e,C,E,18,W=8;8.3Q=0;n=8.c.K.P;5a=O.3V((n/4)/1b.2u);3p=5a*4;5b=3p+((n/4)%1b.2u)*4;18=[];X(i=C=0,E=1b.2u;0<=E?CE;i=0<=E?++C:--C){1e=i*3p;Y=1e+(i===1b.2u-1?5b:3p);A(D.1V){f=3x(o(){9 2b.1i(W,i,1e,Y)});18.1B(f.8m())}Q{18.1B(40((o(i,1e,Y){9 o(){9 2b.1i(W,i,1e,Y)}})(i,1e,Y),0))}}9 18};1b.I.6u=o(){1E.2x(8.c,"5M",8.1o);A(8.1o.V===S.1R.4r){9 8.59(8.6B)}Q{9 8.59(8.6C)}};1b.I.6t=o(){1w.1z("8p 2g "+8.1o.2g);1L.2e(8.c,8.1o.2g,8.1o.1a);1w.1z("1L "+8.1o.2g+" 5d!");9 8.2k()};1b.I.6B=o(1Z,1e,Y){G 1q,i,2q,1Q,C;1w.1z("6G #"+1Z+" - S: "+8.1o.T+", 8u: "+1e+", 8v: "+Y);1E.2x(8.c,"5P",{6H:1Z,6I:1b.2u,8y:1e,8z:Y});1q={r:0,g:0,b:0,a:0};2q=1I 1Y(8.c);X(i=C=1e;C=1C;j=-1C<=1C?++1g:--1g){X(k=1h=1C;1C<=-1C?1h<=-1C:1h>=-1C;k=1C<=-1C?++1h:--1h){24=2q.6j(j,k);28[2T*3]=24.r;28[2T*3+1]=24.g;28[2T*3+2]=24.b;2T++}}1Q=8.4q(F,28,1K,2a);8.2G[i]=1m.22(1Q.r);8.2G[i+1]=1m.22(1Q.g);8.2G[i+2]=1m.22(1Q.b);8.2G[i+3]=8.c.K[i+3]}8.3h(1Z);A(D.1V){9 3x["6J"]()}};1b.I.3h=o(1Z){G i,C,E;A(1Z>=0){1w.1z("6G #"+1Z+" 5d! S: "+8.1o.T)}8.3Q++;1E.2x(8.c,"3h",{6H:1Z,8H:8.3Q,6I:1b.2u});A(8.3Q===1b.2u){A(8.1o.V===S.1R.4p){X(i=C=0,E=8.c.K.P;0<=E?CE;i=0<=E?++C:--C){8.c.K[i]=8.2G[i]}}A(1Z>=0){1w.1z("S "+8.1o.T+" 5d!")}1E.2x(8.c,"5N",8.1o);9 8.2k()}};1b.I.4q=o(F,28,1K,2a){G i,1F,C,E;1F={r:0,g:0,b:0};X(i=C=0,E=F.P;0<=E?CE;i=0<=E?++C:--C){1F.r+=F[i]*28[i*3];1F.g+=F[i]*28[i*3+1];1F.b+=F[i]*28[i*3+2]}1F.r=(1F.r/1K)+2a;1F.g=(1F.g/1K)+2a;1F.b=(1F.b/1K)+2a;9 1F};1b.I.6s=o(1k,1d){G 11,2I,W=8;11=1J.3e(\'11\');11.4G=o(){1k.1j.65(11,0,0,W.c.1y.U,W.c.1y.14);1k.2p=1k.1j.4x(0,0,W.c.1y.U,W.c.1y.14);1k.K=1k.2p.1q;W.c.K=1k.K;9 W.2k()};2I=1P.8I(1d);9 11.1d=2I!=N?2I:1d};9 1b})();D.1M=1M=(o(){o 1M(){}1M.2M={};1M.6e=o(2n){9 8.2M[2n]!=N};1M.2A=o(2n){9 8.2M[2n]};1M.5T=o(T,2h){9 8.2M[T]=2h};1M.2e=o(2n,1A){G W=8;40(o(){9 1A.1i(W.2A(2n),W.2A(2n))},0);9 8.2A(2n)};1M.8L=o(T){A(T==N){T=1T}A(T){9 6P 8.2M[T]}Q{9 8.2M={}}};9 1M})();1x.Z("6b",o(J,H){9{r:J.r,g:J.g,b:J.b}});1x.Z("8N",o(J,H){9{r:(J.r*H.r)/B,g:(J.g*H.g)/B,b:(J.b*H.b)/B}});1x.Z("8O",o(J,H){9{r:B-(((B-J.r)*(B-H.r))/B),g:B-(((B-J.g)*(B-H.g))/B),b:B-(((B-J.b)*(B-H.b))/B)}});1x.Z("8P",o(J,H){G 15;15={};15.r=H.r>1n?B-2*(B-J.r)*(B-H.r)/B:(H.r*J.r*2)/B;15.g=H.g>1n?B-2*(B-J.g)*(B-H.g)/B:(H.g*J.g*2)/B;15.b=H.b>1n?B-2*(B-J.b)*(B-H.b)/B:(H.b*J.b*2)/B;9 15});1x.Z("8R",o(J,H){9{r:J.r-H.r,g:J.g-H.g,b:J.b-H.b}});1x.Z("8S",o(J,H){9{r:H.r+J.r,g:H.g+J.g,b:H.b+J.b}});1x.Z("8T",o(J,H){9{r:1n-2*(H.r-1n)*(J.r-1n)/B,g:1n-2*(H.g-1n)*(J.g-1n)/B,b:1n-2*(H.b-1n)*(J.b-1n)/B}});1x.Z("8U",o(J,H){G 15;15={};15.r=H.r>1n?B-((B-H.r)*(B-(J.r-1n)))/B:(H.r*(J.r+1n))/B;15.g=H.g>1n?B-((B-H.g)*(B-(J.g-1n)))/B:(H.g*(J.g+1n))/B;15.b=H.b>1n?B-((B-H.b)*(B-(J.b-1n)))/B:(H.b*(J.b+1n))/B;9 15});1x.Z("8V",o(J,H){9{r:H.r>J.r?H.r:J.r,g:H.g>J.g?H.g:J.g,b:H.b>J.b?H.b:J.b}});1x.Z("8W",o(J,H){9{r:H.r>J.r?J.r:H.r,g:H.g>J.g?J.g:H.g,b:H.b>J.b?J.b:H.b}});S.Z("4a",o(){G 2J;A(17.P===1){2J=1s.4B(17[0])}Q{2J={r:17[0],g:17[1],b:17[2]}}9 8.1G("4a",o(u){u.r=2J.r;u.g=2J.g;u.b=2J.b;u.a=B;9 u})});S.Z("6R",o(F){F=O.3V(B*(F/1f));9 8.1G("6R",o(u){u.r+=F;u.g+=F;u.b+=F;9 u})});S.Z("6S",o(F){F*=-0.90;9 8.1G("6S",o(u){G R;R=O.R(u.r,u.g,u.b);A(u.r!==R){u.r+=(R-u.r)*F}A(u.g!==R){u.g+=(R-u.g)*F}A(u.b!==R){u.b+=(R-u.b)*F}9 u})});S.Z("6T",o(F){F*=-1;9 8.1G("6T",o(u){G 3y,2m,R;R=O.R(u.r,u.g,u.b);2m=(u.r+u.g+u.b)/3;3y=((O.2s(R-2m)*2/B)*F)/1f;A(u.r!==R){u.r+=(R-u.r)*3y}A(u.g!==R){u.g+=(R-u.g)*3y}A(u.b!==R){u.b+=(R-u.b)*3y}9 u})});S.Z("6W",o(F){9 8.1G("6W",o(u){G 2m;2m=1S.5A(u);u.r=2m;u.g=2m;u.b=2m;9 u})});S.Z("6X",o(F){F=O.1v((F+1f)/1f,2);9 8.1G("6X",o(u){u.r/=B;u.r-=0.5;u.r*=F;u.r+=0.5;u.r*=B;u.g/=B;u.g-=0.5;u.g*=F;u.g+=0.5;u.g*=B;u.b/=B;u.b-=0.5;u.b*=F;u.b+=0.5;u.b*=B;9 u})});S.Z("6Y",o(F){9 8.1G("6Y",o(u){G h,2z,23;2z=1s.6N(u.r,u.g,u.b);h=2z.h*1f;h+=O.2s(F);h=h%1f;h/=1f;2z.h=h;23=1s.6V(2z.h,2z.s,2z.v);23.a=u.a;9 23})});S.Z("6Z",o(){G 32,23;A(17.P===2){23=1s.4B(17[0]);32=17[1]}Q A(17.P===4){23={r:17[0],g:17[1],b:17[2]};32=17[3]}9 8.1G("6Z",o(u){u.r-=(u.r-23.r)*(32/1f);u.g-=(u.g-23.g)*(32/1f);u.b-=(u.b-23.b)*(32/1f);9 u})});S.Z("71",o(){9 8.1G("71",o(u){u.r=B-u.r;u.g=B-u.g;u.b=B-u.b;9 u})});S.Z("72",o(F){A(F==N){F=1f}F/=1f;9 8.1G("72",o(u){u.r=O.1t(B,(u.r*(1-(0.9g*F)))+(u.g*(0.9h*F))+(u.b*(0.9i*F)));u.g=O.1t(B,(u.r*(0.9j*F))+(u.g*(1-(0.9k*F)))+(u.b*(0.9l*F)));u.b=O.1t(B,(u.r*(0.9m*F))+(u.g*(0.9n*F))+(u.b*(1-(0.9o*F))));9 u})});S.Z("73",o(F){9 8.1G("73",o(u){u.r=O.1v(u.r/B,F)*B;u.g=O.1v(u.g/B,F)*B;u.b=O.1v(u.b/B,F)*B;9 u})});S.Z("74",o(F){F=O.2s(F)*2.55;9 8.1G("74",o(u){G 2f;2f=1S.5u(F*-1,F);u.r+=2f;u.g+=2f;u.b+=2f;9 u})});S.Z("75",o(F){F=O.2s(F)*2.55;9 8.1G("75",o(u){A(u.r>B-F){u.r=B}Q A(u.rB-F){u.g=B}Q A(u.gB-F){u.b=B}Q A(u.b0){u.r+=(B-u.r)*19.3X}Q{u.r-=u.r*O.2s(19.3X)}}A(19.3W!=N){A(19.3W>0){u.g+=(B-u.g)*19.3W}Q{u.g-=u.g*O.2s(19.3W)}}A(19.3K!=N){A(19.3K>0){u.b+=(B-u.b)*19.3K}Q{u.b-=u.b*O.2s(19.3K)}}9 u})});S.Z("48",o(){G 1r,2c,25,26,21,Y,i,1e,C,1g,E,1O;2c=17[0],25=2<=17.P?70.1i(17,1):[];A(1p 2c==="3o"){2c=2c.9C("")}A(2c[0]==="v"){2c=[\'r\',\'g\',\'b\']}A(25.P<3||25.P>4){3S"54 9D 9E 17 3T 48 3u";}1e=25[0];26=25[1];21=25.P===4?25[2]:25[1];Y=25[25.P-1];1r=1S.1r(1e,26,21,Y,0,B);A(1e[0]>0){X(i=C=0,E=1e[0];0<=E?CE;i=0<=E?++C:--C){1r[i]=1e[1]}}A(Y[0]=B;i=1O<=B?++1g:--1g){1r[i]=Y[1]}}9 8.1G("48",o(u){G 1h,2R;X(i=1h=0,2R=2c.P;0<=2R?1h<2R:1h>2R;i=0<=2R?++1h:--1h){u[2c[i]]=1r[u[2c[i]]]}9 u})});S.Z("9G",o(F){G 26,21,p;p=O.2s(F)/1f;26=[0,B*p];21=[B-(B*p),B];A(F<0){26=26.6v();21=21.6v()}9 8.48(\'23\',[0,0],26,21,[B,B])})}).1i(8);',62,602,'||||||||this|return|||||||||||||||function||||||rgba||||||if|255|_i|Caman|_ref|adjust|var|rgbaParent|prototype|rgbaLayer|pixelData|canvas|image|null|Math|length|else|max|Filter|name|width|type|_this|for|end|register||img|||height|result||arguments|_results|options|args|Renderer|_len|src|start|100|_j|_k|call|context|layer|case|Util|128|currentJob|typeof|data|bezier|Convert|min|loc|pow|Log|Blender|dimensions|debug|callback|push|builder|id|Event|val|process|parentData|new|document|divisor|Plugin|Store|newLoc|_ref1|IO|res|Type|Calculate|false|levels|NodeJS|055|Layer|PixelInfo|bnum|target|ctrl2|clampRGB|rgb|pixel|cps|ctrl1|exports|kernel|caman|bias|fn|chans||execute|rand|plugin|obj|ratio|ele|processNext|object|avg|search|initObj|imageData|pixelInfo|devicePixelRatio|abs|opacity|Blocks|break|CamanParser|trigger|hex|hsv|get|curveY|events|lang|renderer|finishInit|modPixelData|layerData|proxyUrl|color|cb|Analyze|items|add|chan|leftCoord|apply|_ref2|1379310345|builderIndex|Image|ready|switch|file|getAttribute|x1|window|y1|level|renderQueue|Cx|getFloat|originalHeight|originalWidth|x0|Canvas|y2|y0|x2|true|createElement|Logger|toLowerCase|blockFinished|event|currentLayer|pixelStack|Cy|parseInt|imageLoaded|string|blockN|unparsedInstructions|adjustSize|func|attr|filter|opts|imgs|Fiber|amt|prop|copy|undefined|fs|slice|numPixels|substr|hiDPIReplacement|imageUrl|root|oldCanvas|blue|overwrite|require|langToExt|rightCoord|hiDPIRatio|blocksDone|processFn|throw|to|matches|floor|green|red|Root|hueToRGB|setTimeout|lowBound|By|Bx|highBound|complete|continue|INST_REGEX|curves|vert|fillColor|getContext|horiz|sel|dest|initType|008856451679|xyz|LayerFinished|LayerDequeue|newLayer|inst|instFunc|match|blenders|Kernel|processKernel|Single|round|backingStoreRatio|Ax|Ay|hiDPIDisabled|getImageData|curveX|x3|y3|hexToRGB|waitForImageLoaded|imageAdjustments|replaceChild|parentNode|onload|04045|0031308|4166666667|whiteX|whiteY|whiteZ|DOMUpdated|3333333333|787037037|2068965517|1284185493|readyState|listener|_fn|_type|LoadOverlay|toBase64|canvasQueue|stats|layerStack|blendingMode|originalPixelData|bind|Invalid||plugins|job|finishedFn|eachBlock|blockPixelLength|lastBlockN|crossOrigin|finished|version|nodeName|except|uniqid|value|__hasProp|in|__indexOf|initNode|render|node|setInitObject|newCanvas|sqrt|xyzToLab|addEventListener|randomRange|hiDPICapable|parser|047|108|883|luminance|parse|px|style|initialized|116|500|200|RegExp|applyCurrentLayer|DOM|types|processStart|processComplete|renderFinished|blockStarted|hidpi|executeLayer|setup|put|try|catch|filterFunc|domainRegex|parseArguments|corsEnabled|applyToParent|domIsLoaded|nodeSave|browserSave|png|drawImage|scaled|assignId|hiDPIAdjustments|pop|toImage|normal|isRemote|mode|has|1000|log|console|popContext|getPixelRelative|getAttrId|proxyParam|nowLoc|swapped|remoteProxy|needsHiDPISwap|dataStr|shift|loadOverlay|executePlugin|executeFilter|reverse|anonymous|pushContext|putImageData|err|autoload|renderBlock|renderKernel|Height|DEBUG|date|Block|blockNum|totalBlocks|yield|release|Width|setAttribute|rgbToHSV|loaded|delete|from|brightness|saturation|vibrance|copyAttributes|hsvToRGB|greyscale|contrast|hue|colorize|__slice|invert|sepia|gamma|noise|clip|channels|me|renderStart|__bind|rgbToXYZ|initCanvas|initImage|item|2406|5372|replace|octet|stream|location|href|4986|9689|8758|statSync|isFile|Creating|output|writeFile|toBuffer|Finished|writing|toDataURL|0415|0557|2040|0570|layerID|createImageData|setBlendingMode|Remote|copyParent|299|isNaN|overlayImage|587|114|instanceof|webkitBackingStorePixelRatio|info|warn|error|DOMContentLoaded|charAt|locationXY|scale|processPlugin|camanProxyUrl|rgbToHSL|putPixelRelative|querySelectorAll|getPixel|putPixel|HiDPI|disabled|os|cpus|Released|Version|replaceCanvas|hslToRGB|toString|onerror|distance|revert|default|backingStorePixelRatio|Uint8Array|labToXYZ|oBackingStorePixelRatio|msBackingStorePixelRatio|rgbToLab|random|labToRGB|run|Initializing|toFixed|Executing|calculateLevels|Function|URL|using|Start|End|detected|mozBackingStorePixelRatio|startPixel|endPixel|given|void|listen|fibers|nodeValue|4124|Rendering|blocksFinished|remoteCheck|3576|1805|flush|2126|multiply|screen|overlay|attributes|difference|addition|exclusion|softLight|lighten|darken|7152|http|https|01|0722||0193|extend||domain|1192|credentials|encodeURIComponent|querySelector|Array|useProxy|9505|analyze|ruby|607|769|189|349|314|168|272|534|869|rb|python|py|perl|pl|javascript|js|proxies|caman_proxy|hasOwnProperty|save|readystatechange|indexOf|split|number|of|xyzToRGB|exposure|use'.split('|'),0,{})) \ No newline at end of file diff --git a/ajax/libs/camanjs/package.json b/ajax/libs/camanjs/package.json index 6d86d1a03..853509f38 100644 --- a/ajax/libs/camanjs/package.json +++ b/ajax/libs/camanjs/package.json @@ -1,7 +1,7 @@ { "name": "camanjs", "filename": "caman.full.min.js", - "version": "3.3.0", + "version": "4.0.0", "description": "Pure Javascript (Ca)nvas (Man)ipulation.", "homepage": "http://camanjs.com/", "keywords": [