Permalink
Browse files

Move all plugins to their own repository

  • Loading branch information...
1 parent 0ac6301 commit c8e3179aab68424dab6adae6a53c3b98ed22168d @meltingice committed Dec 23, 2012
View
3 .gitmodules
@@ -1,3 +1,6 @@
[submodule "test/qunit"]
path = test/qunit
url = https://github.com/jquery/qunit.git
+[submodule "src/plugins"]
+ path = src/plugins
+ url = https://github.com/meltingice/CamanJS-Plugins.git
View
2 Cakefile
@@ -57,7 +57,7 @@ coffeeFiles = [
"lib/filters"
]
-pluginsFolder = "src/plugins"
+pluginsFolder = "src/plugins/src"
###
Event System
View
2 README.md
@@ -4,7 +4,7 @@
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.
-CamanJS is very easy to extend with new filters and plugins, and it comes with a wide array of image editing functionality, which is only growing as the community makes more plugins.
+CamanJS is very easy to extend with new filters and plugins, and it comes with a wide array of image editing functionality, which is only growing as the community makes more plugins. All features that are not a part of the core CamanJS library are in a [separate plugins repository](https://github.com/meltingice/CamanJS-Plugins).
For more information, I highly recommend taking a look at the [official website](http://camanjs.com) where there is more comprehensive documentation and interactive demos. You can also [read the wiki](https://github.com/meltingice/CamanJS/wiki) for some basic information about the project and how to use it.
1 src/plugins
@@ -0,0 +1 @@
+Subproject commit 834bb8d6538391f7e65b4194e25022c128cce43a
View
76 src/plugins/blur.coffee
@@ -1,76 +0,0 @@
-Caman.Filter.register "boxBlur", ->
- @processKernel "Box Blur", [
- 1, 1, 1,
- 1, 1, 1,
- 1, 1, 1
- ]
-
-Caman.Filter.register "radialBlur", ->
- @processKernel "Radial Blur", [
- 0, 1, 0,
- 1, 1, 1,
- 0, 1, 0
- ]
-
-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", ->
- 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
- ]
View
146 src/plugins/camera.coffee
@@ -1,146 +0,0 @@
-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 = @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 = @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)
-
View
348 src/plugins/compoundBlur.coffee
@@ -1,348 +0,0 @@
-###
-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 = Caman.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 = Caman.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]
-
View
20 src/plugins/edges.coffee
@@ -1,20 +0,0 @@
-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
- ]
View
9 src/plugins/posterize.coffee
@@ -1,9 +0,0 @@
-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
View
256 src/plugins/presets.coffee
@@ -1,256 +0,0 @@
-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
View
55 src/plugins/size.coffee
@@ -1,55 +0,0 @@
-# Allows us to crop the canvas and produce a new smaller
-# canvas.
-Caman.Plugin.register "crop", (width, height, x = 0, y = 0) ->
- # Create our new canvas element
- if exports?
- canvas = new Canvas width, height
- else
- canvas = document.createElement 'canvas'
- canvas.width = width
- canvas.height = height
-
- ctx = canvas.getContext '2d'
-
- # Perform the cropping by drawing to the new canvas
- ctx.drawImage @canvas, x, y, width, height, 0, 0, width, height
-
- # Update all of the references
- @replaceCanvas canvas
-
-# Resize the canvas and the image to a new size
-Caman.Plugin.register "resize", (newDims = null) ->
- # Calculate new size
- if newDims is null or (!newDims.width? and !newDims.height?)
- Log.error "Invalid or missing dimensions given for resize"
- return
-
- if not newDims.width?
- # Calculate width
- newDims.width = @canvas.width * newDims.height / @canvas.height
- else if not newDims.height?
- # Calculate height
- newDims.height = @canvas.height * newDims.width / @canvas.width
-
- if exports?
- canvas = new Canvas newDims.width, newDims.height
- else
- canvas = document.createElement 'canvas'
- canvas.width = newDims.width
- canvas.height = newDims.height
-
- ctx = canvas.getContext '2d'
-
- ctx.drawImage @canvas,
- 0, 0,
- @canvas.width, @canvas.height,
- 0, 0,
- newDims.width, newDims.height
-
- @replaceCanvas canvas
-
-Caman.Filter.register "crop", (width, height, x = 0, y = 0) ->
- @processPlugin "crop", Array.prototype.slice.call(arguments, 0)
-
-Caman.Filter.register "resize", (width, height) ->
- @processPlugin "resize", Array.prototype.slice.call(arguments, 0)
View
238 src/plugins/stackBlur.coffee
@@ -1,238 +0,0 @@
-###
-StackBlur - a fast almost Gaussian Blur For Canvas v0.31 modified for CamanJS
-
-Version: 0.31
-Author: Mario Klingemann
-Contact: mario@quasimondo.com
-Website: http://www.quasimondo.com/StackBlurForCanvas
-Twitter: @quasimondo
-Modified By: Ryan LeFevre (@meltingice)
-
-In case you find this class useful - especially in commercial projects -
-I am not totally unhappy for a small donation to my PayPal account
-mario@quasimondo.de
-
-Or support me on flattr:
-https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript
-
-Copyright (c) 2010 Mario Klingemann
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-###
-
-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]
View
14 src/plugins/threshold.coffee
@@ -1,14 +0,0 @@
-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

0 comments on commit c8e3179

Please sign in to comment.