diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 8450b4b8..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "src/plugins"] - path = src/plugins - url = https://github.com/meltingice/CamanJS-Plugins.git diff --git a/.travis.yml b/.travis.yml index 0b6bea49..ac2c0e35 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,11 @@ language: node_js env: TRAVISCI=true node_js: - "0.10" - - "0.8" before_script: - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start \ No newline at end of file + - sh -e /etc/init.d/xvfb start +before_install: + - sudo apt-get install libcairo2-dev libjpeg8-dev libpango1.0-dev libgif-dev build-essential g++ + - npm install canvas + - npm install karma-coffee-preprocessor karma-firefox-launcher + diff --git a/Cakefile b/Cakefile index 0b2cc7bd..fbb0eeb2 100644 --- a/Cakefile +++ b/Cakefile @@ -3,10 +3,7 @@ fs = require 'fs' util = require 'util' {jsmin} = require 'jsmin' -try - packer = require 'packer' -catch err - packer = null +packer = null targetName = "caman" diff --git a/README.md b/README.md index 462f0afd..7e0f29c9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # About the Project -[![Build Status](https://secure.travis-ci.org/meltingice/CamanJS.png)](http://travis-ci.org/meltingice/CamanJS) +[![Build Status](https://api.travis-ci.org/ckfinder/CamanJS.png)](https://travis-ci.org/ckfinder/CamanJS) The main focus of CamanJS is manipulating images using the HTML5 canvas and Javascript. It's a combination of a simple-to-use interface with advanced and efficient image/canvas editing techniques. It is also completely library independent and can be safely used next to jQuery, YUI, Scriptaculous, MooTools, etc. diff --git a/dist/caman.full.js b/dist/caman.full.js index 772007ff..a39d5dc1 100644 --- a/dist/caman.full.js +++ b/dist/caman.full.js @@ -1,11 +1,11 @@ -// Generated by CoffeeScript 1.6.3 +// Generated by CoffeeScript 1.12.7 (function() { var $, Analyze, Blender, Calculate, Caman, CamanParser, Canvas, Convert, Event, Fiber, Filter, IO, Image, Layer, Log, Module, Pixel, Plugin, Renderer, Root, Store, Util, fs, http, moduleKeywords, slice, vignetteFilters, - __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; }, - __slice = [].slice, - __hasProp = {}.hasOwnProperty, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + 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; }, + slice1 = [].slice, + hasProp = {}.hasOwnProperty, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; moduleKeywords = ['extended', 'included']; @@ -13,52 +13,53 @@ function Module() {} Module["extends"] = function(obj) { - var key, value, _ref; + var key, ref, value; for (key in obj) { value = obj[key]; - if (__indexOf.call(moduleKeywords, key) < 0) { + if (indexOf.call(moduleKeywords, key) < 0) { this[key] = value; } } - if ((_ref = obj.extended) != null) { - _ref.apply(this); + if ((ref = obj.extended) != null) { + ref.apply(this); } return this; }; Module.includes = function(obj) { - var key, value, _ref; + var key, ref, value; for (key in obj) { value = obj[key]; - if (__indexOf.call(moduleKeywords, key) < 0) { + if (indexOf.call(moduleKeywords, key) < 0) { this.prototype[key] = value; } } - if ((_ref = obj.included) != null) { - _ref.apply(this); + if ((ref = obj.included) != null) { + ref.apply(this); } return this; }; Module.delegate = function() { - var args, source, target, _i, _len, _results; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + var args, len, o, results, source, target; + args = 1 <= arguments.length ? slice1.call(arguments, 0) : []; target = args.pop(); - _results = []; - for (_i = 0, _len = args.length; _i < _len; _i++) { - source = args[_i]; - _results.push(this.prototype[source] = target.prototype[source]); + results = []; + for (o = 0, len = args.length; o < len; o++) { + source = args[o]; + results.push(this.prototype[source] = target.prototype[source]); } - return _results; + return results; }; Module.aliasFunction = function(to, from) { - var _this = this; - return this.prototype[to] = function() { - var args; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - return _this.prototype[from].apply(_this, args); - }; + return this.prototype[to] = (function(_this) { + return function() { + var args; + args = 1 <= arguments.length ? slice1.call(arguments, 0) : []; + return _this.prototype[from].apply(_this, args); + }; + })(this); }; Module.aliasProperty = function(to, from) { @@ -106,13 +107,13 @@ })(); Util.extend = function() { - var copy, dest, obj, prop, src, _i, _len; - obj = arguments[0], src = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + var copy, dest, len, o, obj, prop, src; + obj = arguments[0], src = 2 <= arguments.length ? slice1.call(arguments, 1) : []; dest = obj; - for (_i = 0, _len = src.length; _i < _len; _i++) { - copy = src[_i]; + for (o = 0, len = src.length; o < len; o++) { + copy = src[o]; for (prop in copy) { - if (!__hasProp.call(copy, prop)) continue; + if (!hasProp.call(copy, prop)) continue; dest[prop] = copy[prop]; } } @@ -130,20 +131,20 @@ }; Util.copyAttributes = function(from, to, opts) { - var attr, _i, _len, _ref, _ref1, _results; + var attr, len, o, 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)) { + ref = from.attributes; + results = []; + for (o = 0, len = ref.length; o < len; o++) { + attr = ref[o]; + if ((opts.except != null) && (ref1 = attr.nodeName, indexOf.call(opts.except, ref1) >= 0)) { continue; } - _results.push(to.setAttribute(attr.nodeName, attr.nodeValue)); + results.push(to.setAttribute(attr.nodeName, attr.nodeValue)); } - return _results; + return results; }; Util.dataArray = function(length) { @@ -171,8 +172,8 @@ Root = window; } - Caman = (function(_super) { - __extends(Caman, _super); + Caman = (function(superClass) { + extend(Caman, superClass); Caman.version = { release: "4.1.2", @@ -211,9 +212,8 @@ }; function Caman() { - this.nodeFileReady = __bind(this.nodeFileReady, this); - var args, callback, id, - _this = this; + this.nodeFileReady = bind(this.nodeFileReady, this); + var args, callback, id; if (arguments.length === 0) { throw "Invalid arguments"; } @@ -236,6 +236,8 @@ }; this.cropped = false; this.resized = false; + this.rotated = false; + this.rotationAngle = 0; this.pixelStack = []; this.layerStack = []; this.canvasQueue = []; @@ -243,10 +245,12 @@ this.scaled = false; this.analyze = new Analyze(this); this.renderer = new Renderer(this); - this.domIsLoaded(function() { - _this.parseArguments(args); - return _this.setup(); - }); + this.domIsLoaded((function(_this) { + return function() { + _this.parseArguments(args); + return _this.setup(); + }; + })(this)); return this; } else { return new Caman(arguments); @@ -254,32 +258,37 @@ } Caman.prototype.domIsLoaded = function(cb) { - var listener, - _this = this; + var listener; if (Caman.NodeJS) { - return setTimeout(function() { - return cb.call(_this); - }, 0); + return setTimeout((function(_this) { + return function() { + return cb.call(_this); + }; + })(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 setTimeout((function(_this) { + return function() { return cb.call(_this); - } - }; + }; + })(this), 0); + } else { + listener = (function(_this) { + return function() { + if (document.readyState === "complete") { + Log.debug("DOM initialized"); + return cb.call(_this); + } + }; + })(this); return document.addEventListener("readystatechange", listener, false); } } }; Caman.prototype.parseArguments = function(args) { - var key, val, _ref, _results; + var key, ref, results, val; if (args.length === 0) { throw "Invalid arguments given"; } @@ -303,14 +312,14 @@ } this.callback = args[2]; if (args.length === 4) { - _ref = args[4]; - _results = []; - for (key in _ref) { - if (!__hasProp.call(_ref, key)) continue; - val = _ref[key]; - _results.push(this.options[key] = val); + ref = args[4]; + results = []; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + val = ref[key]; + results.push(this.options[key] = val); } - return _results; + return results; } }; @@ -378,6 +387,7 @@ this.image.src = data; Log.debug("Image loaded. Width = " + (this.imageWidth()) + ", Height = " + (this.imageHeight())); this.canvas = new Canvas(this.imageWidth(), this.imageHeight()); + this.renderingCanvas = new Canvas(this.imageWidth(), this.imageHeight()); return this.finishInit(); }; @@ -385,21 +395,31 @@ this.image = this.initObj; this.canvas = document.createElement('canvas'); this.context = this.canvas.getContext('2d'); + this.renderingCanvas = document.createElement('canvas'); + this.renderingContext = this.renderingCanvas.getContext('2d'); Util.copyAttributes(this.image, this.canvas, { except: ['src'] }); + Util.copyAttributes(this.image, this.renderingCanvas, { + except: ['src'] + }); if (this.image.parentNode != null) { - this.image.parentNode.replaceChild(this.canvas, this.image); + this.image.parentNode.replaceChild(this.renderingCanvas, this.image); } this.imageAdjustments(); return this.waitForImageLoaded(); }; Caman.prototype.initCanvas = function() { - this.canvas = this.initObj; + this.canvas = document.createElement('canvas'); this.context = this.canvas.getContext('2d'); + this.renderingCanvas = this.initObj; + this.renderingContext = this.renderingCanvas.getContext('2d'); + this.canvas.width = this.renderingCanvas.width; + this.canvas.height = this.renderingCanvas.height; if (this.imageUrl != null) { this.image = document.createElement('img'); + this.image.crossOrigin = 'anonymous'; this.image.src = this.imageUrl; this.imageAdjustments(); return this.waitForImageLoaded(); @@ -451,18 +471,25 @@ if (this.swapped) { this.canvas.width = this.imageWidth() / this.hiDPIRatio(); this.canvas.height = this.imageHeight() / this.hiDPIRatio(); + this.renderingCanvas.width = this.imageWidth() / this.hiDPIRatio(); + this.renderingCanvas.height = this.imageHeight() / this.hiDPIRatio(); } else { this.canvas.width = this.imageWidth(); this.canvas.height = this.imageHeight(); + this.renderingCanvas.width = this.imageWidth(); + this.renderingCanvas.height = this.imageHeight(); } return this.finishInit(); }; Caman.prototype.finishInit = function() { - var i, pixel, _i, _len, _ref; + var i, len, o, pixel, ref; if (this.context == null) { this.context = this.canvas.getContext('2d'); } + if (this.renderingContext == null) { + this.renderingContext = this.renderingCanvas.getContext('2d'); + } this.originalWidth = this.preScaledWidth = this.width = this.canvas.width; this.originalHeight = this.preScaledHeight = this.height = this.canvas.height; this.hiDPIAdjustments(); @@ -471,15 +498,16 @@ } if (this.image != null) { this.context.drawImage(this.image, 0, 0, this.imageWidth(), this.imageHeight(), 0, 0, this.preScaledWidth, this.preScaledHeight); + this.renderingContext.drawImage(this.image, 0, 0, this.imageWidth(), this.imageHeight(), 0, 0, this.preScaledWidth, this.preScaledHeight); } this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); this.pixelData = this.imageData.data; if (Caman.allowRevert) { this.initializedPixelData = Util.dataArray(this.pixelData.length); this.originalPixelData = Util.dataArray(this.pixelData.length); - _ref = this.pixelData; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; + ref = this.pixelData; + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; this.initializedPixelData[i] = pixel; this.originalPixelData[i] = pixel; } @@ -501,18 +529,18 @@ }; Caman.prototype.resetOriginalPixelData = function() { - var i, pixel, _i, _len, _ref, _results; + var i, len, o, pixel, ref, results; if (!Caman.allowRevert) { throw "Revert disabled"; } this.originalPixelData = Util.dataArray(this.pixelData.length); - _ref = this.pixelData; - _results = []; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; - _results.push(this.originalPixelData[i] = pixel); + ref = this.pixelData; + results = []; + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; + results.push(this.originalPixelData[i] = pixel); } - return _results; + return results; }; Caman.prototype.hasId = function() { @@ -543,8 +571,8 @@ this.preScaledHeight = this.canvas.height; this.canvas.width = this.preScaledWidth * ratio; this.canvas.height = this.preScaledHeight * ratio; - this.canvas.style.width = "" + this.preScaledWidth + "px"; - this.canvas.style.height = "" + this.preScaledHeight + "px"; + this.canvas.style.width = this.preScaledWidth + "px"; + this.canvas.style.height = this.preScaledHeight + "px"; this.context.scale(ratio, ratio); this.width = this.originalWidth = this.canvas.width; return this.height = this.originalHeight = this.canvas.height; @@ -577,12 +605,18 @@ }; Caman.prototype.replaceCanvas = function(newCanvas) { - var oldCanvas; - oldCanvas = this.canvas; + var i, len, o, pixel, ref; this.canvas = newCanvas; this.context = this.canvas.getContext('2d'); - if (!Caman.NodeJS) { - oldCanvas.parentNode.replaceChild(this.canvas, oldCanvas); + this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); + this.pixelData = this.imageData.data; + if (Caman.allowRevert) { + this.originalPixelData = Util.dataArray(this.pixelData.length); + ref = this.pixelData; + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; + this.originalPixelData[i] = pixel; + } } this.width = this.canvas.width; this.height = this.canvas.height; @@ -594,37 +628,40 @@ }; 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); - }); + return this.renderer.execute((function(_this) { + return function() { + _this.renderingCanvas.width = _this.canvas.width; + _this.renderingCanvas.height = _this.canvas.height; + _this.renderingContext.putImageData(_this.imageData, 0, 0); + return callback.call(_this); + }; + })(this)); }; Caman.prototype.revert = function(updateContext) { - var i, pixel, _i, _len, _ref; + var i, len, o, pixel, ref; if (updateContext == null) { updateContext = true; } if (!Caman.allowRevert) { throw "Revert disabled"; } - _ref = this.originalVisiblePixels(); - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; + ref = this.originalVisiblePixels(); + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; this.pixelData[i] = pixel; } if (updateContext) { - return this.context.putImageData(this.imageData, 0, 0); + return this.renderingContext.putImageData(this.imageData, 0, 0); } }; Caman.prototype.reset = function() { - var canvas, ctx, i, imageData, pixel, pixelData, _i, _len, _ref; + var canvas, ctx, i, imageData, len, o, pixel, pixelData, ref; canvas = document.createElement('canvas'); Util.copyAttributes(this.canvas, canvas); canvas.width = this.originalWidth; @@ -632,9 +669,9 @@ ctx = canvas.getContext('2d'); imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); pixelData = imageData.data; - _ref = this.initializedPixelData; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; + ref = this.initializedPixelData; + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; pixelData[i] = pixel; } ctx.putImageData(imageData, 0, 0); @@ -647,42 +684,20 @@ }; Caman.prototype.originalVisiblePixels = function() { - var canvas, coord, ctx, endX, endY, i, imageData, pixel, pixelData, pixels, scaledCanvas, startX, startY, width, _i, _j, _len, _ref, _ref1, _ref2, _ref3; + var coord, endX, endY, i, o, pixelData, pixels, ref, ref1, ref2, startX, startY, width; if (!Caman.allowRevert) { throw "Revert disabled"; } pixels = []; - startX = this.cropCoordinates.x; + startX = 0; endX = startX + this.width; - startY = this.cropCoordinates.y; + startY = 0; endY = startY + this.height; - if (this.resized) { - canvas = document.createElement('canvas'); - canvas.width = this.originalWidth; - canvas.height = this.originalHeight; - ctx = canvas.getContext('2d'); - imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); - pixelData = imageData.data; - _ref = this.originalPixelData; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; - pixelData[i] = pixel; - } - ctx.putImageData(imageData, 0, 0); - scaledCanvas = document.createElement('canvas'); - scaledCanvas.width = this.width; - scaledCanvas.height = this.height; - ctx = scaledCanvas.getContext('2d'); - ctx.drawImage(canvas, 0, 0, this.originalWidth, this.originalHeight, 0, 0, this.width, this.height); - pixelData = ctx.getImageData(0, 0, this.width, this.height).data; - width = this.width; - } else { - pixelData = this.originalPixelData; - width = this.originalWidth; - } - for (i = _j = 0, _ref1 = pixelData.length; _j < _ref1; i = _j += 4) { + pixelData = this.originalPixelData; + width = this.canvas.width; + for (i = o = 0, ref = pixelData.length; o < ref; i = o += 4) { coord = Pixel.locationToCoordinates(i, width); - if (((startX <= (_ref2 = coord.x) && _ref2 < endX)) && ((startY <= (_ref3 = coord.y) && _ref3 < endY))) { + if (((startX <= (ref1 = coord.x) && ref1 < endX)) && ((startY <= (ref2 = coord.y) && ref2 < endY))) { pixels.push(pixelData[i], pixelData[i + 1], pixelData[i + 2], pixelData[i + 3]); } } @@ -699,7 +714,7 @@ }; Caman.prototype.processKernel = function(name, adjust, divisor, bias) { - var i, _i, _ref; + var i, o, ref; if (divisor == null) { divisor = null; } @@ -708,7 +723,7 @@ } if (divisor == null) { divisor = 0; - for (i = _i = 0, _ref = adjust.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + for (i = o = 0, ref = adjust.length; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { divisor += adjust[i]; } } @@ -772,29 +787,29 @@ Root.Caman = Caman; Caman.Analyze = (function() { - function Analyze(c) { - this.c = c; + function Analyze(c1) { + this.c = c1; } Analyze.prototype.calculateLevels = function() { - var i, levels, numPixels, _i, _j, _k, _ref; + var i, levels, numPixels, o, ref, u, w; levels = { r: {}, g: {}, b: {} }; - for (i = _i = 0; _i <= 255; i = ++_i) { + for (i = o = 0; o <= 255; i = ++o) { 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) { + for (i = u = 0, ref = this.c.pixelData.length; u < ref; i = u += 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) { + for (i = w = 0; w <= 255; i = ++w) { levels.r[i] /= numPixels; levels.g[i] /= numPixels; levels.b[i] /= numPixels; @@ -809,20 +824,20 @@ Analyze = Caman.Analyze; Caman.DOMUpdated = function() { - var img, imgs, parser, _i, _len, _results; + var img, imgs, len, o, parser, 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() { + results = []; + for (o = 0, len = imgs.length; o < len; o++) { + img = imgs[o]; + results.push(parser = new CamanParser(img, function() { this.parse(); return this.execute(); })); } - return _results; + return results; }; if (Caman.autoload) { @@ -846,7 +861,7 @@ } CamanParser.prototype.parse = function() { - var args, e, filter, func, inst, instFunc, m, r, unparsedInstructions, _i, _len, _ref, _results; + var args, e, filter, func, inst, instFunc, len, m, o, r, ref, results, unparsedInstructions; this.ele = this.caman.canvas; r = new RegExp(INST_REGEX, 'g'); unparsedInstructions = this.dataStr.match(r); @@ -854,20 +869,20 @@ 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 + "); };"); + results = []; + for (o = 0, len = unparsedInstructions.length; o < len; o++) { + inst = unparsedInstructions[o]; + 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 (_error) { - e = _error; - _results.push(Log.debug(e)); + results.push(func.call(this.caman)); + } catch (error) { + e = error; + results.push(Log.debug(e)); } } - return _results; + return results; }; CamanParser.prototype.execute = function() { @@ -926,7 +941,7 @@ }; Calculate.bezier = function(start, ctrl1, ctrl2, end, lowBound, highBound) { - var bezier, clamp, controlPoints, endX, i, j, lerp, next, prev, t, _i, _j, _ref; + var bezier, clamp, controlPoints, endX, i, j, lerp, next, o, prev, ref, t, u; if (lowBound == null) { lowBound = 0; } @@ -950,12 +965,12 @@ clamp = function(a, min, max) { return Math.min(Math.max(a, min), max); }; - for (i = _i = 0; _i < 1000; i = ++_i) { + for (i = o = 0; o < 1000; i = ++o) { t = i / 1000; prev = controlPoints; while (prev.length > 1) { next = []; - for (j = _j = 0, _ref = prev.length - 2; 0 <= _ref ? _j <= _ref : _j >= _ref; j = 0 <= _ref ? ++_j : --_j) { + for (j = u = 0, ref = prev.length - 2; 0 <= ref ? u <= ref : u >= ref; j = 0 <= ref ? ++u : --u) { next.push([lerp(prev[j][0], prev[j + 1][0], t), lerp(prev[j][1], prev[j + 1][1], t)]); } prev = next; @@ -971,8 +986,7 @@ }; Calculate.hermite = function(controlPoints, lowBound, highBound) { - var add, clamp, count, endX, fac0, fac1, fac2, fac3, i, j, lerp, m0, m1, mul, p, p0, p1, pointsPerSegment, pointsPerStep, pos, ret, sub, t, _i, _j, _ref, - _this = this; + var add, clamp, count, endX, fac0, fac1, fac2, fac3, i, j, lerp, m0, m1, mul, o, p, p0, p1, pointsPerSegment, pointsPerStep, pos, ref, ref1, ret, sub, t, u; if (controlPoints.length < 2) { throw "Invalid number of arguments to hermite"; } @@ -980,20 +994,26 @@ lerp = function(a, b, t) { return a * (1 - t) + b * t; }; - add = function(a, b, c, d) { - return [a[0] + b[0] + c[0] + d[0], a[1] + b[1] + c[1] + d[1]]; - }; - mul = function(a, b) { - return [a[0] * b[0], a[1] * b[1]]; - }; - sub = function(a, b) { - return [a[0] - b[0], a[1] - b[1]]; - }; + add = (function(_this) { + return function(a, b, c, d) { + return [a[0] + b[0] + c[0] + d[0], a[1] + b[1] + c[1] + d[1]]; + }; + })(this); + mul = (function(_this) { + return function(a, b) { + return [a[0] * b[0], a[1] * b[1]]; + }; + })(this); + sub = (function(_this) { + return function(a, b) { + return [a[0] - b[0], a[1] - b[1]]; + }; + })(this); clamp = function(a, min, max) { return Math.min(Math.max(a, min), max); }; count = 0; - for (i = _i = 0, _ref = controlPoints.length - 2; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { + for (i = o = 0, ref = controlPoints.length - 2; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) { p0 = controlPoints[i]; p1 = controlPoints[i + 1]; pointsPerSegment = p1[0] - p0[0]; @@ -1005,7 +1025,7 @@ m0 = mul(sub(p1, p), [0.5, 0.5]); p = i < controlPoints.length - 2 ? controlPoints[i + 2] : p1; m1 = mul(sub(p, p0), [0.5, 0.5]); - for (j = _j = 0; 0 <= pointsPerSegment ? _j <= pointsPerSegment : _j >= pointsPerSegment; j = 0 <= pointsPerSegment ? ++_j : --_j) { + for (j = u = 0, ref1 = pointsPerSegment; 0 <= ref1 ? u <= ref1 : u >= ref1; j = 0 <= ref1 ? ++u : --u) { t = j * pointsPerStep; fac0 = 2.0 * t * t * t - 3.0 * t * t + 1.0; fac1 = t * t * t - 2.0 * t * t + t; @@ -1022,21 +1042,23 @@ }; Calculate.missingValues = function(values, endX) { - var i, j, leftCoord, ret, rightCoord, _i, _j; + var i, j, leftCoord, o, ref, ref1, ref2, ret, rightCoord, u; if (Object.keys(values).length < endX + 1) { ret = {}; - for (i = _i = 0; 0 <= endX ? _i <= endX : _i >= endX; i = 0 <= endX ? ++_i : --_i) { + for (i = o = 0, ref = endX; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) { if (values[i] != null) { ret[i] = values[i]; } else { leftCoord = [i - 1, ret[i - 1]]; - for (j = _j = i; i <= endX ? _j <= endX : _j >= endX; j = i <= endX ? ++_j : --_j) { + for (j = u = ref1 = i, ref2 = endX; ref1 <= ref2 ? u <= ref2 : u >= ref2; j = ref1 <= ref2 ? ++u : --u) { if (values[j] != null) { rightCoord = [j, values[j]]; break; } } - ret[i] = leftCoord[1] + ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * (i - leftCoord[0]); + if (rightCoord) { + ret[i] = leftCoord[1] + ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * (i - leftCoord[0]); + } } } return ret; @@ -1381,22 +1403,22 @@ Event.types = ["processStart", "processComplete", "renderStart", "renderFinished", "blockStarted", "blockFinished"]; Event.trigger = function(target, type, data) { - var event, _i, _len, _ref, _results; + var event, len, o, ref, results; if (data == null) { data = null; } 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]; + ref = this.events[type]; + results = []; + for (o = 0, len = ref.length; o < len; o++) { + event = ref[o]; if (event.target === null || target.id === event.target.id) { - _results.push(event.fn.call(target, data)); + results.push(event.fn.call(target, data)); } else { - _results.push(void 0); + results.push(void 0); } } - return _results; + return results; } }; @@ -1409,7 +1431,7 @@ type = _type; fn = _fn; } - if (__indexOf.call(this.types, type) < 0) { + if (indexOf.call(this.types, type) < 0) { return false; } if (!this.events[type]) { @@ -1453,7 +1475,7 @@ Caman.IO = (function() { function IO() {} - IO.domainRegex = /(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/; + IO.domainRegex = /(?:(?:http|https):\/\/)((?:[-|\w]+)\.(?:(?:-|\w|\.)+))/; IO.isRemote = function(img) { if (img == null) { @@ -1466,8 +1488,7 @@ }; IO.corsEnabled = function(img) { - var _ref; - return (img.crossOrigin != null) && ((_ref = img.crossOrigin.toLowerCase()) === 'anonymous' || _ref === 'use-credentials'); + return true; }; IO.isURLRemote = function(url) { @@ -1495,7 +1516,7 @@ }; IO.proxyUrl = function(src) { - return "" + Caman.remoteProxy + "?" + Caman.proxyParam + "=" + (encodeURIComponent(src)); + return Caman.remoteProxy + "?" + Caman.proxyParam + "=" + (encodeURIComponent(src)); }; IO.useProxy = function(lang) { @@ -1548,8 +1569,8 @@ if (stats.isFile() && !overwrite) { return false; } - } catch (_error) { - e = _error; + } catch (error) { + e = error; Log.debug("Creating output file " + file); } return fs.writeFile(file, this.canvas.toBuffer(), function(err) { @@ -1578,14 +1599,14 @@ type = "png"; } type = type.toLowerCase(); - return this.canvas.toDataURL("image/" + type); + return this.renderingCanvas.toDataURL("image/" + type); }; IO = Caman.IO; Caman.Layer = (function() { - function Layer(c) { - this.c = c; + function Layer(c1) { + this.c = c1; this.filter = this.c; this.options = { blendingMode: 'normal', @@ -1616,9 +1637,9 @@ }; Layer.prototype.copyParent = function() { - var i, parentData, _i, _ref; + var i, o, parentData, ref; parentData = this.c.pixelData; - for (i = _i = 0, _ref = this.c.pixelData.length; _i < _ref; i = _i += 4) { + for (i = o = 0, ref = this.c.pixelData.length; o < ref; i = o += 4) { this.pixelData[i] = parentData[i]; this.pixelData[i + 1] = parentData[i + 1]; this.pixelData[i + 2] = parentData[i + 2]; @@ -1649,11 +1670,11 @@ }; Layer.prototype.applyToParent = function() { - var i, layerData, parentData, result, rgbaLayer, rgbaParent, _i, _ref, _results; + var i, layerData, o, parentData, ref, result, results, rgbaLayer, rgbaParent; 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) { + results = []; + for (i = o = 0, ref = layerData.length; o < ref; i = o += 4) { rgbaParent = { r: parentData[i], g: parentData[i + 1], @@ -1675,9 +1696,9 @@ } 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)))); + results.push(parentData[i + 2] = rgbaParent.b - ((rgbaParent.b - result.b) * (this.options.opacity * (result.a / 255)))); } - return _results; + return results; }; return Layer; @@ -1688,21 +1709,21 @@ Caman.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]; + var len, name, o, ref; + ref = ['log', 'info', 'warn', 'error']; + for (o = 0, len = ref.length; o < len; o++) { + name = ref[o]; this[name] = (function(name) { return function() { var args, e; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + args = 1 <= arguments.length ? slice1.call(arguments, 0) : []; if (!Caman.DEBUG) { return; } try { return console[name].apply(console, args); - } catch (_error) { - e = _error; + } catch (error) { + e = error; return console[name](args); } }; @@ -1732,12 +1753,12 @@ }; }; - function Pixel(r, g, b, a, c) { - this.r = r != null ? r : 0; - this.g = g != null ? g : 0; - this.b = b != null ? b : 0; - this.a = a != null ? a : 255; - this.c = c != null ? c : null; + function Pixel(r1, g1, b1, a1, c1) { + this.r = r1 != null ? r1 : 0; + this.g = g1 != null ? g1 : 0; + this.b = b1 != null ? b1 : 0; + this.a = a1 != null ? a1 : 255; + this.c = c1 != null ? c1 : null; this.loc = 0; } @@ -1859,9 +1880,9 @@ Caman.Renderer = (function() { Renderer.Blocks = Caman.NodeJS ? require('os').cpus().length : 4; - function Renderer(c) { - this.c = c; - this.processNext = __bind(this.processNext, this); + function Renderer(c1) { + this.c = c1; + this.processNext = bind(this.processNext, this); this.renderQueue = []; this.modPixelData = null; } @@ -1908,32 +1929,35 @@ }; Renderer.prototype.eachBlock = function(fn) { - var blockN, blockPixelLength, bnum, end, f, i, lastBlockN, n, start, _i, _ref, _results, - _this = this; + var blockN, blockPixelLength, bnum, end, f, i, lastBlockN, n, o, ref, results, start; 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) { + results = []; + for (i = o = 0, ref = Renderer.Blocks; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { start = i * blockN; end = start + (i === Renderer.Blocks - 1 ? lastBlockN : blockN); if (Caman.NodeJS) { - f = Fiber(function() { - return fn.call(_this, i, start, end); - }); - bnum = f.run(); - _results.push(this.blockFinished(bnum)); - } else { - _results.push(setTimeout((function(i, start, end) { + f = Fiber((function(_this) { return function() { return fn.call(_this, i, start, end); }; - })(i, start, end), 0)); + })(this)); + bnum = f.run(); + results.push(this.blockFinished(bnum)); + } else { + results.push(setTimeout((function(_this) { + return function(i, start, end) { + return function() { + return fn.call(_this, i, start, end); + }; + }; + })(this)(i, start, end), 0)); } } - return _results; + return results; }; Renderer.prototype.executeFilter = function() { @@ -1953,7 +1977,7 @@ }; Renderer.prototype.renderBlock = function(bnum, start, end) { - var i, pixel, _i; + var i, o, pixel, ref, ref1; Log.debug("Block #" + bnum + " - Filter: " + this.currentJob.name + ", Start: " + start + ", End: " + end); Event.trigger(this.c, "blockStarted", { blockNum: bnum, @@ -1963,13 +1987,15 @@ }); pixel = new Pixel(); pixel.setContext(this.c); - for (i = _i = start; _i < end; i = _i += 4) { + for (i = o = ref = start, ref1 = end; o < ref1; i = o += 4) { pixel.loc = i; pixel.r = this.c.pixelData[i]; pixel.g = this.c.pixelData[i + 1]; pixel.b = this.c.pixelData[i + 2]; pixel.a = this.c.pixelData[i + 3]; - this.currentJob.processFn(pixel); + if (this.currentJob.processFn) { + this.currentJob.processFn(pixel); + } this.c.pixelData[i] = Util.clampRGB(pixel.r); this.c.pixelData[i + 1] = Util.clampRGB(pixel.g); this.c.pixelData[i + 2] = Util.clampRGB(pixel.b); @@ -1983,12 +2009,16 @@ }; Renderer.prototype.renderKernel = function(bnum, start, end) { - var adjust, adjustSize, bias, builder, builderIndex, divisor, i, j, k, kernel, n, name, p, pixel, res, _i, _j, _k; + var adjust, adjustSize, bias, builder, builderIndex, divisor, i, j, k, kernel, n, name, o, p, pixel, ref, ref1, ref2, ref3, ref4, ref5, res, u, w; name = this.currentJob.name; bias = this.currentJob.bias; divisor = this.currentJob.divisor; n = this.c.pixelData.length; adjust = this.currentJob.adjust; + if (!adjust) { + this.blockFinished(bnum); + return; + } adjustSize = Math.sqrt(adjust.length); kernel = []; Log.debug("Rendering kernel - Filter: " + this.currentJob.name); @@ -1997,11 +2027,11 @@ builder = (adjustSize - 1) / 2; pixel = new Pixel(); pixel.setContext(this.c); - for (i = _i = start; _i < end; i = _i += 4) { + for (i = o = ref = start, ref1 = end; o < ref1; i = o += 4) { pixel.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) { + for (j = u = ref2 = -builder, ref3 = builder; ref2 <= ref3 ? u <= ref3 : u >= ref3; j = ref2 <= ref3 ? ++u : --u) { + for (k = w = ref4 = builder, ref5 = -builder; ref4 <= ref5 ? w <= ref5 : w >= ref5; k = ref4 <= ref5 ? ++w : --w) { p = pixel.getPixelRelative(j, k); kernel[builderIndex * 3] = p.r; kernel[builderIndex * 3 + 1] = p.g; @@ -2023,7 +2053,7 @@ }; Renderer.prototype.blockFinished = function(bnum) { - var i, _i, _ref; + var i, o, ref; if (bnum >= 0) { Log.debug("Block #" + bnum + " finished! Filter: " + this.currentJob.name); } @@ -2035,7 +2065,7 @@ }); 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) { + for (i = o = 0, ref = this.c.pixelData.length; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { this.c.pixelData[i] = this.modPixelData[i]; } } @@ -2048,13 +2078,13 @@ }; Renderer.prototype.processKernel = function(adjust, kernel, divisor, bias) { - var i, val, _i, _ref; + var i, o, ref, val; 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) { + for (i = o = 0, ref = adjust.length; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { val.r += adjust[i] * kernel[i * 3]; val.g += adjust[i] * kernel[i * 3 + 1]; val.b += adjust[i] * kernel[i * 3 + 2]; @@ -2066,16 +2096,17 @@ }; Renderer.prototype.loadOverlay = function(layer, src) { - var img, proxyUrl, - _this = this; + var img, proxyUrl; img = new Image(); - 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(); - }; + img.onload = (function(_this) { + return 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(); + }; + })(this); proxyUrl = IO.remoteCheck(src); return img.src = proxyUrl != null ? proxyUrl : src; }; @@ -2104,10 +2135,11 @@ }; Store.execute = function(search, callback) { - var _this = this; - setTimeout(function() { - return callback.call(_this.get(search), _this.get(search)); - }, 0); + setTimeout((function(_this) { + return function() { + return callback.call(_this.get(search), _this.get(search)); + }; + })(this), 0); return this.get(search); }; @@ -2313,14 +2345,14 @@ Filter.register("hue", function(adjust) { return this.process("hue", function(rgba) { - var b, g, h, hsv, r, _ref; + var b, g, h, hsv, r, ref; 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; - _ref = Convert.hsvToRGB(hsv.h, hsv.s, hsv.v), r = _ref.r, g = _ref.g, b = _ref.b; + ref = Convert.hsvToRGB(hsv.h, hsv.s, hsv.v), r = ref.r, g = ref.g, b = ref.b; rgba.r = r; rgba.g = g; rgba.b = b; @@ -2420,7 +2452,7 @@ return this; } for (chan in options) { - if (!__hasProp.call(options, chan)) continue; + if (!hasProp.call(options, chan)) continue; value = options[chan]; if (value === 0) { delete options[chan]; @@ -2458,8 +2490,8 @@ }); Filter.register("curves", function() { - var algo, bezier, chans, cps, end, i, last, start, _i, _j, _ref, _ref1; - chans = arguments[0], cps = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + var algo, bezier, chans, cps, end, i, last, o, ref, ref1, start, u; + chans = arguments[0], cps = 2 <= arguments.length ? slice1.call(arguments, 1) : []; last = cps[cps.length - 1]; if (typeof last === "function") { algo = last; @@ -2482,19 +2514,19 @@ bezier = algo(cps, 0, 255); start = cps[0]; if (start[0] > 0) { - for (i = _i = 0, _ref = start[0]; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + for (i = o = 0, ref = start[0]; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { bezier[i] = start[1]; } } end = cps[cps.length - 1]; if (end[0] < 255) { - for (i = _j = _ref1 = end[0]; _ref1 <= 255 ? _j <= 255 : _j >= 255; i = _ref1 <= 255 ? ++_j : --_j) { + for (i = u = ref1 = end[0]; ref1 <= 255 ? u <= 255 : u >= 255; i = ref1 <= 255 ? ++u : --u) { 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) { + var ref2, w; + for (i = w = 0, ref2 = chans.length; 0 <= ref2 ? w < ref2 : w > ref2; i = 0 <= ref2 ? ++w : --w) { rgba[chans[i]] = bezier[rgba[chans[i]]]; } return rgba; @@ -2662,7 +2694,7 @@ }); Filter.register("rectangularVignette", function(opts) { - var defaults, dim, percent, size, _i, _len, _ref; + var defaults, dim, len, o, percent, ref, size; defaults = { strength: 50, cornerRadius: 0, @@ -2683,9 +2715,9 @@ 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]; + ref = ["width", "height"]; + for (o = 0, len = ref.length; o < len; o++) { + dim = ref[o]; if (typeof opts.size[dim] === "string") { opts.size[dim] = this.dimensions[dim] * (parseInt(opts.size[dim], 10) / 100); } @@ -2769,6 +2801,7 @@ }); }); + /* CompoundBlur - Blurring with varying radii for Canvas @@ -2805,8 +2838,7 @@ 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; @@ -2856,7 +2888,7 @@ 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; + var b_in_sum, b_out_sum, b_sum, blend, currentIndex, div, g_in_sum, g_out_sum, g_sum, height, heightMinus1, i, i1, iblend, idx, imagePixels, index, iradius, j1, k1, l1, lookupValue, mul_sum, n1, o, o1, p, pb, pg, pixels, pr, q1, r_in_sum, r_out_sum, r_sum, radiusPixels, radiusPlus1, rbs, ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, shg_sum, stack, stackEnd, stackIn, stackOut, stackStart, steps, sumFactor, u, w, w4, wh, wh4, width, widthMinus1, x, y, yi, yp, yw; width = this.dimensions.width; height = this.dimensions.height; imagePixels = this.pixelData; @@ -2864,7 +2896,7 @@ wh = width * height; wh4 = wh << 2; pixels = []; - for (i = _i = 0; 0 <= wh4 ? _i < wh4 : _i > wh4; i = 0 <= wh4 ? ++_i : --_i) { + for (i = o = 0, ref = wh4; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { pixels[i] = imagePixels[i]; } currentIndex = 0; @@ -2887,7 +2919,7 @@ stackStart = new BlurStack(); stackEnd = void 0; stack = stackStart; - for (i = _j = 1; 1 <= div ? _j < div : _j > div; i = 1 <= div ? ++_j : --_j) { + for (i = u = 1, ref1 = div; 1 <= ref1 ? u < ref1 : u > ref1; i = 1 <= ref1 ? ++u : --u) { stack = stack.next = new BlurStack(); if (i === radiusPlus1) { stackEnd = stack; @@ -2899,7 +2931,7 @@ 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) { + for (y = w = 0, ref2 = height; 0 <= ref2 ? w < ref2 : w > ref2; y = 0 <= ref2 ? ++w : --w) { 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]); @@ -2908,13 +2940,13 @@ 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) { + for (i = i1 = 0, ref3 = radiusPlus1; 0 <= ref3 ? i1 < ref3 : i1 > ref3; i = 0 <= ref3 ? ++i1 : --i1) { 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) { + for (i = j1 = 1, ref4 = radiusPlus1; 1 <= ref4 ? j1 < ref4 : j1 > ref4; i = 1 <= ref4 ? ++j1 : --j1) { 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; @@ -2926,7 +2958,7 @@ } stackIn = stackStart; stackOut = stackEnd; - for (x = _n = 0; 0 <= width ? _n < width : _n > width; x = 0 <= width ? ++_n : --_n) { + for (x = k1 = 0, ref5 = width; 0 <= ref5 ? k1 < ref5 : k1 > ref5; x = 0 <= ref5 ? ++k1 : --k1) { 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; @@ -2955,7 +2987,7 @@ } yw += width; } - for (x = _o = 0; 0 <= width ? _o < width : _o > width; x = 0 <= width ? ++_o : --_o) { + for (x = l1 = 0, ref6 = width; 0 <= ref6 ? l1 < ref6 : l1 > ref6; x = 0 <= ref6 ? ++l1 : --l1) { 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]); @@ -2965,14 +2997,14 @@ 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) { + for (i = n1 = 0, ref7 = radiusPlus1; 0 <= ref7 ? n1 < ref7 : n1 > ref7; i = 0 <= ref7 ? ++n1 : --n1) { 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) { + for (i = o1 = 1, ref8 = radiusPlus1; 1 <= ref8 ? o1 < ref8 : o1 > ref8; i = 1 <= ref8 ? ++o1 : --o1) { yi = (yp + x) << 2; r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i); g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs; @@ -2988,7 +3020,7 @@ yi = x; stackIn = stackStart; stackOut = stackEnd; - for (y = _r = 0; 0 <= height ? _r < height : _r > height; y = 0 <= height ? ++_r : --_r) { + for (y = q1 = 0, ref9 = height; 0 <= ref9 ? q1 < ref9 : q1 > ref9; y = 0 <= ref9 ? ++q1 : --q1) { p = yi << 2; pixels[p] = (r_sum * mul_sum) >> shg_sum; pixels[p + 1] = (g_sum * mul_sum) >> shg_sum; @@ -3445,6 +3477,8 @@ ctx.rotate(angle * to_radians); ctx.drawImage(this.canvas, -this.canvas.width / 2, -this.canvas.height / 2, this.canvas.width, this.canvas.height); ctx.restore(); + this.rotationAngle += degrees; + this.rotated = true; return this.replaceCanvas(canvas); }); @@ -3452,6 +3486,7 @@ return this.processPlugin("rotate", Array.prototype.slice.call(arguments, 0)); }); + /* StackBlur - a fast almost Gaussian Blur For Canvas v0.31 modified for CamanJS @@ -3491,8 +3526,7 @@ 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; @@ -3506,7 +3540,7 @@ 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; + var b_in_sum, b_out_sum, b_sum, div, g_in_sum, g_out_sum, g_sum, height, heightMinus1, i, i1, j1, k1, l1, mul_sum, n1, o, o1, p, pb, pg, pixels, pr, r_in_sum, r_out_sum, r_sum, radiusPlus1, rbs, ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, shg_sum, stack, stackEnd, stackIn, stackOut, stackStart, sumFactor, u, w, w4, width, widthMinus1, x, y, yi, yp, yw; if (isNaN(radius) || radius < 1) { return; } @@ -3522,7 +3556,7 @@ 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) { + for (i = o = 1, ref = div; 1 <= ref ? o < ref : o > ref; i = 1 <= ref ? ++o : --o) { stack = stack.next = new BlurStack(); if (i === radiusPlus1) { stackEnd = stack; @@ -3534,7 +3568,7 @@ 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) { + for (y = u = 0, ref1 = height; 0 <= ref1 ? u < ref1 : u > ref1; y = 0 <= ref1 ? ++u : --u) { 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]); @@ -3543,13 +3577,13 @@ 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) { + for (i = w = 0, ref2 = radiusPlus1; 0 <= ref2 ? w < ref2 : w > ref2; i = 0 <= ref2 ? ++w : --w) { 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) { + for (i = i1 = 1, ref3 = radiusPlus1; 1 <= ref3 ? i1 < ref3 : i1 > ref3; i = 1 <= ref3 ? ++i1 : --i1) { 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; @@ -3561,7 +3595,7 @@ } stackIn = stackStart; stackOut = stackEnd; - for (x = _m = 0; 0 <= width ? _m < width : _m > width; x = 0 <= width ? ++_m : --_m) { + for (x = j1 = 0, ref4 = width; 0 <= ref4 ? j1 < ref4 : j1 > ref4; x = 0 <= ref4 ? ++j1 : --j1) { 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; @@ -3590,7 +3624,7 @@ } yw += width; } - for (x = _n = 0; 0 <= width ? _n < width : _n > width; x = 0 <= width ? ++_n : --_n) { + for (x = k1 = 0, ref5 = width; 0 <= ref5 ? k1 < ref5 : k1 > ref5; x = 0 <= ref5 ? ++k1 : --k1) { 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]); @@ -3600,14 +3634,14 @@ 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) { + for (i = l1 = 0, ref6 = radiusPlus1; 0 <= ref6 ? l1 < ref6 : l1 > ref6; i = 0 <= ref6 ? ++l1 : --l1) { 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) { + for (i = n1 = 1, ref7 = radius; 1 <= ref7 ? n1 <= ref7 : n1 >= ref7; i = 1 <= ref7 ? ++n1 : --n1) { yi = (yp + x) << 2; r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i); g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs; @@ -3623,7 +3657,7 @@ yi = x; stackIn = stackStart; stackOut = stackEnd; - for (y = _q = 0; 0 <= height ? _q < height : _q > height; y = 0 <= height ? ++_q : --_q) { + for (y = o1 = 0, ref8 = height; 0 <= ref8 ? o1 < ref8 : o1 > ref8; y = 0 <= ref8 ? ++o1 : --o1) { p = yi << 2; pixels[p] = (r_sum * mul_sum) >> shg_sum; pixels[p + 1] = (g_sum * mul_sum) >> shg_sum; diff --git a/dist/caman.full.min.js b/dist/caman.full.min.js index 437fbcab..05729f0d 100644 --- a/dist/caman.full.min.js +++ b/dist/caman.full.min.js @@ -1,92 +1,91 @@ -(function(){var $,Analyze,Blender,Calculate,Caman,CamanParser,Canvas,Convert,Event,Fiber,Filter,IO,Image,Layer,Log,Module,Pixel,Plugin,Renderer,Root,Store,Util,fs,http,moduleKeywords,slice,vignetteFilters,__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;};Util.dataArray=function(length){if(length==null){length=0;} +return val;};Util.copyAttributes=function(from,to,opts){var attr,len,o,ref,ref1,results;if(opts==null){opts={};} +ref=from.attributes;results=[];for(o=0,len=ref.length;o=0)){continue;} +results.push(to.setAttribute(attr.nodeName,attr.nodeValue));} +return results;};Util.dataArray=function(length){if(length==null){length=0;} if(Caman.NodeJS||(window.Uint8Array!=null)){return new Uint8Array(length);} return new Array(length);};return Util;})();if(typeof exports!=="undefined"&&exports!==null){Root=exports;Canvas=require('canvas');Image=Canvas.Image;Fiber=require('fibers');fs=require('fs');http=require('http');}else{Root=window;} -Caman=(function(_super){__extends(Caman,_super);Caman.version={release:"4.1.2",date:"7/27/2013"};Caman.DEBUG=false;Caman.allowRevert=true;Caman.crossOrigin="anonymous";Caman.remoteProxy="";Caman.proxyParam="camanProxyUrl";Caman.NodeJS=typeof exports!=="undefined"&&exports!==null;Caman.autoload=!Caman.NodeJS;Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.getAttrId=function(canvas){if(Caman.NodeJS){return true;} +Caman=(function(superClass){extend(Caman,superClass);Caman.version={release:"4.1.2",date:"7/27/2013"};Caman.DEBUG=false;Caman.allowRevert=true;Caman.crossOrigin="anonymous";Caman.remoteProxy="";Caman.proxyParam="camanProxyUrl";Caman.NodeJS=typeof exports!=="undefined"&&exports!==null;Caman.autoload=!Caman.NodeJS;Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.getAttrId=function(canvas){if(Caman.NodeJS){return true;} if(typeof canvas==="string"){canvas=$(canvas);} if(!((canvas!=null)&&(canvas.getAttribute!=null))){return null;} -return canvas.getAttribute('data-caman-id');};function Caman(){this.nodeFileReady=__bind(this.nodeFileReady,this);var args,callback,id,_this=this;if(arguments.length===0){throw"Invalid arguments";} +return canvas.getAttribute('data-caman-id');};function Caman(){this.nodeFileReady=bind(this.nodeFileReady,this);var args,callback,id;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.initializedPixelData=this.originalPixelData=null;this.cropCoordinates={x:0,y:0};this.cropped=false;this.resized=false;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){var key,val,_ref,_results;if(args.length===0){throw"Invalid arguments given";} +this.id=Util.uniqid.get();this.initializedPixelData=this.originalPixelData=null;this.cropCoordinates={x:0,y:0};this.cropped=false;this.resized=false;this.rotated=false;this.rotationAngle=0;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){return function(){_this.parseArguments(args);return _this.setup();};})(this));return this;}else{return new Caman(arguments);}} +Caman.prototype.domIsLoaded=function(cb){var listener;if(Caman.NodeJS){return setTimeout((function(_this){return function(){return cb.call(_this);};})(this),0);}else{if(document.readyState==="complete"){Log.debug("DOM initialized");return setTimeout((function(_this){return function(){return cb.call(_this);};})(this),0);}else{listener=(function(_this){return function(){if(document.readyState==="complete"){Log.debug("DOM initialized");return cb.call(_this);}};})(this);return document.addEventListener("readystatechange",listener,false);}}};Caman.prototype.parseArguments=function(args){var key,ref,results,val;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;} -this.callback=args[2];if(args.length===4){_ref=args[4];_results=[];for(key in _ref){if(!__hasProp.call(_ref,key))continue;val=_ref[key];_results.push(this.options[key]=val);} -return _results;}};Caman.prototype.setInitObject=function(obj){if(Caman.NodeJS){this.initObj=obj;this.initType='node';return;} +this.callback=args[2];if(args.length===4){ref=args[4];results=[];for(key in ref){if(!hasProp.call(ref,key))continue;val=ref[key];results.push(this.options[key]=val);} +return results;}};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);} if(this.initObj==null){throw"Could not find image or canvas for initialization.";} 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(){Log.debug("Initializing for NodeJS");if(typeof this.initObj==="string"&&this.initObj.match(/^https?:\/\//)){return this.readFromHttp(this.initObj,this.nodeFileReady);}else if(typeof this.initObj==="string"){return fs.readFile(this.initObj,this.nodeFileReady);}else{return this.nodeFileReady(null,this.initObj);}};Caman.prototype.readFromHttp=function(url,callback){var req;Log.debug("Fetching image from "+url);req=http.get(url,function(res){var buf;buf='';res.setEncoding('binary');res.on('data',function(chunk){return buf+=chunk;});return res.on('end',function(){return callback(null,new Buffer(buf,'binary'));});});return req.on('error',callback);};Caman.prototype.nodeFileReady=function(err,data){if(err){throw err;} -this.image=new Image();this.image.src=data;Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));this.canvas=new Canvas(this.imageWidth(),this.imageHeight());return this.finishInit();};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']});if(this.image.parentNode!=null){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();} +this.image=new Image();this.image.src=data;Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));this.canvas=new Canvas(this.imageWidth(),this.imageHeight());this.renderingCanvas=new Canvas(this.imageWidth(),this.imageHeight());return this.finishInit();};Caman.prototype.initImage=function(){this.image=this.initObj;this.canvas=document.createElement('canvas');this.context=this.canvas.getContext('2d');this.renderingCanvas=document.createElement('canvas');this.renderingContext=this.renderingCanvas.getContext('2d');Util.copyAttributes(this.image,this.canvas,{except:['src']});Util.copyAttributes(this.image,this.renderingCanvas,{except:['src']});if(this.image.parentNode!=null){this.image.parentNode.replaceChild(this.renderingCanvas,this.image);} +this.imageAdjustments();return this.waitForImageLoaded();};Caman.prototype.initCanvas=function(){this.canvas=document.createElement('canvas');this.context=this.canvas.getContext('2d');this.renderingCanvas=this.initObj;this.renderingContext=this.renderingCanvas.getContext('2d');this.canvas.width=this.renderingCanvas.width;this.canvas.height=this.renderingCanvas.height;if(this.imageUrl!=null){this.image=document.createElement('img');this.image.crossOrigin='anonymous';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.isImageLoaded()){return this.imageLoaded();}else{return this.image.onload=this.imageLoaded;}};Caman.prototype.isImageLoaded=function(){if(!this.image.complete){return false;} if((this.image.naturalWidth!=null)&&this.image.naturalWidth===0){return false;} -return true;};Caman.prototype.imageWidth=function(){return this.image.width||this.image.naturalWidth;};Caman.prototype.imageHeight=function(){return this.image.height||this.image.naturalHeight;};Caman.prototype.imageLoaded=function(){Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));if(this.swapped){this.canvas.width=this.imageWidth()/this.hiDPIRatio();this.canvas.height=this.imageHeight()/this.hiDPIRatio();}else{this.canvas.width=this.imageWidth();this.canvas.height=this.imageHeight();} -return this.finishInit();};Caman.prototype.finishInit=function(){var i,pixel,_i,_len,_ref;if(this.context==null){this.context=this.canvas.getContext('2d');} +return true;};Caman.prototype.imageWidth=function(){return this.image.width||this.image.naturalWidth;};Caman.prototype.imageHeight=function(){return this.image.height||this.image.naturalHeight;};Caman.prototype.imageLoaded=function(){Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));if(this.swapped){this.canvas.width=this.imageWidth()/this.hiDPIRatio();this.canvas.height=this.imageHeight()/this.hiDPIRatio();this.renderingCanvas.width=this.imageWidth()/this.hiDPIRatio();this.renderingCanvas.height=this.imageHeight()/this.hiDPIRatio();}else{this.canvas.width=this.imageWidth();this.canvas.height=this.imageHeight();this.renderingCanvas.width=this.imageWidth();this.renderingCanvas.height=this.imageHeight();} +return this.finishInit();};Caman.prototype.finishInit=function(){var i,len,o,pixel,ref;if(this.context==null){this.context=this.canvas.getContext('2d');} +if(this.renderingContext==null){this.renderingContext=this.renderingCanvas.getContext('2d');} this.originalWidth=this.preScaledWidth=this.width=this.canvas.width;this.originalHeight=this.preScaledHeight=this.height=this.canvas.height;this.hiDPIAdjustments();if(!this.hasId()){this.assignId();} -if(this.image!=null){this.context.drawImage(this.image,0,0,this.imageWidth(),this.imageHeight(),0,0,this.preScaledWidth,this.preScaledHeight);} -this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;if(Caman.allowRevert){this.initializedPixelData=Util.dataArray(this.pixelData.length);this.originalPixelData=Util.dataArray(this.pixelData.length);_ref=this.pixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.initializedPixelData[i]=pixel;this.originalPixelData[i]=pixel;}} +if(this.image!=null){this.context.drawImage(this.image,0,0,this.imageWidth(),this.imageHeight(),0,0,this.preScaledWidth,this.preScaledHeight);this.renderingContext.drawImage(this.image,0,0,this.imageWidth(),this.imageHeight(),0,0,this.preScaledWidth,this.preScaledHeight);} +this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;if(Caman.allowRevert){this.initializedPixelData=Util.dataArray(this.pixelData.length);this.originalPixelData=Util.dataArray(this.pixelData.length);ref=this.pixelData;for(i=o=0,len=ref.length;o_ref;i=0<=_ref?++_i:--_i){divisor+=adjust[i];}} -this.renderer.add({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias});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;})(Module);Root.Caman=Caman;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;})();Analyze=Caman.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);}})();} +if(divisor==null){divisor=0;for(i=o=0,ref=adjust.length;0<=ref?oref;i=0<=ref?++o:--o){divisor+=adjust[i];}} +this.renderer.add({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias});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;})(Module);Root.Caman=Caman;Caman.Analyze=(function(){function Analyze(c1){this.c=c1;} +Analyze.prototype.calculateLevels=function(){var i,levels,numPixels,o,ref,u,w;levels={r:{},g:{},b:{}};for(i=o=0;o<=255;i=++o){levels.r[i]=0;levels.g[i]=0;levels.b[i]=0;} +for(i=u=0,ref=this.c.pixelData.length;u0)){return;} +results=[];for(o=0,len=imgs.length;o0)){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(_error){e=_error;_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=(function(){function Blender(){} +CamanParser.prototype.parse=function(){var args,e,filter,func,inst,instFunc,len,m,o,r,ref,results,unparsedInstructions;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(o=0,len=unparsedInstructions.length;o1){next=[];for(j=_j=0,_ref=prev.length-2;0<=_ref?_j<=_ref:_j>=_ref;j=0<=_ref?++_j:--_j){next.push([lerp(prev[j][0],prev[j+1][0],t),lerp(prev[j][1],prev[j+1][1],t)]);} +bezier={};lerp=function(a,b,t){return a*(1-t)+b*t;};clamp=function(a,min,max){return Math.min(Math.max(a,min),max);};for(i=o=0;o<1000;i=++o){t=i/1000;prev=controlPoints;while(prev.length>1){next=[];for(j=u=0,ref=prev.length-2;0<=ref?u<=ref:u>=ref;j=0<=ref?++u:--u){next.push([lerp(prev[j][0],prev[j+1][0],t),lerp(prev[j][1],prev[j+1][1],t)]);} prev=next;} bezier[Math.round(prev[0][0])]=Math.round(clamp(prev[0][1],lowBound,highBound));} endX=controlPoints[controlPoints.length-1][0];bezier=Caman.Calculate.missingValues(bezier,endX);if(bezier[endX]==null){bezier[endX]=bezier[endX-1];} -return bezier;};Calculate.hermite=function(controlPoints,lowBound,highBound){var add,clamp,count,endX,fac0,fac1,fac2,fac3,i,j,lerp,m0,m1,mul,p,p0,p1,pointsPerSegment,pointsPerStep,pos,ret,sub,t,_i,_j,_ref,_this=this;if(controlPoints.length<2){throw"Invalid number of arguments to hermite";} -ret={};lerp=function(a,b,t){return a*(1-t)+b*t;};add=function(a,b,c,d){return[a[0]+b[0]+c[0]+d[0],a[1]+b[1]+c[1]+d[1]];};mul=function(a,b){return[a[0]*b[0],a[1]*b[1]];};sub=function(a,b){return[a[0]-b[0],a[1]-b[1]];};clamp=function(a,min,max){return Math.min(Math.max(a,min),max);};count=0;for(i=_i=0,_ref=controlPoints.length-2;0<=_ref?_i<=_ref:_i>=_ref;i=0<=_ref?++_i:--_i){p0=controlPoints[i];p1=controlPoints[i+1];pointsPerSegment=p1[0]-p0[0];pointsPerStep=1/pointsPerSegment;if(i===controlPoints.length-2){pointsPerStep=1/(pointsPerSegment-1);} -p=i>0?controlPoints[i-1]:p0;m0=mul(sub(p1,p),[0.5,0.5]);p=i=pointsPerSegment;j=0<=pointsPerSegment?++_j:--_j){t=j*pointsPerStep;fac0=2.0*t*t*t-3.0*t*t+1.0;fac1=t*t*t-2.0*t*t+t;fac2=-2.0*t*t*t+3.0*t*t;fac3=t*t*t-t*t;pos=add(mul(p0,[fac0,fac0]),mul(m0,[fac1,fac1]),mul(p1,[fac2,fac2]),mul(m1,[fac3,fac3]));ret[Math.round(pos[0])]=Math.round(clamp(pos[1],lowBound,highBound));count+=1;}} -endX=controlPoints[controlPoints.length-1][0];ret=Caman.Calculate.missingValues(ret,endX);return ret;};Calculate.missingValues=function(values,endX){var i,j,leftCoord,ret,rightCoord,_i,_j;if(Object.keys(values).length=endX;i=0<=endX?++_i:--_i){if(values[i]!=null){ret[i]=values[i];}else{leftCoord=[i-1,ret[i-1]];for(j=_j=i;i<=endX?_j<=endX:_j>=endX;j=i<=endX?++_j:--_j){if(values[j]!=null){rightCoord=[j,values[j]];break;}} -ret[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}} +return bezier;};Calculate.hermite=function(controlPoints,lowBound,highBound){var add,clamp,count,endX,fac0,fac1,fac2,fac3,i,j,lerp,m0,m1,mul,o,p,p0,p1,pointsPerSegment,pointsPerStep,pos,ref,ref1,ret,sub,t,u;if(controlPoints.length<2){throw"Invalid number of arguments to hermite";} +ret={};lerp=function(a,b,t){return a*(1-t)+b*t;};add=(function(_this){return function(a,b,c,d){return[a[0]+b[0]+c[0]+d[0],a[1]+b[1]+c[1]+d[1]];};})(this);mul=(function(_this){return function(a,b){return[a[0]*b[0],a[1]*b[1]];};})(this);sub=(function(_this){return function(a,b){return[a[0]-b[0],a[1]-b[1]];};})(this);clamp=function(a,min,max){return Math.min(Math.max(a,min),max);};count=0;for(i=o=0,ref=controlPoints.length-2;0<=ref?o<=ref:o>=ref;i=0<=ref?++o:--o){p0=controlPoints[i];p1=controlPoints[i+1];pointsPerSegment=p1[0]-p0[0];pointsPerStep=1/pointsPerSegment;if(i===controlPoints.length-2){pointsPerStep=1/(pointsPerSegment-1);} +p=i>0?controlPoints[i-1]:p0;m0=mul(sub(p1,p),[0.5,0.5]);p=i=ref1;j=0<=ref1?++u:--u){t=j*pointsPerStep;fac0=2.0*t*t*t-3.0*t*t+1.0;fac1=t*t*t-2.0*t*t+t;fac2=-2.0*t*t*t+3.0*t*t;fac3=t*t*t-t*t;pos=add(mul(p0,[fac0,fac0]),mul(m0,[fac1,fac1]),mul(p1,[fac2,fac2]),mul(m1,[fac3,fac3]));ret[Math.round(pos[0])]=Math.round(clamp(pos[1],lowBound,highBound));count+=1;}} +endX=controlPoints[controlPoints.length-1][0];ret=Caman.Calculate.missingValues(ret,endX);return ret;};Calculate.missingValues=function(values,endX){var i,j,leftCoord,o,ref,ref1,ref2,ret,rightCoord,u;if(Object.keys(values).length=ref;i=0<=ref?++o:--o){if(values[i]!=null){ret[i]=values[i];}else{leftCoord=[i-1,ret[i-1]];for(j=u=ref1=i,ref2=endX;ref1<=ref2?u<=ref2:u>=ref2;j=ref1<=ref2?++u:--u){if(values[j]!=null){rightCoord=[j,values[j]];break;}} +if(rightCoord){ret[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}}} return ret;} return values;};return Calculate;})();Calculate=Caman.Calculate;Caman.Convert=(function(){function Convert(){} Convert.hexToRGB=function(hex){var b,g,r;if(hex.charAt(0)==="#"){hex=hex.substr(1);} @@ -117,33 +116,33 @@ 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;})();Convert=Caman.Convert;Caman.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(data==null){data=null;} -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;} +Event.events={};Event.types=["processStart","processComplete","renderStart","renderFinished","blockStarted","blockFinished"];Event.trigger=function(target,type,data){var event,len,o,ref,results;if(data==null){data=null;} +if(this.events[type]&&this.events[type].length){ref=this.events[type];results=[];for(o=0,len=ref.length;o_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);});bnum=f.run();_results.push(this.blockFinished(bnum));}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 i,pixel,_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});pixel=new Pixel();pixel.setContext(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){p=pixel.getPixelRelative(j,k);kernel[builderIndex*3]=p.r;kernel[builderIndex*3+1]=p.g;kernel[builderIndex*3+2]=p.b;builderIndex++;}} +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=Util.dataArray(this.c.pixelData.length);return this.processNext();};Renderer.prototype.eachBlock=function(fn){var blockN,blockPixelLength,bnum,end,f,i,lastBlockN,n,o,ref,results,start;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=o=0,ref=Renderer.Blocks;0<=ref?oref;i=0<=ref?++o:--o){start=i*blockN;end=start+(i===Renderer.Blocks-1?lastBlockN:blockN);if(Caman.NodeJS){f=Fiber((function(_this){return function(){return fn.call(_this,i,start,end);};})(this));bnum=f.run();results.push(this.blockFinished(bnum));}else{results.push(setTimeout((function(_this){return function(i,start,end){return function(){return fn.call(_this,i,start,end);};};})(this)(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 i,o,pixel,ref,ref1;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});pixel=new Pixel();pixel.setContext(this.c);for(i=o=ref=start,ref1=end;o=ref3;j=ref2<=ref3?++u:--u){for(k=w=ref4=builder,ref5=-builder;ref4<=ref5?w<=ref5:w>=ref5;k=ref4<=ref5?++w:--w){p=pixel.getPixelRelative(j,k);kernel[builderIndex*3]=p.r;kernel[builderIndex*3+1]=p.g;kernel[builderIndex*3+2]=p.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];} -if(Caman.NodeJS){return Fiber["yield"](bnum);}else{return this.blockFinished(bnum);}};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(Caman.NodeJS){return Fiber["yield"](bnum);}else{return this.blockFinished(bnum);}};Renderer.prototype.blockFinished=function(bnum){var i,o,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=o=0,ref=this.c.pixelData.length;0<=ref?oref;i=0<=ref?++o:--o){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=new Image();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;})();Renderer=Caman.Renderer;Caman.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;} +Event.trigger(this.c,"processComplete",this.currentJob);return this.processNext();}};Renderer.prototype.processKernel=function(adjust,kernel,divisor,bias){var i,o,ref,val;val={r:0,g:0,b:0};for(i=o=0,ref=adjust.length;0<=ref?oref;i=0<=ref?++o:--o){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;img=new Image();img.onload=(function(_this){return 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();};})(this);proxyUrl=IO.remoteCheck(src);return img.src=proxyUrl!=null?proxyUrl:src;};return Renderer;})();Renderer=Caman.Renderer;Caman.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){setTimeout((function(_this){return function(){return callback.call(_this.get(search),_this.get(search));};})(this),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;})();Store=Caman.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;} @@ -175,25 +176,25 @@ 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 b,g,h,hsv,r,_ref;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;_ref=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v),r=_ref.r,g=_ref.g,b=_ref.b;rgba.r=r;rgba.g=g;rgba.b=b;return rgba;});});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 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 b,g,h,hsv,r,ref;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;ref=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v),r=ref.r,g=ref.g,b=ref.b;rgba.r=r;rgba.g=g;rgba.b=b;return rgba;});});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 algo,bezier,chans,cps,end,i,last,start,_i,_j,_ref,_ref1;chans=arguments[0],cps=2<=arguments.length?__slice.call(arguments,1):[];last=cps[cps.length-1];if(typeof last==="function"){algo=last;cps.pop();}else if(typeof last==="string"){algo=Calculate[last];cps.pop();}else{algo=Calculate.bezier;} +return rgba;});});Filter.register("curves",function(){var algo,bezier,chans,cps,end,i,last,o,ref,ref1,start,u;chans=arguments[0],cps=2<=arguments.length?slice1.call(arguments,1):[];last=cps[cps.length-1];if(typeof last==="function"){algo=last;cps.pop();}else if(typeof last==="string"){algo=Calculate[last];cps.pop();}else{algo=Calculate.bezier;} if(typeof chans==="string"){chans=chans.split("");} if(chans[0]==="v"){chans=['r','g','b'];} if(cps.length<2){throw"Invalid number of arguments to curves filter";} -bezier=algo(cps,0,255);start=cps[0];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];}} -end=cps[cps.length-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]]];} +bezier=algo(cps,0,255);start=cps[0];if(start[0]>0){for(i=o=0,ref=start[0];0<=ref?oref;i=0<=ref?++o:--o){bezier[i]=start[1];}} +end=cps[cps.length-1];if(end[0]<255){for(i=u=ref1=end[0];ref1<=255?u<=255:u>=255;i=ref1<=255?++u:--u){bezier[i]=end[1];}} +return this.process("curves",function(rgba){var ref2,w;for(i=w=0,ref2=chans.length;0<=ref2?wref2;i=0<=ref2?++w:--w){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.Plugin.register("crop",function(width,height,x,y){var canvas,ctx;if(x==null){x=0;} if(y==null){y=0;} @@ -207,7 +208,7 @@ return this.processKernel("Motion Blur",kernel);});Caman.Filter.register("sharpe 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=rgba.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};} +return rgba;});});Filter.register("rectangularVignette",function(opts){var defaults,dim,len,o,percent,ref,size;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(o=0,len=ref.length;oopts.corners[0].x&&loc.xopts.coords.bottom&&loc.yopts.coords.left&&loc.xopts.corners[3].y&& if(loc.x>opts.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];} +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,i1,iblend,idx,imagePixels,index,iradius,j1,k1,l1,lookupValue,mul_sum,n1,o,o1,p,pb,pg,pixels,pr,q1,r_in_sum,r_out_sum,r_sum,radiusPixels,radiusPlus1,rbs,ref,ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9,shg_sum,stack,stackEnd,stackIn,stackOut,stackStart,steps,sumFactor,u,w,w4,wh,wh4,width,widthMinus1,x,y,yi,yp,yw;width=this.dimensions.width;height=this.dimensions.height;imagePixels=this.pixelData;radiusPixels=radiusData.data;wh=width*height;wh4=wh<<2;pixels=[];for(i=o=0,ref=wh4;0<=ref?oref;i=0<=ref?++o:--o){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)ref1;i=1<=ref1?++u:--u){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=w=0,ref2=height;0<=ref2?wref2;y=0<=ref2?++w:--w){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=i1=0,ref3=radiusPlus1;0<=ref3?i1ref3;i=0<=ref3?++i1:--i1){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +for(i=j1=1,ref4=radiusPlus1;1<=ref4?j1ref4;i=1<=ref4?++j1:--j1){p=yi+((widthMinus1ref5;x=0<=ref5?++k1:--k1){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)ref6;x=0<=ref6?++l1:--l1){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=n1=0,ref7=radiusPlus1;0<=ref7?n1ref7;i=0<=ref7?++n1:--n1){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +yp=width;for(i=o1=1,ref8=radiusPlus1;1<=ref8?o1ref8;i=1<=ref8?++o1:--o1){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(iref9;y=0<=ref9?++q1:--q1){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)ref;i=1<=ref?++o:--o){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=u=0,ref1=height;0<=ref1?uref1;y=0<=ref1?++u:--u){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=w=0,ref2=radiusPlus1;0<=ref2?wref2;i=0<=ref2?++w:--w){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +for(i=i1=1,ref3=radiusPlus1;1<=ref3?i1ref3;i=1<=ref3?++i1:--i1){p=yi+((widthMinus1ref4;x=0<=ref4?++j1:--j1){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)ref5;x=0<=ref5?++k1:--k1){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=l1=0,ref6=radiusPlus1;0<=ref6?l1ref6;i=0<=ref6?++l1:--l1){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +yp=width;for(i=n1=1,ref7=radius;1<=ref7?n1<=ref7:n1>=ref7;i=1<=ref7?++n1:--n1){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(iref8;y=0<=ref8?++o1:--o1){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(){M $,4K,2k,2b,D,54,3S,1X,2Q,6B,R,2N,4V,39,1Y,3L,28,2w,1P,7V,32,1v,fs,6y,7Z,5f,9y,6s=[].fb||A(bS){W(M i=0,l=o.P;iE){u E}u 2f};1v.5H=A(4M,3N,G){M 6l,H,1n,K,3T,1o;B(G==L){G={}}K=4M.e6;1o=[];W(H=0,1n=K.P;H<1n;H++){6l=K[H];B((G.8W!=L)&&(3T=6l.9U,6s.1w(G.8W,3T)>=0)){5I}1o.2j(3N.cR(6l.9U,6l.dd))}u 1o};1v.6F=A(P){B(P==L){P=0}B(D.2O||(4N.cC!=L)){u 1y cC(P)}u 1y 5T(P)};u 1v})();B(1r 2g!=="42"&&2g!==L){7V=2g;3S=6x(\'I\');4V=3S.4V;6B=6x(\'eQ\');fs=6x(\'fs\');6y=6x(\'6y\')}S{7V=4N}D=(A(cv){cM(D,cv);D.9w={ct:"4.1.2",cs:"7/27/de"};D.co=2r;D.6r=31;D.9t="cm";D.8t="";D.ck="df";D.2O=1r 2g!=="42"&&2g!==L;D.ci=!D.2O;D.65=A(){u"dg "+D.9w.ct+", dh "+D.9w.cs};D.9m=A(I){B(D.2O){u 31}B(1r I==="3j"){I=$(I)}B(!((I!=L)&&(I.6c!=L))){u L}u I.6c(\'29-3E-2X\')};A D(){o.6d=9x(o.6d,o);M 1k,1N,2X,1D=o;B(1l.P===0){2V"6i 1l";}B(o bY D){o.6k=o.6k.98(o);o.6H=o.6H.98(o);1k=1l[0];B(!D.2O){2X=49(D.9m(1k[0]),10);1N=1r 1k[1]==="A"?1k[1]:1r 1k[2]==="A"?1k[2]:A(){};B(!bQ(2X)&&32.bP(2X)){u 32.3O(2X,1N)}}o.2X=1v.8Z.4i();o.7D=o.5g=L;o.6z={x:0,y:0};o.bH=2r;o.7R=2r;o.6D=[];o.8S=[];o.8P=[];o.6N=L;o.bl=2r;o.du=1y 4K(o);o.4S=1y 1P(o);o.bi(A(){1D.bh(1k);u 1D.bg()});u o}S{u 1y D(1l)}}D.N.bi=A(cb){M 8H,1D=o;B(D.2O){u 8q(A(){u cb.1w(1D)},0)}S{B(2p.9q==="8D"){1Y.2x("aU aT");u 8q(A(){u cb.1w(1D)},0)}S{8H=A(){B(2p.9q==="8D"){1Y.2x("aU aT");u cb.1w(1D)}};u 2p.aS("dE",8H,2r)}}};D.N.bh=A(1k){M 2t,2f,K,1o;B(1k.P===0){2V"6i 1l aQ";}o.3b=L;o.8A=L;o.8z=L;o.1N=A(){};o.aM(1k[0]);B(1k.P===1){u}61(1r 1k[1]){2i"3j":o.8z=1k[1];4Z;2i"A":o.1N=1k[1]}B(1k.P===2){u}o.1N=1k[2];B(1k.P===4){K=1k[4];1o=[];W(2t 5h K){B(!74.1w(K,2t))5I;2f=K[2t];1o.2j(o.1F[2t]=2f)}u 1o}};D.N.aM=A(2C){B(D.2O){o.3b=2C;o.8A=\'ay\';u}B(1r 2C==="44"){o.3b=2C}S{o.3b=$(2C)}B(o.3b==L){2V"dN dO dV 1f d3 I W dX.";}u o.8A=o.3b.9U.6P()};D.N.bg=A(){61(o.8A){2i"ay":u o.cN();2i"1K":u o.cE();2i"I":u o.cx()}};D.N.cN=A(){1Y.2x("e8 W 2O");B(1r o.3b==="3j"&&o.3b.7W(/^ch?:\\/\\//)){u o.cf(o.3b,o.6d)}S B(1r o.3b==="3j"){u fs.eb(o.3b,o.6d)}S{u o.6d(L,o.3b)}};D.N.cf=A(6u,1N){M 9z;1Y.2x("fj 1f 4M "+6u);9z=6y.4i(6u,A(4p){M 7O;7O=\'\';4p.fk(\'aP\');4p.9B(\'29\',A(at){u 7O+=at});u 4p.9B(\'1Q\',A(){u 1N(L,1y fp(7O,\'aP\'))})});u 9z.9B(\'9C\',1N)};D.N.6d=A(6G,29){B(6G){2V 6G;}o.1f=1y 4V();o.1f.1G=29;1Y.2x("4V cS. cD = "+(o.5b())+", cy = "+(o.4W()));o.I=1y 3S(o.5b(),o.4W());u o.6k()};D.N.cE=A(){o.1f=o.3b;o.I=2p.3K(\'I\');o.1i=o.I.3h(\'2d\');1v.5H(o.1f,o.I,{8W:[\'1G\']});B(o.1f.7c!=L){o.1f.7c.9D(o.I,o.1f)}o.9J();u o.9L()};D.N.cx=A(){o.I=o.3b;o.1i=o.I.3h(\'2d\');B(o.8z!=L){o.1f=2p.3K(\'1K\');o.1f.1G=o.8z;o.9J();u o.9L()}S{u o.6k()}};D.N.9J=A(){B(o.9M()){1Y.2x(o.1f.1G,"->",o.8m());o.bd=31;o.1f.1G=o.8m()}B(2N.bb(o.1f)){o.1f.1G=2N.57(o.1f.1G);u 1Y.2x("fu 1f fx, fD cQ = "+o.1f.1G)}};D.N.9L=A(){B(o.cB()){u o.6H()}S{u o.1f.cr=o.6H}};D.N.cB=A(){B(!o.1f.8D){u 2r}B((o.1f.9P!=L)&&o.1f.9P===0){u 2r}u 31};D.N.5b=A(){u o.1f.F||o.1f.9P};D.N.4W=A(){u o.1f.J||o.1f.fN};D.N.6H=A(){1Y.2x("4V cS. cD = "+(o.5b())+", cy = "+(o.4W()));B(o.bd){o.I.F=o.5b()/o.7G();o.I.J=o.4W()/o.7G()}S{o.I.F=o.5b();o.I.J=o.4W()}u o.6k()};D.N.6k=A(){M i,1u,H,1n,K;B(o.1i==L){o.1i=o.I.3h(\'2d\')}o.51=o.6W=o.F=o.I.F;o.5D=o.6Y=o.J=o.I.J;o.d9();B(!o.c7()){o.c6()}B(o.1f!=L){o.1i.5U(o.1f,0,0,o.5b(),o.4W(),0,0,o.6W,o.6Y)}o.2y=o.1i.48(0,0,o.I.F,o.I.J);o.T=o.2y.29;B(D.6r){o.7D=1v.6F(o.T.P);o.5g=1v.6F(o.T.P);K=o.T;W(i=H=0,1n=K.P;H<1n;i=++H){1u=K[i];o.7D[i]=1u;o.5g[i]=1u}}o.1d={F:o.I.F,J:o.I.J};B(!D.2O){32.c4(o.2X,o)}o.1N.1w(o,o);u o.1N=A(){}};D.N.c1=A(){o.2y=o.1i.48(0,0,o.I.F,o.I.J);u o.T=o.2y.29};D.N.g3=A(){M i,1u,H,1n,K,1o;B(!D.6r){2V"a0 7F";}o.5g=1v.6F(o.T.P);K=o.T;1o=[];W(i=H=0,1n=K.P;H<1n;i=++H){1u=K[i];1o.2j(o.5g[i]=1u)}u 1o};D.N.c7=A(){u D.9m(o.I)!=L};D.N.c6=A(){B(D.2O||o.I.6c(\'29-3E-2X\')){u}u o.I.cR(\'29-3E-2X\',o.2X)};D.N.aE=A(){u o.I.6c(\'29-3E-cO-7F\')!==L};D.N.d9=A(){M 4d;B(D.2O||!o.9M()){u}4d=o.7G();B(4d!==1){1Y.2x("g4 4d = "+4d);o.bl=31;o.6W=o.I.F;o.6Y=o.I.J;o.I.F=o.6W*4d;o.I.J=o.6Y*4d;o.I.c8.F=""+o.6W+"c5";o.I.c8.J=""+o.6Y+"c5";o.1i.g6(4d,4d);o.F=o.51=o.I.F;u o.J=o.5D=o.I.J}};D.N.7G=A(){M a3,4j;4j=4N.4j||1;a3=o.1i.g7||o.1i.gi||o.1i.gk||o.1i.gm||o.1i.go||1;u 4j/a3};D.N.aZ=A(){u(4N.4j!=L)&&4N.4j!==1};D.N.9M=A(){B(o.aE()||!o.aZ()){u 2r}u o.8m()!==L};D.N.8m=A(){B(o.1f==L){u L}u o.1f.6c(\'29-3E-cO\')};D.N.73=A(aD){M 7z;7z=o.I;o.I=aD;o.1i=o.I.3h(\'2d\');B(!D.2O){7z.7c.9D(o.I,7z)}o.F=o.I.F;o.J=o.I.J;o.c1();u o.1d={F:o.I.F,J:o.I.J}};D.N.a8=A(1N){M 1D=o;B(1N==L){1N=A(){}}2Q.4Y(o,"aX");u o.4S.3O(A(){1D.1i.7x(1D.2y,0,0);u 1N.1w(1D)})};D.N.gu=A(8e){M i,1u,H,1n,K;B(8e==L){8e=31}B(!D.6r){2V"a0 7F";}K=o.d2();W(i=H=0,1n=K.P;H<1n;i=++H){1u=K[i];o.T[i]=1u}B(8e){u o.1i.7x(o.2y,0,0)}};D.N.gt=A(){M I,1W,i,2y,1u,T,H,1n,K;I=2p.3K(\'I\');1v.5H(o.I,I);I.F=o.51;I.J=o.5D;1W=I.3h(\'2d\');2y=1W.48(0,0,I.F,I.J);T=2y.29;K=o.7D;W(i=H=0,1n=K.P;H<1n;i=++H){1u=K[i];T[i]=1u}1W.7x(2y,0,0);o.6z={x:0,y:0};o.7R=2r;u o.73(I)};D.N.d2=A(){M I,7E,1W,26,a6,i,2y,1u,T,Y,72,8k,8w,F,H,1e,1n,K,3T,4o,a5;B(!D.6r){2V"a0 7F";}Y=[];8k=o.6z.x;26=8k+o.F;8w=o.6z.y;a6=8w+o.J;B(o.7R){I=2p.3K(\'I\');I.F=o.51;I.J=o.5D;1W=I.3h(\'2d\');2y=1W.48(0,0,I.F,I.J);T=2y.29;K=o.5g;W(i=H=0,1n=K.P;H<1n;i=++H){1u=K[i];T[i]=1u}1W.7x(2y,0,0);72=2p.3K(\'I\');72.F=o.F;72.J=o.J;1W=72.3h(\'2d\');1W.5U(I,0,0,o.51,o.5D,0,0,o.F,o.J);T=1W.48(0,0,o.F,o.J).29;F=o.F}S{T=o.5g;F=o.51}W(i=1e=0,3T=T.P;1e<3T;i=1e+=4){7E=28.cl(i,F);B(((8k<=(4o=7E.x)&&4o<26))&&((8w<=(a5=7E.y)&&a5K;i=0<=K?++H:--H){2K+=Q[i]}}o.4S.4k({1t:R.3g.a1,1q:1q,Q:Q,2K:2K,3e:3e});u o};D.N.5a=A(4b,1k){o.4S.4k({1t:R.3g.2w,4b:4b,1k:1k});u o};D.N.2Z=A(1N){M 2a;2a=1y 39(o);o.8P.2j(2a);o.4S.4k({1t:R.3g.9Z});1N.1w(2a);o.4S.4k({1t:R.3g.9Y});u o};D.N.bm=A(2a){u o.bn(2a)};D.N.bn=A(2a){o.8S.2j(o.6N);o.6D.2j(o.T);o.6N=2a;u o.T=2a.T};D.N.bx=A(){o.T=o.6D.6o();u o.6N=o.8S.6o()};D.N.bO=A(){u o.6N.bU()};u D})(3L);7V.D=D;D.4K=(A(){A 4K(c){o.c=c}4K.N.fX=A(){M i,3B,71,H,1e,1I,K;3B={r:{},g:{},b:{}};W(i=H=0;H<=E;i=++H){3B.r[i]=0;3B.g[i]=0;3B.b[i]=0}W(i=1e=0,K=o.c.T.P;1e0)){u}1o=[];W(H=0,1n=6Z.P;H<1n;H++){1K=6Z[H];1o.2j(cA=1y 54(1K,A(){o.cI();u o.3O()}))}u 1o};B(D.ci){(A(){B(2p.9q==="8D"){u D.9X()}S{u 2p.aS("fT",D.9X,2r)}})()}54=(A(){M 8g;8g="(\\\\w+)\\\\((.*?)\\\\)";A 54(46,db){o.ab=46.6c(\'29-3E\');o.3E=D(46,db.98(o))}54.N.cI=A(){M 1k,e,1C,5j,9W,9V,m,r,6X,H,1n,K,1o;o.46=o.3E.I;r=1y bf(8g,\'g\');6X=o.ab.7W(r);B(!(6X.P>0)){u}r=1y bf(8g);1o=[];W(H=0,1n=6X.P;H<1n;H++){9W=6X[H];K=9W.7W(r),m=K[0],1C=K[1],1k=K[2];9V=1y fO("u A() { o."+1C+"("+1k+"); };");9S{5j=9V();1o.2j(5j.1w(o.3E))}9R(5C){e=5C;1o.2j(1Y.2x(e))}}u 1o};54.N.3O=A(){M 46;46=o.46;u o.3E.a8(A(){u 46.7c.9D(o.bJ(),46)})};u 54})();D.2k=(A(){A 2k(){}2k.9Q={};2k.V=A(1q,5j){u o.9Q[1q]=5j};2k.3O=A(1q,Z,X){u o.9Q[1q](Z,X)};u 2k})();2k=D.2k;D.2b=(A(){A 2b(){}2b.52=A(6U,6S,6R,6Q){u O.7L(O.1T(6R-6U,2)+O.1T(6Q-6S,2))};2b.ce=A(1M,1c,6M){M 4s;B(6M==L){6M=2r}4s=1M+(O.fL()*(1c-1M));B(6M){u 4s.fH(6M)}S{u O.62(4s)}};2b.6L=A(C){u(0.9O*C.r)+(0.fF*C.g)+(0.fE*C.b)};2b.2h=A(1J,4H,4G,1Q,58,59){M 2h,5r,2F,26,i,j,5s,1S,3G,t,H,1e,K;B(58==L){58=0}B(59==L){59=E}B(1J[0]bY 5T){2F=1J;58=4H;59=4G}S{2F=[1J,4H,4G,1Q]}B(2F.P<2){2V"6i 8s 9K 1l 3N 2h";}2h={};5s=A(a,b,t){u a*(1-t)+b*t};5r=A(a,1M,1c){u O.1M(O.1c(a,1M),1c)};W(i=H=0;H1){1S=[];W(j=1e=0,K=3G.P-2;0<=K?1e<=K:1e>=K;j=0<=K?++1e:--1e){1S.2j([5s(3G[j][0],3G[j+1][0],t),5s(3G[j][1],3G[j+1][1],t)])}3G=1S}2h[O.62(3G[0][0])]=O.62(5r(3G[0][1],58,59))}26=2F[2F.P-1][0];2h=D.2b.9H(2h,26);B(2h[26]==L){2h[26]=2h[26-1]}u 2h};2b.bR=A(2F,58,59){M 4k,5r,9G,26,8C,76,77,78,i,j,5s,9F,9E,4A,p,5A,5B,4u,7g,7i,3p,7k,t,H,1e,K,1D=o;B(2F.P<2){2V"6i 8s 9K 1l 3N bR";}3p={};5s=A(a,b,t){u a*(1-t)+b*t};4k=A(a,b,c,d){u[a[0]+b[0]+c[0]+d[0],a[1]+b[1]+c[1]+d[1]]};4A=A(a,b){u[a[0]*b[0],a[1]*b[1]]};7k=A(a,b){u[a[0]-b[0],a[1]-b[1]]};5r=A(a,1M,1c){u O.1M(O.1c(a,1M),1c)};9G=0;W(i=H=0,K=2F.P-2;0<=K?H<=K:H>=K;i=0<=K?++H:--H){5A=2F[i];5B=2F[i+1];4u=5B[0]-5A[0];7g=1/4u;B(i===2F.P-2){7g=1/(4u-1)}p=i>0?2F[i-1]:5A;9F=4A(7k(5B,p),[0.5,0.5]);p=i<2F.P-2?2F[i+2]:5B;9E=4A(7k(p,5A),[0.5,0.5]);W(j=1e=0;0<=4u?1e<=4u:1e>=4u;j=0<=4u?++1e:--1e){t=j*7g;8C=2.0*t*t*t-3.0*t*t+1.0;76=t*t*t-2.0*t*t+t;77=-2.0*t*t*t+3.0*t*t;78=t*t*t-t*t;7i=4k(4A(5A,[8C,8C]),4A(9F,[76,76]),4A(5B,[77,77]),4A(9E,[78,78]));3p[O.62(7i[0])]=O.62(5r(7i[1],58,59));9G+=1}}26=2F[2F.P-1][0];3p=D.2b.9H(3p,26);u 3p};2b.9H=A(5c,26){M i,j,5F,3p,7s,H,1e;B(bc.ft(5c).P<26+1){3p={};W(i=H=0;0<=26?H<=26:H>=26;i=0<=26?++H:--H){B(5c[i]!=L){3p[i]=5c[i]}S{5F=[i-1,3p[i-1]];W(j=1e=i;i<=26?1e<=26:1e>=26;j=i<=26?++1e:--1e){B(5c[j]!=L){7s=[j,5c[j]];4Z}}3p[i]=5F[1]+((7s[1]-5F[1])/(7s[0]-5F[0]))*(i-5F[0])}}u 3p}u 5c};u 2b})();2b=D.2b;D.1X=(A(){A 1X(){}1X.7u=A(3F){M b,g,r;B(3F.fr(0)==="#"){3F=3F.5d(1)}r=49(3F.5d(0,2),16);g=49(3F.5d(2,2),16);b=49(3F.5d(4,2),16);u{r:r,g:g,b:b}};1X.fq=A(r,g,b){M d,h,l,1c,1M,s;B(1r r==="44"){g=r.g;b=r.b;r=r.r}r/=E;g/=E;b/=E;1c=O.1c(r,g,b);1M=O.1M(r,g,b);l=(1c+1M)/2;B(1c===1M){h=s=0}S{d=1c-1M;s=l>0.5?d/(2-1c-1M):d/(1c+1M);h=(A(){61(1c){2i r:u(g-b)/d+(g1){t-=1}B(t<1/6){u p+(q-p)*6*t}B(t<1/2){u q}B(t<2/3){u p+(q-p)*(2/3-t)*6}u p};1X.aL=A(r,g,b){M d,h,1c,1M,s,v;r/=E;g/=E;b/=E;1c=O.1c(r,g,b);1M=O.1M(r,g,b);v=1c;d=1c-1M;s=1c===0?0:d/1c;B(1c===1M){h=0}S{h=(A(){61(1c){2i r:u(g-b)/d+(g0.9A){r=O.1T((r+0.3n)/1.3n,2.4)}S{r/=12.92}B(g>0.9A){g=O.1T((g+0.3n)/1.3n,2.4)}S{g/=12.92}B(b>0.9A){b=O.1T((b+0.3n)/1.3n,2.4)}S{b/=12.92}x=r*0.fi+g*0.fh+b*0.fg;y=r*0.bp+g*0.bs+b*0.bv;z=r*0.ff+g*0.fe+b*0.fd;u{x:x*1j,y:y*1j,z:z*1j}};1X.fc=A(x,y,z){M b,g,r;x/=1j;y/=1j;z/=1j;r=(3.fa*x)+(-1.f9*y)+(-0.f8*z);g=(-0.f7*x)+(1.f6*y)+(0.f5*z);b=(0.f4*x)+(-0.f3*y)+(1.f1*z);B(r>0.9v){r=(1.3n*O.1T(r,0.9u))-0.3n}S{r*=12.92}B(g>0.9v){g=(1.3n*O.1T(g,0.9u))-0.3n}S{g*=12.92}B(b>0.9v){b=(1.3n*O.1T(b,0.9u))-0.3n}S{b*=12.92}u{r:r*E,g:g*E,b:b*E}};1X.c9=A(x,y,z){M a,b,l,9s,9r,8E;B(1r x==="44"){y=x.y;z=x.z;x=x.x}9s=95.cn;9r=1j.0;8E=9n.cu;x/=9s;y/=9r;z/=8E;B(x>0.9l){x=O.1T(x,0.9k)}S{x=(7.9j*x)+0.69}B(y>0.9l){y=O.1T(y,0.9k)}S{y=(7.9j*y)+0.69}B(z>0.9l){z=O.1T(z,0.9k)}S{z=(7.9j*z)+0.69}l=cF*y-16;a=cG*(x-y);b=6a*(y-z);u{l:l,a:a,b:b}};1X.f0=A(l,a,b){M x,y,z;B(1r l==="44"){a=l.a;b=l.b;l=l.l}y=(l+16)/cF;x=y+(a/cG);z=y-(b/6a);B(x>0.9i){x=x*x*x}S{x=0.9h*(x-0.69)}B(y>0.9i){y=y*y*y}S{y=0.9h*(y-0.69)}B(z>0.9i){z=z*z*z}S{z=0.9h*(z-0.69)}u{x:x*95.cn,y:y*1j.0,z:z*9n.cu}};1X.eZ=A(r,g,b){M 9f;B(1r r==="44"){g=r.g;b=r.b;r=r.r}9f=o.b1(r,g,b);u o.c9(9f)};1X.eY=A(l,a,b){};u 1X})();1X=D.1X;D.2Q=(A(){A 2Q(){}2Q.5n={};2Q.cU=["cV","cW","aX","d0","d1","6g"];2Q.4Y=A(38,1t,29){M 6m,H,1n,K,1o;B(29==L){29=L}B(o.5n[1t]&&o.5n[1t].P){K=o.5n[1t];1o=[];W(H=0,1n=K.P;H<1n;H++){6m=K[H];B(6m.38===L||38.2X===6m.38.2X){1o.2j(6m.fn.1w(38,29))}S{1o.2j(da 0)}}u 1o}};2Q.eX=A(38,1t,fn){M 9e,9d;B(1r 38==="3j"){9d=38;9e=1t;38=L;1t=9d;fn=9e}B(6s.1w(o.cU,1t)<0){u 2r}B(!o.5n[1t]){o.5n[1t]=[]}o.5n[1t].2j({38:38,fn:fn});u 31};u 2Q})();2Q=D.2Q;D.R=(A(){A R(){}R.3g={a2:1,a1:2,9Z:3,9Y:4,9c:5,2w:6};R.V=A(1q,ah){u D.N[1q]=ah};u R})();R=D.R;D.2N=(A(){A 2N(){}2N.aq=/(?:(?:6y|ch):\\/\\/)((?:\\w+)\\.(?:(?:\\w|\\.)+))/;2N.bb=A(1K){B(1K==L){u 2r}B(o.as(1K)){u 2r}u o.7j(1K.1G)};2N.as=A(1K){M K;u(1K.9t!=L)&&((K=1K.9t.6P())===\'cm\'||K===\'ax-eW\')};2N.7j=A(6u){M 7l;7l=6u.7W(o.aq);B(7l){u 7l[1]!==2p.eV}S{u 2r}};2N.aK=A(1G){B(o.7j(1G)){B(!D.8t.P){1Y.99("eS 3N eR a aV 1f eN a eM aY. cQ: "+1G)}S{B(D.7j(D.8t)){1Y.99("eL ax a aV aY W eK eI.");u}u o.57(1G)}}};2N.57=A(1G){u""+D.8t+"?"+D.ck+"="+(eG(1G))};2N.eD=A(5k){M 7w;7w={eC:\'eB\',eA:\'ez\',ey:\'ex\',ew:\'ev\'};5k=5k.6P();B(7w[5k]!=L){5k=7w[5k]}u"eu/es."+5k};u 2N})();D.N.bB=A(){B(1r 2g!=="42"&&2g!==L){u o.bC.4r(o,1l)}S{u o.bD.4r(o,1l)}};D.N.bD=A(1t){M 1f;B(1t==L){1t="bG"}1t=1t.6P();1f=o.94(1t).er("1f/"+1t,"1f/eq-ep");u 2p.eo.en=1f};D.N.bC=A(5R,7J,1N){M e,91;B(7J==L){7J=31}B(1N==L){1N=L}9S{91=fs.em(5R);B(91.ek()&&!7J){u 2r}}9R(5C){e=5C;1Y.2x("ej eh 5R "+5R)}u fs.eg(5R,o.I.ef(),A(6G){1Y.2x("ee ed 3N "+5R);B(1N){u 1N.1w(o,6G)}})};D.N.bJ=A(1t){M 1K;1K=1y 4V();1K.1G=o.94(1t);1K.F=o.1d.F;1K.J=o.1d.J;B(4N.4j){1K.F/=4N.4j;1K.J/=4N.4j}u 1K};D.N.94=A(1t){B(1t==L){1t="bG"}1t=1t.6P();u o.I.ec("1f/"+1t)};2N=D.2N;D.39=(A(){A 39(c){o.c=c;o.1C=o.c;o.1F={8Y:\'8X\',2q:1.0};o.ea=1v.8Z.4i();o.I=1r 2g!=="42"&&2g!==L?1y 3S():2p.3K(\'I\');o.I.F=o.c.1d.F;o.I.J=o.c.1d.J;o.1i=o.I.3h(\'2d\');o.1i.e9(o.I.F,o.I.J);o.2y=o.1i.48(0,0,o.I.F,o.I.J);o.T=o.2y.29}39.N.2Z=A(cb){u o.c.2Z.1w(o.c,cb)};39.N.3q=A(cg){o.1F.8Y=cg;u o};39.N.2q=A(2q){o.1F.2q=2q/1j;u o};39.N.4n=A(){M i,2Y,H,K;2Y=o.c.T;W(i=H=0,K=o.c.T.P;Ho.c.T.P||3M<0){u 1y 28(0,0,0,E,o.c)}u o.8O(3M)};28.N.e4=A(8c,8d,C){M cP;B(o.c==L){2V"6b a 67 1i";}cP=o.U+(o.c.1d.F*4*(8d*-1))+(4*8c);B(3M>o.c.T.P||3M<0){u}o.c.T[3M]=C.r;o.c.T[3M+1]=C.g;o.c.T[3M+2]=C.b;o.c.T[3M+3]=C.a;u 31};28.N.e3=A(x,y){M U;B(o.c==L){2V"6b a 67 1i";}U=o.8U(x,y,o.F);u o.8O(U)};28.N.e2=A(x,y,C){M U;B(o.c==L){2V"6b a 67 1i";}U=o.8U(x,y,o.F);o.c.T[U]=C.r;o.c.T[U+1]=C.g;o.c.T[U+2]=C.b;u o.c.T[U+3]=C.a};28.N.65=A(){u o.e1()};28.N.e0=A(8f){M 3F;B(8f==L){8f=2r}3F=\'#\'+o.r.65(16)+o.g.65(16)+o.b.65(16);B(8f){u 3F+o.a.65(16)}S{u 3F}};u 28})();28=D.28;D.2w=(A(){A 2w(){}2w.8N={};2w.V=A(1q,4b){u o.8N[1q]=4b};2w.3O=A(1i,1q,1k){u o.8N[1q].4r(1i,1k)};u 2w})();2w=D.2w;D.1P=(A(){1P.4t=D.2O?6x(\'dZ\').dY().P:4;A 1P(c){o.c=c;o.4l=9x(o.4l,o);o.6I=[];o.53=L}1P.N.4k=A(8M){B(8M==L){u}u o.6I.2j(8M)};1P.N.4l=A(){M 2a;B(o.6I.P===0){2Q.4Y(o,"d0");B(o.8L!=L){o.8L.1w(o.c)}u o}o.2c=o.6I.d4();61(o.2c.1t){2i R.3g.9Z:2a=o.c.8P.d4();o.c.bm(2a);u o.4l();2i R.3g.9Y:o.c.bO();o.c.bx();u o.4l();2i R.3g.9c:u o.d5(o.2c.2a,o.2c.1G);2i R.3g.2w:u o.d6();dW:u o.d8()}};1P.N.3O=A(1N){o.8L=1N;o.53=1v.6F(o.c.T.P);u o.4l()};1P.N.8K=A(fn){M 6T,8J,2T,1Q,f,i,8I,n,1J,H,K,1o,1D=o;o.8p=0;n=o.c.T.P;8J=O.2P((n/4)/1P.4t);6T=8J*4;8I=6T+((n/4)%1P.4t)*4;1o=[];W(i=H=0,K=1P.4t;0<=K?HK;i=0<=K?++H:--H){1J=i*6T;1Q=1J+(i===1P.4t-1?8I:6T);B(D.2O){f=6B(A(){u fn.1w(1D,i,1J,1Q)});2T=f.dU();1o.2j(o.6g(2T))}S{1o.2j(8q((A(i,1J,1Q){u A(){u fn.1w(1D,i,1J,1Q)}})(i,1J,1Q),0))}}u 1o};1P.N.d8=A(){2Q.4Y(o.c,"cV",o.2c);B(o.2c.1t===R.3g.a2){u o.8K(o.ae)}S{u o.8K(o.af)}};1P.N.d6=A(){1Y.2x("dT 4b "+o.2c.4b);2w.3O(o.c,o.2c.4b,o.2c.1k);1Y.2x("2w "+o.2c.4b+" 8G!");u o.4l()};1P.N.ae=A(2T,1J,1Q){M i,1u,H;1Y.2x("ai #"+2T+" - R: "+o.2c.1q+", dS: "+1J+", dR: "+1Q);2Q.4Y(o.c,"d1",{al:2T,am:1P.4t,dQ:1J,dP:1Q});1u=1y 28();1u.8T(o.c);W(i=H=1J;H<1Q;i=H+=4){1u.U=i;1u.r=o.c.T[i];1u.g=o.c.T[i+1];1u.b=o.c.T[i+2];1u.a=o.c.T[i+3];o.2c.7n(1u);o.c.T[i]=1v.3H(1u.r);o.c.T[i+1]=1v.3H(1u.g);o.c.T[i+2]=1v.3H(1u.b);o.c.T[i+3]=1v.3H(1u.a)}B(D.2O){u 6B["ap"](2T)}S{u o.6g(2T)}};1P.N.af=A(2T,1J,1Q){M Q,6V,3e,2U,5E,2K,i,j,k,2I,n,1q,p,1u,4p,H,1e,1I;1q=o.2c.1q;3e=o.2c.3e;2K=o.2c.2K;n=o.c.T.P;Q=o.2c.Q;6V=O.7L(Q.P);2I=[];1Y.2x("dM 2I - R: "+o.2c.1q);1J=O.1c(1J,o.c.1d.F*4*((6V-1)/2));1Q=O.1M(1Q,n-(o.c.1d.F*4*((6V-1)/2)));2U=(6V-1)/2;1u=1y 28();1u.8T(o.c);W(i=H=1J;H<1Q;i=H+=4){1u.U=i;5E=0;W(j=1e=-2U;-2U<=2U?1e<=2U:1e>=2U;j=-2U<=2U?++1e:--1e){W(k=1I=2U;2U<=-2U?1I<=-2U:1I>=-2U;k=2U<=-2U?++1I:--1I){p=1u.cJ(j,k);2I[5E*3]=p.r;2I[5E*3+1]=p.g;2I[5E*3+2]=p.b;5E++}}4p=o.3I(Q,2I,2K,3e);o.53[i]=1v.3H(4p.r);o.53[i+1]=1v.3H(4p.g);o.53[i+2]=1v.3H(4p.b);o.53[i+3]=o.c.T[i+3]}B(D.2O){u 6B["ap"](2T)}S{u o.6g(2T)}};1P.N.6g=A(2T){M i,H,K;B(2T>=0){1Y.2x("ai #"+2T+" 8G! R: "+o.2c.1q)}o.8p++;2Q.4Y(o.c,"6g",{al:2T,dL:o.8p,am:1P.4t});B(o.8p===1P.4t){B(o.2c.1t===R.3g.a1){W(i=H=0,K=o.c.T.P;0<=K?HK;i=0<=K?++H:--H){o.c.T[i]=o.53[i]}}B(2T>=0){1Y.2x("R "+o.2c.1q+" 8G!")}2Q.4Y(o.c,"cW",o.2c);u o.4l()}};1P.N.3I=A(Q,2I,2K,3e){M i,2f,H,K;2f={r:0,g:0,b:0};W(i=H=0,K=Q.P;0<=K?HK;i=0<=K?++H:--H){2f.r+=Q[i]*2I[i*3];2f.g+=Q[i]*2I[i*3+1];2f.b+=Q[i]*2I[i*3+2]}2f.r=(2f.r/2K)+3e;2f.g=(2f.g/2K)+3e;2f.b=(2f.b/2K)+3e;u 2f};1P.N.d5=A(2a,1G){M 1K,57,1D=o;1K=1y 4V();1K.cr=A(){2a.1i.5U(1K,0,0,1D.c.1d.F,1D.c.1d.J);2a.2y=2a.1i.48(0,0,1D.c.1d.F,1D.c.1d.J);2a.T=2a.2y.29;1D.c.T=2a.T;u 1D.4l()};57=2N.aK(1G);u 1K.1G=57!=L?57:1G};u 1P})();1P=D.1P;D.32=(A(){A 32(){}32.5p={};32.bP=A(4Q){u o.5p[4Q]!=L};32.4i=A(4Q){u o.5p[4Q]};32.c4=A(1q,2C){u o.5p[1q]=2C};32.3O=A(4Q,1N){M 1D=o;8q(A(){u 1N.1w(1D.4i(4Q),1D.4i(4Q))},0);u o.4i(4Q)};32.dK=A(1q){B(1q==L){1q=2r}B(1q){u aA o.5p[1q]}S{u o.5p={}}};u 32})();32=D.32;2k.V("8X",A(Z,X){u{r:Z.r,g:Z.g,b:Z.b}});2k.V("5o",A(Z,X){u{r:(Z.r*X.r)/E,g:(Z.g*X.g)/E,b:(Z.b*X.b)/E}});2k.V("dJ",A(Z,X){u{r:E-(((E-Z.r)*(E-X.r))/E),g:E-(((E-Z.g)*(E-X.g))/E),b:E-(((E-Z.b)*(E-X.b))/E)}});2k.V("8v",A(Z,X){M 1E;1E={};1E.r=X.r>1g?E-2*(E-Z.r)*(E-X.r)/E:(X.r*Z.r*2)/E;1E.g=X.g>1g?E-2*(E-Z.g)*(E-X.g)/E:(X.g*Z.g*2)/E;1E.b=X.b>1g?E-2*(E-Z.b)*(E-X.b)/E:(X.b*Z.b*2)/E;u 1E});2k.V("dI",A(Z,X){u{r:Z.r-X.r,g:Z.g-X.g,b:Z.b-X.b}});2k.V("aG",A(Z,X){u{r:X.r+Z.r,g:X.g+Z.g,b:X.b+Z.b}});2k.V("dH",A(Z,X){u{r:1g-2*(X.r-1g)*(Z.r-1g)/E,g:1g-2*(X.g-1g)*(Z.g-1g)/E,b:1g-2*(X.b-1g)*(Z.b-1g)/E}});2k.V("aI",A(Z,X){M 1E;1E={};1E.r=X.r>1g?E-((E-X.r)*(E-(Z.r-1g)))/E:(X.r*(Z.r+1g))/E;1E.g=X.g>1g?E-((E-X.g)*(E-(Z.g-1g)))/E:(X.g*(Z.g+1g))/E;1E.b=X.b>1g?E-((E-X.b)*(E-(Z.b-1g)))/E:(X.b*(Z.b+1g))/E;u 1E});2k.V("dG",A(Z,X){u{r:X.r>Z.r?X.r:Z.r,g:X.g>Z.g?X.g:Z.g,b:X.b>Z.b?X.b:Z.b}});2k.V("gx",A(Z,X){u{r:X.r>Z.r?Z.r:X.r,g:X.g>Z.g?Z.g:X.g,b:X.b>Z.b?Z.b:X.b}});R.V("4B",A(){M 3c;B(1l.P===1){3c=1X.7u(1l[0])}S{3c={r:1l[0],g:1l[1],b:1l[2]}}u o.2m("4B",A(C){C.r=3c.r;C.g=3c.g;C.b=3c.b;C.a=E;u C})});R.V("3A",A(Q){Q=O.2P(E*(Q/1j));u o.2m("3A",A(C){C.r+=Q;C.g+=Q;C.b+=Q;u C})});R.V("3D",A(Q){Q*=-0.dF;u o.2m("3D",A(C){M 1c;1c=O.1c(C.r,C.g,C.b);B(C.r!==1c){C.r+=(1c-C.r)*Q}B(C.g!==1c){C.g+=(1c-C.g)*Q}B(C.b!==1c){C.b+=(1c-C.b)*Q}u C})});R.V("3Y",A(Q){Q*=-1;u o.2m("3Y",A(C){M 1p,4E,1c;1c=O.1c(C.r,C.g,C.b);4E=(C.r+C.g+C.b)/3;1p=((O.4D(1c-4E)*2/E)*Q)/1j;B(C.r!==1c){C.r+=(1c-C.r)*1p}B(C.g!==1c){C.g+=(1c-C.g)*1p}B(C.b!==1c){C.b+=(1c-C.b)*1p}u C})});R.V("4C",A(Q){u o.2m("4C",A(C){M 4E;4E=2b.6L(C);C.r=4E;C.g=4E;C.b=4E;u C})});R.V("2u",A(Q){Q=O.1T((Q+1j)/1j,2);u o.2m("2u",A(C){C.r/=E;C.r-=0.5;C.r*=Q;C.r+=0.5;C.r*=E;C.g/=E;C.g-=0.5;C.g*=Q;C.g+=0.5;C.g*=E;C.b/=E;C.b-=0.5;C.b*=Q;C.b+=0.5;C.b*=E;u C})});R.V("8F",A(Q){u o.2m("8F",A(C){M b,g,h,4X,r,K;4X=1X.aL(C.r,C.g,C.b);h=4X.h*1j;h+=O.4D(Q);h=h%1j;h/=1j;4X.h=h;K=1X.aW(4X.h,4X.s,4X.v),r=K.r,g=K.g,b=K.b;C.r=r;C.g=g;C.b=b;u C})});R.V("4e",A(){M 5Q,3f;B(1l.P===2){3f=1X.7u(1l[0]);5Q=1l[1]}S B(1l.P===4){3f={r:1l[0],g:1l[1],b:1l[2]};5Q=1l[3]}u o.2m("4e",A(C){C.r-=(C.r-3f.r)*(5Q/1j);C.g-=(C.g-3f.g)*(5Q/1j);C.b-=(C.b-3f.b)*(5Q/1j);u C})});R.V("b0",A(){u o.2m("b0",A(C){C.r=E-C.r;C.g=E-C.g;C.b=E-C.b;u C})});R.V("4a",A(Q){B(Q==L){Q=1j}Q/=1j;u o.2m("4a",A(C){C.r=O.1M(E,(C.r*(1-(0.dD*Q)))+(C.g*(0.dC*Q))+(C.b*(0.dB*Q)));C.g=O.1M(E,(C.r*(0.dA*Q))+(C.g*(1-(0.dz*Q)))+(C.b*(0.dy*Q)));C.b=O.1M(E,(C.r*(0.dx*Q))+(C.g*(0.dw*Q))+(C.b*(1-(0.dv*Q))));u C})});R.V("2v",A(Q){u o.2m("2v",A(C){C.r=O.1T(C.r/E,Q)*E;C.g=O.1T(C.g/E,Q)*E;C.b=O.1T(C.b/E,Q)*E;u C})});R.V("8n",A(Q){Q=O.4D(Q)*2.55;u o.2m("8n",A(C){M 4s;4s=2b.ce(Q*-1,Q);C.r+=4s;C.g+=4s;C.b+=4s;u C})});R.V("8l",A(Q){Q=O.4D(Q)*2.55;u o.2m("8l",A(C){B(C.r>E-Q){C.r=E}S B(C.rE-Q){C.g=E}S B(C.gE-Q){C.b=E}S B(C.b0){C.r+=(E-C.r)*1F.3d}S{C.r-=C.r*O.4D(1F.3d)}}B(1F.4U!=L){B(1F.4U>0){C.g+=(E-C.g)*1F.4U}S{C.g-=C.g*O.4D(1F.4U)}}B(1F.41!=L){B(1F.41>0){C.b+=(E-C.b)*1F.41}S{C.b-=C.b*O.4D(1F.41)}}u C})});R.V("2e",A(){M 6O,2h,43,3J,1Q,i,5X,1J,H,1e,K,3T;43=1l[0],3J=2<=1l.P?5W.1w(1l,1):[];5X=3J[3J.P-1];B(1r 5X==="A"){6O=5X;3J.6o()}S B(1r 5X==="3j"){6O=2b[5X];3J.6o()}S{6O=2b.2h}B(1r 43==="3j"){43=43.dt("")}B(43[0]==="v"){43=[\'r\',\'g\',\'b\']}B(3J.P<2){2V"6i 8s 9K 1l 3N 2e 1C";}2h=6O(3J,0,E);1J=3J[0];B(1J[0]>0){W(i=H=0,K=1J[0];0<=K?HK;i=0<=K?++H:--H){2h[i]=1J[1]}}1Q=3J[3J.P-1];B(1Q[0]=E;i=3T<=E?++1e:--1e){2h[i]=1Q[1]}}u o.2m("2e",A(C){M 1I,4o;W(i=1I=0,4o=43.P;0<=4o?1I<4o:1I>4o;i=0<=4o?++1I:--1I){C[43[i]]=2h[C[43[i]]]}u C})});R.V("33",A(Q){M 4H,4G,p;p=O.4D(Q)/1j;4H=[0,E*p];4G=[E-(E*p),E];B(Q<0){4H=4H.bq();4G=4G.bq()}u o.2e(\'3f\',[0,0],4H,4G,[E,E])});D.2w.V("8Q",A(F,J,x,y){M I,1W;B(x==L){x=0}B(y==L){y=0}B(1r 2g!=="42"&&2g!==L){I=1y 3S(F,J)}S{I=2p.3K(\'I\');1v.5H(o.I,I);I.F=F;I.J=J}1W=I.3h(\'2d\');1W.5U(o.I,x,y,F,J,0,0,F,J);o.6z={x:x,y:y};o.bH=31;u o.73(I)});D.2w.V("88",A(2B){M I,1W;B(2B==L){2B=L}B(2B===L||((2B.F==L)&&(2B.J==L))){1Y.9C("6i d3 ds 1d aQ W 88");u}B(2B.F==L){2B.F=o.I.F*2B.J/o.I.J}S B(2B.J==L){2B.J=o.I.J*2B.F/o.I.F}B(1r 2g!=="42"&&2g!==L){I=1y 3S(2B.F,2B.J)}S{I=2p.3K(\'I\');1v.5H(o.I,I);I.F=2B.F;I.J=2B.J}1W=I.3h(\'2d\');1W.5U(o.I,0,0,o.I.F,o.I.J,0,0,2B.F,2B.J);o.7R=31;u o.73(I)});D.R.V("8Q",A(){u o.5a("8Q",5T.N.5f.1w(1l,0))});D.R.V("88",A(){u o.5a("88",5T.N.5f.1w(1l,0))});D.R.V("dr",A(){u o.3I("dq 85",[1,1,1,1,1,1,1,1,1])});D.R.V("dp",A(){u o.3I("do dn 85",[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])});D.R.V("dm",A(){u o.3I("dl 85",[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])});D.R.V("dk",A(3C){M 2I;B(3C===0||3C===47){2I=[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]}S B((3C>0&&3C<90)||(3C>47&&3C<7K)){2I=[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]}S B(3C===90||3C===7K){2I=[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]}S{2I=[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]}u o.3I("dj 85",2I)});D.R.V("6w",A(1p){B(1p==L){1p=1j}1p/=1j;u o.3I("di",[0,-1p,0,-1p,4*1p+1,-1p,0,-1p,0])});9y={3A:A(C,1p,G){C.r=C.r-(C.r*1p*G.3i);C.g=C.g-(C.g*1p*G.3i);C.b=C.b-(C.b*1p*G.3i);u C},2v:A(C,1p,G){C.r=O.1T(C.r/E,O.1c(10*1p*G.3i,1))*E;C.g=O.1T(C.g/E,O.1c(10*1p*G.3i,1))*E;C.b=O.1T(C.b/E,O.1c(10*1p*G.3i,1))*E;u C},4e:A(C,1p,G){C.r-=(C.r-G.3c.r)*1p;C.g-=(C.g-G.3c.g)*1p;C.b-=(C.b-G.3c.b)*1p;u C}};R.V("1V",A(1s,3i){M 2h,3t,1Q,1J;B(3i==L){3i=60}B(1r 1s==="3j"&&1s.5d(-1)==="%"){B(o.1d.J>o.1d.F){1s=o.1d.F*(49(1s.5d(0,1s.P-1),10)/1j)}S{1s=o.1d.J*(49(1s.5d(0,1s.P-1),10)/1j)}}3i/=1j;3t=[o.1d.F/2,o.1d.J/2];1J=O.7L(O.1T(3t[0],2)+O.1T(3t[1],2));1Q=1J-1s;2h=2b.2h([0,1],[30,30],[70,60],[1j,80]);u o.2m("1V",A(C){M 7m,2J,U;U=C.8R();7m=2b.52(U.x,U.y,3t[0],3t[1]);B(7m>1Q){2J=O.1c(1,(2h[O.62(((7m-1Q)/1s)*1j)]/10)*3i);C.r=O.1T(C.r/E,2J)*E;C.g=O.1T(C.g/E,2J)*E;C.b=O.1T(C.b/E,2J)*E}u C})});R.V("bX",A(G){M 4c,6j,7h,1s,H,1n,K;4c={3i:50,2G:0,9g:\'3A\',3c:{r:0,g:0,b:0}};G=1v.7N(4c,G);B(!G.1s){u o}S B(1r G.1s==="3j"){7h=49(G.1s,10)/1j;G.1s={F:o.1d.F*7h,J:o.1d.J*7h}}S B(1r G.1s==="44"){K=["F","J"];W(H=0,1n=K.P;H<1n;H++){6j=K[H];B(1r G.1s[6j]==="3j"){G.1s[6j]=o.1d[6j]*(49(G.1s[6j],10)/1j)}}}S B(G.1s==="8s"){1s=G.1s;G.1s={F:1s,J:1s}}B(1r G.2G==="3j"){G.2G=(G.1s.F/2)*(49(G.2G,10)/1j)}G.3i/=1j;G.1s.F=O.2P(G.1s.F);G.1s.J=O.2P(G.1s.J);G.1f={F:o.1d.F,J:o.1d.J};B(G.9g==="4e"&&1r G.3c==="3j"){G.3c=1X.7u(G.3c)}G.1Z={5m:(o.1d.F-G.1s.F)/2,68:o.1d.F-G.1Z.5m,5l:(o.1d.J-G.1s.J)/2,66:o.1d.J-G.1Z.5l};G.1x=[{x:G.1Z.5m+G.2G,y:G.1Z.66-G.2G},{x:G.1Z.68-G.2G,y:G.1Z.66-G.2G},{x:G.1Z.68-G.2G,y:G.1Z.5l+G.2G},{x:G.1Z.5m+G.2G,y:G.1Z.5l+G.2G}];G.4f=2b.52(0,0,G.1x[3].x,G.1x[3].y)-G.2G;u o.2m("bX",A(C){M 1p,U,4g;U=C.8R();B((U.x>G.1x[0].x&&U.xG.1Z.5l&&U.yG.1Z.5m&&U.xG.1x[3].y&&U.yG.1x[0].x&&U.xG.1Z.66){1p=(U.y-G.1Z.66)/G.4f}S B(U.y>G.1x[2].y&&U.yG.1Z.68){1p=(U.x-G.1Z.68)/G.4f}S B(U.x>G.1x[0].x&&U.xG.1x[2].y&&U.y=G.1x[0].y){4g=D.52(U.x,U.y,G.1x[0].x,G.1x[0].y);1p=(4g-G.2G)/G.4f}S B(U.x>=G.1x[1].x&&U.y>=G.1x[1].y){4g=D.52(U.x,U.y,G.1x[1].x,G.1x[1].y);1p=(4g-G.2G)/G.4f}S B(U.x>=G.1x[2].x&&U.y<=G.1x[2].y){4g=D.52(U.x,U.y,G.1x[2].x,G.1x[2].y);1p=(4g-G.2G)/G.4f}S B(U.x<=G.1x[3].x&&U.y<=G.1x[3].y){4g=D.52(U.x,U.y,G.1x[3].x,G.1x[3].y);1p=(4g-G.2G)/G.4f}B(1p<0){u C}u 9y[G.9g](C,1p,G)})});(A(){M 4v,9o,9p,64,63;64=[2S,2S,37,2S,3u,37,3v,2S,3X,3u,3y,37,3W,3v,3V,2S,4J,3X,4I,3u,4F,3y,4z,37,4x,3W,4m,3v,34,3V,4T,2S,5Z,4J,3Q,3X,5P,4I,5N,3u,34,4F,5K,3y,4O,4z,4L,37,5z,4x,5y,3W,5x,4m,5w,3v,5v,34,5u,3V,5t,4T,3P,2S,8u,5Z,8r,4J,8o,3Q,8a,3X,7Y,5P,7M,4I,4y,5N,7e,3u,5q,34,7a,4F,79,5K,4w,3y,3P,4O,8y,4z,8x,4L,8j,37,8b,5z,3Q,4x,7X,5y,7U,3W,7S,5x,7P,4m,4y,5w,5G,3v,7p,5v,7o,34,7d,5u,8B,3V,5Y,5t,4w,4T,89,3P,81,2S,cK,8u,cw,5Z,4L,8r,cq,4J,cp,8o,cj,3Q,cc,8a,ca,3X,bT,7Y,bM,5P,bK,7M,bF,4I,bE,4y,83,5N,5G,7e,84,3u,bA,5q,bz,34,by,7a,bw,4F,86,79,5Y,5K,bu,4w,bo,3y,bj,3P,ba,4O,b9,8y,b8,4z,b7,8x,b6,4L,b5,8j,b4,37,b3,8b,b2,5z,aR,3Q,aO,4x,aJ,7X,aH,5y,aF,7U,aC,3W,az,7S,aw,5x,av,7P,au,4m,ar,4y,83,5w,ao,5G,an,3v,84,7p,ak,5v,5q,7o,aj,34,ag,7d,ad,5u,9O,8B,86,3V,a9,5Y,d7,5t,cZ,4w,cY,4T,3y,89,cX,3P,cT,81,4O];63=[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];9o=A(F,J,5J,5M,2H,P,c2){M 3Z,1i,2s,6U,6R,6S,6Q;3Z=1r 2g!=="42"&&2g!==L?1y 3S():2p.3K(\'I\');3Z.F=F;3Z.J=J;6U=5J+O.c0(2H)*P*0.5;6S=5M+O.bZ(2H)*P*0.5;6R=5J-O.c0(2H)*P*0.5;6Q=5M-O.bZ(2H)*P*0.5;1i=3Z.3h("2d");2s=1i.el(6U,6S,6R,6Q);B(!c2){2s.5e(0,"7H");2s.5e(1,"93")}S{2s.5e(0,"7H");2s.5e(0.5,"93");2s.5e(1,"7H")}1i.bN=2s;1i.bL(0,0,F,J);u 1i.48(0,0,F,J)};9p=A(F,J,5J,5M,6v,6t){M 3Z,1i,2s;3Z=1r 2g!=="42"&&2g!==L?1y 3S():2p.3K(\'I\');3Z.F=F;3Z.J=J;1i=3Z.3h("2d");2s=1i.et(5J,5M,6v,5J,5M,6t);2s.5e(1,"7H");2s.5e(0,"93");1i.bN=2s;1i.bL(0,0,F,J);u 1i.48(0,0,F,J)};4v=A(){o.r=0;o.g=0;o.b=0;o.a=0;u o.1S=L};D.2w.V("96",A(bt,1U,br,7B){M 2n,2A,1O,5L,6q,2J,2l,2D,1L,J,3U,i,6p,2z,3o,7r,3R,6n,2L,p,1z,1B,Y,1A,2o,2E,1R,9a,1a,3a,2R,1b,4h,1m,1H,2M,5i,2W,8i,8h,5V,F,3l,x,y,1h,4R,4P,H,1e,1I,3m,3r,3s,3k,3w,3z,5O;F=o.1d.F;J=o.1d.J;3o=o.T;9a=bt.29;8h=F*J;5V=8h<<2;Y=[];W(i=H=0;0<=5V?H<5V:H>5V;i=0<=5V?++H:--H){Y[i]=3o[i]}6q=0;5i=7B;7B-=1;9I(5i-->=0){3R=(1U+0.5)|0;B(3R===0){5I}B(3R>6A){3R=6A}2J=3R+3R+1;8i=F<<2;3l=F-1;3U=J-1;1a=3R+1;2W=1a*(1a+1)/2;2M=1y 4v();4h=da 0;1b=2M;W(i=1e=1;1<=2J?1e<2J:1e>2J;i=1<=2J?++1e:--1e){1b=1b.1S=1y 4v();B(i===1a){4h=1b}}1b.1S=2M;1m=L;1H=L;4P=1h=0;2L=64[3R];2R=63[3R];W(y=1I=0;0<=J?1IJ;y=0<=J?++1I:--1I){2o=2l=2n=1R=1L=1O=0;2E=1a*(1A=Y[1h]);2D=1a*(1B=Y[1h+1]);2A=1a*(1z=Y[1h+2]);1R+=2W*1A;1L+=2W*1B;1O+=2W*1z;1b=2M;W(i=3m=0;0<=1a?3m<1a:3m>1a;i=0<=1a?++3m:--3m){1b.r=1A;1b.g=1B;1b.b=1z;1b=1b.1S}W(i=3r=1;1<=1a?3r<1a:3r>1a;i=1<=1a?++3r:--3r){p=1h+((3lF;x=0<=F?++3s:--3s){Y[1h]=(1R*2L)>>2R;Y[1h+1]=(1L*2L)>>2R;Y[1h+2]=(1O*2L)>>2R;1R-=2E;1L-=2D;1O-=2A;2E-=1m.r;2D-=1m.g;2A-=1m.b;p=(4P+((p=x+1a)<3l?p:3l))<<2;2o+=(1m.r=Y[p]);2l+=(1m.g=Y[p+1]);2n+=(1m.b=Y[p+2]);1R+=2o;1L+=2l;1O+=2n;1m=1m.1S;2E+=(1A=1H.r);2D+=(1B=1H.g);2A+=(1z=1H.b);2o-=1A;2l-=1B;2n-=1z;1H=1H.1S;1h+=4}4P+=F}W(x=3k=0;0<=F?3kF;x=0<=F?++3k:--3k){2l=2n=2o=1L=1O=1R=0;1h=x<<2;2E=1a*(1A=Y[1h]);2D=1a*(1B=Y[1h+1]);2A=1a*(1z=Y[1h+2]);1R+=2W*1A;1L+=2W*1B;1O+=2W*1z;1b=2M;W(i=3w=0;0<=1a?3w<1a:3w>1a;i=0<=1a?++3w:--3w){1b.r=1A;1b.g=1B;1b.b=1z;1b=1b.1S}4R=F;W(i=3z=1;1<=1a?3z<1a:3z>1a;i=1<=1a?++3z:--3z){1h=(4R+x)<<2;1R+=(1b.r=(1A=Y[1h]))*(3a=1a-i);1L+=(1b.g=(1B=Y[1h+1]))*3a;1O+=(1b.b=(1z=Y[1h+2]))*3a;2o+=1A;2l+=1B;2n+=1z;1b=1b.1S;B(i<3U){4R+=F}}1h=x;1m=2M;1H=4h;W(y=5O=0;0<=J?5OJ;y=0<=J?++5O:--5O){p=1h<<2;Y[p]=(1R*2L)>>2R;Y[p+1]=(1L*2L)>>2R;Y[p+2]=(1O*2L)>>2R;1R-=2E;1L-=2D;1O-=2A;2E-=1m.r;2D-=1m.g;2A-=1m.b;p=(x+(((p=y+1a)<3U?p:3U)*F))<<2;1R+=(2o+=(1m.r=Y[p]));1L+=(2l+=(1m.g=Y[p+1]));1O+=(2n+=(1m.b=Y[p+2]));1m=1m.1S;2E+=(1A=1H.r);2D+=(1B=1H.g);2A+=(1z=1H.b);2o-=1A;2l-=1B;2n-=1z;1H=1H.1S;1h+=F}}1U*=br;i=8h;9I(--i>-1){2z=i<<2;6n=(9a[2z+2]&fl)/E.0*7B;7r=6n|0;B(7r===6q){5L=6A.0*(6n-(6n|0));6p=6A-5L;3o[2z]=(3o[2z]*6p+Y[2z]*5L)>>8;3o[2z+1]=(3o[2z+1]*6p+Y[2z+1]*5L)>>8;3o[2z+2]=(3o[2z+2]*6p+Y[2z+2]*5L)>>8}S B(7r===6q+1){3o[2z]=Y[2z];3o[2z+1]=Y[2z+1];3o[2z+2]=Y[2z+2]}}6q++}u o});D.R.V("fo",A(G){M 4c,2s;4c={3t:{x:o.1d.F/2,y:o.1d.J/2},2H:45,aa:6a,7v:3,7t:1.5,5i:3};G=1v.7N(4c,G);G.2H*=O.aB/47;2s=9o(o.1d.F,o.1d.J,G.3t.x,G.3t.y,G.2H,G.aa,31);u o.5a("96",[2s,G.7v,G.7t,G.5i])});u D.R.V("fv",A(G){M 4c,2s,6v,6t;4c={1s:50,3t:{x:o.1d.F/2,y:o.1d.J/2},7v:3,7t:1.5,5i:3,1U:L};G=1v.7N(4c,G);B(!G.1U){G.1U=o.1d.F2J;i=1<=2J?++H:--H){1b=1b.1S=1y 4v();B(i===1a){4h=1b}}1b.1S=2M;1m=L;1H=L;4P=1h=0;2L=64[1U];2R=63[1U];W(y=1e=0;0<=J?1eJ;y=0<=J?++1e:--1e){2o=2l=2n=1R=1L=1O=0;2E=1a*(1A=Y[1h]);2D=1a*(1B=Y[1h+1]);2A=1a*(1z=Y[1h+2]);1R+=2W*1A;1L+=2W*1B;1O+=2W*1z;1b=2M;W(i=1I=0;0<=1a?1I<1a:1I>1a;i=0<=1a?++1I:--1I){1b.r=1A;1b.g=1B;1b.b=1z;1b=1b.1S}W(i=3m=1;1<=1a?3m<1a:3m>1a;i=1<=1a?++3m:--3m){p=1h+((3lF;x=0<=F?++3r:--3r){Y[1h]=(1R*2L)>>2R;Y[1h+1]=(1L*2L)>>2R;Y[1h+2]=(1O*2L)>>2R;1R-=2E;1L-=2D;1O-=2A;2E-=1m.r;2D-=1m.g;2A-=1m.b;p=(4P+((p=x+1U+1)<3l?p:3l))<<2;2o+=(1m.r=Y[p]);2l+=(1m.g=Y[p+1]);2n+=(1m.b=Y[p+2]);1R+=2o;1L+=2l;1O+=2n;1m=1m.1S;2E+=(1A=1H.r);2D+=(1B=1H.g);2A+=(1z=1H.b);2o-=1A;2l-=1B;2n-=1z;1H=1H.1S;1h+=4}4P+=F}W(x=3s=0;0<=F?3sF;x=0<=F?++3s:--3s){2l=2n=2o=1L=1O=1R=0;1h=x<<2;2E=1a*(1A=Y[1h]);2D=1a*(1B=Y[1h+1]);2A=1a*(1z=Y[1h+2]);1R+=2W*1A;1L+=2W*1B;1O+=2W*1z;1b=2M;W(i=3k=0;0<=1a?3k<1a:3k>1a;i=0<=1a?++3k:--3k){1b.r=1A;1b.g=1B;1b.b=1z;1b=1b.1S}4R=F;W(i=3w=1;1<=1U?3w<=1U:3w>=1U;i=1<=1U?++3w:--3w){1h=(4R+x)<<2;1R+=(1b.r=(1A=Y[1h]))*(3a=1a-i);1L+=(1b.g=(1B=Y[1h+1]))*3a;1O+=(1b.b=(1z=Y[1h+2]))*3a;2o+=1A;2l+=1B;2n+=1z;1b=1b.1S;B(i<3U){4R+=F}}1h=x;1m=2M;1H=4h;W(y=3z=0;0<=J?3zJ;y=0<=J?++3z:--3z){p=1h<<2;Y[p]=(1R*2L)>>2R;Y[p+1]=(1L*2L)>>2R;Y[p+2]=(1O*2L)>>2R;1R-=2E;1L-=2D;1O-=2A;2E-=1m.r;2D-=1m.g;2A-=1m.b;p=(x+(((p=y+1a)<3U?p:3U)*F))<<2;1R+=(2o+=(1m.r=Y[p]));1L+=(2l+=(1m.g=Y[p+1]));1O+=(2n+=(1m.b=Y[p+2]));1m=1m.1S;2E+=(1A=1H.r);2D+=(1B=1H.g);2A+=(1z=1H.b);2o-=1A;2l-=1B;2n-=1z;1H=1H.1S;1h+=F}}u o});u D.R.V("6f",A(1U){u o.5a("6f",[1U])})})();D.R.V("c3",A(Q){u o.2m("c3",A(C){M 6L;6L=(0.bp*C.r)+(0.bs*C.g)+(0.bv*C.b);B(6L= 0)) { + ref = from.attributes; + results = []; + for (o = 0, len = ref.length; o < len; o++) { + attr = ref[o]; + if ((opts.except != null) && (ref1 = attr.nodeName, indexOf.call(opts.except, ref1) >= 0)) { continue; } - _results.push(to.setAttribute(attr.nodeName, attr.nodeValue)); + results.push(to.setAttribute(attr.nodeName, attr.nodeValue)); } - return _results; + return results; }; Util.dataArray = function(length) { @@ -171,8 +172,8 @@ Root = window; } - Caman = (function(_super) { - __extends(Caman, _super); + Caman = (function(superClass) { + extend(Caman, superClass); Caman.version = { release: "4.1.2", @@ -211,9 +212,8 @@ }; function Caman() { - this.nodeFileReady = __bind(this.nodeFileReady, this); - var args, callback, id, - _this = this; + this.nodeFileReady = bind(this.nodeFileReady, this); + var args, callback, id; if (arguments.length === 0) { throw "Invalid arguments"; } @@ -236,6 +236,8 @@ }; this.cropped = false; this.resized = false; + this.rotated = false; + this.rotationAngle = 0; this.pixelStack = []; this.layerStack = []; this.canvasQueue = []; @@ -243,10 +245,12 @@ this.scaled = false; this.analyze = new Analyze(this); this.renderer = new Renderer(this); - this.domIsLoaded(function() { - _this.parseArguments(args); - return _this.setup(); - }); + this.domIsLoaded((function(_this) { + return function() { + _this.parseArguments(args); + return _this.setup(); + }; + })(this)); return this; } else { return new Caman(arguments); @@ -254,32 +258,37 @@ } Caman.prototype.domIsLoaded = function(cb) { - var listener, - _this = this; + var listener; if (Caman.NodeJS) { - return setTimeout(function() { - return cb.call(_this); - }, 0); + return setTimeout((function(_this) { + return function() { + return cb.call(_this); + }; + })(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 setTimeout((function(_this) { + return function() { return cb.call(_this); - } - }; + }; + })(this), 0); + } else { + listener = (function(_this) { + return function() { + if (document.readyState === "complete") { + Log.debug("DOM initialized"); + return cb.call(_this); + } + }; + })(this); return document.addEventListener("readystatechange", listener, false); } } }; Caman.prototype.parseArguments = function(args) { - var key, val, _ref, _results; + var key, ref, results, val; if (args.length === 0) { throw "Invalid arguments given"; } @@ -303,14 +312,14 @@ } this.callback = args[2]; if (args.length === 4) { - _ref = args[4]; - _results = []; - for (key in _ref) { - if (!__hasProp.call(_ref, key)) continue; - val = _ref[key]; - _results.push(this.options[key] = val); + ref = args[4]; + results = []; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + val = ref[key]; + results.push(this.options[key] = val); } - return _results; + return results; } }; @@ -378,6 +387,7 @@ this.image.src = data; Log.debug("Image loaded. Width = " + (this.imageWidth()) + ", Height = " + (this.imageHeight())); this.canvas = new Canvas(this.imageWidth(), this.imageHeight()); + this.renderingCanvas = new Canvas(this.imageWidth(), this.imageHeight()); return this.finishInit(); }; @@ -385,21 +395,31 @@ this.image = this.initObj; this.canvas = document.createElement('canvas'); this.context = this.canvas.getContext('2d'); + this.renderingCanvas = document.createElement('canvas'); + this.renderingContext = this.renderingCanvas.getContext('2d'); Util.copyAttributes(this.image, this.canvas, { except: ['src'] }); + Util.copyAttributes(this.image, this.renderingCanvas, { + except: ['src'] + }); if (this.image.parentNode != null) { - this.image.parentNode.replaceChild(this.canvas, this.image); + this.image.parentNode.replaceChild(this.renderingCanvas, this.image); } this.imageAdjustments(); return this.waitForImageLoaded(); }; Caman.prototype.initCanvas = function() { - this.canvas = this.initObj; + this.canvas = document.createElement('canvas'); this.context = this.canvas.getContext('2d'); + this.renderingCanvas = this.initObj; + this.renderingContext = this.renderingCanvas.getContext('2d'); + this.canvas.width = this.renderingCanvas.width; + this.canvas.height = this.renderingCanvas.height; if (this.imageUrl != null) { this.image = document.createElement('img'); + this.image.crossOrigin = 'anonymous'; this.image.src = this.imageUrl; this.imageAdjustments(); return this.waitForImageLoaded(); @@ -451,18 +471,25 @@ if (this.swapped) { this.canvas.width = this.imageWidth() / this.hiDPIRatio(); this.canvas.height = this.imageHeight() / this.hiDPIRatio(); + this.renderingCanvas.width = this.imageWidth() / this.hiDPIRatio(); + this.renderingCanvas.height = this.imageHeight() / this.hiDPIRatio(); } else { this.canvas.width = this.imageWidth(); this.canvas.height = this.imageHeight(); + this.renderingCanvas.width = this.imageWidth(); + this.renderingCanvas.height = this.imageHeight(); } return this.finishInit(); }; Caman.prototype.finishInit = function() { - var i, pixel, _i, _len, _ref; + var i, len, o, pixel, ref; if (this.context == null) { this.context = this.canvas.getContext('2d'); } + if (this.renderingContext == null) { + this.renderingContext = this.renderingCanvas.getContext('2d'); + } this.originalWidth = this.preScaledWidth = this.width = this.canvas.width; this.originalHeight = this.preScaledHeight = this.height = this.canvas.height; this.hiDPIAdjustments(); @@ -471,15 +498,16 @@ } if (this.image != null) { this.context.drawImage(this.image, 0, 0, this.imageWidth(), this.imageHeight(), 0, 0, this.preScaledWidth, this.preScaledHeight); + this.renderingContext.drawImage(this.image, 0, 0, this.imageWidth(), this.imageHeight(), 0, 0, this.preScaledWidth, this.preScaledHeight); } this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); this.pixelData = this.imageData.data; if (Caman.allowRevert) { this.initializedPixelData = Util.dataArray(this.pixelData.length); this.originalPixelData = Util.dataArray(this.pixelData.length); - _ref = this.pixelData; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; + ref = this.pixelData; + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; this.initializedPixelData[i] = pixel; this.originalPixelData[i] = pixel; } @@ -501,18 +529,18 @@ }; Caman.prototype.resetOriginalPixelData = function() { - var i, pixel, _i, _len, _ref, _results; + var i, len, o, pixel, ref, results; if (!Caman.allowRevert) { throw "Revert disabled"; } this.originalPixelData = Util.dataArray(this.pixelData.length); - _ref = this.pixelData; - _results = []; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; - _results.push(this.originalPixelData[i] = pixel); + ref = this.pixelData; + results = []; + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; + results.push(this.originalPixelData[i] = pixel); } - return _results; + return results; }; Caman.prototype.hasId = function() { @@ -543,8 +571,8 @@ this.preScaledHeight = this.canvas.height; this.canvas.width = this.preScaledWidth * ratio; this.canvas.height = this.preScaledHeight * ratio; - this.canvas.style.width = "" + this.preScaledWidth + "px"; - this.canvas.style.height = "" + this.preScaledHeight + "px"; + this.canvas.style.width = this.preScaledWidth + "px"; + this.canvas.style.height = this.preScaledHeight + "px"; this.context.scale(ratio, ratio); this.width = this.originalWidth = this.canvas.width; return this.height = this.originalHeight = this.canvas.height; @@ -577,12 +605,18 @@ }; Caman.prototype.replaceCanvas = function(newCanvas) { - var oldCanvas; - oldCanvas = this.canvas; + var i, len, o, pixel, ref; this.canvas = newCanvas; this.context = this.canvas.getContext('2d'); - if (!Caman.NodeJS) { - oldCanvas.parentNode.replaceChild(this.canvas, oldCanvas); + this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height); + this.pixelData = this.imageData.data; + if (Caman.allowRevert) { + this.originalPixelData = Util.dataArray(this.pixelData.length); + ref = this.pixelData; + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; + this.originalPixelData[i] = pixel; + } } this.width = this.canvas.width; this.height = this.canvas.height; @@ -594,37 +628,40 @@ }; 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); - }); + return this.renderer.execute((function(_this) { + return function() { + _this.renderingCanvas.width = _this.canvas.width; + _this.renderingCanvas.height = _this.canvas.height; + _this.renderingContext.putImageData(_this.imageData, 0, 0); + return callback.call(_this); + }; + })(this)); }; Caman.prototype.revert = function(updateContext) { - var i, pixel, _i, _len, _ref; + var i, len, o, pixel, ref; if (updateContext == null) { updateContext = true; } if (!Caman.allowRevert) { throw "Revert disabled"; } - _ref = this.originalVisiblePixels(); - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; + ref = this.originalVisiblePixels(); + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; this.pixelData[i] = pixel; } if (updateContext) { - return this.context.putImageData(this.imageData, 0, 0); + return this.renderingContext.putImageData(this.imageData, 0, 0); } }; Caman.prototype.reset = function() { - var canvas, ctx, i, imageData, pixel, pixelData, _i, _len, _ref; + var canvas, ctx, i, imageData, len, o, pixel, pixelData, ref; canvas = document.createElement('canvas'); Util.copyAttributes(this.canvas, canvas); canvas.width = this.originalWidth; @@ -632,9 +669,9 @@ ctx = canvas.getContext('2d'); imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); pixelData = imageData.data; - _ref = this.initializedPixelData; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; + ref = this.initializedPixelData; + for (i = o = 0, len = ref.length; o < len; i = ++o) { + pixel = ref[i]; pixelData[i] = pixel; } ctx.putImageData(imageData, 0, 0); @@ -647,42 +684,20 @@ }; Caman.prototype.originalVisiblePixels = function() { - var canvas, coord, ctx, endX, endY, i, imageData, pixel, pixelData, pixels, scaledCanvas, startX, startY, width, _i, _j, _len, _ref, _ref1, _ref2, _ref3; + var coord, endX, endY, i, o, pixelData, pixels, ref, ref1, ref2, startX, startY, width; if (!Caman.allowRevert) { throw "Revert disabled"; } pixels = []; - startX = this.cropCoordinates.x; + startX = 0; endX = startX + this.width; - startY = this.cropCoordinates.y; + startY = 0; endY = startY + this.height; - if (this.resized) { - canvas = document.createElement('canvas'); - canvas.width = this.originalWidth; - canvas.height = this.originalHeight; - ctx = canvas.getContext('2d'); - imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); - pixelData = imageData.data; - _ref = this.originalPixelData; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - pixel = _ref[i]; - pixelData[i] = pixel; - } - ctx.putImageData(imageData, 0, 0); - scaledCanvas = document.createElement('canvas'); - scaledCanvas.width = this.width; - scaledCanvas.height = this.height; - ctx = scaledCanvas.getContext('2d'); - ctx.drawImage(canvas, 0, 0, this.originalWidth, this.originalHeight, 0, 0, this.width, this.height); - pixelData = ctx.getImageData(0, 0, this.width, this.height).data; - width = this.width; - } else { - pixelData = this.originalPixelData; - width = this.originalWidth; - } - for (i = _j = 0, _ref1 = pixelData.length; _j < _ref1; i = _j += 4) { + pixelData = this.originalPixelData; + width = this.canvas.width; + for (i = o = 0, ref = pixelData.length; o < ref; i = o += 4) { coord = Pixel.locationToCoordinates(i, width); - if (((startX <= (_ref2 = coord.x) && _ref2 < endX)) && ((startY <= (_ref3 = coord.y) && _ref3 < endY))) { + if (((startX <= (ref1 = coord.x) && ref1 < endX)) && ((startY <= (ref2 = coord.y) && ref2 < endY))) { pixels.push(pixelData[i], pixelData[i + 1], pixelData[i + 2], pixelData[i + 3]); } } @@ -699,7 +714,7 @@ }; Caman.prototype.processKernel = function(name, adjust, divisor, bias) { - var i, _i, _ref; + var i, o, ref; if (divisor == null) { divisor = null; } @@ -708,7 +723,7 @@ } if (divisor == null) { divisor = 0; - for (i = _i = 0, _ref = adjust.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + for (i = o = 0, ref = adjust.length; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { divisor += adjust[i]; } } @@ -772,29 +787,29 @@ Root.Caman = Caman; Caman.Analyze = (function() { - function Analyze(c) { - this.c = c; + function Analyze(c1) { + this.c = c1; } Analyze.prototype.calculateLevels = function() { - var i, levels, numPixels, _i, _j, _k, _ref; + var i, levels, numPixels, o, ref, u, w; levels = { r: {}, g: {}, b: {} }; - for (i = _i = 0; _i <= 255; i = ++_i) { + for (i = o = 0; o <= 255; i = ++o) { 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) { + for (i = u = 0, ref = this.c.pixelData.length; u < ref; i = u += 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) { + for (i = w = 0; w <= 255; i = ++w) { levels.r[i] /= numPixels; levels.g[i] /= numPixels; levels.b[i] /= numPixels; @@ -809,20 +824,20 @@ Analyze = Caman.Analyze; Caman.DOMUpdated = function() { - var img, imgs, parser, _i, _len, _results; + var img, imgs, len, o, parser, 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() { + results = []; + for (o = 0, len = imgs.length; o < len; o++) { + img = imgs[o]; + results.push(parser = new CamanParser(img, function() { this.parse(); return this.execute(); })); } - return _results; + return results; }; if (Caman.autoload) { @@ -846,7 +861,7 @@ } CamanParser.prototype.parse = function() { - var args, e, filter, func, inst, instFunc, m, r, unparsedInstructions, _i, _len, _ref, _results; + var args, e, filter, func, inst, instFunc, len, m, o, r, ref, results, unparsedInstructions; this.ele = this.caman.canvas; r = new RegExp(INST_REGEX, 'g'); unparsedInstructions = this.dataStr.match(r); @@ -854,20 +869,20 @@ 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 + "); };"); + results = []; + for (o = 0, len = unparsedInstructions.length; o < len; o++) { + inst = unparsedInstructions[o]; + 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 (_error) { - e = _error; - _results.push(Log.debug(e)); + results.push(func.call(this.caman)); + } catch (error) { + e = error; + results.push(Log.debug(e)); } } - return _results; + return results; }; CamanParser.prototype.execute = function() { @@ -926,7 +941,7 @@ }; Calculate.bezier = function(start, ctrl1, ctrl2, end, lowBound, highBound) { - var bezier, clamp, controlPoints, endX, i, j, lerp, next, prev, t, _i, _j, _ref; + var bezier, clamp, controlPoints, endX, i, j, lerp, next, o, prev, ref, t, u; if (lowBound == null) { lowBound = 0; } @@ -950,12 +965,12 @@ clamp = function(a, min, max) { return Math.min(Math.max(a, min), max); }; - for (i = _i = 0; _i < 1000; i = ++_i) { + for (i = o = 0; o < 1000; i = ++o) { t = i / 1000; prev = controlPoints; while (prev.length > 1) { next = []; - for (j = _j = 0, _ref = prev.length - 2; 0 <= _ref ? _j <= _ref : _j >= _ref; j = 0 <= _ref ? ++_j : --_j) { + for (j = u = 0, ref = prev.length - 2; 0 <= ref ? u <= ref : u >= ref; j = 0 <= ref ? ++u : --u) { next.push([lerp(prev[j][0], prev[j + 1][0], t), lerp(prev[j][1], prev[j + 1][1], t)]); } prev = next; @@ -971,8 +986,7 @@ }; Calculate.hermite = function(controlPoints, lowBound, highBound) { - var add, clamp, count, endX, fac0, fac1, fac2, fac3, i, j, lerp, m0, m1, mul, p, p0, p1, pointsPerSegment, pointsPerStep, pos, ret, sub, t, _i, _j, _ref, - _this = this; + var add, clamp, count, endX, fac0, fac1, fac2, fac3, i, j, lerp, m0, m1, mul, o, p, p0, p1, pointsPerSegment, pointsPerStep, pos, ref, ref1, ret, sub, t, u; if (controlPoints.length < 2) { throw "Invalid number of arguments to hermite"; } @@ -980,20 +994,26 @@ lerp = function(a, b, t) { return a * (1 - t) + b * t; }; - add = function(a, b, c, d) { - return [a[0] + b[0] + c[0] + d[0], a[1] + b[1] + c[1] + d[1]]; - }; - mul = function(a, b) { - return [a[0] * b[0], a[1] * b[1]]; - }; - sub = function(a, b) { - return [a[0] - b[0], a[1] - b[1]]; - }; + add = (function(_this) { + return function(a, b, c, d) { + return [a[0] + b[0] + c[0] + d[0], a[1] + b[1] + c[1] + d[1]]; + }; + })(this); + mul = (function(_this) { + return function(a, b) { + return [a[0] * b[0], a[1] * b[1]]; + }; + })(this); + sub = (function(_this) { + return function(a, b) { + return [a[0] - b[0], a[1] - b[1]]; + }; + })(this); clamp = function(a, min, max) { return Math.min(Math.max(a, min), max); }; count = 0; - for (i = _i = 0, _ref = controlPoints.length - 2; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { + for (i = o = 0, ref = controlPoints.length - 2; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) { p0 = controlPoints[i]; p1 = controlPoints[i + 1]; pointsPerSegment = p1[0] - p0[0]; @@ -1005,7 +1025,7 @@ m0 = mul(sub(p1, p), [0.5, 0.5]); p = i < controlPoints.length - 2 ? controlPoints[i + 2] : p1; m1 = mul(sub(p, p0), [0.5, 0.5]); - for (j = _j = 0; 0 <= pointsPerSegment ? _j <= pointsPerSegment : _j >= pointsPerSegment; j = 0 <= pointsPerSegment ? ++_j : --_j) { + for (j = u = 0, ref1 = pointsPerSegment; 0 <= ref1 ? u <= ref1 : u >= ref1; j = 0 <= ref1 ? ++u : --u) { t = j * pointsPerStep; fac0 = 2.0 * t * t * t - 3.0 * t * t + 1.0; fac1 = t * t * t - 2.0 * t * t + t; @@ -1022,21 +1042,23 @@ }; Calculate.missingValues = function(values, endX) { - var i, j, leftCoord, ret, rightCoord, _i, _j; + var i, j, leftCoord, o, ref, ref1, ref2, ret, rightCoord, u; if (Object.keys(values).length < endX + 1) { ret = {}; - for (i = _i = 0; 0 <= endX ? _i <= endX : _i >= endX; i = 0 <= endX ? ++_i : --_i) { + for (i = o = 0, ref = endX; 0 <= ref ? o <= ref : o >= ref; i = 0 <= ref ? ++o : --o) { if (values[i] != null) { ret[i] = values[i]; } else { leftCoord = [i - 1, ret[i - 1]]; - for (j = _j = i; i <= endX ? _j <= endX : _j >= endX; j = i <= endX ? ++_j : --_j) { + for (j = u = ref1 = i, ref2 = endX; ref1 <= ref2 ? u <= ref2 : u >= ref2; j = ref1 <= ref2 ? ++u : --u) { if (values[j] != null) { rightCoord = [j, values[j]]; break; } } - ret[i] = leftCoord[1] + ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * (i - leftCoord[0]); + if (rightCoord) { + ret[i] = leftCoord[1] + ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * (i - leftCoord[0]); + } } } return ret; @@ -1381,22 +1403,22 @@ Event.types = ["processStart", "processComplete", "renderStart", "renderFinished", "blockStarted", "blockFinished"]; Event.trigger = function(target, type, data) { - var event, _i, _len, _ref, _results; + var event, len, o, ref, results; if (data == null) { data = null; } 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]; + ref = this.events[type]; + results = []; + for (o = 0, len = ref.length; o < len; o++) { + event = ref[o]; if (event.target === null || target.id === event.target.id) { - _results.push(event.fn.call(target, data)); + results.push(event.fn.call(target, data)); } else { - _results.push(void 0); + results.push(void 0); } } - return _results; + return results; } }; @@ -1409,7 +1431,7 @@ type = _type; fn = _fn; } - if (__indexOf.call(this.types, type) < 0) { + if (indexOf.call(this.types, type) < 0) { return false; } if (!this.events[type]) { @@ -1453,7 +1475,7 @@ Caman.IO = (function() { function IO() {} - IO.domainRegex = /(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/; + IO.domainRegex = /(?:(?:http|https):\/\/)((?:[-|\w]+)\.(?:(?:-|\w|\.)+))/; IO.isRemote = function(img) { if (img == null) { @@ -1466,8 +1488,7 @@ }; IO.corsEnabled = function(img) { - var _ref; - return (img.crossOrigin != null) && ((_ref = img.crossOrigin.toLowerCase()) === 'anonymous' || _ref === 'use-credentials'); + return true; }; IO.isURLRemote = function(url) { @@ -1495,7 +1516,7 @@ }; IO.proxyUrl = function(src) { - return "" + Caman.remoteProxy + "?" + Caman.proxyParam + "=" + (encodeURIComponent(src)); + return Caman.remoteProxy + "?" + Caman.proxyParam + "=" + (encodeURIComponent(src)); }; IO.useProxy = function(lang) { @@ -1548,8 +1569,8 @@ if (stats.isFile() && !overwrite) { return false; } - } catch (_error) { - e = _error; + } catch (error) { + e = error; Log.debug("Creating output file " + file); } return fs.writeFile(file, this.canvas.toBuffer(), function(err) { @@ -1578,14 +1599,14 @@ type = "png"; } type = type.toLowerCase(); - return this.canvas.toDataURL("image/" + type); + return this.renderingCanvas.toDataURL("image/" + type); }; IO = Caman.IO; Caman.Layer = (function() { - function Layer(c) { - this.c = c; + function Layer(c1) { + this.c = c1; this.filter = this.c; this.options = { blendingMode: 'normal', @@ -1616,9 +1637,9 @@ }; Layer.prototype.copyParent = function() { - var i, parentData, _i, _ref; + var i, o, parentData, ref; parentData = this.c.pixelData; - for (i = _i = 0, _ref = this.c.pixelData.length; _i < _ref; i = _i += 4) { + for (i = o = 0, ref = this.c.pixelData.length; o < ref; i = o += 4) { this.pixelData[i] = parentData[i]; this.pixelData[i + 1] = parentData[i + 1]; this.pixelData[i + 2] = parentData[i + 2]; @@ -1649,11 +1670,11 @@ }; Layer.prototype.applyToParent = function() { - var i, layerData, parentData, result, rgbaLayer, rgbaParent, _i, _ref, _results; + var i, layerData, o, parentData, ref, result, results, rgbaLayer, rgbaParent; 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) { + results = []; + for (i = o = 0, ref = layerData.length; o < ref; i = o += 4) { rgbaParent = { r: parentData[i], g: parentData[i + 1], @@ -1675,9 +1696,9 @@ } 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)))); + results.push(parentData[i + 2] = rgbaParent.b - ((rgbaParent.b - result.b) * (this.options.opacity * (result.a / 255)))); } - return _results; + return results; }; return Layer; @@ -1688,21 +1709,21 @@ Caman.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]; + var len, name, o, ref; + ref = ['log', 'info', 'warn', 'error']; + for (o = 0, len = ref.length; o < len; o++) { + name = ref[o]; this[name] = (function(name) { return function() { var args, e; - args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + args = 1 <= arguments.length ? slice1.call(arguments, 0) : []; if (!Caman.DEBUG) { return; } try { return console[name].apply(console, args); - } catch (_error) { - e = _error; + } catch (error) { + e = error; return console[name](args); } }; @@ -1732,12 +1753,12 @@ }; }; - function Pixel(r, g, b, a, c) { - this.r = r != null ? r : 0; - this.g = g != null ? g : 0; - this.b = b != null ? b : 0; - this.a = a != null ? a : 255; - this.c = c != null ? c : null; + function Pixel(r1, g1, b1, a1, c1) { + this.r = r1 != null ? r1 : 0; + this.g = g1 != null ? g1 : 0; + this.b = b1 != null ? b1 : 0; + this.a = a1 != null ? a1 : 255; + this.c = c1 != null ? c1 : null; this.loc = 0; } @@ -1859,9 +1880,9 @@ Caman.Renderer = (function() { Renderer.Blocks = Caman.NodeJS ? require('os').cpus().length : 4; - function Renderer(c) { - this.c = c; - this.processNext = __bind(this.processNext, this); + function Renderer(c1) { + this.c = c1; + this.processNext = bind(this.processNext, this); this.renderQueue = []; this.modPixelData = null; } @@ -1908,32 +1929,35 @@ }; Renderer.prototype.eachBlock = function(fn) { - var blockN, blockPixelLength, bnum, end, f, i, lastBlockN, n, start, _i, _ref, _results, - _this = this; + var blockN, blockPixelLength, bnum, end, f, i, lastBlockN, n, o, ref, results, start; 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) { + results = []; + for (i = o = 0, ref = Renderer.Blocks; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { start = i * blockN; end = start + (i === Renderer.Blocks - 1 ? lastBlockN : blockN); if (Caman.NodeJS) { - f = Fiber(function() { - return fn.call(_this, i, start, end); - }); - bnum = f.run(); - _results.push(this.blockFinished(bnum)); - } else { - _results.push(setTimeout((function(i, start, end) { + f = Fiber((function(_this) { return function() { return fn.call(_this, i, start, end); }; - })(i, start, end), 0)); + })(this)); + bnum = f.run(); + results.push(this.blockFinished(bnum)); + } else { + results.push(setTimeout((function(_this) { + return function(i, start, end) { + return function() { + return fn.call(_this, i, start, end); + }; + }; + })(this)(i, start, end), 0)); } } - return _results; + return results; }; Renderer.prototype.executeFilter = function() { @@ -1953,7 +1977,7 @@ }; Renderer.prototype.renderBlock = function(bnum, start, end) { - var i, pixel, _i; + var i, o, pixel, ref, ref1; Log.debug("Block #" + bnum + " - Filter: " + this.currentJob.name + ", Start: " + start + ", End: " + end); Event.trigger(this.c, "blockStarted", { blockNum: bnum, @@ -1963,13 +1987,15 @@ }); pixel = new Pixel(); pixel.setContext(this.c); - for (i = _i = start; _i < end; i = _i += 4) { + for (i = o = ref = start, ref1 = end; o < ref1; i = o += 4) { pixel.loc = i; pixel.r = this.c.pixelData[i]; pixel.g = this.c.pixelData[i + 1]; pixel.b = this.c.pixelData[i + 2]; pixel.a = this.c.pixelData[i + 3]; - this.currentJob.processFn(pixel); + if (this.currentJob.processFn) { + this.currentJob.processFn(pixel); + } this.c.pixelData[i] = Util.clampRGB(pixel.r); this.c.pixelData[i + 1] = Util.clampRGB(pixel.g); this.c.pixelData[i + 2] = Util.clampRGB(pixel.b); @@ -1983,12 +2009,16 @@ }; Renderer.prototype.renderKernel = function(bnum, start, end) { - var adjust, adjustSize, bias, builder, builderIndex, divisor, i, j, k, kernel, n, name, p, pixel, res, _i, _j, _k; + var adjust, adjustSize, bias, builder, builderIndex, divisor, i, j, k, kernel, n, name, o, p, pixel, ref, ref1, ref2, ref3, ref4, ref5, res, u, w; name = this.currentJob.name; bias = this.currentJob.bias; divisor = this.currentJob.divisor; n = this.c.pixelData.length; adjust = this.currentJob.adjust; + if (!adjust) { + this.blockFinished(bnum); + return; + } adjustSize = Math.sqrt(adjust.length); kernel = []; Log.debug("Rendering kernel - Filter: " + this.currentJob.name); @@ -1997,11 +2027,11 @@ builder = (adjustSize - 1) / 2; pixel = new Pixel(); pixel.setContext(this.c); - for (i = _i = start; _i < end; i = _i += 4) { + for (i = o = ref = start, ref1 = end; o < ref1; i = o += 4) { pixel.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) { + for (j = u = ref2 = -builder, ref3 = builder; ref2 <= ref3 ? u <= ref3 : u >= ref3; j = ref2 <= ref3 ? ++u : --u) { + for (k = w = ref4 = builder, ref5 = -builder; ref4 <= ref5 ? w <= ref5 : w >= ref5; k = ref4 <= ref5 ? ++w : --w) { p = pixel.getPixelRelative(j, k); kernel[builderIndex * 3] = p.r; kernel[builderIndex * 3 + 1] = p.g; @@ -2023,7 +2053,7 @@ }; Renderer.prototype.blockFinished = function(bnum) { - var i, _i, _ref; + var i, o, ref; if (bnum >= 0) { Log.debug("Block #" + bnum + " finished! Filter: " + this.currentJob.name); } @@ -2035,7 +2065,7 @@ }); 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) { + for (i = o = 0, ref = this.c.pixelData.length; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { this.c.pixelData[i] = this.modPixelData[i]; } } @@ -2048,13 +2078,13 @@ }; Renderer.prototype.processKernel = function(adjust, kernel, divisor, bias) { - var i, val, _i, _ref; + var i, o, ref, val; 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) { + for (i = o = 0, ref = adjust.length; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { val.r += adjust[i] * kernel[i * 3]; val.g += adjust[i] * kernel[i * 3 + 1]; val.b += adjust[i] * kernel[i * 3 + 2]; @@ -2066,16 +2096,17 @@ }; Renderer.prototype.loadOverlay = function(layer, src) { - var img, proxyUrl, - _this = this; + var img, proxyUrl; img = new Image(); - 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(); - }; + img.onload = (function(_this) { + return 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(); + }; + })(this); proxyUrl = IO.remoteCheck(src); return img.src = proxyUrl != null ? proxyUrl : src; }; @@ -2104,10 +2135,11 @@ }; Store.execute = function(search, callback) { - var _this = this; - setTimeout(function() { - return callback.call(_this.get(search), _this.get(search)); - }, 0); + setTimeout((function(_this) { + return function() { + return callback.call(_this.get(search), _this.get(search)); + }; + })(this), 0); return this.get(search); }; @@ -2313,14 +2345,14 @@ Filter.register("hue", function(adjust) { return this.process("hue", function(rgba) { - var b, g, h, hsv, r, _ref; + var b, g, h, hsv, r, ref; 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; - _ref = Convert.hsvToRGB(hsv.h, hsv.s, hsv.v), r = _ref.r, g = _ref.g, b = _ref.b; + ref = Convert.hsvToRGB(hsv.h, hsv.s, hsv.v), r = ref.r, g = ref.g, b = ref.b; rgba.r = r; rgba.g = g; rgba.b = b; @@ -2420,7 +2452,7 @@ return this; } for (chan in options) { - if (!__hasProp.call(options, chan)) continue; + if (!hasProp.call(options, chan)) continue; value = options[chan]; if (value === 0) { delete options[chan]; @@ -2458,8 +2490,8 @@ }); Filter.register("curves", function() { - var algo, bezier, chans, cps, end, i, last, start, _i, _j, _ref, _ref1; - chans = arguments[0], cps = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + var algo, bezier, chans, cps, end, i, last, o, ref, ref1, start, u; + chans = arguments[0], cps = 2 <= arguments.length ? slice1.call(arguments, 1) : []; last = cps[cps.length - 1]; if (typeof last === "function") { algo = last; @@ -2482,19 +2514,19 @@ bezier = algo(cps, 0, 255); start = cps[0]; if (start[0] > 0) { - for (i = _i = 0, _ref = start[0]; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + for (i = o = 0, ref = start[0]; 0 <= ref ? o < ref : o > ref; i = 0 <= ref ? ++o : --o) { bezier[i] = start[1]; } } end = cps[cps.length - 1]; if (end[0] < 255) { - for (i = _j = _ref1 = end[0]; _ref1 <= 255 ? _j <= 255 : _j >= 255; i = _ref1 <= 255 ? ++_j : --_j) { + for (i = u = ref1 = end[0]; ref1 <= 255 ? u <= 255 : u >= 255; i = ref1 <= 255 ? ++u : --u) { 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) { + var ref2, w; + for (i = w = 0, ref2 = chans.length; 0 <= ref2 ? w < ref2 : w > ref2; i = 0 <= ref2 ? ++w : --w) { rgba[chans[i]] = bezier[rgba[chans[i]]]; } return rgba; diff --git a/dist/caman.min.js b/dist/caman.min.js index 06d4f5fb..6617b83e 100644 --- a/dist/caman.min.js +++ b/dist/caman.min.js @@ -1,92 +1,91 @@ -(function(){var $,Analyze,Blender,Calculate,Caman,CamanParser,Canvas,Convert,Event,Fiber,Filter,IO,Image,Layer,Log,Module,Pixel,Plugin,Renderer,Root,Store,Util,fs,http,moduleKeywords,slice,__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;};Util.dataArray=function(length){if(length==null){length=0;} +return val;};Util.copyAttributes=function(from,to,opts){var attr,len,o,ref,ref1,results;if(opts==null){opts={};} +ref=from.attributes;results=[];for(o=0,len=ref.length;o=0)){continue;} +results.push(to.setAttribute(attr.nodeName,attr.nodeValue));} +return results;};Util.dataArray=function(length){if(length==null){length=0;} if(Caman.NodeJS||(window.Uint8Array!=null)){return new Uint8Array(length);} return new Array(length);};return Util;})();if(typeof exports!=="undefined"&&exports!==null){Root=exports;Canvas=require('canvas');Image=Canvas.Image;Fiber=require('fibers');fs=require('fs');http=require('http');}else{Root=window;} -Caman=(function(_super){__extends(Caman,_super);Caman.version={release:"4.1.2",date:"7/27/2013"};Caman.DEBUG=false;Caman.allowRevert=true;Caman.crossOrigin="anonymous";Caman.remoteProxy="";Caman.proxyParam="camanProxyUrl";Caman.NodeJS=typeof exports!=="undefined"&&exports!==null;Caman.autoload=!Caman.NodeJS;Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.getAttrId=function(canvas){if(Caman.NodeJS){return true;} +Caman=(function(superClass){extend(Caman,superClass);Caman.version={release:"4.1.2",date:"7/27/2013"};Caman.DEBUG=false;Caman.allowRevert=true;Caman.crossOrigin="anonymous";Caman.remoteProxy="";Caman.proxyParam="camanProxyUrl";Caman.NodeJS=typeof exports!=="undefined"&&exports!==null;Caman.autoload=!Caman.NodeJS;Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.getAttrId=function(canvas){if(Caman.NodeJS){return true;} if(typeof canvas==="string"){canvas=$(canvas);} if(!((canvas!=null)&&(canvas.getAttribute!=null))){return null;} -return canvas.getAttribute('data-caman-id');};function Caman(){this.nodeFileReady=__bind(this.nodeFileReady,this);var args,callback,id,_this=this;if(arguments.length===0){throw"Invalid arguments";} +return canvas.getAttribute('data-caman-id');};function Caman(){this.nodeFileReady=bind(this.nodeFileReady,this);var args,callback,id;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.initializedPixelData=this.originalPixelData=null;this.cropCoordinates={x:0,y:0};this.cropped=false;this.resized=false;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){var key,val,_ref,_results;if(args.length===0){throw"Invalid arguments given";} +this.id=Util.uniqid.get();this.initializedPixelData=this.originalPixelData=null;this.cropCoordinates={x:0,y:0};this.cropped=false;this.resized=false;this.rotated=false;this.rotationAngle=0;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){return function(){_this.parseArguments(args);return _this.setup();};})(this));return this;}else{return new Caman(arguments);}} +Caman.prototype.domIsLoaded=function(cb){var listener;if(Caman.NodeJS){return setTimeout((function(_this){return function(){return cb.call(_this);};})(this),0);}else{if(document.readyState==="complete"){Log.debug("DOM initialized");return setTimeout((function(_this){return function(){return cb.call(_this);};})(this),0);}else{listener=(function(_this){return function(){if(document.readyState==="complete"){Log.debug("DOM initialized");return cb.call(_this);}};})(this);return document.addEventListener("readystatechange",listener,false);}}};Caman.prototype.parseArguments=function(args){var key,ref,results,val;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;} -this.callback=args[2];if(args.length===4){_ref=args[4];_results=[];for(key in _ref){if(!__hasProp.call(_ref,key))continue;val=_ref[key];_results.push(this.options[key]=val);} -return _results;}};Caman.prototype.setInitObject=function(obj){if(Caman.NodeJS){this.initObj=obj;this.initType='node';return;} +this.callback=args[2];if(args.length===4){ref=args[4];results=[];for(key in ref){if(!hasProp.call(ref,key))continue;val=ref[key];results.push(this.options[key]=val);} +return results;}};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);} if(this.initObj==null){throw"Could not find image or canvas for initialization.";} 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(){Log.debug("Initializing for NodeJS");if(typeof this.initObj==="string"&&this.initObj.match(/^https?:\/\//)){return this.readFromHttp(this.initObj,this.nodeFileReady);}else if(typeof this.initObj==="string"){return fs.readFile(this.initObj,this.nodeFileReady);}else{return this.nodeFileReady(null,this.initObj);}};Caman.prototype.readFromHttp=function(url,callback){var req;Log.debug("Fetching image from "+url);req=http.get(url,function(res){var buf;buf='';res.setEncoding('binary');res.on('data',function(chunk){return buf+=chunk;});return res.on('end',function(){return callback(null,new Buffer(buf,'binary'));});});return req.on('error',callback);};Caman.prototype.nodeFileReady=function(err,data){if(err){throw err;} -this.image=new Image();this.image.src=data;Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));this.canvas=new Canvas(this.imageWidth(),this.imageHeight());return this.finishInit();};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']});if(this.image.parentNode!=null){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();} +this.image=new Image();this.image.src=data;Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));this.canvas=new Canvas(this.imageWidth(),this.imageHeight());this.renderingCanvas=new Canvas(this.imageWidth(),this.imageHeight());return this.finishInit();};Caman.prototype.initImage=function(){this.image=this.initObj;this.canvas=document.createElement('canvas');this.context=this.canvas.getContext('2d');this.renderingCanvas=document.createElement('canvas');this.renderingContext=this.renderingCanvas.getContext('2d');Util.copyAttributes(this.image,this.canvas,{except:['src']});Util.copyAttributes(this.image,this.renderingCanvas,{except:['src']});if(this.image.parentNode!=null){this.image.parentNode.replaceChild(this.renderingCanvas,this.image);} +this.imageAdjustments();return this.waitForImageLoaded();};Caman.prototype.initCanvas=function(){this.canvas=document.createElement('canvas');this.context=this.canvas.getContext('2d');this.renderingCanvas=this.initObj;this.renderingContext=this.renderingCanvas.getContext('2d');this.canvas.width=this.renderingCanvas.width;this.canvas.height=this.renderingCanvas.height;if(this.imageUrl!=null){this.image=document.createElement('img');this.image.crossOrigin='anonymous';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.isImageLoaded()){return this.imageLoaded();}else{return this.image.onload=this.imageLoaded;}};Caman.prototype.isImageLoaded=function(){if(!this.image.complete){return false;} if((this.image.naturalWidth!=null)&&this.image.naturalWidth===0){return false;} -return true;};Caman.prototype.imageWidth=function(){return this.image.width||this.image.naturalWidth;};Caman.prototype.imageHeight=function(){return this.image.height||this.image.naturalHeight;};Caman.prototype.imageLoaded=function(){Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));if(this.swapped){this.canvas.width=this.imageWidth()/this.hiDPIRatio();this.canvas.height=this.imageHeight()/this.hiDPIRatio();}else{this.canvas.width=this.imageWidth();this.canvas.height=this.imageHeight();} -return this.finishInit();};Caman.prototype.finishInit=function(){var i,pixel,_i,_len,_ref;if(this.context==null){this.context=this.canvas.getContext('2d');} +return true;};Caman.prototype.imageWidth=function(){return this.image.width||this.image.naturalWidth;};Caman.prototype.imageHeight=function(){return this.image.height||this.image.naturalHeight;};Caman.prototype.imageLoaded=function(){Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));if(this.swapped){this.canvas.width=this.imageWidth()/this.hiDPIRatio();this.canvas.height=this.imageHeight()/this.hiDPIRatio();this.renderingCanvas.width=this.imageWidth()/this.hiDPIRatio();this.renderingCanvas.height=this.imageHeight()/this.hiDPIRatio();}else{this.canvas.width=this.imageWidth();this.canvas.height=this.imageHeight();this.renderingCanvas.width=this.imageWidth();this.renderingCanvas.height=this.imageHeight();} +return this.finishInit();};Caman.prototype.finishInit=function(){var i,len,o,pixel,ref;if(this.context==null){this.context=this.canvas.getContext('2d');} +if(this.renderingContext==null){this.renderingContext=this.renderingCanvas.getContext('2d');} this.originalWidth=this.preScaledWidth=this.width=this.canvas.width;this.originalHeight=this.preScaledHeight=this.height=this.canvas.height;this.hiDPIAdjustments();if(!this.hasId()){this.assignId();} -if(this.image!=null){this.context.drawImage(this.image,0,0,this.imageWidth(),this.imageHeight(),0,0,this.preScaledWidth,this.preScaledHeight);} -this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;if(Caman.allowRevert){this.initializedPixelData=Util.dataArray(this.pixelData.length);this.originalPixelData=Util.dataArray(this.pixelData.length);_ref=this.pixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.initializedPixelData[i]=pixel;this.originalPixelData[i]=pixel;}} +if(this.image!=null){this.context.drawImage(this.image,0,0,this.imageWidth(),this.imageHeight(),0,0,this.preScaledWidth,this.preScaledHeight);this.renderingContext.drawImage(this.image,0,0,this.imageWidth(),this.imageHeight(),0,0,this.preScaledWidth,this.preScaledHeight);} +this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;if(Caman.allowRevert){this.initializedPixelData=Util.dataArray(this.pixelData.length);this.originalPixelData=Util.dataArray(this.pixelData.length);ref=this.pixelData;for(i=o=0,len=ref.length;o_ref;i=0<=_ref?++_i:--_i){divisor+=adjust[i];}} -this.renderer.add({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias});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;})(Module);Root.Caman=Caman;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;})();Analyze=Caman.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);}})();} +if(divisor==null){divisor=0;for(i=o=0,ref=adjust.length;0<=ref?oref;i=0<=ref?++o:--o){divisor+=adjust[i];}} +this.renderer.add({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias});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;})(Module);Root.Caman=Caman;Caman.Analyze=(function(){function Analyze(c1){this.c=c1;} +Analyze.prototype.calculateLevels=function(){var i,levels,numPixels,o,ref,u,w;levels={r:{},g:{},b:{}};for(i=o=0;o<=255;i=++o){levels.r[i]=0;levels.g[i]=0;levels.b[i]=0;} +for(i=u=0,ref=this.c.pixelData.length;u0)){return;} +results=[];for(o=0,len=imgs.length;o0)){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(_error){e=_error;_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=(function(){function Blender(){} +CamanParser.prototype.parse=function(){var args,e,filter,func,inst,instFunc,len,m,o,r,ref,results,unparsedInstructions;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(o=0,len=unparsedInstructions.length;o1){next=[];for(j=_j=0,_ref=prev.length-2;0<=_ref?_j<=_ref:_j>=_ref;j=0<=_ref?++_j:--_j){next.push([lerp(prev[j][0],prev[j+1][0],t),lerp(prev[j][1],prev[j+1][1],t)]);} +bezier={};lerp=function(a,b,t){return a*(1-t)+b*t;};clamp=function(a,min,max){return Math.min(Math.max(a,min),max);};for(i=o=0;o<1000;i=++o){t=i/1000;prev=controlPoints;while(prev.length>1){next=[];for(j=u=0,ref=prev.length-2;0<=ref?u<=ref:u>=ref;j=0<=ref?++u:--u){next.push([lerp(prev[j][0],prev[j+1][0],t),lerp(prev[j][1],prev[j+1][1],t)]);} prev=next;} bezier[Math.round(prev[0][0])]=Math.round(clamp(prev[0][1],lowBound,highBound));} endX=controlPoints[controlPoints.length-1][0];bezier=Caman.Calculate.missingValues(bezier,endX);if(bezier[endX]==null){bezier[endX]=bezier[endX-1];} -return bezier;};Calculate.hermite=function(controlPoints,lowBound,highBound){var add,clamp,count,endX,fac0,fac1,fac2,fac3,i,j,lerp,m0,m1,mul,p,p0,p1,pointsPerSegment,pointsPerStep,pos,ret,sub,t,_i,_j,_ref,_this=this;if(controlPoints.length<2){throw"Invalid number of arguments to hermite";} -ret={};lerp=function(a,b,t){return a*(1-t)+b*t;};add=function(a,b,c,d){return[a[0]+b[0]+c[0]+d[0],a[1]+b[1]+c[1]+d[1]];};mul=function(a,b){return[a[0]*b[0],a[1]*b[1]];};sub=function(a,b){return[a[0]-b[0],a[1]-b[1]];};clamp=function(a,min,max){return Math.min(Math.max(a,min),max);};count=0;for(i=_i=0,_ref=controlPoints.length-2;0<=_ref?_i<=_ref:_i>=_ref;i=0<=_ref?++_i:--_i){p0=controlPoints[i];p1=controlPoints[i+1];pointsPerSegment=p1[0]-p0[0];pointsPerStep=1/pointsPerSegment;if(i===controlPoints.length-2){pointsPerStep=1/(pointsPerSegment-1);} -p=i>0?controlPoints[i-1]:p0;m0=mul(sub(p1,p),[0.5,0.5]);p=i=pointsPerSegment;j=0<=pointsPerSegment?++_j:--_j){t=j*pointsPerStep;fac0=2.0*t*t*t-3.0*t*t+1.0;fac1=t*t*t-2.0*t*t+t;fac2=-2.0*t*t*t+3.0*t*t;fac3=t*t*t-t*t;pos=add(mul(p0,[fac0,fac0]),mul(m0,[fac1,fac1]),mul(p1,[fac2,fac2]),mul(m1,[fac3,fac3]));ret[Math.round(pos[0])]=Math.round(clamp(pos[1],lowBound,highBound));count+=1;}} -endX=controlPoints[controlPoints.length-1][0];ret=Caman.Calculate.missingValues(ret,endX);return ret;};Calculate.missingValues=function(values,endX){var i,j,leftCoord,ret,rightCoord,_i,_j;if(Object.keys(values).length=endX;i=0<=endX?++_i:--_i){if(values[i]!=null){ret[i]=values[i];}else{leftCoord=[i-1,ret[i-1]];for(j=_j=i;i<=endX?_j<=endX:_j>=endX;j=i<=endX?++_j:--_j){if(values[j]!=null){rightCoord=[j,values[j]];break;}} -ret[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}} +return bezier;};Calculate.hermite=function(controlPoints,lowBound,highBound){var add,clamp,count,endX,fac0,fac1,fac2,fac3,i,j,lerp,m0,m1,mul,o,p,p0,p1,pointsPerSegment,pointsPerStep,pos,ref,ref1,ret,sub,t,u;if(controlPoints.length<2){throw"Invalid number of arguments to hermite";} +ret={};lerp=function(a,b,t){return a*(1-t)+b*t;};add=(function(_this){return function(a,b,c,d){return[a[0]+b[0]+c[0]+d[0],a[1]+b[1]+c[1]+d[1]];};})(this);mul=(function(_this){return function(a,b){return[a[0]*b[0],a[1]*b[1]];};})(this);sub=(function(_this){return function(a,b){return[a[0]-b[0],a[1]-b[1]];};})(this);clamp=function(a,min,max){return Math.min(Math.max(a,min),max);};count=0;for(i=o=0,ref=controlPoints.length-2;0<=ref?o<=ref:o>=ref;i=0<=ref?++o:--o){p0=controlPoints[i];p1=controlPoints[i+1];pointsPerSegment=p1[0]-p0[0];pointsPerStep=1/pointsPerSegment;if(i===controlPoints.length-2){pointsPerStep=1/(pointsPerSegment-1);} +p=i>0?controlPoints[i-1]:p0;m0=mul(sub(p1,p),[0.5,0.5]);p=i=ref1;j=0<=ref1?++u:--u){t=j*pointsPerStep;fac0=2.0*t*t*t-3.0*t*t+1.0;fac1=t*t*t-2.0*t*t+t;fac2=-2.0*t*t*t+3.0*t*t;fac3=t*t*t-t*t;pos=add(mul(p0,[fac0,fac0]),mul(m0,[fac1,fac1]),mul(p1,[fac2,fac2]),mul(m1,[fac3,fac3]));ret[Math.round(pos[0])]=Math.round(clamp(pos[1],lowBound,highBound));count+=1;}} +endX=controlPoints[controlPoints.length-1][0];ret=Caman.Calculate.missingValues(ret,endX);return ret;};Calculate.missingValues=function(values,endX){var i,j,leftCoord,o,ref,ref1,ref2,ret,rightCoord,u;if(Object.keys(values).length=ref;i=0<=ref?++o:--o){if(values[i]!=null){ret[i]=values[i];}else{leftCoord=[i-1,ret[i-1]];for(j=u=ref1=i,ref2=endX;ref1<=ref2?u<=ref2:u>=ref2;j=ref1<=ref2?++u:--u){if(values[j]!=null){rightCoord=[j,values[j]];break;}} +if(rightCoord){ret[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}}} return ret;} return values;};return Calculate;})();Calculate=Caman.Calculate;Caman.Convert=(function(){function Convert(){} Convert.hexToRGB=function(hex){var b,g,r;if(hex.charAt(0)==="#"){hex=hex.substr(1);} @@ -117,33 +116,33 @@ 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;})();Convert=Caman.Convert;Caman.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(data==null){data=null;} -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;} +Event.events={};Event.types=["processStart","processComplete","renderStart","renderFinished","blockStarted","blockFinished"];Event.trigger=function(target,type,data){var event,len,o,ref,results;if(data==null){data=null;} +if(this.events[type]&&this.events[type].length){ref=this.events[type];results=[];for(o=0,len=ref.length;o_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);});bnum=f.run();_results.push(this.blockFinished(bnum));}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 i,pixel,_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});pixel=new Pixel();pixel.setContext(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){p=pixel.getPixelRelative(j,k);kernel[builderIndex*3]=p.r;kernel[builderIndex*3+1]=p.g;kernel[builderIndex*3+2]=p.b;builderIndex++;}} +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=Util.dataArray(this.c.pixelData.length);return this.processNext();};Renderer.prototype.eachBlock=function(fn){var blockN,blockPixelLength,bnum,end,f,i,lastBlockN,n,o,ref,results,start;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=o=0,ref=Renderer.Blocks;0<=ref?oref;i=0<=ref?++o:--o){start=i*blockN;end=start+(i===Renderer.Blocks-1?lastBlockN:blockN);if(Caman.NodeJS){f=Fiber((function(_this){return function(){return fn.call(_this,i,start,end);};})(this));bnum=f.run();results.push(this.blockFinished(bnum));}else{results.push(setTimeout((function(_this){return function(i,start,end){return function(){return fn.call(_this,i,start,end);};};})(this)(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 i,o,pixel,ref,ref1;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});pixel=new Pixel();pixel.setContext(this.c);for(i=o=ref=start,ref1=end;o=ref3;j=ref2<=ref3?++u:--u){for(k=w=ref4=builder,ref5=-builder;ref4<=ref5?w<=ref5:w>=ref5;k=ref4<=ref5?++w:--w){p=pixel.getPixelRelative(j,k);kernel[builderIndex*3]=p.r;kernel[builderIndex*3+1]=p.g;kernel[builderIndex*3+2]=p.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];} -if(Caman.NodeJS){return Fiber["yield"](bnum);}else{return this.blockFinished(bnum);}};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(Caman.NodeJS){return Fiber["yield"](bnum);}else{return this.blockFinished(bnum);}};Renderer.prototype.blockFinished=function(bnum){var i,o,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=o=0,ref=this.c.pixelData.length;0<=ref?oref;i=0<=ref?++o:--o){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=new Image();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;})();Renderer=Caman.Renderer;Caman.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;} +Event.trigger(this.c,"processComplete",this.currentJob);return this.processNext();}};Renderer.prototype.processKernel=function(adjust,kernel,divisor,bias){var i,o,ref,val;val={r:0,g:0,b:0};for(i=o=0,ref=adjust.length;0<=ref?oref;i=0<=ref?++o:--o){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;img=new Image();img.onload=(function(_this){return 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();};})(this);proxyUrl=IO.remoteCheck(src);return img.src=proxyUrl!=null?proxyUrl:src;};return Renderer;})();Renderer=Caman.Renderer;Caman.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){setTimeout((function(_this){return function(){return callback.call(_this.get(search),_this.get(search));};})(this),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;})();Store=Caman.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;} @@ -175,25 +176,25 @@ 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 b,g,h,hsv,r,_ref;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;_ref=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v),r=_ref.r,g=_ref.g,b=_ref.b;rgba.r=r;rgba.g=g;rgba.b=b;return rgba;});});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 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 b,g,h,hsv,r,ref;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;ref=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v),r=ref.r,g=ref.g,b=ref.b;rgba.r=r;rgba.g=g;rgba.b=b;return rgba;});});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 algo,bezier,chans,cps,end,i,last,start,_i,_j,_ref,_ref1;chans=arguments[0],cps=2<=arguments.length?__slice.call(arguments,1):[];last=cps[cps.length-1];if(typeof last==="function"){algo=last;cps.pop();}else if(typeof last==="string"){algo=Calculate[last];cps.pop();}else{algo=Calculate.bezier;} +return rgba;});});Filter.register("curves",function(){var algo,bezier,chans,cps,end,i,last,o,ref,ref1,start,u;chans=arguments[0],cps=2<=arguments.length?slice1.call(arguments,1):[];last=cps[cps.length-1];if(typeof last==="function"){algo=last;cps.pop();}else if(typeof last==="string"){algo=Calculate[last];cps.pop();}else{algo=Calculate.bezier;} if(typeof chans==="string"){chans=chans.split("");} if(chans[0]==="v"){chans=['r','g','b'];} if(cps.length<2){throw"Invalid number of arguments to curves filter";} -bezier=algo(cps,0,255);start=cps[0];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];}} -end=cps[cps.length-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]]];} +bezier=algo(cps,0,255);start=cps[0];if(start[0]>0){for(i=o=0,ref=start[0];0<=ref?oref;i=0<=ref?++o:--o){bezier[i]=start[1];}} +end=cps[cps.length-1];if(end[0]<255){for(i=u=ref1=end[0];ref1<=255?u<=255:u>=255;i=ref1<=255?++u:--u){bezier[i]=end[1];}} +return this.process("curves",function(rgba){var ref2,w;for(i=w=0,ref2=chans.length;0<=ref2?wref2;i=0<=ref2?++w:--w){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.Plugin.register("crop",function(width,height,x,y){var canvas,ctx;if(x==null){x=0;} if(y==null){y=0;} diff --git a/dist/caman.pack.js b/dist/caman.pack.js index d6c3bac7..209b2f05 100644 --- a/dist/caman.pack.js +++ b/dist/caman.pack.js @@ -1 +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(){I $,2F,1z,1J,B,2Y,30,1p,1O,3X,V,1Q,2I,22,1o,2g,1r,1V,1g,4o,21,1a,3q,49,4G,3r,4g=[].9q||o(7j){T(I i=0,l=8.L;iD){9 D}9 1x};1a.40=o(2R,2l,3Z){I 3W,C,13,F,2q,Y;u(3Z==G){3Z={}}F=2R.aH;Y=[];T(C=0,13=F.L;C<13;C++){3W=F[C];u((3Z.6m!=G)&&(2q=3W.6p,4g.18(3Z.6m,2q)>=0)){42}Y.1A(2l.7G(3W.6p,3W.am))}9 Y};1a.3T=o(L){u(L==G){L=0}u(B.1S||(2T.7B!=G)){9 1m 7B(L)}9 1m 4c(L)};9 1a})();u(1f 1Y!=="36"&&1Y!==G){4o=1Y;30=3S(\'E\');2I=30.2I;3X=3S(\'a0\');3q=3S(\'3q\');49=3S(\'49\')}R{4o=2T}B=(o(7d){6x(B,7d);B.6s={7M:"4.1.2",7s:"7/27/b8"};B.6V=1G;B.44=2c;B.6v="7x";B.5e="";B.7P="aP";B.1S=1f 1Y!=="36"&&1Y!==G;B.82=!B.1S;B.3D=o(){9"a2 "+B.6s.7M+", aO "+B.6s.7s};B.5V=o(E){u(B.1S){9 2c}u(1f E==="2S"){E=$(E)}u(!((E!=G)&&(E.3G!=G))){9 G}9 E.3G(\'1v-2h-1W\')};o B(){8.3n=5k(8.3n,8);I W,1j,1W,1b=8;u(X.L===0){1R"3l X";}u(8 8m B){8.3h=8.3h.5o(8);8.4f=8.4f.5o(8);W=X[0];u(!B.1S){1W=4D(B.5V(W[0]),10);1j=1f W[1]==="o"?W[1]:1f W[2]==="o"?W[2]:o(){};u(!aT(1W)&&21.8z(1W)){9 21.2o(1W,1j)}}8.1W=1a.6e.2t();8.4Q=8.38=G;8.3U={x:0,y:0};8.84=1G;8.4w=1G;8.4b=[];8.63=[];8.5R=[];8.4j=G;8.76=1G;8.aN=1m 2F(8);8.2L=1m 1g(8);8.6L(o(){1b.8v(W);9 1b.86()});9 8}R{9 1m B(X)}}B.H.6L=o(3y){I 5m,1b=8;u(B.1S){9 59(o(){9 3y.18(1b)},0)}R{u(1M.5F==="4P"){1o.1C("6S 6R");9 59(o(){9 3y.18(1b)},0)}R{5m=o(){u(1M.5F==="4P"){1o.1C("6S 6R");9 3y.18(1b)}};9 1M.6B("a4",5m,1G)}}};B.H.8v=o(W){I 1B,1x,F,Y;u(W.L===0){1R"3l X 80";}8.23=G;8.4A=G;8.4F=G;8.1j=o(){};8.8D(W[0]);u(W.L===1){9}3I(1f W[1]){1t"2S":8.4F=W[1];3c;1t"o":8.1j=W[1]}u(W.L===2){9}8.1j=W[2];u(W.L===4){F=W[4];Y=[];T(1B 2X F){u(!3L.18(F,1B))42;1x=F[1B];Y.1A(8.1e[1B]=1x)}9 Y}};B.H.8D=o(1D){u(B.1S){8.23=1D;8.4A=\'7Q\';9}u(1f 1D==="2w"){8.23=1D}R{8.23=$(1D)}u(8.23==G){1R"bb 9F 9X S 85 E T ak.";}9 8.4A=8.23.6p.4m()};B.H.86=o(){3I(8.4A){1t"7Q":9 8.8F();1t"1i":9 8.8B();1t"E":9 8.8t()}};B.H.8F=o(){1o.1C("aU T 1S");u(1f 8.23==="2S"&&8.23.4N(/^8e?:\\/\\//)){9 8.89(8.23,8.3n)}R u(1f 8.23==="2S"){9 3q.9Y(8.23,8.3n)}R{9 8.3n(G,8.23)}};B.H.89=o(3Y,1j){I 6j;1o.1C("ac S 2R "+3Y);6j=49.2t(3Y,o(2r){I 4z;4z=\'\';2r.aK(\'7z\');2r.5X(\'1v\',o(7t){9 4z+=7t});9 2r.5X(\'1q\',o(){9 1j(G,1m aS(4z,\'7z\'))})});9 6j.5X(\'5K\',1j)};B.H.3n=o(4l,1v){u(4l){1R 4l;}8.S=1m 2I();8.S.1c=1v;1o.1C("2I 6E. 8u = "+(8.3f())+", 8j = "+(8.3e()));8.E=1m 30(8.3f(),8.3e());9 8.3h()};B.H.8B=o(){8.S=8.23;8.E=1M.2U(\'E\');8.19=8.E.2p(\'2d\');1a.40(8.S,8.E,{6m:[\'1c\']});u(8.S.58!=G){8.S.58.5S(8.E,8.S)}8.5i();9 8.5Z()};B.H.8t=o(){8.E=8.23;8.19=8.E.2p(\'2d\');u(8.4F!=G){8.S=1M.2U(\'1i\');8.S.1c=8.4F;8.5i();9 8.5Z()}R{9 8.3h()}};B.H.5i=o(){u(8.61()){1o.1C(8.S.1c,"->",8.4L());8.7c=2c;8.S.1c=8.4L()}u(1Q.7l(8.S)){8.S.1c=1Q.3b(8.S.1c);9 1o.1C("90 S 9f, 9j 7m = "+8.S.1c)}};B.H.5Z=o(){u(8.7F()){9 8.4f()}R{9 8.S.6T=8.4f}};B.H.7F=o(){u(!8.S.4P){9 1G}u((8.S.5A!=G)&&8.S.5A===0){9 1G}9 2c};B.H.3f=o(){9 8.S.K||8.S.5A};B.H.3e=o(){9 8.S.P||8.S.ag};B.H.4f=o(){1o.1C("2I 6E. 8u = "+(8.3f())+", 8j = "+(8.3e()));u(8.7c){8.E.K=8.3f()/8.4x();8.E.P=8.3e()/8.4x()}R{8.E.K=8.3f();8.E.P=8.3e()}9 8.3h()};B.H.3h=o(){I i,15,C,13,F;u(8.19==G){8.19=8.E.2p(\'2d\')}8.3J=8.3M=8.K=8.E.K;8.3N=8.3O=8.P=8.E.P;8.7O();u(!8.8d()){8.6J()}u(8.S!=G){8.19.3P(8.S,0,0,8.3f(),8.3e(),0,0,8.3M,8.3O)}8.1H=8.19.3a(0,0,8.E.K,8.E.P);8.M=8.1H.1v;u(B.44){8.4Q=1a.3T(8.M.L);8.38=1a.3T(8.M.L);F=8.M;T(i=C=0,13=F.L;C<13;i=++C){15=F[i];8.4Q[i]=15;8.38[i]=15}}8.1E={K:8.E.K,P:8.E.P};u(!B.1S){21.7f(8.1W,8)}8.1j.18(8,8);9 8.1j=o(){}};B.H.7k=o(){8.1H=8.19.3a(0,0,8.E.K,8.E.P);9 8.M=8.1H.1v};B.H.9r=o(){I i,15,C,13,F,Y;u(!B.44){1R"6u 4V";}8.38=1a.3T(8.M.L);F=8.M;Y=[];T(i=C=0,13=F.L;C<13;i=++C){15=F[i];Y.1A(8.38[i]=15)}9 Y};B.H.8d=o(){9 B.5V(8.E)!=G};B.H.6J=o(){u(B.1S||8.E.3G(\'1v-2h-1W\')){9}9 8.E.7G(\'1v-2h-1W\',8.1W)};B.H.7n=o(){9 8.E.3G(\'1v-2h-7p-4V\')!==G};B.H.7O=o(){I 2s;u(B.1S||!8.61()){9}2s=8.4x();u(2s!==1){1o.1C("a7 2s = "+2s);8.76=2c;8.3M=8.E.K;8.3O=8.E.P;8.E.K=8.3M*2s;8.E.P=8.3O*2s;8.E.7C.K=""+8.3M+"7E";8.E.7C.P=""+8.3O+"7E";8.19.ah(2s,2s);8.K=8.3J=8.E.K;9 8.P=8.3N=8.E.P}};B.H.4x=o(){I 6t,2C;2C=2T.2C||1;6t=8.19.ap||8.19.at||8.19.av||8.19.aG||8.19.aI||1;9 2C/6t};B.H.7N=o(){9(2T.2C!=G)&&2T.2C!==1};B.H.61=o(){u(8.7n()||!8.7N()){9 1G}9 8.4L()!==G};B.H.4L=o(){u(8.S==G){9 G}9 8.S.3G(\'1v-2h-7p\')};B.H.57=o(7V){I 5a;5a=8.E;8.E=7V;8.19=8.E.2p(\'2d\');u(!B.1S){5a.58.5S(8.E,5a)}8.K=8.E.K;8.P=8.E.P;8.7k();9 8.1E={K:8.E.K,P:8.E.P}};B.H.8f=o(1j){I 1b=8;u(1j==G){1j=o(){}}1O.39(8,"6D");9 8.2L.2o(o(){1b.19.5d(1b.1H,0,0);9 1j.18(1b)})};B.H.b5=o(4p){I i,15,C,13,F;u(4p==G){4p=2c}u(!B.44){1R"6u 4V";}F=8.6U();T(i=C=0,13=F.L;C<13;i=++C){15=F[i];8.M[i]=15}u(4p){9 8.19.5d(8.1H,0,0)}};B.H.bm=o(){I E,1K,i,1H,15,M,C,13,F;E=1M.2U(\'E\');1a.40(8.E,E);E.K=8.3J;E.P=8.3N;1K=E.2p(\'2d\');1H=1K.3a(0,0,E.K,E.P);M=1H.1v;F=8.4Q;T(i=C=0,13=F.L;C<13;i=++C){15=F[i];M[i]=15}1K.5d(1H,0,0);8.3U={x:0,y:0};8.4w=1G;9 8.57(E)};B.H.6U=o(){I E,4r,1K,1s,6r,i,1H,15,M,4u,3R,4B,4C,K,C,Z,13,F,2q,2x,6q;u(!B.44){1R"6u 4V";}4u=[];4B=8.3U.x;1s=4B+8.K;4C=8.3U.y;6r=4C+8.P;u(8.4w){E=1M.2U(\'E\');E.K=8.3J;E.P=8.3N;1K=E.2p(\'2d\');1H=1K.3a(0,0,E.K,E.P);M=1H.1v;F=8.38;T(i=C=0,13=F.L;C<13;i=++C){15=F[i];M[i]=15}1K.5d(1H,0,0);3R=1M.2U(\'E\');3R.K=8.K;3R.P=8.P;1K=3R.2p(\'2d\');1K.3P(E,0,0,8.3J,8.3N,0,0,8.K,8.P);M=1K.3a(0,0,8.K,8.P).1v;K=8.K}R{M=8.38;K=8.3J}T(i=Z=0,2q=M.L;Z<2q;i=Z+=4){4r=1r.7u(i,K);u(((4B<=(2x=4r.x)&&2x<1s))&&((4C<=(6q=4r.y)&&6q<6r))){4u.1A(M[i],M[i+1],M[i+2],M[i+3])}}9 4u};B.H.1T=o(11,4M){8.2L.2D({14:V.25.6o,11:11,4M:4M});9 8};B.H.6n=o(11,J,1P,26){I i,C,F;u(1P==G){1P=G}u(26==G){26=0}u(1P==G){1P=0;T(i=C=0,F=J.L;0<=F?CF;i=0<=F?++C:--C){1P+=J[i]}}8.2L.2D({14:V.25.6l,11:11,J:J,1P:1P,26:26});9 8};B.H.6k=o(2v,W){8.2L.2D({14:V.25.1V,2v:2v,W:W});9 8};B.H.6i=o(1j){I 1w;1w=1m 22(8);8.5R.1A(1w);8.2L.2D({14:V.25.6h});1j.18(1w);8.2L.2D({14:V.25.6g});9 8};B.H.6Z=o(1w){9 8.71(1w)};B.H.71=o(1w){8.63.1A(8.4j);8.4b.1A(8.M);8.4j=1w;9 8.M=1w.M};B.H.73=o(){8.M=8.4b.4h();9 8.4j=8.63.4h()};B.H.77=o(){9 8.4j.7b()};9 B})(2g);4o.B=B;B.2F=(o(){o 2F(c){8.c=c}2F.H.8T=o(){I i,2a,3K,C,Z,1N,F;2a={r:{},g:{},b:{}};T(i=C=0;C<=D;i=++C){2a.r[i]=0;2a.g[i]=0;2a.b[i]=0}T(i=Z=0,F=8.c.M.L;Z0)){9}Y=[];T(C=0,13=46.L;C<13;C++){1i=46[C];Y.1A(7q=1m 2Y(1i,o(){8.7r();9 8.2o()}))}9 Y};u(B.82){(o(){u(1M.5F==="4P"){9 B.6d()}R{9 1M.6B("a3",B.6d,1G)}})()}2Y=(o(){I 4y;4y="(\\\\w+)\\\\((.*?)\\\\)";o 2Y(2z,7v){8.7y=2z.3G(\'1v-2h\');8.2h=B(2z,7v.5o(8))}2Y.H.7r=o(){I W,e,47,35,6a,68,m,r,4a,C,13,F,Y;8.2z=8.2h.E;r=1m 7H(4y,\'g\');4a=8.7y.4N(r);u(!(4a.L>0)){9}r=1m 7H(4y);Y=[];T(C=0,13=4a.L;C<13;C++){6a=4a[C];F=6a.4N(r),m=F[0],47=F[1],W=F[2];68=1m az("9 o() { 8."+47+"("+W+"); };");65{35=68();Y.1A(35.18(8.2h))}64(3H){e=3H;Y.1A(1o.1C(e))}}9 Y};2Y.H.2o=o(){I 2z;2z=8.2z;9 8.2h.8f(o(){9 2z.58.5S(8.7R(),2z)})};9 2Y})();B.1z=(o(){o 1z(){}1z.60={};1z.17=o(11,35){9 8.60[11]=35};1z.2o=o(11,O,N){9 8.60[11](O,N)};9 1z})();1z=B.1z;B.1J=(o(){o 1J(){}1J.aQ=o(8l,8w,8x,8A){9 Q.8E(Q.1Z(8x-8l,2)+Q.1Z(8A-8w,2))};1J.6C=o(1h,U,4d){I 2A;u(4d==G){4d=1G}2A=1h+(Q.91()*(U-1h));u(4d){9 2A.9d(4d)}R{9 Q.4e(2A)}};1J.6K=o(A){9(0.9m*A.r)+(0.9o*A.g)+(0.9p*A.b)};1J.1L=o(1k,2Q,2P,1q,32,2V){I 1L,3F,1I,1s,i,j,3E,4U,2f,t,C,Z,F;u(32==G){32=0}u(2V==G){2V=D}u(1k[0]8m 4c){1I=1k;32=2Q;2V=2P}R{1I=[1k,2Q,2P,1q]}u(1I.L<2){1R"3l 5Q 5P X 2l 1L";}1L={};3E=o(a,b,t){9 a*(1-t)+b*t};3F=o(a,1h,U){9 Q.1h(Q.U(a,1h),U)};T(i=C=0;C<7e;i=++C){t=i/7e;2f=1I;ad(2f.L>1){4U=[];T(j=Z=0,F=2f.L-2;0<=F?Z<=F:Z>=F;j=0<=F?++Z:--Z){4U.1A([3E(2f[j][0],2f[j+1][0],t),3E(2f[j][1],2f[j+1][1],t)])}2f=4U}1L[Q.4e(2f[0][0])]=Q.4e(3F(2f[0][1],32,2V))}1s=1I[1I.L-1][0];1L=B.1J.5O(1L,1s);u(1L[1s]==G){1L[1s]=1L[1s-1]}9 1L};1J.7h=o(1I,32,2V){I 2D,3F,5L,1s,4Z,50,51,52,i,j,3E,5I,5G,2O,p,3g,3C,2N,4n,5b,28,5c,t,C,Z,F,1b=8;u(1I.L<2){1R"3l 5Q 5P X 2l 7h";}28={};3E=o(a,b,t){9 a*(1-t)+b*t};2D=o(a,b,c,d){9[a[0]+b[0]+c[0]+d[0],a[1]+b[1]+c[1]+d[1]]};2O=o(a,b){9[a[0]*b[0],a[1]*b[1]]};5c=o(a,b){9[a[0]-b[0],a[1]-b[1]]};3F=o(a,1h,U){9 Q.1h(Q.U(a,1h),U)};5L=0;T(i=C=0,F=1I.L-2;0<=F?C<=F:C>=F;i=0<=F?++C:--C){3g=1I[i];3C=1I[i+1];2N=3C[0]-3g[0];4n=1/2N;u(i===1I.L-2){4n=1/(2N-1)}p=i>0?1I[i-1]:3g;5I=2O(5c(3C,p),[0.5,0.5]);p=i<1I.L-2?1I[i+2]:3C;5G=2O(5c(p,3g),[0.5,0.5]);T(j=Z=0;0<=2N?Z<=2N:Z>=2N;j=0<=2N?++Z:--Z){t=j*4n;4Z=2.0*t*t*t-3.0*t*t+1.0;50=t*t*t-2.0*t*t+t;51=-2.0*t*t*t+3.0*t*t;52=t*t*t-t*t;5b=2D(2O(3g,[4Z,4Z]),2O(5I,[50,50]),2O(3C,[51,51]),2O(5G,[52,52]));28[Q.4e(5b[0])]=Q.4e(3F(5b[1],32,2V));5L+=1}}1s=1I[1I.L-1][0];28=B.1J.5O(28,1s);9 28};1J.5O=o(2Z,1s){I i,j,3B,28,5f,C,Z;u(6I.b7(2Z).L<1s+1){28={};T(i=C=0;0<=1s?C<=1s:C>=1s;i=0<=1s?++C:--C){u(2Z[i]!=G){28[i]=2Z[i]}R{3B=[i-1,28[i-1]];T(j=Z=i;i<=1s?Z<=1s:Z>=1s;j=i<=1s?++Z:--Z){u(2Z[j]!=G){5f=[j,2Z[j]];3c}}28[i]=3B[1]+((5f[1]-3B[1])/(5f[0]-3B[0]))*(i-3B[0])}}9 28}9 2Z};9 1J})();1J=B.1J;B.1p=(o(){o 1p(){}1p.5l=o(2e){I b,g,r;u(2e.be(0)==="#"){2e=2e.5h(1)}r=4D(2e.5h(0,2),16);g=4D(2e.5h(2,2),16);b=4D(2e.5h(4,2),16);9{r:r,g:g,b:b}};1p.8Q=o(r,g,b){I d,h,l,U,1h,s;u(1f r==="2w"){g=r.g;b=r.b;r=r.r}r/=D;g/=D;b/=D;U=Q.U(r,g,b);1h=Q.1h(r,g,b);l=(U+1h)/2;u(U===1h){h=s=0}R{d=U-1h;s=l>0.5?d/(2-U-1h):d/(U+1h);h=(o(){3I(U){1t r:9(g-b)/d+(g1){t-=1}u(t<1/6){9 p+(q-p)*6*t}u(t<1/2){9 q}u(t<2/3){9 p+(q-p)*(2/3-t)*6}9 p};1p.81=o(r,g,b){I d,h,U,1h,s,v;r/=D;g/=D;b/=D;U=Q.U(r,g,b);1h=Q.1h(r,g,b);v=U;d=U-1h;s=U===0?0:d/U;u(U===1h){h=0}R{h=(o(){3I(U){1t r:9(g-b)/d+(g0.5n){r=Q.1Z((r+0.29)/1.29,2.4)}R{r/=12.92}u(g>0.5n){g=Q.1Z((g+0.29)/1.29,2.4)}R{g/=12.92}u(b>0.5n){b=Q.1Z((b+0.29)/1.29,2.4)}R{b/=12.92}x=r*0.9v+g*0.9w+b*0.9x;y=r*0.9z+g*0.9A+b*0.9B;z=r*0.9C+g*0.9D+b*0.9E;9{x:x*1n,y:y*1n,z:z*1n}};1p.9H=o(x,y,z){I b,g,r;x/=1n;y/=1n;z/=1n;r=(3.9M*x)+(-1.9N*y)+(-0.9O*z);g=(-0.9R*x)+(1.9S*y)+(0.9T*z);b=(0.9U*x)+(-0.9V*y)+(1.9W*z);u(r>0.5p){r=(1.29*Q.1Z(r,0.5q))-0.29}R{r*=12.92}u(g>0.5p){g=(1.29*Q.1Z(g,0.5q))-0.29}R{g*=12.92}u(b>0.5p){b=(1.29*Q.1Z(b,0.5q))-0.29}R{b*=12.92}9{r:r*D,g:g*D,b:b*D}};1p.8y=o(x,y,z){I a,b,l,5r,5s,5t;u(1f x==="2w"){y=x.y;z=x.z;x=x.x}5r=95.6y;5s=1n.0;5t=6z.6A;x/=5r;y/=5s;z/=5t;u(x>0.5u){x=Q.1Z(x,0.5v)}R{x=(7.5w*x)+0.3w}u(y>0.5u){y=Q.1Z(y,0.5v)}R{y=(7.5w*y)+0.3w}u(z>0.5u){z=Q.1Z(z,0.5v)}R{z=(7.5w*z)+0.3w}l=6F*y-16;a=6G*(x-y);b=6H*(y-z);9{l:l,a:a,b:b}};1p.al=o(l,a,b){I x,y,z;u(1f l==="2w"){a=l.a;b=l.b;l=l.l}y=(l+16)/6F;x=y+(a/6G);z=y-(b/6H);u(x>0.5x){x=x*x*x}R{x=0.5y*(x-0.3w)}u(y>0.5x){y=y*y*y}R{y=0.5y*(y-0.3w)}u(z>0.5x){z=z*z*z}R{z=0.5y*(z-0.3w)}9{x:x*95.6y,y:y*1n.0,z:z*6z.6A}};1p.ao=o(r,g,b){I 5z;u(1f r==="2w"){g=r.g;b=r.b;r=r.r}5z=8.88(r,g,b);9 8.8y(5z)};1p.as=o(l,a,b){};9 1p})();1p=B.1p;B.1O=(o(){o 1O(){}1O.2W={};1O.6M=["6N","6O","6D","6P","6Q","3v"];1O.39=o(24,14,1v){I 4k,C,13,F,Y;u(1v==G){1v=G}u(8.2W[14]&&8.2W[14].L){F=8.2W[14];Y=[];T(C=0,13=F.L;C<13;C++){4k=F[C];u(4k.24===G||24.1W===4k.24.1W){Y.1A(4k.2n.18(24,1v))}R{Y.1A(aL 0)}}9 Y}};1O.aM=o(24,14,2n){I 5C,5D;u(1f 24==="2S"){5D=24;5C=14;24=G;14=5D;2n=5C}u(4g.18(8.6M,14)<0){9 1G}u(!8.2W[14]){8.2W[14]=[]}8.2W[14].1A({24:24,2n:2n});9 2c};9 1O})();1O=B.1O;B.V=(o(){o V(){}V.25={6o:1,6l:2,6h:3,6g:4,5E:5,1V:6};V.17=o(11,6W){9 B.H[11]=6W};9 V})();V=B.V;B.1Q=(o(){o 1Q(){}1Q.6X=/(?:(?:49|8e):\\/\\/)((?:\\w+)\\.(?:(?:\\w|\\.)+))/;1Q.7l=o(1i){u(1i==G){9 1G}u(8.6Y(1i)){9 1G}9 8.56(1i.1c)};1Q.6Y=o(1i){I F;9(1i.6v!=G)&&((F=1i.6v.4m())===\'7x\'||F===\'70-aV\')};1Q.56=o(3Y){I 54;54=3Y.4N(8.6X);u(54){9 54[1]!==1M.b6}R{9 1G}};1Q.72=o(1c){u(8.56(1c)){u(!B.5e.L){1o.5H("b9 2l ba a 74 S bc a bd 75. 7m: "+1c)}R{u(B.56(B.5e)){1o.5H("bf 70 a 74 75 T bg bh.");9}9 8.3b(1c)}}};1Q.3b=o(1c){9""+B.5e+"?"+B.7P+"="+(bi(1c))};1Q.bl=o(3d){I 53;53={bn:\'8G\',8H:\'8I\',8J:\'8K\',8L:\'8M\'};3d=3d.4m();u(53[3d]!=G){3d=53[3d]}9"8N/8O."+3d};9 1Q})();B.H.8P=o(){u(1f 1Y!=="36"&&1Y!==G){9 8.78.2u(8,X)}R{9 8.79.2u(8,X)}};B.H.79=o(14){I S;u(14==G){14="7a"}14=14.4m();S=8.5J(14).8U("S/"+14,"S/8V-8W");9 1M.8X.8Y=S};B.H.78=o(3u,4Y,1j){I e,5M;u(4Y==G){4Y=2c}u(1j==G){1j=G}65{5M=3q.93(3u);u(5M.94()&&!4Y){9 1G}}64(3H){e=3H;1o.1C("96 97 3u "+3u)}9 3q.98(3u,8.E.99(),o(4l){1o.1C("9a 9b 2l "+3u);u(1j){9 1j.18(8,4l)}})};B.H.7R=o(14){I 1i;1i=1m 2I();1i.1c=8.5J(14);1i.K=8.1E.K;1i.P=8.1E.P;u(2T.2C){1i.K/=2T.2C;1i.P/=2T.2C}9 1i};B.H.5J=o(14){u(14==G){14="7a"}14=14.4m();9 8.E.9c("S/"+14)};1Q=B.1Q;B.22=(o(){o 22(c){8.c=c;8.47=8.c;8.1e={5N:\'7g\',2K:1.0};8.9g=1a.6e.2t();8.E=1f 1Y!=="36"&&1Y!==G?1m 30():1M.2U(\'E\');8.E.K=8.c.1E.K;8.E.P=8.c.1E.P;8.19=8.E.2p(\'2d\');8.19.9h(8.E.K,8.E.P);8.1H=8.19.3a(0,0,8.E.K,8.E.P);8.M=8.1H.1v}22.H.6i=o(3y){9 8.c.6i.18(8.c,3y)};22.H.9i=o(7i){8.1e.5N=7i;9 8};22.H.2K=o(2K){8.1e.2K=2K/1n;9 8};22.H.9k=o(){I i,20,C,F;20=8.c.M;T(i=C=0,F=8.c.M.L;C8.c.M.L||2k<0){9 1m 1r(0,0,0,D,8.c)}9 8.5Y(2k)};1r.H.9G=o(4O,4I,A){I 7A;u(8.c==G){1R"3t a 3s 19";}7A=8.1l+(8.c.1E.K*4*(4I*-1))+(4*4O);u(2k>8.c.M.L||2k<0){9}8.c.M[2k]=A.r;8.c.M[2k+1]=A.g;8.c.M[2k+2]=A.b;8.c.M[2k+3]=A.a;9 2c};1r.H.9I=o(x,y){I 1l;u(8.c==G){1R"3t a 3s 19";}1l=8.5U(x,y,8.K);9 8.5Y(1l)};1r.H.9J=o(x,y,A){I 1l;u(8.c==G){1R"3t a 3s 19";}1l=8.5U(x,y,8.K);8.c.M[1l]=A.r;8.c.M[1l+1]=A.g;8.c.M[1l+2]=A.b;9 8.c.M[1l+3]=A.a};1r.H.3D=o(){9 8.9K()};1r.H.9L=o(4H){I 2e;u(4H==G){4H=1G}2e=\'#\'+8.r.3D(16)+8.g.3D(16)+8.b.3D(16);u(4H){9 2e+8.a.3D(16)}R{9 2e}};9 1r})();1r=B.1r;B.1V=(o(){o 1V(){}1V.62={};1V.17=o(11,2v){9 8.62[11]=2v};1V.2o=o(19,11,W){9 8.62[11].2u(19,W)};9 1V})();1V=B.1V;B.1g=(o(){1g.2J=B.1S?3S(\'9P\').9Q().L:4;o 1g(c){8.c=c;8.2B=5k(8.2B,8);8.4i=[];8.33=G}1g.H.2D=o(66){u(66==G){9}9 8.4i.1A(66)};1g.H.2B=o(){I 1w;u(8.4i.L===0){1O.39(8,"6P");u(8.67!=G){8.67.18(8.c)}9 8}8.1u=8.4i.7I();3I(8.1u.14){1t V.25.6h:1w=8.c.5R.7I();8.c.6Z(1w);9 8.2B();1t V.25.6g:8.c.77();8.c.73();9 8.2B();1t V.25.5E:9 8.7J(8.1u.1w,8.1u.1c);1t V.25.1V:9 8.7K();9Z:9 8.7L()}};1g.H.2o=o(1j){8.67=1j;8.33=1a.3T(8.c.M.L);9 8.2B()};1g.H.69=o(2n){I 48,6b,1X,1q,f,i,6c,n,1k,C,F,Y,1b=8;8.4v=0;n=8.c.M.L;6b=Q.2E((n/4)/1g.2J);48=6b*4;6c=48+((n/4)%1g.2J)*4;Y=[];T(i=C=0,F=1g.2J;0<=F?CF;i=0<=F?++C:--C){1k=i*48;1q=1k+(i===1g.2J-1?6c:48);u(B.1S){f=3X(o(){9 2n.18(1b,i,1k,1q)});1X=f.a8();Y.1A(8.3v(1X))}R{Y.1A(59((o(i,1k,1q){9 o(){9 2n.18(1b,i,1k,1q)}})(i,1k,1q),0))}}9 Y};1g.H.7L=o(){1O.39(8.c,"6N",8.1u);u(8.1u.14===V.25.6o){9 8.69(8.7T)}R{9 8.69(8.7U)}};1g.H.7K=o(){1o.1C("ab 2v "+8.1u.2v);1V.2o(8.c,8.1u.2v,8.1u.W);1o.1C("1V "+8.1u.2v+" 6f!");9 8.2B()};1g.H.7T=o(1X,1k,1q){I i,15,C;1o.1C("7W #"+1X+" - V: "+8.1u.11+", ae: "+1k+", af: "+1q);1O.39(8.c,"6Q",{7X:1X,7Y:1g.2J,ai:1k,aj:1q});15=1m 1r();15.5W(8.c);T(i=C=1k;C<1q;i=C+=4){15.1l=i;15.r=8.c.M[i];15.g=8.c.M[i+1];15.b=8.c.M[i+2];15.a=8.c.M[i+3];8.1u.4M(15);8.c.M[i]=1a.2j(15.r);8.c.M[i+1]=1a.2j(15.g);8.c.M[i+2]=1a.2j(15.b);8.c.M[i+3]=1a.2j(15.a)}u(B.1S){9 3X["7Z"](1X)}R{9 8.3v(1X)}};1g.H.7U=o(1X,1k,1q){I J,41,26,1U,3p,1P,i,j,k,2b,n,11,p,15,2r,C,Z,1N;11=8.1u.11;26=8.1u.26;1P=8.1u.1P;n=8.c.M.L;J=8.1u.J;41=Q.8E(J.L);2b=[];1o.1C("aq 2b - V: "+8.1u.11);1k=Q.U(1k,8.c.1E.K*4*((41-1)/2));1q=Q.1h(1q,n-(8.c.1E.K*4*((41-1)/2)));1U=(41-1)/2;15=1m 1r();15.5W(8.c);T(i=C=1k;C<1q;i=C+=4){15.1l=i;3p=0;T(j=Z=-1U;-1U<=1U?Z<=1U:Z>=1U;j=-1U<=1U?++Z:--Z){T(k=1N=1U;1U<=-1U?1N<=-1U:1N>=-1U;k=1U<=-1U?++1N:--1N){p=15.7w(j,k);2b[3p*3]=p.r;2b[3p*3+1]=p.g;2b[3p*3+2]=p.b;3p++}}2r=8.6n(J,2b,1P,26);8.33[i]=1a.2j(2r.r);8.33[i+1]=1a.2j(2r.g);8.33[i+2]=1a.2j(2r.b);8.33[i+3]=8.c.M[i+3]}u(B.1S){9 3X["7Z"](1X)}R{9 8.3v(1X)}};1g.H.3v=o(1X){I i,C,F;u(1X>=0){1o.1C("7W #"+1X+" 6f! V: "+8.1u.11)}8.4v++;1O.39(8.c,"3v",{7X:1X,ar:8.4v,7Y:1g.2J});u(8.4v===1g.2J){u(8.1u.14===V.25.6l){T(i=C=0,F=8.c.M.L;0<=F?CF;i=0<=F?++C:--C){8.c.M[i]=8.33[i]}}u(1X>=0){1o.1C("V "+8.1u.11+" 6f!")}1O.39(8.c,"6O",8.1u);9 8.2B()}};1g.H.6n=o(J,2b,1P,26){I i,1x,C,F;1x={r:0,g:0,b:0};T(i=C=0,F=J.L;0<=F?CF;i=0<=F?++C:--C){1x.r+=J[i]*2b[i*3];1x.g+=J[i]*2b[i*3+1];1x.b+=J[i]*2b[i*3+2]}1x.r=(1x.r/1P)+26;1x.g=(1x.g/1P)+26;1x.b=(1x.b/1P)+26;9 1x};1g.H.7J=o(1w,1c){I 1i,3b,1b=8;1i=1m 2I();1i.6T=o(){1w.19.3P(1i,0,0,1b.c.1E.K,1b.c.1E.P);1w.1H=1w.19.3a(0,0,1b.c.1E.K,1b.c.1E.P);1w.M=1w.1H.1v;1b.c.M=1w.M;9 1b.2B()};3b=1Q.72(1c);9 1i.1c=3b!=G?3b:1c};9 1g})();1g=B.1g;B.21=(o(){o 21(){}21.3o={};21.8z=o(2H){9 8.3o[2H]!=G};21.2t=o(2H){9 8.3o[2H]};21.7f=o(11,1D){9 8.3o[11]=1D};21.2o=o(2H,1j){I 1b=8;59(o(){9 1j.18(1b.2t(2H),1b.2t(2H))},0);9 8.2t(2H)};21.au=o(11){u(11==G){11=1G}u(11){9 87 8.3o[11]}R{9 8.3o={}}};9 21})();21=B.21;1z.17("7g",o(O,N){9{r:O.r,g:O.g,b:O.b}});1z.17("aw",o(O,N){9{r:(O.r*N.r)/D,g:(O.g*N.g)/D,b:(O.b*N.b)/D}});1z.17("ax",o(O,N){9{r:D-(((D-O.r)*(D-N.r))/D),g:D-(((D-O.g)*(D-N.g))/D),b:D-(((D-O.b)*(D-N.b))/D)}});1z.17("ay",o(O,N){I 1d;1d={};1d.r=N.r>1y?D-2*(D-O.r)*(D-N.r)/D:(N.r*O.r*2)/D;1d.g=N.g>1y?D-2*(D-O.g)*(D-N.g)/D:(N.g*O.g*2)/D;1d.b=N.b>1y?D-2*(D-O.b)*(D-N.b)/D:(N.b*O.b*2)/D;9 1d});1z.17("aA",o(O,N){9{r:O.r-N.r,g:O.g-N.g,b:O.b-N.b}});1z.17("aB",o(O,N){9{r:N.r+O.r,g:N.g+O.g,b:N.b+O.b}});1z.17("aC",o(O,N){9{r:1y-2*(N.r-1y)*(O.r-1y)/D,g:1y-2*(N.g-1y)*(O.g-1y)/D,b:1y-2*(N.b-1y)*(O.b-1y)/D}});1z.17("aD",o(O,N){I 1d;1d={};1d.r=N.r>1y?D-((D-N.r)*(D-(O.r-1y)))/D:(N.r*(O.r+1y))/D;1d.g=N.g>1y?D-((D-N.g)*(D-(O.g-1y)))/D:(N.g*(O.g+1y))/D;1d.b=N.b>1y?D-((D-N.b)*(D-(O.b-1y)))/D:(N.b*(O.b+1y))/D;9 1d});1z.17("aE",o(O,N){9{r:N.r>O.r?N.r:O.r,g:N.g>O.g?N.g:O.g,b:N.b>O.b?N.b:O.b}});1z.17("aF",o(O,N){9{r:N.r>O.r?O.r:N.r,g:N.g>O.g?O.g:N.g,b:N.b>O.b?O.b:N.b}});V.17("4W",o(){I 3m;u(X.L===1){3m=1p.5l(X[0])}R{3m={r:X[0],g:X[1],b:X[2]}}9 8.1T("4W",o(A){A.r=3m.r;A.g=3m.g;A.b=3m.b;A.a=D;9 A})});V.17("8a",o(J){J=Q.2E(D*(J/1n));9 8.1T("8a",o(A){A.r+=J;A.g+=J;A.b+=J;9 A})});V.17("8b",o(J){J*=-0.aJ;9 8.1T("8b",o(A){I U;U=Q.U(A.r,A.g,A.b);u(A.r!==U){A.r+=(U-A.r)*J}u(A.g!==U){A.g+=(U-A.g)*J}u(A.b!==U){A.b+=(U-A.b)*J}9 A})});V.17("8c",o(J){J*=-1;9 8.1T("8c",o(A){I 3V,2G,U;U=Q.U(A.r,A.g,A.b);2G=(A.r+A.g+A.b)/3;3V=((Q.2M(U-2G)*2/D)*J)/1n;u(A.r!==U){A.r+=(U-A.r)*3V}u(A.g!==U){A.g+=(U-A.g)*3V}u(A.b!==U){A.b+=(U-A.b)*3V}9 A})});V.17("8g",o(J){9 8.1T("8g",o(A){I 2G;2G=1J.6K(A);A.r=2G;A.g=2G;A.b=2G;9 A})});V.17("8h",o(J){J=Q.1Z((J+1n)/1n,2);9 8.1T("8h",o(A){A.r/=D;A.r-=0.5;A.r*=J;A.r+=0.5;A.r*=D;A.g/=D;A.g-=0.5;A.g*=J;A.g+=0.5;A.g*=D;A.b/=D;A.b-=0.5;A.b*=J;A.b+=0.5;A.b*=D;9 A})});V.17("8i",o(J){9 8.1T("8i",o(A){I b,g,h,34,r,F;34=1p.81(A.r,A.g,A.b);h=34.h*1n;h+=Q.2M(J);h=h%1n;h/=1n;34.h=h;F=1p.83(34.h,34.s,34.v),r=F.r,g=F.g,b=F.b;A.r=r;A.g=g;A.b=b;9 A})});V.17("8k",o(){I 3k,31;u(X.L===2){31=1p.5l(X[0]);3k=X[1]}R u(X.L===4){31={r:X[0],g:X[1],b:X[2]};3k=X[3]}9 8.1T("8k",o(A){A.r-=(A.r-31.r)*(3k/1n);A.g-=(A.g-31.g)*(3k/1n);A.b-=(A.b-31.b)*(3k/1n);9 A})});V.17("8n",o(){9 8.1T("8n",o(A){A.r=D-A.r;A.g=D-A.g;A.b=D-A.b;9 A})});V.17("8o",o(J){u(J==G){J=1n}J/=1n;9 8.1T("8o",o(A){A.r=Q.1h(D,(A.r*(1-(0.aW*J)))+(A.g*(0.aX*J))+(A.b*(0.aY*J)));A.g=Q.1h(D,(A.r*(0.aZ*J))+(A.g*(1-(0.b0*J)))+(A.b*(0.b1*J)));A.b=Q.1h(D,(A.r*(0.b2*J))+(A.g*(0.b3*J))+(A.b*(1-(0.b4*J))));9 A})});V.17("8p",o(J){9 8.1T("8p",o(A){A.r=Q.1Z(A.r/D,J)*D;A.g=Q.1Z(A.g/D,J)*D;A.b=Q.1Z(A.b/D,J)*D;9 A})});V.17("8q",o(J){J=Q.2M(J)*2.55;9 8.1T("8q",o(A){I 2A;2A=1J.6C(J*-1,J);A.r+=2A;A.g+=2A;A.b+=2A;9 A})});V.17("8r",o(J){J=Q.2M(J)*2.55;9 8.1T("8r",o(A){u(A.r>D-J){A.r=D}R u(A.rD-J){A.g=D}R u(A.gD-J){A.b=D}R u(A.b0){A.r+=(D-A.r)*1e.4E}R{A.r-=A.r*Q.2M(1e.4E)}}u(1e.4s!=G){u(1e.4s>0){A.g+=(D-A.g)*1e.4s}R{A.g-=A.g*Q.2M(1e.4s)}}u(1e.4q!=G){u(1e.4q>0){A.b+=(D-A.b)*1e.4q}R{A.b-=A.b*Q.2M(1e.4q)}}9 A})});V.17("4X",o(){I 3Q,1L,2m,2i,1q,i,3i,1k,C,Z,F,2q;2m=X[0],2i=2<=X.L?3x.18(X,1):[];3i=2i[2i.L-1];u(1f 3i==="o"){3Q=3i;2i.4h()}R u(1f 3i==="2S"){3Q=1J[3i];2i.4h()}R{3Q=1J.1L}u(1f 2m==="2S"){2m=2m.bj("")}u(2m[0]==="v"){2m=[\'r\',\'g\',\'b\']}u(2i.L<2){1R"3l 5Q 5P X 2l 4X 47";}1L=3Q(2i,0,D);1k=2i[0];u(1k[0]>0){T(i=C=0,F=1k[0];0<=F?CF;i=0<=F?++C:--C){1L[i]=1k[1]}}1q=2i[2i.L-1];u(1q[0]=D;i=2q<=D?++Z:--Z){1L[i]=1q[1]}}9 8.1T("4X",o(A){I 1N,2x;T(i=1N=0,2x=2m.L;0<=2x?1N<2x:1N>2x;i=0<=2x?++1N:--1N){A[2m[i]]=1L[A[2m[i]]]}9 A})});V.17("bk",o(J){I 2Q,2P,p;p=Q.2M(J)/1n;2Q=[0,D*p];2P=[D-(D*p),D];u(J<0){2Q=2Q.8C();2P=2P.8C()}9 8.4X(\'31\',[0,0],2Q,2P,[D,D])});B.1V.17("6w",o(K,P,x,y){I E,1K;u(x==G){x=0}u(y==G){y=0}u(1f 1Y!=="36"&&1Y!==G){E=1m 30(K,P)}R{E=1M.2U(\'E\');1a.40(8.E,E);E.K=K;E.P=P}1K=E.2p(\'2d\');1K.3P(8.E,x,y,K,P,0,0,K,P);8.3U={x:x,y:y};8.84=2c;9 8.57(E)});B.1V.17("4R",o(1F){I E,1K;u(1F==G){1F=G}u(1F===G||((1F.K==G)&&(1F.P==G))){1o.5K("3l 85 an 1E 80 T 4R");9}u(1F.K==G){1F.K=8.E.K*1F.P/8.E.P}R u(1F.P==G){1F.P=8.E.P*1F.K/8.E.K}u(1f 1Y!=="36"&&1Y!==G){E=1m 30(1F.K,1F.P)}R{E=1M.2U(\'E\');1a.40(8.E,E);E.K=1F.K;E.P=1F.P}1K=E.2p(\'2d\');1K.3P(8.E,0,0,8.E.K,8.E.P,0,0,1F.K,1F.P);8.4w=2c;9 8.57(E)});B.V.17("6w",o(){9 8.6k("6w",4c.H.3r.18(X,0))});B.V.17("4R",o(){9 8.6k("4R",4c.H.3r.18(X,0))})}).18(8);',62,707,'||||||||this|return|||||||||||||||function||||||if||||||rgba|Caman|_i|255|canvas|_ref|null|prototype|var|adjust|width|length|pixelData|rgbaParent|rgbaLayer|height|Math|else|image|for|max|Filter|args|arguments|_results|_j||name||_len|type|pixel||register|call|context|Util|_this|src|result|options|typeof|Renderer|min|img|callback|start|loc|new|100|Log|Convert|end|Pixel|endX|case|currentJob|data|layer|val|128|Blender|push|key|debug|obj|dimensions|newDims|false|imageData|controlPoints|Calculate|ctx|bezier|document|_k|Event|divisor|IO|throw|NodeJS|process|builder|Plugin|id|bnum|exports|pow|parentData|Store|Layer|initObj|target|Type|bias||ret|055|levels|kernel|true||hex|prev|Module|caman|cps|clampRGB|newLoc|to|chans|fn|execute|getContext|_ref1|res|ratio|get|apply|plugin|object|_ref2|value|ele|rand|processNext|devicePixelRatio|add|floor|Analyze|avg|search|Image|Blocks|opacity|renderer|abs|pointsPerSegment|mul|ctrl2|ctrl1|from|string|window|createElement|highBound|events|in|CamanParser|values|Canvas|rgb|lowBound|modPixelData|hsv|func|undefined|layerData|originalPixelData|trigger|getImageData|proxyUrl|break|lang|imageHeight|imageWidth|p0|finishInit|last|chan|level|Invalid|color|nodeFileReady|items|builderIndex|fs|slice|CamanJS|Requires|file|blockFinished|1379310345|__slice|cb|child|parent|leftCoord|p1|toString|lerp|clamp|getAttribute|_error|switch|originalWidth|numPixels|__hasProp|preScaledWidth|originalHeight|preScaledHeight|drawImage|algo|scaledCanvas|require|dataArray|cropCoordinates|amt|attr|Fiber|url|opts|copyAttributes|adjustSize|continue|prop|allowRevert|copy|imgs|filter|blockN|http|unparsedInstructions|pixelStack|Array|getFloat|round|imageLoaded|__indexOf|pop|renderQueue|currentLayer|event|err|toLowerCase|pointsPerStep|Root|updateContext|blue|coord|green|dest|pixels|blocksDone|resized|hiDPIRatio|INST_REGEX|buf|initType|startX|startY|parseInt|red|imageUrl|moduleKeywords|includeAlpha|vert|root|sel|hiDPIReplacement|processFn|match|horiz|complete|initializedPixelData|resize|source|Logger|next|disabled|fillColor|curves|overwrite|fac0|fac1|fac2|fac3|langToExt|matches||isURLRemote|replaceCanvas|parentNode|setTimeout|oldCanvas|pos|sub|putImageData|remoteProxy|rightCoord|hueToRGB|substr|imageAdjustments|ctor|__bind|hexToRGB|listener|04045|bind|0031308|4166666667|whiteX|whiteY|whiteZ|008856451679|3333333333|787037037|2068965517|1284185493|xyz|naturalWidth|included|_fn|_type|LoadOverlay|readyState|m1|info|m0|toBase64|error|count|stats|blendingMode|missingValues|of|number|canvasQueue|replaceChild|console|coordinatesToLocation|getAttrId|setContext|on|pixelAtLocation|waitForImageLoaded|blenders|needsHiDPISwap|plugins|layerStack|catch|try|job|finishedFn|instFunc|eachBlock|inst|blockPixelLength|lastBlockN|DOMUpdated|uniqid|finished|LayerFinished|LayerDequeue|newLayer|req|processPlugin|Kernel|except|processKernel|Single|nodeName|_ref3|endY|version|backingStoreRatio|Revert|crossOrigin|crop|__extends|047|108|883|addEventListener|randomRange|renderStart|loaded|116|500|200|Object|assignId|luminance|domIsLoaded|types|processStart|processComplete|renderFinished|blockStarted|initialized|DOM|onload|originalVisiblePixels|DEBUG|filterFunc|domainRegex|corsEnabled|executeLayer|use|pushContext|remoteCheck|popContext|remote|proxy|scaled|applyCurrentLayer|nodeSave|browserSave|png|applyToParent|swapped|_super|1000|put|normal|hermite|mode|item|reloadCanvasData|isRemote|URL|hiDPIDisabled|log|hidpi|parser|parse|date|chunk|locationToCoordinates|ready|getPixelRelative|anonymous|dataStr|binary|nowLoc|Uint8Array|style|extended|px|isImageLoaded|setAttribute|RegExp|shift|loadOverlay|executePlugin|executeFilter|release|hiDPICapable|hiDPIAdjustments|proxyParam|node|toImage|me|renderBlock|renderKernel|newCanvas|Block|blockNum|totalBlocks|yield|given|rgbToHSV|autoload|hsvToRGB|cropped|or|setup|delete|rgbToXYZ|readFromHttp|brightness|saturation|vibrance|hasId|https|render|greyscale|contrast|hue|Height|colorize|x1|instanceof|invert|sepia|gamma|noise|clip|channels|initCanvas|Width|parseArguments|y1|x2|xyzToLab|has|y2|initImage|reverse|setInitObject|sqrt|initNode|rb|python|py|perl|pl|javascript|js|proxies|caman_proxy|save|rgbToHSL|set|defineProperty|calculateLevels|replace|octet|stream|location|href|hslToRGB|Remote|random||statSync|isFile||Creating|output|writeFile|toBuffer|Finished|writing|toDataURL|toFixed|hasOwnProperty|detected|layerID|createImageData|setBlendingMode|using|copyParent|aliasProperty|299|overlayImage|587|114|indexOf|resetOriginalPixelData|aliasFunction|warn|extend|4124|3576|1805|locationXY|2126|7152|0722|0193|1192|9505|not|putPixelRelative|xyzToRGB|getPixel|putPixel|toKey|toHex|2406|5372|4986|os|cpus|9689|8758|0415|0557|2040|0570|find|readFile|default|fibers|querySelectorAll|Version|DOMContentLoaded|readystatechange|delegate|includes|HiDPI|run|querySelector|extends|Executing|Fetching|while|Start|End|naturalHeight|scale|startPixel|endPixel|initialization|labToXYZ|nodeValue|missing|rgbToLab|webkitBackingStorePixelRatio|Rendering|blocksFinished|labToRGB|mozBackingStorePixelRatio|flush|msBackingStorePixelRatio|multiply|screen|overlay|Function|difference|addition|exclusion|softLight|lighten|darken|oBackingStorePixelRatio|attributes|backingStorePixelRatio|01|setEncoding|void|listen|analyze|Released|camanProxyUrl|distance|__super__|Buffer|isNaN|Initializing|credentials|607|769|189|349|314|168|272|534|869|revert|domain|keys|2013|Attempting|load|Could|without|configured|charAt|Cannot|loading|images|encodeURIComponent|split|exposure|useProxy|reset|ruby|constructor'.split('|'),0,{})) \ No newline at end of file +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(){I $,2N,1z,1H,B,3e,2L,1s,1N,45,V,1U,2V,24,1n,2i,1r,1R,1h,4I,1X,1a,3D,3Y,4w,3i,3W=[].9r||o(8o){U(I i=0,l=8.K;iD){9 D}9 1w};1a.3L=o(2H,2o,4h){I 4j,C,13,E,2q,X;u(4h==G){4h={}}E=2H.bm;X=[];U(C=0,13=E.K;C<13;C++){4j=E[C];u((4h.5c!=G)&&(2q=4j.5f,3W.19(4h.5c,2q)>=0)){4f}X.1y(2o.7n(4j.5f,4j.bn))}9 X};1a.3v=o(K){u(K==G){K=0}u(B.21||(2Y.7o!=G)){9 1k 7o(K)}9 1k 44(K)};9 1a})();u(1f 1Y!=="33"&&1Y!==G){4I=1Y;2L=4i(\'F\');2V=2L.2V;45=4i(\'bl\');3D=4i(\'3D\');3Y=4i(\'3Y\')}R{4I=2Y}B=(o(79){7c(B,79);B.5o={7V:"4.1.2",8z:"7/27/ao"};B.6V=1C;B.3C=2n;B.5X="86";B.4A="";B.8c="9q";B.21=1f 1Y!=="33"&&1Y!==G;B.8m=!B.21;B.3t=o(){9"9g "+B.5o.7V+", 9x "+B.5o.8z};B.63=o(F){u(B.21){9 2n}u(1f F==="2Z"){F=$(F)}u(!((F!=G)&&(F.3w!=G))){9 G}9 F.3w(\'1A-2l-1T\')};o B(){8.3s=5T(8.3s,8);I W,1i,1T;u(Y.K===0){1O"3m Y";}u(8 6A B){8.3x=8.3x.5p(8);8.4k=8.4k.5p(8);W=Y[0];u(!B.21){1T=50(B.63(W[0]),10);1i=1f W[1]==="o"?W[1]:1f W[2]==="o"?W[2]:o(){};u(!bo(1T)&&1X.6P(1T)){9 1X.2t(1T,1i)}}8.1T=1a.5q.2D();8.59=8.2J=G;8.5m={x:0,y:0};8.82=1C;8.5s=1C;8.be=1C;8.bd=0;8.4a=[];8.5t=[];8.5u=[];8.49=G;8.6R=1C;8.aT=1k 2N(8);8.2P=1k 1h(8);8.7T((o(Z){9 o(){Z.80(W);9 Z.8g()}})(8));9 8}R{9 1k B(Y)}}B.H.7T=o(3y){I 5C;u(B.21){9 4s((o(Z){9 o(){9 3y.19(Z)}})(8),0)}R{u(1L.5D==="4D"){1n.1D("6B 6G");9 4s((o(Z){9 o(){9 3y.19(Z)}})(8),0)}R{5C=(o(Z){9 o(){u(1L.5D==="4D"){1n.1D("6B 6G");9 3y.19(Z)}}})(8);9 1L.6L("ap",5C,1C)}}};B.H.80=o(W){I 1B,1w,E,X;u(W.K===0){1O"3m Y 6M";}8.23=G;8.4m=G;8.4n=G;8.1i=o(){};8.6W(W[0]);u(W.K===1){9}3p(1f W[1]){1v"2Z":8.4n=W[1];31;1v"o":8.1i=W[1]}u(W.K===2){9}8.1i=W[2];u(W.K===4){E=W[4];X=[];U(1B 3d E){u(!3R.19(E,1B))4f;1w=E[1B];X.1y(8.1c[1B]=1w)}9 X}};B.H.6W=o(1I){u(B.21){8.23=1I;8.4m=\'6Z\';9}u(1f 1I==="2v"){8.23=1I}R{8.23=$(1I)}u(8.23==G){1O"al a8 a7 S 7f F U a3.";}9 8.4m=8.23.5f.3Z()};B.H.8g=o(){3p(8.4m){1v"6Z":9 8.7w();1v"1g":9 8.7A();1v"F":9 8.7B()}};B.H.7w=o(){1n.1D("9N U 21");u(1f 8.23==="2Z"&&8.23.4C(/^7E?:\\/\\//)){9 8.7F(8.23,8.3s)}R u(1f 8.23==="2Z"){9 3D.9E(8.23,8.3s)}R{9 8.3s(G,8.23)}};B.H.7F=o(3X,1i){I 66;1n.1D("9A S 2H "+3X);66=3Y.2D(3X,o(2u){I 4N;4N=\'\';2u.9s(\'8d\');2u.6m(\'1A\',o(8f){9 4N+=8f});9 2u.6m(\'1p\',o(){9 1i(G,1k 91(4N,\'8d\'))})});9 66.6m(\'6t\',1i)};B.H.3s=o(3T,1A){u(3T){1O 3T;}8.S=1k 2V();8.S.1b=1A;1n.1D("2V 8D. 8E = "+(8.2g())+", 8p = "+(8.2f()));8.F=1k 2L(8.2g(),8.2f());8.1J=1k 2L(8.2g(),8.2f());9 8.3x()};B.H.7A=o(){8.S=8.23;8.F=1L.2O(\'F\');8.1e=8.F.2b(\'2d\');8.1J=1L.2O(\'F\');8.3c=8.1J.2b(\'2d\');1a.3L(8.S,8.F,{5c:[\'1b\']});1a.3L(8.S,8.1J,{5c:[\'1b\']});u(8.S.6g!=G){8.S.6g.7z(8.1J,8.S)}8.5Z();9 8.5Y()};B.H.7B=o(){8.F=1L.2O(\'F\');8.1e=8.F.2b(\'2d\');8.1J=8.23;8.3c=8.1J.2b(\'2d\');8.F.L=8.1J.L;8.F.P=8.1J.P;u(8.4n!=G){8.S=1L.2O(\'1g\');8.S.1b=8.4n;8.5Z();9 8.5Y()}R{9 8.3x()}};B.H.5Z=o(){u(8.5V()){1n.1D(8.S.1b,"->",8.4M());8.7k=2n;8.S.1b=8.4M()}u(1U.7j(8.S)){8.S.1b=1U.3f(8.S.1b);9 1n.1D("a5 S aa, ad 78 = "+8.S.1b)}};B.H.5Y=o(){u(8.73()){9 8.4k()}R{9 8.S.72=8.4k}};B.H.73=o(){u(!8.S.4D){9 1C}u((8.S.5O!=G)&&8.S.5O===0){9 1C}9 2n};B.H.2g=o(){9 8.S.L||8.S.5O};B.H.2f=o(){9 8.S.P||8.S.an};B.H.4k=o(){1n.1D("2V 8D. 8E = "+(8.2g())+", 8p = "+(8.2f()));u(8.7k){8.F.L=8.2g()/8.3K();8.F.P=8.2f()/8.3K();8.1J.L=8.2g()/8.3K();8.1J.P=8.2f()/8.3K()}R{8.F.L=8.2g();8.F.P=8.2f();8.1J.L=8.2g();8.1J.P=8.2f()}9 8.3x()};B.H.3x=o(){I i,15,C,13,E;u(8.1e==G){8.1e=8.F.2b(\'2d\')}u(8.3c==G){8.3c=8.1J.2b(\'2d\')}8.5N=8.3M=8.L=8.F.L;8.5M=8.3O=8.P=8.F.P;8.6S();u(!8.6Q()){8.6N()}u(8.S!=G){8.1e.46(8.S,0,0,8.2g(),8.2f(),0,0,8.3M,8.3O);8.3c.46(8.S,0,0,8.2g(),8.2f(),0,0,8.3M,8.3O)}8.1W=8.1e.3u(0,0,8.F.L,8.F.P);8.M=8.1W.1A;u(B.3C){8.59=1a.3v(8.M.K);8.2J=1a.3v(8.M.K);E=8.M;U(i=C=0,13=E.K;C<13;i=++C){15=E[i];8.59[i]=15;8.2J[i]=15}}8.1F={L:8.F.L,P:8.F.P};u(!B.21){1X.6K(8.1T,8)}8.1i.19(8,8);9 8.1i=o(){}};B.H.6z=o(){8.1W=8.1e.3u(0,0,8.F.L,8.F.P);9 8.M=8.1W.1A};B.H.aG=o(){I i,15,C,13,E,X;u(!B.3C){1O"5E 4y";}8.2J=1a.3v(8.M.K);E=8.M;X=[];U(i=C=0,13=E.K;C<13;i=++C){15=E[i];X.1y(8.2J[i]=15)}9 X};B.H.6Q=o(){9 B.63(8.F)!=G};B.H.6N=o(){u(B.21||8.F.3w(\'1A-2l-1T\')){9}9 8.F.7n(\'1A-2l-1T\',8.1T)};B.H.6w=o(){9 8.F.3w(\'1A-2l-6v-4y\')!==G};B.H.6S=o(){I 2E;u(B.21||!8.5V()){9}2E=8.3K();u(2E!==1){1n.1D("aH 2E = "+2E);8.6R=2n;8.3M=8.F.L;8.3O=8.F.P;8.F.L=8.3M*2E;8.F.P=8.3O*2E;8.F.8w.L=""+8.3M+"8u";8.F.8w.P=""+8.3O+"8u";8.1e.aK(2E,2E);8.L=8.5N=8.F.L;9 8.P=8.5M=8.F.P}};B.H.3K=o(){I 5B,2C;2C=2Y.2C||1;5B=8.1e.aU||8.1e.aV||8.1e.b6||8.1e.b7||8.1e.b8||1;9 2C/5B};B.H.7p=o(){9(2Y.2C!=G)&&2Y.2C!==1};B.H.5V=o(){u(8.6w()||!8.7p()){9 1C}9 8.4M()!==G};B.H.4M=o(){u(8.S==G){9 G}9 8.S.3w(\'1A-2l-6v\')};B.H.4O=o(7e){I i,15,C,13,E;8.F=7e;8.1e=8.F.2b(\'2d\');8.1W=8.1e.3u(0,0,8.F.L,8.F.P);8.M=8.1W.1A;u(B.3C){8.2J=1a.3v(8.M.K);E=8.M;U(i=C=0,13=E.K;C<13;i=++C){15=E[i];8.2J[i]=15}}8.L=8.F.L;8.P=8.F.P;8.6z();9 8.1F={L:8.F.L,P:8.F.P}};B.H.75=o(1i){u(1i==G){1i=o(){}}1N.3a(8,"6Y");9 8.2P.2t((o(Z){9 o(){Z.1J.L=Z.F.L;Z.1J.P=Z.F.P;Z.3c.5v(Z.1W,0,0);9 1i.19(Z)}})(8))};B.H.bf=o(4V){I i,15,C,13,E;u(4V==G){4V=2n}u(!B.3C){1O"5E 4y";}E=8.7r();U(i=C=0,13=E.K;C<13;i=++C){15=E[i];8.M[i]=15}u(4V){9 8.3c.5v(8.1W,0,0)}};B.H.bh=o(){I F,2p,i,1W,15,M,C,13,E;F=1L.2O(\'F\');1a.3L(8.F,F);F.L=8.5N;F.P=8.5M;2p=F.2b(\'2d\');1W=2p.3u(0,0,F.L,F.P);M=1W.1A;E=8.59;U(i=C=0,13=E.K;C<13;i=++C){15=E[i];M[i]=15}2p.5v(1W,0,0);8.5m={x:0,y:0};8.5s=1C;9 8.4O(F)};B.H.7r=o(){I 4Z,1q,5n,i,M,52,53,54,L,C,E,2q,2y;u(!B.3C){1O"5E 4y";}52=[];53=0;1q=53+8.L;54=0;5n=54+8.P;M=8.2J;L=8.F.L;U(i=C=0,E=M.K;CE;i=0<=E?++C:--C){1S+=J[i]}}8.2P.2F({14:V.25.5h,11:11,J:J,1S:1S,26:26});9 8};B.H.5i=o(2w,W){8.2P.2F({14:V.25.1R,2w:2w,W:W});9 8};B.H.5j=o(1i){I 1t;1t=1k 24(8);8.5u.1y(1t);8.2P.2F({14:V.25.5k});1i.19(1t);8.2P.2F({14:V.25.5l});9 8};B.H.8h=o(1t){9 8.8i(1t)};B.H.8i=o(1t){8.5t.1y(8.49);8.4a.1y(8.M);8.49=1t;9 8.M=1t.M};B.H.6x=o(){8.M=8.4a.3U();9 8.49=8.5t.3U()};B.H.6D=o(){9 8.49.6J()};9 B})(2i);4I.B=B;B.2N=(o(){o 2N(c){8.c=c}2N.H.bi=o(){I i,29,4e,C,17,1M,E;29={r:{},g:{},b:{}};U(i=C=0;C<=D;i=++C){29.r[i]=0;29.g[i]=0;29.b[i]=0}U(i=17=0,E=8.c.M.K;170)){9}X=[];U(C=0,13=4b.K;C<13;C++){1g=4b[C];X.1y(6C=1k 3e(1g,o(){8.6H();9 8.2t()}))}9 X};u(B.8m){(o(){u(1L.5D==="4D"){9 B.5r()}R{9 1L.6L("bb",B.5r,1C)}})()}3e=(o(){I 4T;4T="(\\\\w+)\\\\((.*?)\\\\)";o 3e(2z,6T){8.6U=2z.3w(\'1A-2l\');8.2l=B(2z,6T.5p(8))}3e.H.6H=o(){I W,e,48,39,5w,5x,m,r,47,C,13,E,X;8.2z=8.2l.F;r=1k 7h(4T,\'g\');47=8.6U.4C(r);u(!(47.K>0)){9}r=1k 7h(4T);X=[];U(C=0,13=47.K;C<13;C++){5w=47[C];E=5w.4C(r),m=E[0],48=E[1],W=E[2];5x=1k b9("9 o() { 8."+48+"("+W+"); };");5y{39=5x();X.1y(39.19(8.2l))}5z(3E){e=3E;X.1y(1n.1D(e))}}9 X};3e.H.2t=o(){I 2z;2z=8.2z;9 8.2l.75(o(){9 2z.6g.7z(8.7q(),2z)})};9 3e})();B.1z=(o(){o 1z(){}1z.5A={};1z.18=o(11,39){9 8.5A[11]=39};1z.2t=o(11,O,N){9 8.5A[11](O,N)};9 1z})();1z=B.1z;B.1H=(o(){o 1H(){}1H.b5=o(7H,7I,7J,7K){9 Q.7N(Q.1Z(7J-7H,2)+Q.1Z(7K-7I,2))};1H.7P=o(1j,T,42){I 2A;u(42==G){42=1C}2A=1j+(Q.aQ()*(T-1j));u(42){9 2A.aP(42)}R{9 Q.41(2A)}};1H.83=o(A){9(0.aN*A.r)+(0.aM*A.g)+(0.aL*A.b)};1H.1K=o(1l,2X,2W,1p,34,35){I 1K,3o,1E,1q,i,j,3r,4v,2m,t,C,17,E;u(34==G){34=0}u(35==G){35=D}u(1l[0]6A 44){1E=1l;34=2X;35=2W}R{1E=[1l,2X,2W,1p]}u(1E.K<2){1O"3m 5F 5G Y 2o 1K";}1K={};3r=o(a,b,t){9 a*(1-t)+b*t};3o=o(a,1j,T){9 Q.1j(Q.T(a,1j),T)};U(i=C=0;C<6F;i=++C){t=i/6F;2m=1E;as(2m.K>1){4v=[];U(j=17=0,E=2m.K-2;0<=E?17<=E:17>=E;j=0<=E?++17:--17){4v.1y([3r(2m[j][0],2m[j+1][0],t),3r(2m[j][1],2m[j+1][1],t)])}2m=4v}1K[Q.41(2m[0][0])]=Q.41(3o(2m[0][1],34,35))}1q=1E[1E.K-1][0];1K=B.1H.5H(1K,1q);u(1K[1q]==G){1K[1q]=1K[1q-1]}9 1K};1H.6I=o(1E,34,35){I 2F,3o,5I,1q,4u,4t,4r,4p,i,j,3r,5J,5K,2M,p,3P,3N,2I,58,56,2a,51,t,C,17,E;u(1E.K<2){1O"3m 5F 5G Y 2o 6I";}2a={};3r=o(a,b,t){9 a*(1-t)+b*t};2F=(o(Z){9 o(a,b,c,d){9[a[0]+b[0]+c[0]+d[0],a[1]+b[1]+c[1]+d[1]]}})(8);2M=(o(Z){9 o(a,b){9[a[0]*b[0],a[1]*b[1]]}})(8);51=(o(Z){9 o(a,b){9[a[0]-b[0],a[1]-b[1]]}})(8);3o=o(a,1j,T){9 Q.1j(Q.T(a,1j),T)};5I=0;U(i=C=0,E=1E.K-2;0<=E?C<=E:C>=E;i=0<=E?++C:--C){3P=1E[i];3N=1E[i+1];2I=3N[0]-3P[0];58=1/2I;u(i===1E.K-2){58=1/(2I-1)}p=i>0?1E[i-1]:3P;5J=2M(51(3N,p),[0.5,0.5]);p=i<1E.K-2?1E[i+2]:3N;5K=2M(51(p,3P),[0.5,0.5]);U(j=17=0;0<=2I?17<=2I:17>=2I;j=0<=2I?++17:--17){t=j*58;4u=2.0*t*t*t-3.0*t*t+1.0;4t=t*t*t-2.0*t*t+t;4r=-2.0*t*t*t+3.0*t*t;4p=t*t*t-t*t;56=2F(2M(3P,[4u,4u]),2M(5J,[4t,4t]),2M(3N,[4r,4r]),2M(5K,[4p,4p]));2a[Q.41(56[0])]=Q.41(3o(56[1],34,35));5I+=1}}1q=1E[1E.K-1][0];2a=B.1H.5H(2a,1q);9 2a};1H.5H=o(3g,1q){I i,j,3J,2a,4Y,C,17;u(7W.ah(3g).K<1q+1){2a={};U(i=C=0;0<=1q?C<=1q:C>=1q;i=0<=1q?++C:--C){u(3g[i]!=G){2a[i]=3g[i]}R{3J=[i-1,2a[i-1]];U(j=17=i;i<=1q?17<=1q:17>=1q;j=i<=1q?++17:--17){u(3g[j]!=G){4Y=[j,3g[j]];31}}2a[i]=3J[1]+((4Y[1]-3J[1])/(4Y[0]-3J[0]))*(i-3J[0])}}9 2a}9 3g};9 1H})();1H=B.1H;B.1s=(o(){o 1s(){}1s.5P=o(2h){I b,g,r;u(2h.ae(0)==="#"){2h=2h.4W(1)}r=50(2h.4W(0,2),16);g=50(2h.4W(2,2),16);b=50(2h.4W(4,2),16);9{r:r,g:g,b:b}};1s.ab=o(r,g,b){I d,h,l,T,1j,s;u(1f r==="2v"){g=r.g;b=r.b;r=r.r}r/=D;g/=D;b/=D;T=Q.T(r,g,b);1j=Q.1j(r,g,b);l=(T+1j)/2;u(T===1j){h=s=0}R{d=T-1j;s=l>0.5?d/(2-T-1j):d/(T+1j);h=(o(){3p(T){1v r:9(g-b)/d+(g1){t-=1}u(t<1/6){9 p+(q-p)*6*t}u(t<1/2){9 q}u(t<2/3){9 p+(q-p)*(2/3-t)*6}9 p};1s.7g=o(r,g,b){I d,h,T,1j,s,v;r/=D;g/=D;b/=D;T=Q.T(r,g,b);1j=Q.1j(r,g,b);v=T;d=T-1j;s=T===0?0:d/T;u(T===1j){h=0}R{h=(o(){3p(T){1v r:9(g-b)/d+(g0.5W){r=Q.1Z((r+0.28)/1.28,2.4)}R{r/=12.92}u(g>0.5W){g=Q.1Z((g+0.28)/1.28,2.4)}R{g/=12.92}u(b>0.5W){b=Q.1Z((b+0.28)/1.28,2.4)}R{b/=12.92}x=r*0.a2+g*0.a1+b*0.9Z;y=r*0.9Y+g*0.9X+b*0.9W;z=r*0.9V+g*0.9U+b*0.9T;9{x:x*1o,y:y*1o,z:z*1o}};1s.9S=o(x,y,z){I b,g,r;x/=1o;y/=1o;z/=1o;r=(3.9P*x)+(-1.9O*y)+(-0.9I*z);g=(-0.9G*x)+(1.9F*y)+(0.9D*z);b=(0.9C*x)+(-0.9B*y)+(1.9y*z);u(r>0.68){r=(1.28*Q.1Z(r,0.69))-0.28}R{r*=12.92}u(g>0.68){g=(1.28*Q.1Z(g,0.69))-0.28}R{g*=12.92}u(b>0.68){b=(1.28*Q.1Z(b,0.69))-0.28}R{b*=12.92}9{r:r*D,g:g*D,b:b*D}};1s.7M=o(x,y,z){I a,b,l,6a,6b,6c;u(1f x==="2v"){y=x.y;z=x.z;x=x.x}6a=95.7Q;6b=1o.0;6c=7R.7S;x/=6a;y/=6b;z/=6c;u(x>0.6d){x=Q.1Z(x,0.6e)}R{x=(7.6f*x)+0.3z}u(y>0.6d){y=Q.1Z(y,0.6e)}R{y=(7.6f*y)+0.3z}u(z>0.6d){z=Q.1Z(z,0.6e)}R{z=(7.6f*z)+0.3z}l=7X*y-16;a=7Y*(x-y);b=7Z*(y-z);9{l:l,a:a,b:b}};1s.9w=o(l,a,b){I x,y,z;u(1f l==="2v"){a=l.a;b=l.b;l=l.l}y=(l+16)/7X;x=y+(a/7Y);z=y-(b/7Z);u(x>0.6i){x=x*x*x}R{x=0.6j*(x-0.3z)}u(y>0.6i){y=y*y*y}R{y=0.6j*(y-0.3z)}u(z>0.6i){z=z*z*z}R{z=0.6j*(z-0.3z)}9{x:x*95.7Q,y:y*1o.0,z:z*7R.7S}};1s.9v=o(r,g,b){I 6l;u(1f r==="2v"){g=r.g;b=r.b;r=r.r}6l=8.7l(r,g,b);9 8.7M(6l)};1s.9t=o(l,a,b){};9 1s})();1s=B.1s;B.1N=(o(){o 1N(){}1N.3b={};1N.87=["88","89","6Y","8a","8b","3Q"];1N.3a=o(22,14,1A){I 3S,C,13,E,X;u(1A==G){1A=G}u(8.3b[14]&&8.3b[14].K){E=8.3b[14];X=[];U(C=0,13=E.K;C<13;C++){3S=E[C];u(3S.22===G||22.1T===3S.22.1T){X.1y(3S.2r.19(22,1A))}R{X.1y(9p 0)}}9 X}};1N.9n=o(22,14,2r){I 6n,5e;u(1f 22==="2Z"){5e=22;6n=14;22=G;14=5e;2r=6n}u(3W.19(8.87,14)<0){9 1C}u(!8.3b[14]){8.3b[14]=[]}8.3b[14].1y({22:22,2r:2r});9 2n};9 1N})();1N=B.1N;B.V=(o(){o V(){}V.25={6o:1,5h:2,5k:3,5l:4,6p:5,1R:6};V.18=o(11,8j){9 B.H[11]=8j};9 V})();V=B.V;B.1U=(o(){o 1U(){}1U.8k=/(?:(?:3Y|7E):\\/\\/)((?:\\w+)\\.(?:(?:\\w|\\.)+))/;1U.7j=o(1g){u(1g==G){9 1C}u(8.8l(1g)){9 1C}9 8.4q(1g.1b)};1U.8l=o(1g){I E;9(1g.5X!=G)&&((E=1g.5X.3Z())===\'86\'||E===\'8n-9m\')};1U.4q=o(3X){I 4o;4o=3X.4C(8.8k);u(4o){9 4o[1]!==1L.9k}R{9 1C}};1U.8r=o(1b){u(8.4q(1b)){u(!B.4A.K){1n.6q("9f 2o 9e a 8v S 93 a 90 8y. 78: "+1b)}R{u(B.4q(B.4A)){1n.6q("8U 8n a 8v 8y U 8T 8S.");9}9 8.3f(1b)}}};1U.3f=o(1b){9""+B.4A+"?"+B.8c+"="+(8R(1b))};1U.8G=o(38){I 5b;5b={a4:\'8H\',8I:\'8J\',8K:\'8L\',8M:\'8N\'};38=38.3Z();u(5b[38]!=G){38=5b[38]}9"8O/8P."+38};9 1U})();B.H.8Q=o(){u(1f 1Y!=="33"&&1Y!==G){9 8.8C.2G(8,Y)}R{9 8.8B.2G(8,Y)}};B.H.8B=o(14){I S;u(14==G){14="8A"}14=14.3Z();S=8.6u(14).8V("S/"+14,"S/8W-8X");9 1L.8Y.8Z=S};B.H.8C=o(3q,57,1i){I e,6s;u(57==G){57=2n}u(1i==G){1i=G}5y{6s=3D.94(3q);u(6s.96()&&!57){9 1C}}5z(3E){e=3E;1n.1D("97 98 3q "+3q)}9 3D.99(3q,8.F.9a(),o(3T){1n.1D("9b 9c 2o "+3q);u(1i){9 1i.19(8,3T)}})};B.H.7q=o(14){I 1g;1g=1k 2V();1g.1b=8.6u(14);1g.L=8.1F.L;1g.P=8.1F.P;u(2Y.2C){1g.L/=2Y.2C;1g.P/=2Y.2C}9 1g};B.H.6u=o(14){u(14==G){14="8A"}14=14.3Z();9 8.1J.9d("S/"+14)};1U=B.1U;B.24=(o(){o 24(c){8.c=c;8.48=8.c;8.1c={6r:\'8t\',2Q:1.0};8.9h=1a.5q.2D();8.F=1f 1Y!=="33"&&1Y!==G?1k 2L():1L.2O(\'F\');8.F.L=8.c.1F.L;8.F.P=8.c.1F.P;8.1e=8.F.2b(\'2d\');8.1e.9i(8.F.L,8.F.P);8.1W=8.1e.3u(0,0,8.F.L,8.F.P);8.M=8.1W.1A}24.H.5j=o(3y){9 8.c.5j.19(8.c,3y)};24.H.9j=o(8q){8.1c.6r=8q;9 8};24.H.2Q=o(2Q){8.1c.2Q=2Q/1o;9 8};24.H.9l=o(){I i,20,C,E;20=8.c.M;U(i=C=0,E=8.c.M.K;C8.c.M.K||2j<0){9 1k 1r(0,0,0,D,8.c)}9 8.65(2j)};1r.H.9H=o(4F,4E,A){I 7D;u(8.c==G){1O"3l a 3k 1e";}7D=8.1m+(8.c.1F.L*4*(4E*-1))+(4*4F);u(2j>8.c.M.K||2j<0){9}8.c.M[2j]=A.r;8.c.M[2j+1]=A.g;8.c.M[2j+2]=A.b;8.c.M[2j+3]=A.a;9 2n};1r.H.9J=o(x,y){I 1m;u(8.c==G){1O"3l a 3k 1e";}1m=8.6h(x,y,8.L);9 8.65(1m)};1r.H.9K=o(x,y,A){I 1m;u(8.c==G){1O"3l a 3k 1e";}1m=8.6h(x,y,8.L);8.c.M[1m]=A.r;8.c.M[1m+1]=A.g;8.c.M[1m+2]=A.b;9 8.c.M[1m+3]=A.a};1r.H.3t=o(){9 8.9L()};1r.H.9M=o(4B){I 2h;u(4B==G){4B=1C}2h=\'#\'+8.r.3t(16)+8.g.3t(16)+8.b.3t(16);u(4B){9 2h+8.a.3t(16)}R{9 2h}};9 1r})();1r=B.1r;B.1R=(o(){o 1R(){}1R.64={};1R.18=o(11,2w){9 8.64[11]=2w};1R.2t=o(1e,11,W){9 8.64[11].2G(1e,W)};9 1R})();1R=B.1R;B.1h=(o(){1h.2T=B.21?4i(\'9Q\').9R().K:4;o 1h(c){8.c=c;8.2B=5T(8.2B,8);8.3V=[];8.32=G}1h.H.2F=o(62){u(62==G){9}9 8.3V.1y(62)};1h.H.2B=o(){I 1t;u(8.3V.K===0){1N.3a(8,"8a");u(8.61!=G){8.61.19(8.c)}9 8}8.1x=8.3V.7v();3p(8.1x.14){1v V.25.5k:1t=8.c.5u.7v();8.c.8h(1t);9 8.2B();1v V.25.5l:8.c.6D();8.c.6x();9 8.2B();1v V.25.6p:9 8.7u(8.1x.1t,8.1x.1b);1v V.25.1R:9 8.7t();a0:9 8.7s()}};1h.H.2t=o(1i){8.61=1i;8.32=1a.3v(8.c.M.K);9 8.2B()};1h.H.60=o(2r){I 40,5U,1P,1p,f,i,5S,n,1l,C,E,X;8.4Q=0;n=8.c.M.K;5U=Q.2K((n/4)/1h.2T);40=5U*4;5S=40+((n/4)%1h.2T)*4;X=[];U(i=C=0,E=1h.2T;0<=E?CE;i=0<=E?++C:--C){1l=i*40;1p=1l+(i===1h.2T-1?5S:40);u(B.21){f=45((o(Z){9 o(){9 2r.19(Z,i,1l,1p)}})(8));1P=f.a9();X.1y(8.3Q(1P))}R{X.1y(4s((o(Z){9 o(i,1l,1p){9 o(){9 2r.19(Z,i,1l,1p)}}})(8)(i,1l,1p),0))}}9 X};1h.H.7s=o(){1N.3a(8.c,"88",8.1x);u(8.1x.14===V.25.6o){9 8.60(8.7b)}R{9 8.60(8.7a)}};1h.H.7t=o(){1n.1D("ac 2w "+8.1x.2w);1R.2t(8.c,8.1x.2w,8.1x.W);1n.1D("1R "+8.1x.2w+" 5R!");9 8.2B()};1h.H.7b=o(1P,1l,1p){I i,15,C;1n.1D("77 #"+1P+" - V: "+8.1x.11+", af: "+1l+", ag: "+1p);1N.3a(8.c,"8b",{74:1P,71:1h.2T,ai:1l,aj:1p});15=1k 1r();15.67(8.c);U(i=C=1l;C<1p;i=C+=4){15.1m=i;15.r=8.c.M[i];15.g=8.c.M[i+1];15.b=8.c.M[i+2];15.a=8.c.M[i+3];8.1x.5a(15);8.c.M[i]=1a.2e(15.r);8.c.M[i+1]=1a.2e(15.g);8.c.M[i+2]=1a.2e(15.b);8.c.M[i+3]=1a.2e(15.a)}u(B.21){9 45["70"](1P)}R{9 8.3Q(1P)}};1h.H.7a=o(1P,1l,1p){I J,43,26,1V,3n,1S,i,j,k,2k,n,11,p,15,2u,C,17,1M;11=8.1x.11;26=8.1x.26;1S=8.1x.1S;n=8.c.M.K;J=8.1x.J;43=Q.7N(J.K);2k=[];1n.1D("aq 2k - V: "+8.1x.11);1l=Q.T(1l,8.c.1F.L*4*((43-1)/2));1p=Q.1j(1p,n-(8.c.1F.L*4*((43-1)/2)));1V=(43-1)/2;15=1k 1r();15.67(8.c);U(i=C=1l;C<1p;i=C+=4){15.1m=i;3n=0;U(j=17=-1V;-1V<=1V?17<=1V:17>=1V;j=-1V<=1V?++17:--17){U(k=1M=1V;1V<=-1V?1M<=-1V:1M>=-1V;k=1V<=-1V?++1M:--1M){p=15.7G(j,k);2k[3n*3]=p.r;2k[3n*3+1]=p.g;2k[3n*3+2]=p.b;3n++}}2u=8.5Q(J,2k,1S,26);8.32[i]=1a.2e(2u.r);8.32[i+1]=1a.2e(2u.g);8.32[i+2]=1a.2e(2u.b);8.32[i+3]=8.c.M[i+3]}u(B.21){9 45["70"](1P)}R{9 8.3Q(1P)}};1h.H.3Q=o(1P){I i,C,E;u(1P>=0){1n.1D("77 #"+1P+" 5R! V: "+8.1x.11)}8.4Q++;1N.3a(8.c,"3Q",{74:1P,ar:8.4Q,71:1h.2T});u(8.4Q===1h.2T){u(8.1x.14===V.25.5h){U(i=C=0,E=8.c.M.K;0<=E?CE;i=0<=E?++C:--C){8.c.M[i]=8.32[i]}}u(1P>=0){1n.1D("V "+8.1x.11+" 5R!")}1N.3a(8.c,"89",8.1x);9 8.2B()}};1h.H.5Q=o(J,2k,1S,26){I i,1w,C,E;1w={r:0,g:0,b:0};U(i=C=0,E=J.K;0<=E?CE;i=0<=E?++C:--C){1w.r+=J[i]*2k[i*3];1w.g+=J[i]*2k[i*3+1];1w.b+=J[i]*2k[i*3+2]}1w.r=(1w.r/1S)+26;1w.g=(1w.g/1S)+26;1w.b=(1w.b/1S)+26;9 1w};1h.H.7u=o(1t,1b){I 1g,3f;1g=1k 2V();1g.72=(o(Z){9 o(){1t.1e.46(1g,0,0,Z.c.1F.L,Z.c.1F.P);1t.1W=1t.1e.3u(0,0,Z.c.1F.L,Z.c.1F.P);1t.M=1t.1W.1A;Z.c.M=1t.M;9 Z.2B()}})(8);3f=1U.8r(1b);9 1g.1b=3f!=G?3f:1b};9 1h})();1h=B.1h;B.1X=(o(){o 1X(){}1X.3h={};1X.6P=o(2U){9 8.3h[2U]!=G};1X.2D=o(2U){9 8.3h[2U]};1X.6K=o(11,1I){9 8.3h[11]=1I};1X.2t=o(2U,1i){4s((o(Z){9 o(){9 1i.19(Z.2D(2U),Z.2D(2U))}})(8),0);9 8.2D(2U)};1X.at=o(11){u(11==G){11=1C}u(11){9 6E 8.3h[11]}R{9 8.3h={}}};9 1X})();1X=B.1X;1z.18("8t",o(O,N){9{r:O.r,g:O.g,b:O.b}});1z.18("av",o(O,N){9{r:(O.r*N.r)/D,g:(O.g*N.g)/D,b:(O.b*N.b)/D}});1z.18("aw",o(O,N){9{r:D-(((D-O.r)*(D-N.r))/D),g:D-(((D-O.g)*(D-N.g))/D),b:D-(((D-O.b)*(D-N.b))/D)}});1z.18("ax",o(O,N){I 1d;1d={};1d.r=N.r>1u?D-2*(D-O.r)*(D-N.r)/D:(N.r*O.r*2)/D;1d.g=N.g>1u?D-2*(D-O.g)*(D-N.g)/D:(N.g*O.g*2)/D;1d.b=N.b>1u?D-2*(D-O.b)*(D-N.b)/D:(N.b*O.b*2)/D;9 1d});1z.18("az",o(O,N){9{r:O.r-N.r,g:O.g-N.g,b:O.b-N.b}});1z.18("aA",o(O,N){9{r:N.r+O.r,g:N.g+O.g,b:N.b+O.b}});1z.18("aB",o(O,N){9{r:1u-2*(N.r-1u)*(O.r-1u)/D,g:1u-2*(N.g-1u)*(O.g-1u)/D,b:1u-2*(N.b-1u)*(O.b-1u)/D}});1z.18("aC",o(O,N){I 1d;1d={};1d.r=N.r>1u?D-((D-N.r)*(D-(O.r-1u)))/D:(N.r*(O.r+1u))/D;1d.g=N.g>1u?D-((D-N.g)*(D-(O.g-1u)))/D:(N.g*(O.g+1u))/D;1d.b=N.b>1u?D-((D-N.b)*(D-(O.b-1u)))/D:(N.b*(O.b+1u))/D;9 1d});1z.18("aD",o(O,N){9{r:N.r>O.r?N.r:O.r,g:N.g>O.g?N.g:O.g,b:N.b>O.b?N.b:O.b}});1z.18("aE",o(O,N){9{r:N.r>O.r?O.r:N.r,g:N.g>O.g?O.g:N.g,b:N.b>O.b?O.b:N.b}});V.18("4U",o(){I 3F;u(Y.K===1){3F=1s.5P(Y[0])}R{3F={r:Y[0],g:Y[1],b:Y[2]}}9 8.1Q("4U",o(A){A.r=3F.r;A.g=3F.g;A.b=3F.b;A.a=D;9 A})});V.18("6y",o(J){J=Q.2K(D*(J/1o));9 8.1Q("6y",o(A){A.r+=J;A.g+=J;A.b+=J;9 A})});V.18("8x",o(J){J*=-0.aI;9 8.1Q("8x",o(A){I T;T=Q.T(A.r,A.g,A.b);u(A.r!==T){A.r+=(T-A.r)*J}u(A.g!==T){A.g+=(T-A.g)*J}u(A.b!==T){A.b+=(T-A.b)*J}9 A})});V.18("8s",o(J){J*=-1;9 8.1Q("8s",o(A){I 4l,2S,T;T=Q.T(A.r,A.g,A.b);2S=(A.r+A.g+A.b)/3;4l=((Q.2R(T-2S)*2/D)*J)/1o;u(A.r!==T){A.r+=(T-A.r)*4l}u(A.g!==T){A.g+=(T-A.g)*4l}u(A.b!==T){A.b+=(T-A.b)*4l}9 A})});V.18("8e",o(J){9 8.1Q("8e",o(A){I 2S;2S=1H.83(A);A.r=2S;A.g=2S;A.b=2S;9 A})});V.18("84",o(J){J=Q.1Z((J+1o)/1o,2);9 8.1Q("84",o(A){A.r/=D;A.r-=0.5;A.r*=J;A.r+=0.5;A.r*=D;A.g/=D;A.g-=0.5;A.g*=J;A.g+=0.5;A.g*=D;A.b/=D;A.b-=0.5;A.b*=J;A.b+=0.5;A.b*=D;9 A})});V.18("81",o(J){9 8.1Q("81",o(A){I b,g,h,37,r,E;37=1s.7g(A.r,A.g,A.b);h=37.h*1o;h+=Q.2R(J);h=h%1o;h/=1o;37.h=h;E=1s.7i(37.h,37.s,37.v),r=E.r,g=E.g,b=E.b;A.r=r;A.g=g;A.b=b;9 A})});V.18("7U",o(){I 3j,30;u(Y.K===2){30=1s.5P(Y[0]);3j=Y[1]}R u(Y.K===4){30={r:Y[0],g:Y[1],b:Y[2]};3j=Y[3]}9 8.1Q("7U",o(A){A.r-=(A.r-30.r)*(3j/1o);A.g-=(A.g-30.g)*(3j/1o);A.b-=(A.b-30.b)*(3j/1o);9 A})});V.18("7O",o(){9 8.1Q("7O",o(A){A.r=D-A.r;A.g=D-A.g;A.b=D-A.b;9 A})});V.18("7L",o(J){u(J==G){J=1o}J/=1o;9 8.1Q("7L",o(A){A.r=Q.1j(D,(A.r*(1-(0.aW*J)))+(A.g*(0.aX*J))+(A.b*(0.aY*J)));A.g=Q.1j(D,(A.r*(0.aZ*J))+(A.g*(1-(0.b0*J)))+(A.b*(0.b1*J)));A.b=Q.1j(D,(A.r*(0.b2*J))+(A.g*(0.b3*J))+(A.b*(1-(0.b4*J))));9 A})});V.18("7C",o(J){9 8.1Q("7C",o(A){A.r=Q.1Z(A.r/D,J)*D;A.g=Q.1Z(A.g/D,J)*D;A.b=Q.1Z(A.b/D,J)*D;9 A})});V.18("7y",o(J){J=Q.2R(J)*2.55;9 8.1Q("7y",o(A){I 2A;2A=1H.7P(J*-1,J);A.r+=2A;A.g+=2A;A.b+=2A;9 A})});V.18("7x",o(J){J=Q.2R(J)*2.55;9 8.1Q("7x",o(A){u(A.r>D-J){A.r=D}R u(A.rD-J){A.g=D}R u(A.gD-J){A.b=D}R u(A.b0){A.r+=(D-A.r)*1c.4S}R{A.r-=A.r*Q.2R(1c.4S)}}u(1c.4J!=G){u(1c.4J>0){A.g+=(D-A.g)*1c.4J}R{A.g-=A.g*Q.2R(1c.4J)}}u(1c.4G!=G){u(1c.4G>0){A.b+=(D-A.b)*1c.4G}R{A.b-=A.b*Q.2R(1c.4G)}}9 A})});V.18("4z",o(){I 4g,1K,2s,2c,1p,i,3G,1l,C,17,E,2q;2s=Y[0],2c=2<=Y.K?3B.19(Y,1):[];3G=2c[2c.K-1];u(1f 3G==="o"){4g=3G;2c.3U()}R u(1f 3G==="2Z"){4g=1H[3G];2c.3U()}R{4g=1H.1K}u(1f 2s==="2Z"){2s=2s.bj("")}u(2s[0]==="v"){2s=[\'r\',\'g\',\'b\']}u(2c.K<2){1O"3m 5F 5G Y 2o 4z 48";}1K=4g(2c,0,D);1l=2c[0];u(1l[0]>0){U(i=C=0,E=1l[0];0<=E?CE;i=0<=E?++C:--C){1K[i]=1l[1]}}1p=2c[2c.K-1];u(1p[0]=D;i=2q<=D?++17:--17){1K[i]=1p[1]}}9 8.1Q("4z",o(A){I 1M,2y;U(i=1M=0,2y=2s.K;0<=2y?1M<2y:1M>2y;i=0<=2y?++1M:--1M){A[2s[i]]=1K[A[2s[i]]]}9 A})});V.18("bk",o(J){I 2X,2W,p;p=Q.2R(J)/1o;2X=[0,D*p];2W=[D-(D*p),D];u(J<0){2X=2X.6O();2W=2W.6O()}9 8.4z(\'30\',[0,0],2X,2W,[D,D])});B.1R.18("5g",o(L,P,x,y){I F,2p;u(x==G){x=0}u(y==G){y=0}u(1f 1Y!=="33"&&1Y!==G){F=1k 2L(L,P)}R{F=1L.2O(\'F\');1a.3L(8.F,F);F.L=L;F.P=P}2p=F.2b(\'2d\');2p.46(8.F,x,y,L,P,0,0,L,P);8.5m={x:x,y:y};8.82=2n;9 8.4O(F)});B.1R.18("4H",o(1G){I F,2p;u(1G==G){1G=G}u(1G===G||((1G.L==G)&&(1G.P==G))){1n.6t("3m 7f bp 1F 6M U 4H");9}u(1G.L==G){1G.L=8.F.L*1G.P/8.F.P}R u(1G.P==G){1G.P=8.F.P*1G.L/8.F.L}u(1f 1Y!=="33"&&1Y!==G){F=1k 2L(1G.L,1G.P)}R{F=1L.2O(\'F\');1a.3L(8.F,F);F.L=1G.L;F.P=1G.P}2p=F.2b(\'2d\');2p.46(8.F,0,0,8.F.L,8.F.P,0,0,1G.L,1G.P);8.5s=2n;9 8.4O(F)});B.V.18("5g",o(){9 8.5i("5g",44.H.3i.19(Y,0))});B.V.18("4H",o(){9 8.5i("4H",44.H.3i.19(Y,0))})}).19(8);',62,708,'||||||||this|return|||||||||||||||function||||||if||||||rgba|Caman|_i|255|_ref|canvas|null|prototype|var|adjust|length|width|pixelData|rgbaParent|rgbaLayer|height|Math|else|image|max|for|Filter|args|_results|arguments|_this||name||_len|type|pixel||_j|register|call|Util|src|options|result|context|typeof|img|Renderer|callback|min|new|start|loc|Log|100|end|endX|Pixel|Convert|layer|128|case|val|currentJob|push|Blender|data|key|false|debug|controlPoints|dimensions|newDims|Calculate|obj|renderingCanvas|bezier|document|_k|Event|throw|bnum|process|Plugin|divisor|id|IO|builder|imageData|Store|exports|pow|parentData|NodeJS|target|initObj|Layer|Type|bias||055|levels|ret|getContext|cps||clampRGB|imageHeight|imageWidth|hex|Module|newLoc|kernel|caman|prev|true|to|ctx|_ref1|fn|chans|execute|res|object|plugin|value|_ref2|ele|rand|processNext|devicePixelRatio|get|ratio|add|apply|from|pointsPerSegment|originalPixelData|floor|Canvas|mul|Analyze|createElement|renderer|opacity|abs|avg|Blocks|search|Image|ctrl2|ctrl1|window|string|rgb|break|modPixelData|undefined|lowBound|highBound|layerData|hsv|lang|func|trigger|events|renderingContext|in|CamanParser|proxyUrl|values|items|slice|level|CamanJS|Requires|Invalid|builderIndex|clamp|switch|file|lerp|nodeFileReady|toString|getImageData|dataArray|getAttribute|finishInit|cb|1379310345|chan|__slice|allowRevert|fs|_error|color|last|child|parent|leftCoord|hiDPIRatio|copyAttributes|preScaledWidth|p1|preScaledHeight|p0|blockFinished|__hasProp|event|err|pop|renderQueue|__indexOf|url|http|toLowerCase|blockN|round|getFloat|adjustSize|Array|Fiber|drawImage|unparsedInstructions|filter|currentLayer|pixelStack|imgs|copy|prop|numPixels|continue|algo|opts|require|attr|imageLoaded|amt|initType|imageUrl|matches|fac3|isURLRemote|fac2|setTimeout|fac1|fac0|next|moduleKeywords|source|disabled|curves|remoteProxy|includeAlpha|match|complete|vert|horiz|blue|resize|Root|green|sel|root|hiDPIReplacement|buf|replaceCanvas|Logger|blocksDone|hueToRGB|red|INST_REGEX|fillColor|updateContext|substr|dest|rightCoord|coord|parseInt|sub|pixels|startX|startY||pos|overwrite|pointsPerStep|initializedPixelData|processFn|langToExt|except|ctor|_type|nodeName|crop|Kernel|processPlugin|newLayer|LayerDequeue|LayerFinished|cropCoordinates|endY|version|bind|uniqid|DOMUpdated|resized|layerStack|canvasQueue|putImageData|inst|instFunc|try|catch|blenders|backingStoreRatio|listener|readyState|Revert|number|of|missingValues|count|m0|m1|included|originalHeight|originalWidth|naturalWidth|hexToRGB|processKernel|finished|lastBlockN|__bind|blockPixelLength|needsHiDPISwap|04045|crossOrigin|waitForImageLoaded|imageAdjustments|eachBlock|finishedFn|job|getAttrId|plugins|pixelAtLocation|req|setContext|0031308|4166666667|whiteX|whiteY|whiteZ|008856451679|3333333333|787037037|parentNode|coordinatesToLocation|2068965517|1284185493|console|xyz|on|_fn|Single|LoadOverlay|info|blendingMode|stats|error|toBase64|hidpi|hiDPIDisabled|popContext|brightness|reloadCanvasData|instanceof|DOM|parser|applyCurrentLayer|delete|1000|initialized|parse|hermite|applyToParent|put|addEventListener|given|assignId|reverse|has|hasId|scaled|hiDPIAdjustments|ready|dataStr|DEBUG|setInitObject|extended|renderStart|node|yield|totalBlocks|onload|isImageLoaded|blockNum|render|locationToCoordinates|Block|URL|_super|renderKernel|renderBlock|__extends|me|newCanvas|or|rgbToHSV|RegExp|hsvToRGB|isRemote|swapped|rgbToXYZ|channels|setAttribute|Uint8Array|hiDPICapable|toImage|originalVisiblePixels|executeFilter|executePlugin|loadOverlay|shift|initNode|clip|noise|replaceChild|initImage|initCanvas|gamma|nowLoc|https|readFromHttp|getPixelRelative|x1|y1|x2|y2|sepia|xyzToLab|sqrt|invert|randomRange|047|108|883|domIsLoaded|colorize|release|Object|116|500|200|parseArguments|hue|cropped|luminance|contrast|log|anonymous|types|processStart|processComplete|renderFinished|blockStarted|proxyParam|binary|greyscale|chunk|setup|executeLayer|pushContext|filterFunc|domainRegex|corsEnabled|autoload|use|item|Height|mode|remoteCheck|vibrance|normal|px|remote|style|saturation|proxy|date|png|browserSave|nodeSave|loaded|Width|hasOwnProperty|useProxy|rb|python|py|perl|pl|javascript|js|proxies|caman_proxy|save|encodeURIComponent|images|loading|Cannot|replace|octet|stream|location|href|configured|Buffer||without|statSync||isFile|Creating|output|writeFile|toBuffer|Finished|writing|toDataURL|load|Attempting|Version|layerID|createImageData|setBlendingMode|domain|copyParent|credentials|listen|overlayImage|void|camanProxyUrl|indexOf|setEncoding|labToRGB|warn|rgbToLab|labToXYZ|Released|0570|locationXY|Fetching|2040|0557|0415|readFile|8758|9689|putPixelRelative|4986|getPixel|putPixel|toKey|toHex|Initializing|5372|2406|os|cpus|xyzToRGB|9505|1192|0193|0722|7152|2126|1805|default|3576|4124|initialization|ruby|Remote|hslToRGB|find|not|run|detected|rgbToHSL|Executing|using|charAt|Start|End|keys|startPixel|endPixel|constructor|Could|__super__|naturalHeight|2013|readystatechange|Rendering|blocksFinished|while|flush|extends|multiply|screen|overlay|includes|difference|addition|exclusion|softLight|lighten|darken|delegate|resetOriginalPixelData|HiDPI|01|aliasFunction|scale|114|587|299|aliasProperty|toFixed|random|defineProperty|set|analyze|webkitBackingStorePixelRatio|mozBackingStorePixelRatio|607|769|189|349|314|168|272|534|869|distance|msBackingStorePixelRatio|oBackingStorePixelRatio|backingStorePixelRatio|Function|querySelector|DOMContentLoaded|querySelectorAll|rotationAngle|rotated|revert|extend|reset|calculateLevels|split|exposure|fibers|attributes|nodeValue|isNaN|missing'.split('|'),0,{})) \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 3a89078c..85a82ba1 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -22,16 +22,19 @@ module.exports = function(config) { {pattern: 'test/ext/grey.png', watched: false, included: false} ], - // list of files to exclude exclude: [ ], + preprocessors: { + '**/*.coffee': 'coffee' + }, + // test results reporter to use // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage' - reporters: ['progress'], + reporters: ['dots'], // web server port diff --git a/package.json b/package.json index 62506b18..fd4b3d4f 100644 --- a/package.json +++ b/package.json @@ -60,11 +60,12 @@ "servedir": "*", "cli": "*", "cli-table": "*", - "karma": "~ 0.10", - "karma-mocha": "*" + "karma": "*", + "karma-mocha": "*", + "canvas": "*" }, "scripts": { - "test": "./node_modules/mocha/bin/mocha --compilers coffee:coffee-script --reporter spec --globals Caman ./test/unit/*.coffee && ./node_modules/.bin/karma start --single-run --browsers Firefox", + "test": "./node_modules/mocha/bin/mocha --compilers coffee:coffee-script/register --reporter spec --globals Caman ./test/unit/*.coffee && ./node_modules/karma/bin/karma start --single-run --browsers Firefox", "examples": "./node_modules/servedir/bin/servedir", "docs": "codo", "docs-server": "codo --server" diff --git a/src/core/calculate.coffee b/src/core/calculate.coffee index 410daf7c..62bbf30a 100644 --- a/src/core/calculate.coffee +++ b/src/core/calculate.coffee @@ -179,9 +179,10 @@ class Caman.Calculate rightCoord = [j, values[j]] break - ret[i] = leftCoord[1] + - ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * - (i - leftCoord[0]) + if rightCoord + ret[i] = leftCoord[1] + + ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * + (i - leftCoord[0]) return ret diff --git a/src/core/caman.coffee b/src/core/caman.coffee index b52dcf4c..c9691375 100644 --- a/src/core/caman.coffee +++ b/src/core/caman.coffee @@ -12,17 +12,17 @@ else Root = window # Here it begins. Caman is defined. -# There are many different initialization for Caman, which are described on the +# There are many different initialization for Caman, which are described on the # [Guides](http://camanjs.com/guides). # -# Initialization is tricky because we need to make sure everything we need is actually fully -# loaded in the DOM before proceeding. When initialized on an image, we need to make sure that the -# image is done loading before converting it to a canvas element and writing the pixel data. If we -# do this prematurely, the browser will throw a DOM Error, and chaos will ensue. In the event that -# we initialize Caman on a canvas element while specifying an image URL, we need to create a new +# Initialization is tricky because we need to make sure everything we need is actually fully +# loaded in the DOM before proceeding. When initialized on an image, we need to make sure that the +# image is done loading before converting it to a canvas element and writing the pixel data. If we +# do this prematurely, the browser will throw a DOM Error, and chaos will ensue. In the event that +# we initialize Caman on a canvas element while specifying an image URL, we need to create a new # image element, load the image, then continue with initialization. -# -# The main goal for Caman was simplicity, so all of this is handled transparently to the end-user. +# +# The main goal for Caman was simplicity, so all of this is handled transparently to the end-user. class Caman extends Module # The current version. @version: @@ -71,40 +71,40 @@ class Caman extends Module # The Caman function. While technically a constructor, it was made to be called without # the `new` keyword. Caman will figure it out. - # + # # @param [DOMObject, String] initializer The DOM selector or DOM object to initialize. # @overload Caman(initializer) # Initialize Caman without a callback. - # + # # @overload Caman(initializer, callback) # Initialize Caman with a callback. # @param [Function] callback Function to call once initialization completes. - # + # # @overload Caman(initializer, url) # Initialize Caman with a URL to an image and no callback. # @param [String] url URl to an image to draw to the canvas. - # + # # @overload Caman(initializer, url, callback) # Initialize Caman with a canvas, URL to an image, and a callback. # @param [String] url URl to an image to draw to the canvas. # @param [Function] callback Function to call once initialization completes. - # + # # @overload Caman(file) # **NodeJS**: Initialize Caman with a path to an image file and no callback. # @param [String, File] file File object or path to image to read. - # + # # @overload Caman(file, callback) # **NodeJS**: Initialize Caman with a file and a callback. # @param [String, File] file File object or path to image to read. # @param [Function] callback Function to call once initialization completes. - # + # # @return [Caman] Initialized Caman instance. constructor: -> throw "Invalid arguments" if arguments.length is 0 if @ instanceof Caman # We have to do this to avoid polluting the global scope - # because of how Coffeescript binds functions specified + # because of how Coffeescript binds functions specified # with => and the fact that Caman can be invoked as both # a function and as a 'new' object. @finishInit = @finishInit.bind(@) @@ -124,15 +124,18 @@ class Caman extends Module if !isNaN(id) and Store.has(id) return Store.execute(id, callback) - # Every instance gets a unique ID. Makes it much simpler to check if two variables are the + # Every instance gets a unique ID. Makes it much simpler to check if two variables are the # same instance. @id = Util.uniqid.get() - + @initializedPixelData = @originalPixelData = null @cropCoordinates = x: 0, y: 0 @cropped = false @resized = false + @rotated = false + @rotationAngle = 0 + @pixelStack = [] # Stores the pixel layers @layerStack = [] # Stores all of the layers waiting to be rendered @canvasQueue = [] # Stores all of the canvases to be processed @@ -142,7 +145,7 @@ class Caman extends Module @analyze = new Analyze @ @renderer = new Renderer @ - @domIsLoaded => + @domIsLoaded => @parseArguments(args) @setup() @@ -153,7 +156,7 @@ class Caman extends Module # Checks to ensure the DOM is loaded. Ensures the callback is always fired, even # if the DOM is already loaded before it's invoked. The callback is also always # called asynchronously. - # + # # @param [Function] cb The callback function to fire when the DOM is ready. domIsLoaded: (cb) -> if Caman.NodeJS @@ -190,11 +193,11 @@ class Caman extends Module # First argument is always our canvas/image @setInitObject args[0] return if args.length is 1 - + switch typeof args[1] when "string" then @imageUrl = args[1] when "function" then @callback = args[1] - + return if args.length is 2 @callback = args[2] @@ -259,6 +262,7 @@ class Caman extends Module Log.debug "Image loaded. Width = #{@imageWidth()}, Height = #{@imageHeight()}" @canvas = new Canvas @imageWidth(), @imageHeight() + @renderingCanvas = new Canvas @imageWidth(), @imageHeight() @finishInit() # Initialization function for the browser and image objects. @@ -266,22 +270,34 @@ class Caman extends Module @image = @initObj @canvas = document.createElement 'canvas' @context = @canvas.getContext '2d' + + @renderingCanvas = document.createElement 'canvas' + @renderingContext = @renderingCanvas.getContext '2d' + Util.copyAttributes @image, @canvas, except: ['src'] + Util.copyAttributes @image, @renderingCanvas, except: ['src'] - # Swap out the image with the canvas element if the image exists + # Swap out the image with the rendering canvas element if the image exists # in the DOM. - @image.parentNode.replaceChild @canvas, @image if @image.parentNode? + @image.parentNode.replaceChild @renderingCanvas, @image if @image.parentNode? @imageAdjustments() @waitForImageLoaded() # Initialization function for the browser and canvas objects. initCanvas: -> - @canvas = @initObj + @canvas = document.createElement 'canvas' @context = @canvas.getContext '2d' + @renderingCanvas = @initObj + @renderingContext = @renderingCanvas.getContext '2d' + + @canvas.width = @renderingCanvas.width + @canvas.height = @renderingCanvas.height + if @imageUrl? @image = document.createElement 'img' + @image.crossOrigin = 'anonymous' @image.src = @imageUrl @imageAdjustments() @@ -337,9 +353,13 @@ class Caman extends Module if @swapped @canvas.width = @imageWidth() / @hiDPIRatio() @canvas.height = @imageHeight() / @hiDPIRatio() + @renderingCanvas.width = @imageWidth() / @hiDPIRatio() + @renderingCanvas.height = @imageHeight() / @hiDPIRatio() else @canvas.width = @imageWidth() @canvas.height = @imageHeight() + @renderingCanvas.width = @imageWidth() + @renderingCanvas.height = @imageHeight() @finishInit() @@ -347,6 +367,7 @@ class Caman extends Module # draw the image to the canvas (if applicable). finishInit: -> @context = @canvas.getContext '2d' unless @context? + @renderingContext = @renderingCanvas.getContext '2d' unless @renderingContext? @originalWidth = @preScaledWidth = @width = @canvas.width @originalHeight = @preScaledHeight = @height = @canvas.height @@ -355,15 +376,20 @@ class Caman extends Module @assignId() unless @hasId() if @image? - @context.drawImage @image, - 0, 0, - @imageWidth(), @imageHeight(), - 0, 0, + @context.drawImage @image, + 0, 0, + @imageWidth(), @imageHeight(), + 0, 0, + @preScaledWidth, @preScaledHeight + @renderingContext.drawImage @image, + 0, 0, + @imageWidth(), @imageHeight(), + 0, 0, @preScaledWidth, @preScaledHeight - + @imageData = @context.getImageData 0, 0, @canvas.width, @canvas.height @pixelData = @imageData.data - + if Caman.allowRevert @initializedPixelData = Util.dataArray(@pixelData.length) @originalPixelData = Util.dataArray(@pixelData.length) @@ -470,13 +496,18 @@ class Caman extends Module # # @param [DOMObject] newCanvas The canvas to swap into this instance. replaceCanvas: (newCanvas) -> - oldCanvas = @canvas @canvas = newCanvas @context = @canvas.getContext '2d' + @imageData = @context.getImageData 0, 0, @canvas.width, @canvas.height + @pixelData = @imageData.data + + if Caman.allowRevert + @originalPixelData = Util.dataArray(@pixelData.length) + + for pixel, i in @pixelData + @originalPixelData[i] = pixel - oldCanvas.parentNode.replaceChild @canvas, oldCanvas if !Caman.NodeJS - @width = @canvas.width @height = @canvas.height @@ -491,10 +522,13 @@ class Caman extends Module # # @param [Function] callback Function to call when rendering is finished. render: (callback = ->) -> + Event.trigger @, "renderStart" - + @renderer.execute => - @context.putImageData @imageData, 0, 0 + @renderingCanvas.width = @canvas.width + @renderingCanvas.height = @canvas.height + @renderingContext.putImageData @imageData, 0, 0 callback.call @ # Reverts the canvas back to it's original state while @@ -506,7 +540,7 @@ class Caman extends Module throw "Revert disabled" unless Caman.allowRevert @pixelData[i] = pixel for pixel, i in @originalVisiblePixels() - @context.putImageData @imageData, 0, 0 if updateContext + @renderingContext.putImageData @imageData, 0, 0 if updateContext # Completely resets the canvas back to it's original state. # Any size adjustments will also be reset. @@ -540,43 +574,20 @@ class Caman extends Module pixels = [] - startX = @cropCoordinates.x + startX = 0 endX = startX + @width - startY = @cropCoordinates.y + startY = 0 endY = startY + @height - if @resized - canvas = document.createElement('canvas') - canvas.width = @originalWidth - canvas.height = @originalHeight - - ctx = canvas.getContext('2d') - imageData = ctx.getImageData 0, 0, canvas.width, canvas.height - pixelData = imageData.data - - pixelData[i] = pixel for pixel, i in @originalPixelData - - ctx.putImageData imageData, 0, 0 - - scaledCanvas = document.createElement('canvas') - scaledCanvas.width = @width - scaledCanvas.height = @height - - ctx = scaledCanvas.getContext('2d') - ctx.drawImage canvas, 0, 0, @originalWidth, @originalHeight, 0, 0, @width, @height - - pixelData = ctx.getImageData(0, 0, @width, @height).data - width = @width - else - pixelData = @originalPixelData - width = @originalWidth + pixelData = @originalPixelData + width = @canvas.width for i in [0...pixelData.length] by 4 coord = Pixel.locationToCoordinates(i, width) if (startX <= coord.x < endX) and (startY <= coord.y < endY) - pixels.push pixelData[i], + pixels.push pixelData[i], pixelData[i+1], - pixelData[i+2], + pixelData[i+2], pixelData[i+3] pixels diff --git a/src/core/io.coffee b/src/core/io.coffee index 512672ab..419bccfb 100644 --- a/src/core/io.coffee +++ b/src/core/io.coffee @@ -1,7 +1,7 @@ # Various I/O based operations class Caman.IO # Used for parsing image URLs for domain names. - @domainRegex: /(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/ + @domainRegex: /(?:(?:http|https):\/\/)((?:[-|\w]+)\.(?:(?:-|\w|\.)+))/ # Is the given URL remote? # If a cross-origin setting is set, we assume you have CORS @@ -18,7 +18,7 @@ class Caman.IO # @param [DOMObject] img The image to check. # @return [Boolean] @corsEnabled: (img) -> - img.crossOrigin? and img.crossOrigin.toLowerCase() in ['anonymous', 'use-credentials'] + true # Does the given URL exist on a different domain than the current one? # This is done by comparing the URL to `document.domain`. @@ -40,7 +40,7 @@ class Caman.IO if Caman.isURLRemote Caman.remoteProxy Log.info "Cannot use a remote proxy for loading images." return - + return @proxyUrl(src) # Given a URL, get the proxy URL for it. @@ -63,7 +63,7 @@ class Caman.IO lang = langToExt[lang] if langToExt[lang]? "proxies/caman_proxy.#{lang}" - # Grabs the canvas data, encodes it to Base64, then sets the browser location to + # Grabs the canvas data, encodes it to Base64, then sets the browser location to # the encoded data so that the user will be prompted to download it. # If we're in NodeJS, then we can save the image to disk. # @see Caman @@ -91,7 +91,7 @@ Caman::nodeSave = (file, overwrite = true, callback = null) -> Log.debug "Finished writing to #{file}" callback.call this, err if callback - # Takes the current canvas data, converts it to Base64, then sets it as the source + # Takes the current canvas data, converts it to Base64, then sets it as the source # of a new Image object and returns it. Caman::toImage = (type) -> img = new Image() @@ -108,6 +108,6 @@ Caman::toImage = (type) -> # Base64 encodes the current canvas Caman::toBase64 = (type = "png") -> type = type.toLowerCase() - return @canvas.toDataURL "image/#{type}" + return @renderingCanvas.toDataURL "image/#{type}" -IO = Caman.IO \ No newline at end of file +IO = Caman.IO diff --git a/src/core/renderer.coffee b/src/core/renderer.coffee index a45f70ae..a75d223e 100644 --- a/src/core/renderer.coffee +++ b/src/core/renderer.coffee @@ -109,7 +109,8 @@ class Caman.Renderer pixel.b = @c.pixelData[i+2] pixel.a = @c.pixelData[i+3] - @currentJob.processFn pixel + if @currentJob.processFn + @currentJob.processFn pixel @c.pixelData[i] = Util.clampRGB pixel.r @c.pixelData[i+1] = Util.clampRGB pixel.g @@ -129,6 +130,11 @@ class Caman.Renderer n = @c.pixelData.length adjust = @currentJob.adjust + + if !adjust + @blockFinished bnum + return + adjustSize = Math.sqrt adjust.length kernel = [] diff --git a/src/plugins b/src/plugins deleted file mode 160000 index 60696a50..00000000 --- a/src/plugins +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 60696a50de8987e0fed6e3dde52ef93d0c124fee diff --git a/src/plugins/README.md b/src/plugins/README.md new file mode 100644 index 00000000..698a0956 --- /dev/null +++ b/src/plugins/README.md @@ -0,0 +1,12 @@ +# CamanJS Plugins + +[CamanJS](https://github.com/meltingice/CamanJS) is an image manipulation library written in Javascript. This repository contains all plugins and features that are not a part of the core library. + +## Contributing + +Anyone is encouraged to contribute bug fixes or new features. The proper way to add a new feature is: + +1. Fork this repository. +2. Create a new branch for the feature/plugin you're adding. +3. Commit your changes. +4. Send a pull request! diff --git a/src/plugins/src/blur.coffee b/src/plugins/src/blur.coffee new file mode 100644 index 00000000..6aca5e0a --- /dev/null +++ b/src/plugins/src/blur.coffee @@ -0,0 +1,69 @@ +Caman.Filter.register "boxBlur", -> + @processKernel "Box Blur", [ + 1, 1, 1, + 1, 1, 1, + 1, 1, 1 + ] + +Caman.Filter.register "heavyRadialBlur", -> + @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", -> + @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", (degrees) -> + if degrees in [0, 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 in [90, 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 + ] + + @processKernel "Motion Blur", kernel + +Caman.Filter.register "sharpen", (amt = 100) -> + amt /= 100 + + @processKernel "Sharpen", [ + 0, -amt, 0, + -amt, 4 * amt + 1, -amt, + 0, -amt, 0 + ] diff --git a/src/plugins/src/camera.coffee b/src/plugins/src/camera.coffee new file mode 100644 index 00000000..925d5df1 --- /dev/null +++ b/src/plugins/src/camera.coffee @@ -0,0 +1,146 @@ +vignetteFilters = + brightness: (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) + rgba + + gamma: (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 + rgba + + colorize: (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; + rgba + +Filter.register "vignette", (size, strength = 60) -> + if typeof size is "string" and size.substr(-1) is "%" + if @dimensions.height > @dimensions.width + size = @dimensions.width * (parseInt(size.substr(0, size.length - 1), 10) / 100) + else + size = @dimensions.height * (parseInt(size.substr(0, size.length - 1), 10) / 100) + + strength /= 100 + center = [@dimensions.width / 2, @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] + + @process "vignette", (rgba) -> + loc = rgba.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 + + rgba + +Filter.register "rectangularVignette", (opts) -> + defaults = + strength: 50 + cornerRadius: 0 + method: 'brightness' + color: + r: 0 + g: 0 + b: 0 + + opts = Util.extend defaults, opts + + if not opts.size + return @ + else if typeof opts.size is "string" + percent = parseInt(opts.size, 10) / 100 + opts.size = + width: @dimensions.width * percent + height: @dimensions.height * percent + else if typeof opts.size is "object" + for dim in ["width", "height"] + if typeof opts.size[dim] is "string" + opts.size[dim] = @dimensions[dim] * (parseInt(opts.size[dim], 10) / 100) + else if opts.size is "number" + size = opts.size + opts.size = + width: size + height: size + + if typeof opts.cornerRadius is "string" + opts.cornerRadius = (opts.size.width / 2) * (parseInt(opts.cornerRadius, 10) / 100) + + opts.strength /= 100 + + # Since pixels are discreet, force size to be an int + opts.size.width = Math.floor opts.size.width + opts.size.height = Math.floor opts.size.height + opts.image = + width: @dimensions.width + height: @dimensions.height + + if opts.method is "colorize" and typeof opts.color is "string" + opts.color = Convert.hexToRGB opts.color + + opts.coords = + left: (@dimensions.width - opts.size.width) / 2 + right: @dimensions.width - opts.coords.left + bottom: (@dimensions.height - opts.size.height) / 2 + top: @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 + + @process "rectangularVignette", (rgba) -> + loc = rgba.locationXY() + + # Trivial rejects + if (loc.x > opts.corners[0].x and loc.x < opts.corners[1].x) and (loc.y > opts.coords.bottom and 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 + + # Need to figure out which section we're in. First, the easy ones, then the harder ones. + if loc.x > opts.corners[0].x && loc.x < opts.corners[1].x && loc.y > opts.coords.top + # top-middle section + 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 + # right-middle section + 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 + # bottom-middle section + 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 + # left-middle section + amt = (opts.coords.left - loc.x) / opts.maxDist + else if loc.x <= opts.corners[0].x && loc.y >= opts.corners[0].y + # top-left corner + 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 + # top-right corner + 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 + # bottom-right corner + 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 + # bottom-left corner + radialDist = Caman.distance(loc.x, loc.y, opts.corners[3].x, opts.corners[3].y) + amt = (radialDist - opts.cornerRadius) / opts.maxDist + + return rgba if amt < 0 + return vignetteFilters[opts.method](rgba, amt, opts) + \ No newline at end of file diff --git a/src/plugins/src/compoundBlur.coffee b/src/plugins/src/compoundBlur.coffee new file mode 100644 index 00000000..c1e65ca5 --- /dev/null +++ b/src/plugins/src/compoundBlur.coffee @@ -0,0 +1,348 @@ +### +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. +### + +# Wrapping this in a closure since there's a bunch of extra functions this plugin requires +# and we don't want them clogging up the global scope. +do -> + 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 = (width, height, centerX, centerY, angle, length, mirrored) -> + cnv = if exports? then new Canvas() else 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 not 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 = (width, height, centerX, centerY, radius1, radius2) -> + cnv = if exports? then new Canvas() else 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 = -> + @r = 0 + @g = 0 + @b = 0 + @a = 0 + @next = null + + Caman.Plugin.register "compoundBlur", (radiusData, radius, increaseFactor, blurLevels) -> + width = @dimensions.width + height = @dimensions.height + + imagePixels = @pixelData + radiusPixels = radiusData.data + + wh = width * height + wh4 = wh << 2 + pixels = [] + + pixels[i] = imagePixels[i] for i in [0...wh4] + + currentIndex = 0 + steps = blurLevels + blurLevels -= 1 + + while steps-- >= 0 + iradius = (radius + 0.5) | 0 + continue if iradius is 0 + iradius = 256 if 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 = undefined + stack = stackStart + + for i in [1...div] + stack = stack.next = new BlurStack() + stackEnd = stack if i is radiusPlus1 + + stack.next = stackStart + stackIn = null + stackOut = null + + yw = yi = 0 + + mul_sum = mul_table[iradius] + shg_sum = shg_table[iradius] + + for y in [0...height] + 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 in [0...radiusPlus1] + stack.r = pr + stack.g = pg + stack.b = pb + stack = stack.next + + for i in [1...radiusPlus1] + p = yi + ((if widthMinus1 < i then widthMinus1 else 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 in [0...width] + 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 + (if (p = x + radiusPlus1) < widthMinus1 then p else 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 in [0...width] + 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 in [0...radiusPlus1] + stack.r = pr + stack.g = pg + stack.b = pb + stack = stack.next + + yp = width + + for i in [1...radiusPlus1] + 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 + yp += width if i < heightMinus1 + + yi = x + stackIn = stackStart + stackOut = stackEnd + + for y in [0...height] + 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 + ((if (p = y + radiusPlus1) < heightMinus1 then p else 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 is 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 is currentIndex + 1 + imagePixels[idx] = pixels[idx] + imagePixels[idx + 1] = pixels[idx + 1] + imagePixels[idx + 2] = pixels[idx + 2] + currentIndex++ + + return @ + + Caman.Filter.register "tiltShift", (opts) -> + defaults = + center: + x: @dimensions.width / 2 + y: @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(@dimensions.width, @dimensions.height, opts.center.x, opts.center.y, opts.angle, opts.focusWidth, true) + + @processPlugin "compoundBlur", [gradient, opts.startRadius, opts.radiusFactor, opts.steps] + + Caman.Filter.register "radialBlur", (opts) -> + defaults = + size: 50 + center: + x: @dimensions.width / 2 + y: @dimensions.height / 2 + startRadius: 3 + radiusFactor: 1.5 + steps: 3 + radius: null + + opts = Util.extend defaults, opts + + if not opts.radius + opts.radius = if @dimensions.width < @dimensions.height then @dimensions.height else @dimensions.width + + radius1 = (opts.radius / 2) - opts.size + radius2 = (opts.radius / 2) + + gradient = getRadialGradientMap(@dimensions.width, @dimensions.height, opts.center.x, opts.center.y, radius1, radius2) + + @processPlugin "compoundBlur", [gradient, opts.startRadius, opts.radiusFactor, opts.steps] + \ No newline at end of file diff --git a/src/plugins/src/edges.coffee b/src/plugins/src/edges.coffee new file mode 100644 index 00000000..b7554944 --- /dev/null +++ b/src/plugins/src/edges.coffee @@ -0,0 +1,20 @@ +Caman.Filter.register "edgeEnhance", -> + @processKernel "Edge Enhance", [ + 0, 0, 0, + -1, 1, 0, + 0, 0, 0 + ] + +Caman.Filter.register "edgeDetect", -> + @processKernel "Edge Detect", [ + -1, -1, -1, + -1, 8, -1, + -1, -1, -1 + ] + +Caman.Filter.register "emboss", -> + @processKernel "Emboss", [ + -2, -1, 0, + -1, 1, 1, + 0, 1, 2 + ] \ No newline at end of file diff --git a/src/plugins/src/posterize.coffee b/src/plugins/src/posterize.coffee new file mode 100644 index 00000000..08209eae --- /dev/null +++ b/src/plugins/src/posterize.coffee @@ -0,0 +1,9 @@ +Caman.Filter.register "posterize", (adjust) -> + numOfAreas = 256 / adjust + numOfValues = 255 / (adjust - 1) + + @process "posterize", (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 + rgba \ No newline at end of file diff --git a/src/plugins/src/presets.coffee b/src/plugins/src/presets.coffee new file mode 100644 index 00000000..3bed8804 --- /dev/null +++ b/src/plugins/src/presets.coffee @@ -0,0 +1,256 @@ +Caman.Filter.register "vintage", (vignette = true) -> + @greyscale() + @contrast 5 + @noise 3 + @sepia 100 + @channels red: 8, blue: 2, green: 4 + @gamma 0.87 + + @vignette("40%", 30) if vignette + +Caman.Filter.register "lomo", (vignette = true) -> + @brightness 15 + @exposure 15 + @curves 'rgb', [0, 0], [200, 0], [155, 255], [255, 255] + @saturation -20 + @gamma 1.8 + @vignette("50%", 60) if vignette + @brightness 5 + +Caman.Filter.register "clarity", (grey = false) -> + @vibrance 20 + @curves 'rgb', [5, 0], [130, 150], [190, 220], [250, 255] + @sharpen 15 + @vignette "45%", 20 + + if grey + @greyscale() + @contrast 4 + + @ + +Caman.Filter.register "sinCity", -> + @contrast 100 + @brightness 15 + @exposure 10 + @posterize 80 + @clip 30 + @greyscale() + +Caman.Filter.register "sunrise", -> + @exposure 3.5 + @saturation -5 + @vibrance 50 + @sepia 60 + @colorize "#e87b22", 10 + @channels red: 8, blue: 8 + @contrast 5 + @gamma 1.2 + @vignette "55%", 25 + +Caman.Filter.register "crossProcess", -> + @exposure 5 + @colorize "#e87b22", 4 + @sepia 20 + @channels blue: 8, red: 3 + @curves 'b', [0, 0], [100, 150], [180, 180], [255, 255] + @contrast 15 + @vibrance 75 + @gamma 1.6 + +Caman.Filter.register "orangePeel", -> + @curves 'rgb', [0, 0], [100, 50], [140, 200], [255, 255] + @vibrance -30 + @saturation -30 + @colorize '#ff9000', 30 + @contrast -5 + @gamma 1.4 + +Caman.Filter.register "love", -> + @brightness 5 + @exposure 8 + @contrast 4 + @colorize '#c42007', 30 + @vibrance 50 + @gamma 1.3 + +Caman.Filter.register "grungy", -> + @gamma 1.5 + @clip 25 + @saturation -60 + @contrast 5 + @noise 5 + @vignette "50%", 30 + +Caman.Filter.register "jarques", -> + @saturation -35 + @curves 'b', [20, 0], [90, 120], [186, 144], [255, 230] + @curves 'r', [0, 0], [144, 90], [138, 120], [255, 255] + @curves 'g', [10, 0], [115, 105], [148, 100], [255, 248] + @curves 'rgb', [0, 0], [120, 100], [128, 140], [255, 255] + @sharpen 20 + +Caman.Filter.register "pinhole", -> + @greyscale() + @sepia 10 + @exposure 10 + @contrast 15 + @vignette "60%", 35 + +Caman.Filter.register "oldBoot", -> + @saturation -20 + @vibrance -50 + @gamma 1.1 + @sepia 30 + @channels red: -10, blue: 5 + @curves 'rgb', [0, 0], [80, 50], [128, 230], [255, 255] + @vignette "60%", 30 + +Caman.Filter.register "glowingSun", (vignette = true) -> + @brightness 10 + + @newLayer -> + @setBlendingMode "multiply" + @opacity 80 + @copyParent() + + @filter.gamma 0.8 + @filter.contrast 50 + @filter.exposure 10 + + @newLayer -> + @setBlendingMode "softLight" + @opacity 80 + @fillColor "#f49600" + + @exposure 20 + @gamma 0.8 + @vignette "45%", 20 if vignette + +Caman.Filter.register "hazyDays", -> + @gamma 1.2 + + @newLayer -> + @setBlendingMode "overlay" + @opacity 60 + @copyParent() + + @filter.channels red: 5 + @filter.stackBlur 15 + + @newLayer -> + @setBlendingMode "addition" + @opacity 40 + @fillColor "#6899ba" + + @newLayer -> + @setBlendingMode "multiply" + @opacity 35 + @copyParent() + + @filter.brightness 40 + @filter.vibrance 40 + @filter.exposure 30 + @filter.contrast 15 + + @filter.curves 'r', [0, 40], [128, 128], [128, 128], [255, 215] + @filter.curves 'g', [0, 40], [128, 128], [128, 128], [255, 215] + @filter.curves 'b', [0, 40], [128, 128], [128, 128], [255, 215] + + @filter.stackBlur 5 + + @curves 'r', [20, 0], [128, 158], [128, 128], [235, 255] + @curves 'g', [20, 0], [128, 128], [128, 128], [235, 255] + @curves 'b', [20, 0], [128, 108], [128, 128], [235, 255] + + @vignette "45%", 20 + +Caman.Filter.register "herMajesty", -> + @brightness 40 + @colorize "#ea1c5d", 10 + @curves 'b', [0, 10], [128, 180], [190, 190], [255, 255] + + @newLayer -> + @setBlendingMode 'overlay' + @opacity 50 + @copyParent() + + @filter.gamma 0.7 + @newLayer -> + @setBlendingMode 'normal' + @opacity 60 + @fillColor '#ea1c5d' + + @newLayer -> + @setBlendingMode 'multiply' + @opacity 60 + @copyParent() + + @filter.saturation 50 + @filter.hue 90 + @filter.contrast 10 + + @gamma 1.4 + @vibrance -30 + + @newLayer -> + @opacity 10 + @fillColor '#e5f0ff' + + @ + +Caman.Filter.register "nostalgia", -> + @saturation 20 + @gamma 1.4 + @greyscale() + @contrast 5 + @sepia 100 + @channels red: 8, blue: 2, green: 4 + @gamma 0.8 + @contrast 5 + @exposure 10 + + @newLayer -> + @setBlendingMode 'overlay' + @copyParent() + @opacity 55 + + @filter.stackBlur 10 + + @vignette "50%", 30 + +Caman.Filter.register "hemingway", -> + @greyscale() + @contrast 10 + @gamma 0.9 + + @newLayer -> + @setBlendingMode "multiply" + @opacity 40 + @copyParent() + + @filter.exposure 15 + @filter.contrast 15 + @filter.channels green: 10, red: 5 + + @sepia 30 + @curves 'rgb', [0, 10], [120, 90], [180, 200], [235, 255] + @channels red: 5, green: -2 + @exposure 15 + +Caman.Filter.register "concentrate", -> + @sharpen 40 + @saturation -50 + @channels red: 3 + + @newLayer -> + @setBlendingMode "multiply" + @opacity 80 + @copyParent() + + @filter.sharpen 5 + @filter.contrast 50 + @filter.exposure 10 + @filter.channels blue: 5 + + @brightness 10 \ No newline at end of file diff --git a/src/plugins/src/rotate.coffee b/src/plugins/src/rotate.coffee new file mode 100644 index 00000000..e394b8ba --- /dev/null +++ b/src/plugins/src/rotate.coffee @@ -0,0 +1,46 @@ +Caman.Plugin.register "rotate", (degrees) -> + angle = degrees%360 + if angle == 0 + return @dimensions = + width: @canvas.width + height: @canvas.height + to_radians = Math.PI/180; + + if exports? + canvas = new Canvas() + else + canvas = document.createElement 'canvas' + Util.copyAttributes @canvas, canvas + + if angle == 90 or angle == -270 or angle == 270 or angle == -90 + width = @canvas.height + height = @canvas.width + x = width/2 + y = height/2 + else if angle == 180 + width = @canvas.width + height = @canvas.height + x = width/2 + y = height/2 + else + width = Math.sqrt(Math.pow(@originalWidth, 2) + Math.pow(@originalHeight, 2)) + height = width + x = @canvas.height/2 + y = @canvas.width/2 + + canvas.width = width + canvas.height = height + ctx = canvas.getContext '2d' + ctx.save() + ctx.translate x, y + ctx.rotate angle*to_radians + ctx.drawImage @canvas, -@canvas.width/2, -@canvas.height/2, @canvas.width, @canvas.height + ctx.restore() + + @rotationAngle += degrees + @rotated = true + + @replaceCanvas canvas + +Caman.Filter.register "rotate", -> + @processPlugin "rotate", Array.prototype.slice.call(arguments, 0) diff --git a/src/plugins/src/stackBlur.coffee b/src/plugins/src/stackBlur.coffee new file mode 100644 index 00000000..3aeb0566 --- /dev/null +++ b/src/plugins/src/stackBlur.coffee @@ -0,0 +1,238 @@ +### +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. +### + +do -> + + 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 = -> + @r = 0 + @g = 0 + @b = 0 + @a = 0 + @next = null + + Caman.Plugin.register "stackBlur", (radius) -> + return if isNaN(radius) or radius < 1 + radius |= 0 + + pixels = @pixelData + width = @dimensions.width + height = @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 in [1...div] + stack = stack.next = new BlurStack() + stackEnd = stack if i is radiusPlus1 + + stack.next = stackStart + stackIn = null + stackOut = null + + yw = yi = 0 + + mul_sum = mul_table[radius] + shg_sum = shg_table[radius] + + for y in [0...height] + 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 in [0...radiusPlus1] + stack.r = pr + stack.g = pg + stack.b = pb + stack = stack.next + + for i in [1...radiusPlus1] + p = yi + ((if widthMinus1 < i then widthMinus1 else 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 in [0...width] + 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 + (if (p = x + radius + 1) < widthMinus1 then p else 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 in [0...width] + 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 in [0...radiusPlus1] + stack.r = pr + stack.g = pg + stack.b = pb + stack = stack.next + + yp = width + + for i in [1..radius] + 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 + + yp += width if i < heightMinus1 + + yi = x + stackIn = stackStart + stackOut = stackEnd + + for y in [0...height] + 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 + ((if (p = y + radiusPlus1) < heightMinus1 then p else 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 + + + @ + + Caman.Filter.register "stackBlur", (radius) -> + @processPlugin "stackBlur", [radius] \ No newline at end of file diff --git a/src/plugins/src/threshold.coffee b/src/plugins/src/threshold.coffee new file mode 100644 index 00000000..37d27875 --- /dev/null +++ b/src/plugins/src/threshold.coffee @@ -0,0 +1,14 @@ +Caman.Filter.register "threshold", (adjust) -> + @process "threshold", (rgba) -> + 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 + + rgba \ No newline at end of file diff --git a/test/unit/initialization.coffee b/test/unit/initialization.coffee index d72b608a..ccc4be45 100644 --- a/test/unit/initialization.coffee +++ b/test/unit/initialization.coffee @@ -51,7 +51,7 @@ describe "Initialization", -> canvas.width = 1 canvas.height = 1 - Caman canvas, -> + Caman canvas, -> assert.equal @width, 1 assert.equal @height, 1 done()