364 lines
17 KiB
JavaScript
364 lines
17 KiB
JavaScript
!function() {
|
|
"use strict";
|
|
var t;
|
|
!function(t) {
|
|
t.None = "none",
|
|
t.Url = "url",
|
|
t.Blur = "blur",
|
|
t.Brightness = "brightness",
|
|
t.Contrast = "contrast",
|
|
t.DropShadow = "drop-shadow",
|
|
t.Grayscale = "grayscale",
|
|
t.HueRotate = "hue-rotate",
|
|
t.Invert = "invert",
|
|
t.Opacity = "opacity",
|
|
t.Saturate = "saturate",
|
|
t.Sepia = "sepia"
|
|
}(t || (t = {}));
|
|
var r = new Map
|
|
, a = function(t) {
|
|
var r = document.createElement("canvas");
|
|
return r.height = t.canvas.height,
|
|
r.width = t.canvas.width,
|
|
Object.defineProperty(r, "__skipFilterPatch", {
|
|
value: !0
|
|
}),
|
|
r.getContext("2d")
|
|
};
|
|
var e = ["__skipFilterPatch", "__currentPathMirror", "canvas", "filter", "getImageData"];
|
|
var n = ["clearRect", "drawImage", "fill", "fillRect", "fillText", "stroke", "strokeRect", "strokeText"]
|
|
, i = function(t, a) {
|
|
a.match(/([-a-z]+)(?:\(([\w\d\s\.%-]*)\))?/gim).map(function(t) {
|
|
return t.match(/([-a-z]+)(?:\((.*)\))?/i).slice(1, 3)
|
|
}).reduce(function(t, a) {
|
|
var e = a[0]
|
|
, n = a[1];
|
|
return r.has(e) ? r.get(e).apply(void 0, [t].concat((n || "").split(" "))) : t
|
|
}, t)
|
|
}
|
|
, o = function(t) {
|
|
var r = parseFloat(t);
|
|
return /%\s*?$/i.test(t) && (r /= 100),
|
|
r
|
|
}
|
|
, s = function(t) {
|
|
return parseFloat(t)
|
|
};
|
|
var c, h;
|
|
r.set(t.None, function(t) {
|
|
return t
|
|
}),
|
|
r.set(t.Blur, function(t, r) {
|
|
void 0 === r && (r = "0");
|
|
var a = s(r);
|
|
if (a <= 0)
|
|
return t;
|
|
for (var e, n, i, o, c = t.canvas, h = c.height, u = c.width, v = t.getImageData(0, 0, u, h), f = v.data, p = u - 1, g = h - 1, l = a + 1, d = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1][a], m = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18][a], _ = [], w = [], y = [], D = [], P = [], I = [], b = 3; b-- > 0; ) {
|
|
for (var M = 0, O = 0, k = 0; k < h; k++) {
|
|
for (var C = f[M] * l, x = f[M + 1] * l, F = f[M + 2] * l, j = f[M + 3] * l, R = 1; R <= a; R++)
|
|
e = M + ((R > p ? p : R) << 2),
|
|
C += f[e++],
|
|
x += f[e++],
|
|
F += f[e++],
|
|
j += f[e];
|
|
for (var S = 0; S < u; S++)
|
|
_[O] = C,
|
|
w[O] = x,
|
|
y[O] = F,
|
|
D[O] = j,
|
|
0 === k && (P[S] = ((e = S + l) < p ? e : p) << 2,
|
|
I[S] = (e = S - a) > 0 ? e << 2 : 0),
|
|
n = M + P[S],
|
|
i = M + I[S],
|
|
C += f[n++] - f[i++],
|
|
x += f[n++] - f[i++],
|
|
F += f[n++] - f[i++],
|
|
j += f[n] - f[i],
|
|
O++;
|
|
M += u << 2
|
|
}
|
|
for (S = 0; S < u; S++) {
|
|
var T = S;
|
|
for (C = _[T] * l,
|
|
x = w[T] * l,
|
|
F = y[T] * l,
|
|
j = D[T] * l,
|
|
R = 1; R <= a; R++)
|
|
C += _[T += R > g ? 0 : u],
|
|
x += w[T],
|
|
F += y[T],
|
|
j += D[T];
|
|
for (O = S << 2,
|
|
k = 0; k < h; k++)
|
|
f[O + 3] = o = j * d >>> m,
|
|
o > 0 ? (o = 255 / o,
|
|
f[O] = (C * d >>> m) * o,
|
|
f[O + 1] = (x * d >>> m) * o,
|
|
f[O + 2] = (F * d >>> m) * o) : f[O] = f[O + 1] = f[O + 2] = 0,
|
|
0 === S && (P[k] = ((e = k + l) < g ? e : g) * u,
|
|
I[k] = (e = k - a) > 0 ? e * u : 0),
|
|
n = S + P[k],
|
|
i = S + I[k],
|
|
C += _[n] - _[i],
|
|
x += w[n] - w[i],
|
|
F += y[n] - y[i],
|
|
j += D[n] - D[i],
|
|
O += u << 2
|
|
}
|
|
}
|
|
return t.putImageData(v, 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.Brightness, function(t, r) {
|
|
if (void 0 === r && (r = "1"),
|
|
1 === (r = o(r)))
|
|
return t;
|
|
r < 0 && (r = 0);
|
|
for (var a = t.canvas, e = a.height, n = a.width, i = t.getImageData(0, 0, n, e), s = i.data, c = s.length, h = 0; h < c; h += 4)
|
|
s[h + 0] *= r,
|
|
s[h + 1] *= r,
|
|
s[h + 2] *= r;
|
|
return t.putImageData(i, 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.Contrast, function(t, r) {
|
|
if (void 0 === r && (r = "1"),
|
|
1 === (r = o(r)))
|
|
return t;
|
|
r < 0 && (r = 0);
|
|
for (var a = t.canvas, e = a.height, n = a.width, i = t.getImageData(0, 0, n, e), s = i.data, c = s.length, h = 0; h < c; h += 4)
|
|
s[h + 0] = 255 * ((s[h + 0] / 255 - .5) * r + .5),
|
|
s[h + 1] = 255 * ((s[h + 1] / 255 - .5) * r + .5),
|
|
s[h + 2] = 255 * ((s[h + 2] / 255 - .5) * r + .5);
|
|
return t.putImageData(i, 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.DropShadow, function(t, r, a, e, n) {
|
|
var i = document.createElement("canvas").getContext("2d");
|
|
i.shadowOffsetX = s(r),
|
|
i.shadowOffsetY = s(a),
|
|
i.shadowBlur = n ? s(e || "0") : 0,
|
|
i.shadowColor = n || e || "transparent",
|
|
i.drawImage(t.canvas, 0, 0);
|
|
var o = t.canvas
|
|
, c = o.width
|
|
, h = o.height;
|
|
return t.putImageData(i.getImageData(0, 0, c, h), 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.Grayscale, function(t, r) {
|
|
if (void 0 === r && (r = "0"),
|
|
(r = o(r)) <= 0)
|
|
return t;
|
|
r > 1 && (r = 1);
|
|
for (var a = t.canvas, e = a.height, n = a.width, i = t.getImageData(0, 0, n, e), s = i.data, c = s.length, h = 0; h < c; h += 4) {
|
|
var u = .2126 * s[h] + .7152 * s[h + 1] + .0722 * s[h + 2];
|
|
s[h + 0] += (u - s[h + 0]) * r,
|
|
s[h + 1] += (u - s[h + 1]) * r,
|
|
s[h + 2] += (u - s[h + 2]) * r
|
|
}
|
|
return t.putImageData(i, 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.HueRotate, function(t, r) {
|
|
void 0 === r && (r = "0deg");
|
|
var a = function(t) {
|
|
var r = parseFloat(t);
|
|
switch (t.slice(r.toString().length)) {
|
|
case "deg":
|
|
r /= 360;
|
|
break;
|
|
case "grad":
|
|
r /= 400;
|
|
break;
|
|
case "rad":
|
|
r /= 2 * Math.PI
|
|
}
|
|
return r
|
|
}(r);
|
|
if (a <= 0)
|
|
return t;
|
|
var e, n, i, o, s, c, h, u, v, f = t.canvas, p = f.height, g = f.width, l = t.getImageData(0, 0, g, p), d = l.data, m = (a % 1 + 1) % 1 * 3, _ = Math.floor(m), w = m - _, y = 1 - w;
|
|
switch (_) {
|
|
case 0:
|
|
e = y,
|
|
n = 0,
|
|
i = w,
|
|
o = w,
|
|
s = y,
|
|
c = 0,
|
|
h = 0,
|
|
u = w,
|
|
v = y;
|
|
break;
|
|
case 1:
|
|
e = 0,
|
|
n = w,
|
|
i = y,
|
|
o = y,
|
|
s = 0,
|
|
c = w,
|
|
h = w,
|
|
u = y,
|
|
v = 0;
|
|
break;
|
|
case 2:
|
|
e = w,
|
|
n = y,
|
|
i = 0,
|
|
o = 0,
|
|
s = w,
|
|
c = y,
|
|
h = y,
|
|
u = 0,
|
|
v = w
|
|
}
|
|
for (var D = 0, P = 0; P < p; ++P)
|
|
for (var I = 0; I < g; ++I) {
|
|
var b = d[0 + (D = 4 * (P * g + I))]
|
|
, M = d[D + 1]
|
|
, O = d[D + 2];
|
|
d[D + 0] = Math.floor(e * b + n * M + i * O),
|
|
d[D + 1] = Math.floor(o * b + s * M + c * O),
|
|
d[D + 2] = Math.floor(h * b + u * M + v * O)
|
|
}
|
|
return t.putImageData(l, 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.Invert, function(t, r) {
|
|
if (void 0 === r && (r = "0"),
|
|
(r = o(r)) <= 0)
|
|
return t;
|
|
r > 1 && (r = 1);
|
|
for (var a = t.canvas, e = a.height, n = a.width, i = t.getImageData(0, 0, n, e), s = i.data, c = s.length, h = 0; h < c; h += 4)
|
|
s[h + 0] = Math.abs(s[h + 0] - 255 * r),
|
|
s[h + 1] = Math.abs(s[h + 1] - 255 * r),
|
|
s[h + 2] = Math.abs(s[h + 2] - 255 * r);
|
|
return t.putImageData(i, 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.Opacity, function(t, r) {
|
|
if (void 0 === r && (r = "1"),
|
|
(r = o(r)) < 0)
|
|
return t;
|
|
r > 1 && (r = 1);
|
|
for (var a = t.canvas, e = a.height, n = a.width, i = t.getImageData(0, 0, n, e), s = i.data, c = s.length, h = 3; h < c; h += 4)
|
|
s[h] *= r;
|
|
return t.putImageData(i, 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.Saturate, function(t, r) {
|
|
void 0 === r && (r = "1");
|
|
var a = o(r);
|
|
if (1 === a)
|
|
return t;
|
|
a < 0 && (a = 0);
|
|
for (var e = t.canvas, n = e.height, i = e.width, s = t.getImageData(0, 0, i, n), c = s.data, h = .3086 * (1 - a), u = .6094 * (1 - a), v = .082 * (1 - a), f = i << 2, p = 0; p < n; p++)
|
|
for (var g = p * f, l = 0; l < i; l++) {
|
|
var d = g + (l << 2)
|
|
, m = c[d + 0]
|
|
, _ = c[d + 1]
|
|
, w = c[d + 2];
|
|
c[d + 0] = (h + a) * m + u * _ + v * w,
|
|
c[d + 1] = h * m + (u + a) * _ + v * w,
|
|
c[d + 2] = h * m + u * _ + (v + a) * w
|
|
}
|
|
return t.putImageData(s, 0, 0),
|
|
t
|
|
}),
|
|
r.set(t.Sepia, function(t, r) {
|
|
if (void 0 === r && (r = "0"),
|
|
(r = o(r)) <= 0)
|
|
return t;
|
|
r > 1 && (r = 1);
|
|
for (var a = t.canvas, e = a.height, n = a.width, i = t.getImageData(0, 0, n, e), s = i.data, c = s.length, h = 0; h < c; h += 4) {
|
|
var u = s[h + 0]
|
|
, v = s[h + 1]
|
|
, f = s[h + 2];
|
|
s[h + 0] = (.393 * u + .769 * v + .189 * f) * r + u * (1 - r),
|
|
s[h + 1] = (.349 * u + .686 * v + .168 * f) * r + v * (1 - r),
|
|
s[h + 2] = (.272 * u + .534 * v + .131 * f) * r + f * (1 - r)
|
|
}
|
|
return t.putImageData(i, 0, 0),
|
|
t
|
|
}),
|
|
"filter"in CanvasRenderingContext2D.prototype || (c = HTMLCanvasElement,
|
|
h = CanvasRenderingContext2D,
|
|
Object.defineProperty(c.prototype, "__skipFilterPatch", {
|
|
writable: !0,
|
|
value: !1
|
|
}),
|
|
Object.defineProperty(c.prototype, "__currentPathMirror", {
|
|
writable: !0,
|
|
value: void 0
|
|
}),
|
|
Object.defineProperty(h.prototype, "filter", {
|
|
writable: !0,
|
|
value: t.None
|
|
}),
|
|
function(t) {
|
|
Object.keys(t.prototype).filter(function(t) {
|
|
return e.indexOf(t) < 0
|
|
}).map(function(r) {
|
|
return {
|
|
member: r,
|
|
descriptor: Object.getOwnPropertyDescriptor(t.prototype, r)
|
|
}
|
|
}).filter(function(t) {
|
|
return t.descriptor.set
|
|
}).forEach(function(r) {
|
|
var e = r.member
|
|
, n = r.descriptor;
|
|
Object.defineProperty(t.prototype, e, {
|
|
get: function() {
|
|
return this.canvas.__skipFilterPatch ? n.get.call(this) : this.canvas.__currentPathMirror[e]
|
|
},
|
|
set: function(t) {
|
|
if (this.canvas.__skipFilterPatch)
|
|
return n.set.call(this, t);
|
|
this.canvas.__currentPathMirror || (this.canvas.__currentPathMirror = a(this)),
|
|
this.canvas.__currentPathMirror[e] = t
|
|
}
|
|
})
|
|
})
|
|
}(CanvasRenderingContext2D),
|
|
function(t) {
|
|
Object.keys(t.prototype).filter(function(t) {
|
|
return e.indexOf(t) < 0
|
|
}).map(function(r) {
|
|
return {
|
|
member: r,
|
|
descriptor: Object.getOwnPropertyDescriptor(t.prototype, r)
|
|
}
|
|
}).filter(function(t) {
|
|
var r = t.descriptor;
|
|
return r.value && "function" == typeof r.value
|
|
}).forEach(function(r) {
|
|
var e = r.member
|
|
, o = r.descriptor.value;
|
|
Object.defineProperty(t.prototype, e, {
|
|
value: function() {
|
|
for (var t, r = [], s = 0; s < arguments.length; s++)
|
|
r[s] = arguments[s];
|
|
if (this.canvas.__skipFilterPatch)
|
|
return o.call.apply(o, [this].concat(r));
|
|
this.canvas.__currentPathMirror || (this.canvas.__currentPathMirror = a(this));
|
|
var c = (t = this.canvas.__currentPathMirror)[e].apply(t, r);
|
|
if (n.indexOf(e) > -1) {
|
|
i(this.canvas.__currentPathMirror, this.filter),
|
|
this.canvas.__skipFilterPatch = !0;
|
|
var h = void 0;
|
|
"getTransform"in this && (h = this.getTransform(),
|
|
this.setTransform(1, 0, 0, 1, 0, 0)),
|
|
this.drawImage(this.canvas.__currentPathMirror.canvas, 0, 0),
|
|
h && this.setTransform(h),
|
|
this.canvas.__skipFilterPatch = !1,
|
|
this.canvas.__currentPathMirror = a(this)
|
|
}
|
|
return c
|
|
}
|
|
})
|
|
})
|
|
}(CanvasRenderingContext2D))
|
|
}();
|