{"version":3,"sources":["bgfill.js","colorAvgFromFirstRow.js","colorDiffFromFirstRow.js","crop.js","facetrackWithFlood.js","grayscale.js","greenbox.js","invert.js","mapTone.js","noFilter.js","tracer.js","transform.js","userclick.js"],"names":["FC","cloneImageData","imgData","cnvs","width","height","getContext","putImageData","getImageData","utils","registerFilter","originalImgData","cb","config","iter","x","parseInt","point","y","c","colorUtils","getColor","modImgData","alpha","floodFill","Color","matcherFn","colorFn","ctx","dump","rect","fillStyle","fill","pointArray","length","shift","window","requestAnimationFrame","colorArray","maxDiff","hslDiff","adaptive","document","createElement","push","points","concat","forEach","p","currentColor","startColor","fillColor","lastColor","filter","similarHsl","h","s","l","similarRgb","iData","cx","cy","red","green","blue","diffRgb","modColor","Math","min","setColor","FakeCation","i","diff","refColor","color","data","cols","refColors","console","log","average","diffHsl","j","tmpBottom","tmpSide","offset","top","Infinity","left","bottom","right","canvas","findBottom","findClickPoints","pt_left","pt_right","pt_bottom","bounds","v_c","r","m","r1","r2","center","d1","distance","d2","bx","by","a","b","n","pts","step","PI","theta","cos","sin","getNoseColors","facePoints","imageData","tx","ty","t","max","result","dumpCtx","time","faceDetect","then","face","timeEnd","faceFeatureDetect","userclickFilter","getFilter","tracer","referenceColors","getColors","faceColors","slice","avgFaceColor","avgReferenceColors","abs","toHsl","idata","beginPath","moveTo","lineTo","closePath","strokeStyle","stroke","tracedData","iteration","references","referencepoints","stops","rgbDiff","reject","gsData","tracking","Image","grayscale","ImageData","invert","borders","tmpCanvas","tmpCtx","bgHistBorders","setTimeout","bgImage","drawImage","histogramBorders","transformHistogram","MooreNeighbour","start_point","clockwise_next","d","positions","next_cell","cell","old_cell","dx","dy","this","next","inside","contour","image_data","match_color","pixel_pos","components","poly","lower_y","dummyForLint","moore","undefined","createMask","w","greenboxOnPixels","checkSimilarFace","checkSimilarStop","isStopColor","stopColors","counter","isSimilarToRefcolors","some","blank","drawPoly","mask","removePoly","traceEdge","maskData","cColor","sColor","fColor","same","blendEdge","currentIteration","blend","Uint8ClampedArray","DEBUG_CANVAS","currentRun","removedPixels","scale","rotate","translate","tmpCanvasCtx","tmp2Canvas","tmp2CanvasCtx"],"mappings":"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","file":"filters.js","sourcesContent":["/*global FakeCation, document */\n(function (FC) {\n \"use strict\";\n\n function cloneImageData(imgData, cnvs) {\n\n cnvs.width = imgData.width;\n cnvs.height = imgData.height;\n cnvs.getContext('2d').putImageData(imgData, 0, 0);\n return cnvs.getContext('2d').getImageData(0, 0, cnvs.width, cnvs.height);\n }\n\n FC.utils.registerFilter('bgfill', function (originalImgData, cb, config) {\n var cnvs,\n modImgData,\n imgData,\n pointArray = [],\n colorArray = [],\n maxDiff = config && config.maxDiff || 40,\n hslDiff = config.hslDiff,\n adaptive = config.adaptive;\n\n cnvs = document.createElement('canvas');\n modImgData = cloneImageData(originalImgData, cnvs);\n\n if (config && config.x && config.y) {\n pointArray.push([config.x, config.y]);\n } else if (config && config.points) {\n pointArray = pointArray.concat(config.points);\n } else {\n pointArray.push([100, 100]);\n }\n\n pointArray.forEach(function (p) {\n colorArray.push(FC.colorUtils.getColor(originalImgData, p[0]|0, p[1]|0));\n });\n\n var matcherFn = function (currentColor, startColor, fillColor, lastColor) {\n if (hslDiff) {\n return colorArray.filter(function (c) {\n return c.similarHsl(currentColor, hslDiff.h, hslDiff.s, hslDiff.l) && currentColor.alpha > 0;\n }).length;\n }\n\n return colorArray.filter(function (c) {\n return c.similarRgb(currentColor, maxDiff) && currentColor.alpha > 0;\n\n }).length || adaptive && lastColor && currentColor.similarRgb(lastColor, adaptive);\n };\n var colorFn = function (currentColor, startColor, fillColor, lastColor, iData, cx, cy) {\n var c = new FC.colorUtils.Color(currentColor.red, currentColor.green, currentColor.blue),\n alpha = c.diffRgb(startColor) / maxDiff,\n modColor = FC.colorUtils.getColor(modImgData, cx, cy);\n\n c.alpha = Math.min(1, alpha, modColor.alpha, 0);\n fillColor.green = parseInt(c.alpha * 255, 10);\n\n FC.colorUtils.setColor(imgData, cx, cy, fillColor);\n FC.colorUtils.setColor(modImgData, cx, cy, c);\n };\n\n var point = pointArray.shift();\n\n function iter() {\n var x = parseInt(point[0], 10),\n y = parseInt(point[1], 10),\n c = FC.colorUtils.getColor(modImgData, x, y);\n\n if (c.alpha > .1) {\n imgData = cloneImageData(originalImgData, cnvs);\n\n FC.colorUtils.floodFill(imgData, x, y, new FC.colorUtils.Color(255, 0, 0, 1), matcherFn, colorFn);\n\n {\n let ctx = FC.utils.dump(imgData);\n ctx.putImageData(imgData, 0, 0);\n ctx.rect(x - 5, y - 5, 10, 10);\n ctx.fillStyle = 'green';\n ctx.fill();\n }\n }\n\n if (pointArray.length) {\n point = pointArray.shift();\n window.requestAnimationFrame(iter);\n } else {\n cb(modImgData);\n }\n }\n\n window.requestAnimationFrame(iter);\n\n });\n}(FakeCation));\n","/*global FakeCation*/\n(function (FC) {\n\"use strict\";\n\n FC.utils.registerFilter('colorAvgFromFirstRow', function (imgData, cb) {\n var i, diff, data = imgData.data, refColor, color;\n var width = imgData.width,\n cols = 0,\n refColors = [];\n\n // get color average from first row of the picture\n for(cols; cols < width*4; cols += 4){\n refColors.push(new FC.colorUtils.Color(data[cols], data[cols+1], data[cols+2]));\n }\n console.log(refColors);\n console.log(FC.colorUtils.Color.average(refColors));\n\n // refColor = FC.colorUtils.getColor(imgData, 100, 100);\n refColor = FC.colorUtils.Color.average(refColors);\n console.log(imgData);\n console.log(refColor);\n\n for (i = 0; i < data.length; i += 4) {\n color = new FC.colorUtils.Color(data[i], data[i+1], data[i+2]);\n diff = refColor.diffHsl(color);\n\n data[i+3] = diff < 2 ? 0 : 255;\n }\n\n cb(imgData);\n });\n}(FakeCation));\n","/*global FakeCation*/\n(function (FC) {\n\"use strict\";\n\n FC.utils.registerFilter('colorDiffFromFirstRow', function (imgData, cb) {\n var i, diff, data = imgData.data, color;\n var width = imgData.width,\n cols = 0,\n refColors = [];\n\n // get colors from first row of the picture\n for(cols; cols < width*4; cols += 4){\n refColors.push(new FC.colorUtils.Color(data[cols], data[cols+1], data[cols+2]));\n }\n console.log(refColors);\n\n for (i = 0; i < data.length; i += 4) {\n color = new FC.colorUtils.Color(data[i], data[i+1], data[i+2]);\n\n for(var j = 0; j < refColors.length; j++){\n diff = refColors[j].diffRgb(color);\n if(diff < 2){\n data[i+3] = 0;\n break;\n }\n }\n }\n\n cb(imgData);\n });\n}(FakeCation));\n","/*global FakeCation*/\n(function (FC) {\n \"use strict\";\n\n FC.utils.registerFilter('crop', function (imgData, cb, config) {\n var width = imgData.width,\n height = imgData.height,\n x, y,\n top = Infinity,\n left = Infinity,\n bottom = 0,\n right = 0,\n tmpBottom,\n tmpSide,\n offset,\n data = imgData.data,\n ctx = document.createElement('canvas').getContext('2d');\n\n ctx.canvas.width = imgData.width;\n ctx.canvas.height = imgData.height;\n ctx.putImageData(imgData, 0, 0);\n\n for (y = 0; y < height; y++) {\n for (x = 0; x < width; x++) {\n offset = (y * width + x) * 4;\n if (data[offset + 3] > 0) {\n if (y < top) {\n top = y;\n }\n if (y > bottom) {\n bottom = y;\n }\n\n if (x < left) {\n left = x;\n }\n\n if (x > right) {\n right = x;\n }\n }\n }\n }\n\n if (config && config.findBottom) {\n\n tmpSide = right;\n if (config.findBottom === 'left') {\n tmpSide = left;\n }\n\n tmpBottom = bottom;\n for (y = bottom; y > top && y > 4; y--) {\n offset = (y * width + tmpSide) * 4;\n\n if (data[offset + 3] > 0 && data[offset - width*4 + 3] === 0 && data[offset - 2 * width*4 + 3] === 0) {\n tmpBottom = y;\n }\n }\n\n if (!(tmpBottom <= 4) && !(tmpBottom === top)) {\n bottom = tmpBottom;\n }\n }\n\n cb(ctx.getImageData(left, top, right - left, bottom - top));\n\n });\n}(FakeCation));\n","/*global document, FakeCation*/\n(function (FC) {\n \"use strict\";\n\n function findClickPoints(width, height, pt_left, pt_right, pt_bottom) {\n var center = [(pt_right[0] + pt_left[0]) / 2, (pt_right[1] + pt_left[1]) / 2];\n\n var d1 = FC.utils.distance(pt_left, pt_right);\n var d2 = FC.utils.distance(center, pt_bottom);\n\n function bounds(v_c, r, m) {\n var r1 = 0.4 * v_c + 0.4 * r;\n var r2 = 0.4 * (m - v_c) + 0.4 * r;\n return [r1, r2];\n }\n\n var bx = bounds(center[0], d1, width);\n d1 = Math.min(d1, bx[0]);\n d1 = Math.min(d1, bx[1]);\n\n var by = bounds(center[1], d2, height);\n d2 = Math.min(d2, by[0]);\n d2 = Math.min(d2, by[1]);\n\n // calculate the points of upper half ellipse\n var points = (function (c, a, b, n) {\n var pts = [];\n\n var step = Math.PI / n;\n\n var theta = Math.PI;\n\n var x, y;\n\n while (theta < 2 * Math.PI) {\n x = c[0] + a * Math.cos(theta);\n y = c[1] + b * Math.sin(theta);\n pts.push([x, y]);\n\n theta += step;\n }\n\n return pts;\n })(center, d1, d2 * 2, 20)\n .filter(function (p) {\n return p[0] >= 0 && p[0] < width && p[1] >= 0 && p[1] < height;\n });\n\n return points;\n }\n\n function getNoseColors(facePoints, imageData) {\n var tx = facePoints[33][0],\n ty = facePoints[33][1],\n bx = facePoints[62][0],\n by = facePoints[62][1],\n t = ty,\n r = Math.max(tx, bx),\n b = by,\n l = Math.min(tx, bx),\n x, y,\n result = [];\n\n for (x = l; x < r; x++) {\n for (y = t; y < b; y++) {\n result.push(FC.colorUtils.getColor(imageData, x, y));\n }\n }\n return result;\n }\n\n FC.utils.registerFilter('facetrackWithFlood', function (imgData, cb, config) {\n var canvas = document.createElement('canvas'),\n ctx = canvas.getContext(\"2d\"),\n face;\n\n canvas.width = imgData.width;\n canvas.height = imgData.height;\n ctx.putImageData(imgData, 0, 0);\n\n var dumpCtx = FC.utils.dump(imgData);\n console.time('facetrack');\n FC.faceDetect(canvas).then(function (face) {\n console.timeEnd('facetrack');\n\n dumpCtx.rect(face[0], face[1], face[2], face[3]);\n console.log(face);\n return FC.faceFeatureDetect(canvas, face);\n }).then(function (facePoints) {\n var points = findClickPoints(canvas.width, canvas.height,\n facePoints[1], facePoints[13], facePoints[7]),\n userclickFilter = FC.utils.getFilter('userclick'),\n tracer = FC.utils.getFilter('traceCountours'),\n noseColors = getNoseColors(facePoints, imgData),\n referenceColors = FC.colorUtils.getColors(imgData, points);\n\n var faceColors = FC.colorUtils.getColors(imgData, facePoints.slice(0, 70));\n var avgFaceColor = FC.colorUtils.Color.average(faceColors);\n var avgReferenceColors = FC.colorUtils.Color.average(referenceColors);\n var hslDiff = {\n h: Math.abs(avgReferenceColors.toHsl()[0] - avgFaceColor.toHsl()[0]) * 0.4,\n s: Math.abs(avgReferenceColors.toHsl()[1] - avgFaceColor.toHsl()[1]) * 0.4,\n l: Math.abs(avgReferenceColors.toHsl()[2] - avgFaceColor.toHsl()[2]) * 0.4\n };\n\n console.log(avgFaceColor.toHsl(), avgReferenceColors.toHsl());\n\n userclickFilter(ctx.getImageData(0, 0, canvas.width, canvas.height), function (idata) {\n ctx.putImageData(idata, 0, 0);\n ctx.beginPath();\n ctx.moveTo(facePoints[0][0], facePoints[0][1]);\n facePoints.slice(1, 15).concat(facePoints.slice(-2)).forEach(function (point) {\n ctx.lineTo(point[0], point[1]);\n });\n ctx.closePath();\n\n ctx.strokeStyle = 'pink';\n ctx.stroke();\n\n tracer(idata, function (tracedData) {\n cb(tracedData);\n }, {\n\n cx: facePoints[37][0],\n cy: facePoints[37][1],\n iteration: 100,\n references: referenceColors,\n referencepoints: points,\n stops: faceColors,\n hslDiff: hslDiff,\n rgbDiff: 60\n });\n }, {\n maxDiff: 60,\n points: points\n });\n }).catch(function () {\n config.reject();\n });\n });\n}(FakeCation));\n","/*global tracking, FakeCation*/\n(function (FC) {\n \"use strict\";\n\n FC.utils.registerFilter('grayscale', function (imgData, cb) {\n var gsData = tracking.Image.grayscale(imgData.data, imgData.width, imgData.height, true);\n\n cb(new window.ImageData(gsData, imgData.width, imgData.height));\n });\n}(FakeCation));\n","/*global FakeCation*/\n(function (FC) {\n \"use strict\";\n\n FC.utils.registerFilter('greenbox', function (imgData, cb) {\n var i, diff, data = imgData.data,\n refColor, color;\n\n refColor = FC.colorUtils.getColor(imgData, 100, 100);\n console.log(refColor);\n\n for (i = 0; i < data.length; i += 4) {\n color = new FC.colorUtils.Color(data[i], data[i + 1], data[i + 2]);\n diff = refColor.diffHsl(color);\n\n data[i + 3] = diff < 2 ? 255 / 2 * diff | 0 : 255;\n }\n\n cb(imgData);\n });\n\n\n}(FakeCation));\n","/*global FakeCation*/\n(function (FC) {\n\"use strict\";\n\n FC.utils.registerFilter('invert', function (imgData, cb) {\n var i, data = imgData.data, color;\n\n for (i = 0; i < data.length; i += 4) {\n color = new FC.colorUtils.Color(data[i], data[i+1], data[i+2]);\n color = color.invert();\n\n data[i] = color.red;\n data[i+1] = color.green;\n data[i+2] = color.blue;\n }\n\n cb(imgData);\n });\n}(FakeCation));\n","/*global FakeCation*/\n(function (FC) {\n \"use strict\";\n\n FC.utils.registerFilter('mapTone', function (imgData, cb, config) {\n var borders,\n bgHistBorders = {\n red: {\n min: 3,\n max: 252\n },\n green: {\n min: 3,\n max: 252\n },\n blue: {\n min: 3,\n max: 252\n }\n },\n tmpCanvas, tmpCtx;\n\n setTimeout(function () {\n if (config && config.bgImage) {\n tmpCanvas = document.createElement('canvas');\n tmpCanvas.width = config.bgImage.width;\n tmpCanvas.height = config.bgImage.height;\n tmpCtx = tmpCanvas.getContext('2d');\n\n tmpCtx.drawImage(config.bgImage, 0, 0);\n\n bgHistBorders = FC.colorUtils.histogramBorders(tmpCtx.getImageData(0, 0, tmpCanvas.width, tmpCanvas.height));\n }\n\n borders = FC.colorUtils.histogramBorders(imgData);\n\n // map red and blue completely and green only partially\n bgHistBorders.green = {\n min: (borders.green.min + bgHistBorders.green.min) / 2,\n max: (borders.green.max + bgHistBorders.green.max) / 2\n };\n imgData = FC.colorUtils.transformHistogram(imgData, borders, bgHistBorders);\n\n cb(imgData);\n\n }, 40);\n\n });\n\n}(FakeCation));\n","/*global FakeCation*/\n(function (FC) {\n \"use strict\";\n\n FC.utils.registerFilter('noFilter', function (imgData, cb) {\n cb(imgData);\n });\n}(FakeCation));\n","/*global document, FakeCation*/\n(function (FC) {\n \"use strict\";\n\n var blank = new FakeCation.colorUtils.Color(255, 0, 0, 0);\n\n // moore neightbour algorithm\n // usage:\n // var m = new MooreNeighbour([1, 3]);\n // var pos = m.next(function(x, y) {\n // return point_inside_contouned_area();\n // });\n // pos => [2, 3]\n function MooreNeighbour(start_point) {\n //clockwise order\n var positions = [\n [0, 1],\n [-1, 1],\n [-1, 0],\n [-1, -1],\n [0, -1],\n [1, -1],\n [1, 0],\n [1, 1]\n ];\n\n var x = start_point[0];\n var y = start_point[1];\n var old_cell = [x, y + 1];\n\n // based on diff return the next position clockwise\n function clockwise_next(diff) {\n for (var i = 0; i < 8; ++i) {\n var d = positions[i];\n if (d[0] === diff[0] && d[1] === diff[1]) {\n return positions[(i + 1) % 8];\n }\n }\n }\n\n // with current cell and old_cell return new cell to test\n function next_cell(cell, old_cell) {\n var dx = cell[0] - old_cell[0];\n var dy = cell[1] - old_cell[1];\n var i = clockwise_next([-dx, -dy]);\n return [cell[0] + i[0], cell[1] + i[1]];\n }\n\n // return next contour cell, undefined if no new cell\n this.next = function (inside) {\n var c = 8; // max 8 positions to test\n while (c--) {\n var n = next_cell([x, y], old_cell);\n if (inside(n[0], n[1])) {\n //console.log(\"curr\", [x, y], \"to\", n, \"old\", old_cell);\n x = n[0];\n y = n[1];\n return [x, y];\n }\n old_cell = n;\n }\n };\n }\n\n /**\n this function finds contour for a bunch of pixel given \n color of an image.\n Uses the Moore-Neighbor Tracing.\n Returns poligon whitout any processing\n usage:\n var poly = countour(ctx_imagedata.data, ctx.with, ctx.height, pointx, pointy)\n */\n function contour(image_data, width, height, x, y) {\n\n var components = 4; //rgba\n\n // get color to match \n var pixel_pos = (y * width + x) * components;\n var color = [image_data[pixel_pos],\n image_data[pixel_pos + 1],\n image_data[pixel_pos + 2]\n ];\n\n // helper \n function match_color(x, y) {\n if (x < 0 || x >= width || y < 0 || y >= height) {\n return false;\n }\n\n var pixel_pos = (y * width + x) * components;\n return color[0] === image_data[pixel_pos] &&\n color[1] === image_data[pixel_pos + 1] &&\n color[2] === image_data[pixel_pos + 2];\n }\n\n var poly = [];\n\n // first find the starting point\n var lower_y = y;\n var dummyForLint = 0;\n while (match_color(x, ++lower_y)) {\n dummyForLint++;\n }\n --lower_y;\n var start_point = [x, lower_y];\n\n // start with moore-neightbor\n var moore = new MooreNeighbour(start_point);\n var point;\n do {\n point = moore.next(match_color);\n poly.push(point);\n } while (!(start_point[0] === point[0] && start_point[1] === point[1]) && point !== undefined);\n return poly;\n }\n\n function createMask(imgData, width, height) {\n var x, y, offset, w = imgData.width || width,\n h = imgData.height || height,\n data = imgData.length ? imgData : imgData.data;\n\n for (y = 0; y < h; y++) {\n for (x = 0; x < w; x++) {\n offset = (y * w + x) * 4;\n if (data[offset + 3] === 255) {\n data[offset] = 255;\n data[offset + 1] = 0;\n data[offset + 2] = 0;\n data[offset + 3] = 255;\n } else {\n data[offset] = 0;\n data[offset + 1] = 255;\n data[offset + 2] = 0;\n data[offset + 3] = 255;\n }\n }\n }\n }\n\n function draw_poly(ctx, poly, color, width) {\n ctx.strokeStyle = color || \"rgb(255, 0, 128)\";\n ctx.lineWidth = width || 1;\n ctx.beginPath();\n var p = poly[0];\n ctx.moveTo(p[0], p[1]);\n for (var i = 1; i < poly.length; ++i) {\n p = poly[i];\n ctx.lineTo(p[0], p[1]);\n }\n ctx.closePath();\n ctx.stroke();\n }\n\n function greenboxOnPixels(imgData, pointArray, references, stops, hslDiff) {\n var points = [],\n refColors = references || [FakeCation.colorUtils.getColor(imgData, 100, 100)],\n stopColors = stops || false,\n isStopColor,\n counter = 0;\n\n function checkSimilarFace(refColor) {\n return refColor.similarHsl(this, hslDiff.h, hslDiff.s, hslDiff.l);\n }\n\n function checkSimilarStop(refColor) {\n return refColor.similarHsl(this);\n }\n points = pointArray || [];\n points.forEach(function (point) {\n var x = point[0],\n y = point[1],\n currentColor,\n isSimilarToRefcolors = false;\n\n isStopColor = stopColors !== false;\n currentColor = FakeCation.colorUtils.getColor(imgData, x, y);\n\n if (isStopColor) {\n isStopColor = stopColors.some(checkSimilarStop, currentColor);\n }\n\n if (!isStopColor) {\n isSimilarToRefcolors = refColors.some(checkSimilarFace, currentColor);\n } \n\n if (isSimilarToRefcolors) {\n if (imgData.height - y > 5) {\n FakeCation.colorUtils.setColor(imgData, x, y, blank);\n counter++;\n }\n }\n\n });\n return counter;\n }\n\n function drawPoly(mask, width, poly, red, green, blue, alpha) {\n poly.forEach(function (point) {\n var x = point[0],\n y = point[1];\n var offset = (y * width + x) * 4;\n mask[offset] = red;\n mask[offset + 1] = green;\n mask[offset + 2] = blue;\n mask[offset + 3] = alpha;\n });\n }\n\n function removePoly(imgData, points) {\n var counter;\n points.forEach(function (point) {\n var x = point[0],\n y = point[1];\n FakeCation.colorUtils.setColor(imgData, x, y, blank);\n counter++;\n });\n return counter;\n }\n\n function traceEdge(mask, width, height, cx, cy, imgData) {\n var x, y, color, blue = new FC.colorUtils.Color(0, 0, 255, 1),\n maskData = {\n data: mask,\n width: width,\n height: height\n };\n FC.colorUtils.floodFill(maskData, cx, cy, blue, function (cColor, sColor, fColor) {\n return !fColor.same(cColor) && sColor.same(cColor);\n });\n\n for (y = 0; y < height; y++) {\n for (x = 0; x < width; x++) {\n color = FC.colorUtils.getColor(maskData, x, y);\n if (!color.same(blue)) {\n FC.colorUtils.setColor(imgData, x, y, blank);\n }\n }\n }\n }\n\n function blendEdge(poly, imgData, currentIteration) {\n var blend = [0.1, 0.2, 0.3, 0.5, 0.8],\n i, l = poly.length,\n w = imgData.width,\n p, offset;\n for (i = 0; i < l; i++) {\n p = poly[i];\n offset = (p[1] * w + p[0]) * 4;\n imgData.data[offset + 3] = 255 * blend[currentIteration];\n }\n }\n\n FC.utils.registerFilter('traceCountours', function (imgData, cb, config) {\n var imageData = imgData,\n cx = config.cx,\n cy = config.cy,\n iteration = config.iteration,\n references = config.references,\n stops = config.stops,\n currentIteration = 0,\n removedPixels,\n width = imageData.width,\n height = imageData.height,\n currentRun = 0;\n\n console.log(width, height, cx, cy);\n\n function iter() {\n console.log('traceCountours iteration:' + currentIteration + '/' + iteration);\n let mask = new Uint8ClampedArray(imageData.data);\n createMask(mask, width, height);\n let poly = contour(mask, width, height, parseInt(cx, 10), parseInt(cy, 10));\n\n drawPoly(mask, width, poly, 0,0,255,255);\n\n FakeCation.utils.dump(mask, FakeCation.utils.DEBUG_CANVAS, imgData.width, imgData.height);\n console.log(\"current run: \" + currentRun);\n if (currentRun === 0) {\n removedPixels = greenboxOnPixels(imageData, poly, references, stops, config.hslDiff, config.rgbDiff);\n currentIteration++;\n console.log('removedPixels: ' + removedPixels);\n if (currentIteration > iteration || removedPixels === 0) {\n currentRun++;\n }\n window.requestAnimationFrame(iter);\n } else {\n cb(imageData);\n }\n }\n window.requestAnimationFrame(iter);\n });\n\n FC.utils.registerFilter('removeContours', function (imgData, cb, config) {\n var imageData = imgData,\n cx = config.cx,\n cy = config.cy,\n width = imageData.width,\n height = imageData.height;\n\n console.log(width, height, cx, cy);\n\n function iter() {\n let mask = new Uint8ClampedArray(imageData.data);\n createMask(mask, width, height);\n let poly = contour(mask, width, height, parseInt(cx, 10), parseInt(cy, 10));\n\n drawPoly(mask, width, poly, 0,0,255,255);\n\n console.log(\"removeContours\");\n removePoly(imageData, poly);\n FakeCation.utils.dump(mask, FakeCation.utils.DEBUG_CANVAS, imgData.width, imgData.height);\n cb(imageData);\n }\n window.requestAnimationFrame(iter);\n });\n\n FC.utils.registerFilter('removeOutside', function (imgData, cb, config) {\n var imageData = imgData,\n cx = config.cx,\n cy = config.cy,\n width = imageData.width,\n height = imageData.height,\n currentRun = 0;\n\n console.log(width, height, cx, cy);\n\n function iter() {\n let mask = new Uint8ClampedArray(imageData.data);\n createMask(mask, width, height);\n let poly = contour(mask, width, height, parseInt(cx, 10), parseInt(cy, 10));\n\n drawPoly(mask, width, poly, 0,0,255,255);\n\n console.log(\"removeOutside\");\n traceEdge(mask, width, height, parseInt(cx, 10), parseInt(cy, 10), imageData);\n FakeCation.utils.dump(mask, FakeCation.utils.DEBUG_CANVAS, imgData.width, imgData.height);\n cb(imageData);\n }\n window.requestAnimationFrame(iter);\n });\n\n FC.utils.registerFilter('blendCountours', function (imgData, cb, config) {\n var imageData = imgData,\n cx = config.cx,\n cy = config.cy,\n iteration = 4,\n currentIteration = 0,\n width = imageData.width,\n height = imageData.height,\n currentRun = 0;\n\n\n function iter() {\n console.log('blendCountours iteration:' + currentIteration + '/' + iteration);\n let mask = new Uint8ClampedArray(imageData.data);\n createMask(mask, width, height);\n let poly = contour(mask, width, height, parseInt(cx, 10), parseInt(cy, 10));\n\n drawPoly(mask, width, poly, 0,0,255,255);\n\n FakeCation.utils.dump(mask, FakeCation.utils.DEBUG_CANVAS, imgData.width, imgData.height);\n if (currentRun === 0) {\n blendEdge(poly, imageData, currentIteration);\n currentIteration++;\n if (currentIteration > iteration) {\n currentRun++;\n }\n window.requestAnimationFrame(iter);\n } else {\n cb(imageData);\n }\n }\n window.requestAnimationFrame(iter);\n });\n\n}(FakeCation));\n","/*global FakeCation*/\n(function (FC) {\n \"use strict\";\n\n FC.utils.registerFilter('transform', function (imgData, cb, config) {\n var rotate = config.rotate,\n scale = config.scale,\n translate = config.translate,\n tmpCanvas = document.createElement('canvas'),\n tmpCanvasCtx = tmpCanvas.getContext('2d'),\n tmp2Canvas = document.createElement('canvas'),\n tmp2CanvasCtx = tmp2Canvas.getContext('2d');\n\n tmpCanvas.width = tmp2Canvas.width = imgData.width;\n tmpCanvas.height = tmp2Canvas.height = imgData.height;\n \n tmp2CanvasCtx.putImageData(imgData, 0, 0);\n \n tmpCanvasCtx.drawImage(tmp2Canvas, translate.x, (tmpCanvas.height - tmp2Canvas.height * scale.y)+translate.y, tmp2Canvas.width * scale.x, tmp2Canvas.height * scale.y);\n\n cb(tmpCanvasCtx.getImageData(0, 0, tmpCanvas.width, tmpCanvas.height));\n });\n}(FakeCation));\n","/*global FakeCation, document */\n(function (FC) {\n \"use strict\";\n\n function cloneImageData(imgData, cnvs) {\n\n cnvs.width = imgData.width;\n cnvs.height = imgData.height;\n cnvs.getContext('2d').putImageData(imgData, 0, 0);\n return cnvs.getContext('2d').getImageData(0, 0, cnvs.width, cnvs.height);\n }\n\n FC.utils.registerFilter('userclick', function (originalImgData, cb, config) {\n var maxDiff,\n cnvs,\n modImgData,\n imgData,\n pointArray = [],\n hslDiff = config.hslDiff;\n \n\n cnvs = document.createElement('canvas');\n modImgData = cloneImageData(originalImgData, cnvs);\n\n if (config && config.x && config.y) {\n pointArray.push([config.x, config.y]);\n } else if (config && config.points) {\n pointArray = pointArray.concat(config.points);\n } else {\n pointArray.push([100, 100]);\n }\n\n maxDiff = config && config.maxDiff || 40;\n\n var matcherFn = function (currentColor, startColor) {\n var diff;\n if (hslDiff) {\n return startColor.similarHsl(currentColor, hslDiff.h, hslDiff.s, hslDiff.l) && currentColor.alpha > 0;\n }\n diff = currentColor.diffRgb(startColor);\n return startColor.similarRgb(currentColor, maxDiff) && currentColor.alpha > diff / maxDiff && currentColor.alpha > 0;\n };\n var colorFn = function (currentColor, startColor, fillColor, iData, cx, cy) {\n var c = new FC.colorUtils.Color(currentColor.red, currentColor.green, currentColor.blue),\n alpha = c.diffRgb(startColor) / maxDiff,\n modColor = FC.colorUtils.getColor(modImgData, cx, cy);\n\n c.alpha = Math.min(1, alpha, modColor.alpha, 0);\n fillColor.green = parseInt(c.alpha * 255, 10);\n\n FC.colorUtils.setColor(imgData, cx, cy, fillColor);\n FC.colorUtils.setColor(modImgData, cx, cy, c);\n };\n\n var point = pointArray.shift();\n\n function iter() {\n var x = parseInt(point[0], 10),\n y = parseInt(point[1], 10),\n color;\n\n imgData = cloneImageData(originalImgData, cnvs);\n color = FC.colorUtils.getColor(imgData, x, y);\n\n FC.colorUtils.floodFill(imgData, x, y, new FC.colorUtils.Color(255, 0, 0, 1), matcherFn, colorFn);\n\n {\n let ctx = FC.utils.dump(imgData);\n ctx.putImageData(imgData, 0, 0);\n ctx.rect(x - 5, y - 5, 10, 10);\n ctx.fillStyle = 'green';\n ctx.fill();\n }\n\n if (pointArray.length) {\n point = pointArray.shift();\n window.requestAnimationFrame(iter);\n } else {\n cb(modImgData);\n }\n }\n\n window.requestAnimationFrame(iter);\n\n });\n}(FakeCation));\n"],"sourceRoot":"/source/"}