pixel-data-js 0.5.3 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.dev.cjs +826 -256
- package/dist/index.dev.cjs.map +1 -1
- package/dist/index.dev.js +770 -230
- package/dist/index.dev.js.map +1 -1
- package/dist/index.prod.cjs +826 -256
- package/dist/index.prod.cjs.map +1 -1
- package/dist/index.prod.d.ts +162 -100
- package/dist/index.prod.js +770 -230
- package/dist/index.prod.js.map +1 -1
- package/package.json +1 -1
- package/src/{blend-modes.ts → BlendModes/blend-modes-fast.ts} +215 -217
- package/src/BlendModes/blend-modes-perfect.ts +651 -0
- package/src/BlendModes/blend-modes.ts +31 -0
- package/src/IndexedImage/IndexedImage.ts +32 -49
- package/src/PixelData/PixelData.ts +15 -4
- package/src/PixelData/blendColorPixelData.ts +3 -2
- package/src/PixelData/blendPixelData.ts +3 -2
- package/src/PixelData/reflectPixelData.ts +42 -0
- package/src/PixelData/rotatePixelData.ts +56 -0
- package/src/_types.ts +3 -3
- package/src/index.ts +5 -1
package/dist/index.prod.js
CHANGED
|
@@ -1,31 +1,56 @@
|
|
|
1
|
-
// src/blend-modes.ts
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
// src/BlendModes/blend-modes.ts
|
|
2
|
+
var BlendMode = /* @__PURE__ */ ((BlendMode2) => {
|
|
3
|
+
BlendMode2[BlendMode2["overwrite"] = 0] = "overwrite";
|
|
4
|
+
BlendMode2[BlendMode2["sourceOver"] = 1] = "sourceOver";
|
|
5
|
+
BlendMode2[BlendMode2["darken"] = 2] = "darken";
|
|
6
|
+
BlendMode2[BlendMode2["multiply"] = 3] = "multiply";
|
|
7
|
+
BlendMode2[BlendMode2["colorBurn"] = 4] = "colorBurn";
|
|
8
|
+
BlendMode2[BlendMode2["linearBurn"] = 5] = "linearBurn";
|
|
9
|
+
BlendMode2[BlendMode2["darkerColor"] = 6] = "darkerColor";
|
|
10
|
+
BlendMode2[BlendMode2["lighten"] = 7] = "lighten";
|
|
11
|
+
BlendMode2[BlendMode2["screen"] = 8] = "screen";
|
|
12
|
+
BlendMode2[BlendMode2["colorDodge"] = 9] = "colorDodge";
|
|
13
|
+
BlendMode2[BlendMode2["linearDodge"] = 10] = "linearDodge";
|
|
14
|
+
BlendMode2[BlendMode2["lighterColor"] = 11] = "lighterColor";
|
|
15
|
+
BlendMode2[BlendMode2["overlay"] = 12] = "overlay";
|
|
16
|
+
BlendMode2[BlendMode2["softLight"] = 13] = "softLight";
|
|
17
|
+
BlendMode2[BlendMode2["hardLight"] = 14] = "hardLight";
|
|
18
|
+
BlendMode2[BlendMode2["vividLight"] = 15] = "vividLight";
|
|
19
|
+
BlendMode2[BlendMode2["linearLight"] = 16] = "linearLight";
|
|
20
|
+
BlendMode2[BlendMode2["pinLight"] = 17] = "pinLight";
|
|
21
|
+
BlendMode2[BlendMode2["hardMix"] = 18] = "hardMix";
|
|
22
|
+
BlendMode2[BlendMode2["difference"] = 19] = "difference";
|
|
23
|
+
BlendMode2[BlendMode2["exclusion"] = 20] = "exclusion";
|
|
24
|
+
BlendMode2[BlendMode2["subtract"] = 21] = "subtract";
|
|
25
|
+
BlendMode2[BlendMode2["divide"] = 22] = "divide";
|
|
26
|
+
return BlendMode2;
|
|
27
|
+
})(BlendMode || {});
|
|
28
|
+
|
|
29
|
+
// src/BlendModes/blend-modes-fast.ts
|
|
30
|
+
var overwriteFast = (src, _dst) => src;
|
|
31
|
+
var sourceOverFast = (src, dst) => {
|
|
32
|
+
const sa = src >>> 24 & 255;
|
|
33
|
+
if (sa === 255) return src;
|
|
34
|
+
if (sa === 0) return dst;
|
|
35
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
36
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
37
|
+
const da = dst >>> 24 & 255;
|
|
38
|
+
const invA = 255 - sa;
|
|
39
|
+
const r = sr * sa + dr * invA >> 8;
|
|
40
|
+
const g = sg * sa + dg * invA >> 8;
|
|
41
|
+
const b = sb * sa + db * invA >> 8;
|
|
42
|
+
const a = 255 * sa + da * invA >> 8;
|
|
43
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
18
44
|
};
|
|
19
|
-
var
|
|
45
|
+
var darkenFast = (src, dst) => {
|
|
20
46
|
const sa = src >>> 24 & 255;
|
|
21
47
|
if (sa === 0) return dst;
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
48
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
49
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
50
|
+
const br = sr < dr ? sr : dr;
|
|
51
|
+
const bg = sg < dg ? sg : dg;
|
|
52
|
+
const bb = sb < db ? sb : db;
|
|
25
53
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
26
|
-
const dr = dst & 255;
|
|
27
|
-
const dg = dst >> 8 & 255;
|
|
28
|
-
const db = dst >> 16 & 255;
|
|
29
54
|
const invA = 255 - sa;
|
|
30
55
|
const r = br * sa + dr * invA >> 8;
|
|
31
56
|
const g = bg * sa + dg * invA >> 8;
|
|
@@ -33,45 +58,51 @@ var darkenColor32 = (src, dst) => {
|
|
|
33
58
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
34
59
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
35
60
|
};
|
|
36
|
-
var
|
|
61
|
+
var multiplyFast = (src, dst) => {
|
|
37
62
|
const sa = src >>> 24 & 255;
|
|
38
63
|
if (sa === 0) return dst;
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const
|
|
64
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
65
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
66
|
+
const br = sr * dr >> 8;
|
|
67
|
+
const bg = sg * dg >> 8;
|
|
68
|
+
const bb = sb * db >> 8;
|
|
43
69
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
44
70
|
const invA = 255 - sa;
|
|
71
|
+
const da = dst >>> 24 & 255;
|
|
45
72
|
const r = br * sa + dr * invA >> 8;
|
|
46
73
|
const g = bg * sa + dg * invA >> 8;
|
|
47
74
|
const b = bb * sa + db * invA >> 8;
|
|
48
|
-
const a = 255 * sa +
|
|
75
|
+
const a = 255 * sa + da * invA >> 8;
|
|
49
76
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
50
77
|
};
|
|
51
|
-
var
|
|
78
|
+
var colorBurnFast = (src, dst) => {
|
|
52
79
|
const sa = src >>> 24 & 255;
|
|
53
80
|
if (sa === 0) return dst;
|
|
54
|
-
const sr = src & 255, sg = src
|
|
55
|
-
const dr = dst & 255, dg = dst
|
|
56
|
-
const br = dr === 255 ? 255 : Math.max(0, 255 - (255 - dr << 8) /
|
|
57
|
-
const bg = dg === 255 ? 255 : Math.max(0, 255 - (255 - dg << 8) /
|
|
58
|
-
const bb = db === 255 ? 255 : Math.max(0, 255 - (255 - db << 8) /
|
|
81
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
82
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
83
|
+
const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / sr | 0);
|
|
84
|
+
const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / sg | 0);
|
|
85
|
+
const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / sb | 0);
|
|
59
86
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
60
87
|
const invA = 255 - sa;
|
|
88
|
+
const da = dst >>> 24 & 255;
|
|
61
89
|
const r = br * sa + dr * invA >> 8;
|
|
62
90
|
const g = bg * sa + dg * invA >> 8;
|
|
63
91
|
const b = bb * sa + db * invA >> 8;
|
|
64
|
-
const a = 255 * sa +
|
|
92
|
+
const a = 255 * sa + da * invA >> 8;
|
|
65
93
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
66
94
|
};
|
|
67
|
-
var
|
|
95
|
+
var linearBurnFast = (src, dst) => {
|
|
68
96
|
const sa = src >>> 24 & 255;
|
|
69
97
|
if (sa === 0) return dst;
|
|
70
|
-
const dr = dst & 255, dg = dst
|
|
71
|
-
const sr = src & 255, sg = src
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
const
|
|
98
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
99
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
100
|
+
const brU = dr + sr - 255;
|
|
101
|
+
const bgU = dg + sg - 255;
|
|
102
|
+
const bbU = db + sb - 255;
|
|
103
|
+
const br = brU < 0 ? 0 : brU;
|
|
104
|
+
const bg = bgU < 0 ? 0 : bgU;
|
|
105
|
+
const bb = bbU < 0 ? 0 : bbU;
|
|
75
106
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
76
107
|
const invA = 255 - sa;
|
|
77
108
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -80,11 +111,11 @@ var linearBurnColor32 = (src, dst) => {
|
|
|
80
111
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
81
112
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
82
113
|
};
|
|
83
|
-
var
|
|
114
|
+
var darkerFast = (src, dst) => {
|
|
84
115
|
const sa = src >>> 24 & 255;
|
|
85
116
|
if (sa === 0) return dst;
|
|
86
|
-
const dr = dst & 255, dg = dst
|
|
87
|
-
const sr = src & 255, sg = src
|
|
117
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
118
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
88
119
|
const lumSrc = sr * 77 + sg * 151 + sb * 28;
|
|
89
120
|
const lumDst = dr * 77 + dg * 151 + db * 28;
|
|
90
121
|
let br, bg, bb;
|
|
@@ -105,7 +136,7 @@ var darkerColor32 = (src, dst) => {
|
|
|
105
136
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
106
137
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
107
138
|
};
|
|
108
|
-
var
|
|
139
|
+
var lightenFast = (src, dst) => {
|
|
109
140
|
const sa = src >>> 24 & 255;
|
|
110
141
|
if (sa === 0) return dst;
|
|
111
142
|
const br = Math.max(src & 255, dst & 255);
|
|
@@ -122,13 +153,13 @@ var lightenColor32 = (src, dst) => {
|
|
|
122
153
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
123
154
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
124
155
|
};
|
|
125
|
-
var
|
|
156
|
+
var screenFast = (src, dst) => {
|
|
126
157
|
const sa = src >>> 24 & 255;
|
|
127
158
|
if (sa === 0) return dst;
|
|
128
|
-
const dr = dst & 255, dg = dst
|
|
159
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
129
160
|
const br = 255 - ((255 - (src & 255)) * (255 - dr) >> 8);
|
|
130
|
-
const bg = 255 - ((255 - (src
|
|
131
|
-
const bb = 255 - ((255 - (src
|
|
161
|
+
const bg = 255 - ((255 - (src >>> 8 & 255)) * (255 - dg) >> 8);
|
|
162
|
+
const bb = 255 - ((255 - (src >>> 16 & 255)) * (255 - db) >> 8);
|
|
132
163
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
133
164
|
const invA = 255 - sa;
|
|
134
165
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -137,14 +168,14 @@ var screenColor32 = (src, dst) => {
|
|
|
137
168
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
138
169
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
139
170
|
};
|
|
140
|
-
var
|
|
171
|
+
var colorDodgeFast = (src, dst) => {
|
|
141
172
|
const sa = src >>> 24 & 255;
|
|
142
173
|
if (sa === 0) return dst;
|
|
143
|
-
const dr = dst & 255, dg = dst
|
|
144
|
-
const sr = src & 255, sg = src
|
|
145
|
-
const br = sr === 255 ? 255 : Math.min(255, (dr << 8) / (255 - sr));
|
|
146
|
-
const bg = sg === 255 ? 255 : Math.min(255, (dg << 8) / (255 - sg));
|
|
147
|
-
const bb = sb === 255 ? 255 : Math.min(255, (db << 8) / (255 - sb));
|
|
174
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
175
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
176
|
+
const br = sr === 255 ? 255 : Math.min(255, (dr << 8) / (255 - sr) | 0);
|
|
177
|
+
const bg = sg === 255 ? 255 : Math.min(255, (dg << 8) / (255 - sg) | 0);
|
|
178
|
+
const bb = sb === 255 ? 255 : Math.min(255, (db << 8) / (255 - sb) | 0);
|
|
148
179
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
149
180
|
const invA = 255 - sa;
|
|
150
181
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -153,13 +184,16 @@ var colorDodgeColor32 = (src, dst) => {
|
|
|
153
184
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
154
185
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
155
186
|
};
|
|
156
|
-
var
|
|
187
|
+
var linearDodgeFast = (src, dst) => {
|
|
157
188
|
const sa = src >>> 24 & 255;
|
|
158
189
|
if (sa === 0) return dst;
|
|
159
|
-
const dr = dst & 255, dg = dst
|
|
160
|
-
const
|
|
161
|
-
const
|
|
162
|
-
const
|
|
190
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
191
|
+
const brU = (src & 255) + dr;
|
|
192
|
+
const bgU = (src >>> 8 & 255) + dg;
|
|
193
|
+
const bbU = (src >>> 16 & 255) + db;
|
|
194
|
+
const br = brU > 255 ? 255 : brU;
|
|
195
|
+
const bg = bgU > 255 ? 255 : bgU;
|
|
196
|
+
const bb = bbU > 255 ? 255 : bbU;
|
|
163
197
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
164
198
|
const invA = 255 - sa;
|
|
165
199
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -168,11 +202,11 @@ var linearDodgeColor32 = (src, dst) => {
|
|
|
168
202
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
169
203
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
170
204
|
};
|
|
171
|
-
var
|
|
205
|
+
var lighterFast = (src, dst) => {
|
|
172
206
|
const sa = src >>> 24 & 255;
|
|
173
207
|
if (sa === 0) return dst;
|
|
174
|
-
const dr = dst & 255, dg = dst
|
|
175
|
-
const sr = src & 255, sg = src
|
|
208
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
209
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
176
210
|
const lumSrc = sr * 77 + sg * 151 + sb * 28;
|
|
177
211
|
const lumDst = dr * 77 + dg * 151 + db * 28;
|
|
178
212
|
let br, bg, bb;
|
|
@@ -193,11 +227,11 @@ var lighterColor32 = (src, dst) => {
|
|
|
193
227
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
194
228
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
195
229
|
};
|
|
196
|
-
var
|
|
230
|
+
var overlayFast = (src, dst) => {
|
|
197
231
|
const sa = src >>> 24 & 255;
|
|
198
232
|
if (sa === 0) return dst;
|
|
199
|
-
const sr = src & 255, sg = src
|
|
200
|
-
const dr = dst & 255, dg = dst
|
|
233
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
234
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
201
235
|
const br = dr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);
|
|
202
236
|
const bg = dg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);
|
|
203
237
|
const bb = db < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);
|
|
@@ -209,11 +243,11 @@ var overlayColor32 = (src, dst) => {
|
|
|
209
243
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
210
244
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
211
245
|
};
|
|
212
|
-
var
|
|
246
|
+
var softLightFast = (src, dst) => {
|
|
213
247
|
const sa = src >>> 24 & 255;
|
|
214
248
|
if (sa === 0) return dst;
|
|
215
|
-
const dr = dst & 255, dg = dst
|
|
216
|
-
const sr = src & 255, sg = src
|
|
249
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
250
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
217
251
|
const br = (255 - dr) * (sr * dr >> 8) + dr * (255 - ((255 - sr) * (255 - dr) >> 8)) >> 8;
|
|
218
252
|
const bg = (255 - dg) * (sg * dg >> 8) + dg * (255 - ((255 - sg) * (255 - dg) >> 8)) >> 8;
|
|
219
253
|
const bb = (255 - db) * (sb * db >> 8) + db * (255 - ((255 - sb) * (255 - db) >> 8)) >> 8;
|
|
@@ -225,11 +259,11 @@ var softLightColor32 = (src, dst) => {
|
|
|
225
259
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
226
260
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
227
261
|
};
|
|
228
|
-
var
|
|
262
|
+
var hardLightFast = (src, dst) => {
|
|
229
263
|
const sa = src >>> 24 & 255;
|
|
230
264
|
if (sa === 0) return dst;
|
|
231
|
-
const dr = dst & 255, dg = dst
|
|
232
|
-
const sr = src & 255, sg = src
|
|
265
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
266
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
233
267
|
const br = sr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);
|
|
234
268
|
const bg = sg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);
|
|
235
269
|
const bb = sb < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);
|
|
@@ -241,14 +275,14 @@ var hardLightColor32 = (src, dst) => {
|
|
|
241
275
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
242
276
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
243
277
|
};
|
|
244
|
-
var
|
|
278
|
+
var vividLightFast = (src, dst) => {
|
|
245
279
|
const sa = src >>> 24 & 255;
|
|
246
280
|
if (sa === 0) return dst;
|
|
247
|
-
const dr = dst & 255, dg = dst
|
|
248
|
-
const sr = src & 255, sg = src
|
|
249
|
-
const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr)) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)));
|
|
250
|
-
const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg)) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)));
|
|
251
|
-
const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb)) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)));
|
|
281
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
282
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
283
|
+
const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr) | 0) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)) | 0);
|
|
284
|
+
const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg) | 0) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)) | 0);
|
|
285
|
+
const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb) | 0) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)) | 0);
|
|
252
286
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
253
287
|
const invA = 255 - sa;
|
|
254
288
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -257,14 +291,17 @@ var vividLightColor32 = (src, dst) => {
|
|
|
257
291
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
258
292
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
259
293
|
};
|
|
260
|
-
var
|
|
294
|
+
var linearLightFast = (src, dst) => {
|
|
261
295
|
const sa = src >>> 24 & 255;
|
|
262
296
|
if (sa === 0) return dst;
|
|
263
|
-
const dr = dst & 255, dg = dst
|
|
264
|
-
const sr = src & 255, sg = src
|
|
265
|
-
const
|
|
266
|
-
const
|
|
267
|
-
const
|
|
297
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
298
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
299
|
+
const brU = dr + 2 * sr - 255;
|
|
300
|
+
const bgU = dg + 2 * sg - 255;
|
|
301
|
+
const bbU = db + 2 * sb - 255;
|
|
302
|
+
const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;
|
|
303
|
+
const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;
|
|
304
|
+
const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;
|
|
268
305
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
269
306
|
const invA = 255 - sa;
|
|
270
307
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -273,14 +310,14 @@ var linearLightColor32 = (src, dst) => {
|
|
|
273
310
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
274
311
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
275
312
|
};
|
|
276
|
-
var
|
|
313
|
+
var pinLightFast = (src, dst) => {
|
|
277
314
|
const sa = src >>> 24 & 255;
|
|
278
315
|
if (sa === 0) return dst;
|
|
279
|
-
const dr = dst & 255, dg = dst
|
|
280
|
-
const sr = src & 255, sg = src
|
|
281
|
-
const br = sr < 128 ?
|
|
282
|
-
const bg = sg < 128 ?
|
|
283
|
-
const bb = sb < 128 ?
|
|
316
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
317
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
318
|
+
const br = sr < 128 ? dr < 2 * sr ? dr : 2 * sr : dr > 2 * sr - 256 ? dr : 2 * sr - 256;
|
|
319
|
+
const bg = sg < 128 ? dg < 2 * sg ? dg : 2 * sg : dg > 2 * sg - 256 ? dg : 2 * sg - 256;
|
|
320
|
+
const bb = sb < 128 ? db < 2 * sb ? db : 2 * sb : db > 2 * sb - 256 ? db : 2 * sb - 256;
|
|
284
321
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
285
322
|
const invA = 255 - sa;
|
|
286
323
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -289,14 +326,14 @@ var pinLightColor32 = (src, dst) => {
|
|
|
289
326
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
290
327
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
291
328
|
};
|
|
292
|
-
var
|
|
329
|
+
var hardMixFast = (src, dst) => {
|
|
293
330
|
const sa = src >>> 24 & 255;
|
|
294
331
|
if (sa === 0) return dst;
|
|
295
|
-
const dr = dst & 255, dg = dst
|
|
296
|
-
const sr = src & 255, sg = src
|
|
297
|
-
const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr)) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)))) < 128 ? 0 : 255;
|
|
298
|
-
const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg)) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)))) < 128 ? 0 : 255;
|
|
299
|
-
const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb)) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)))) < 128 ? 0 : 255;
|
|
332
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
333
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
334
|
+
const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr) | 0) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;
|
|
335
|
+
const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg) | 0) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;
|
|
336
|
+
const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb) | 0) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;
|
|
300
337
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
301
338
|
const invA = 255 - sa;
|
|
302
339
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -305,13 +342,16 @@ var hardMixColor32 = (src, dst) => {
|
|
|
305
342
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
306
343
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
307
344
|
};
|
|
308
|
-
var
|
|
345
|
+
var differenceFast = (src, dst) => {
|
|
309
346
|
const sa = src >>> 24 & 255;
|
|
310
347
|
if (sa === 0) return dst;
|
|
311
|
-
const dr = dst & 255, dg = dst
|
|
312
|
-
const
|
|
313
|
-
const
|
|
314
|
-
const
|
|
348
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
349
|
+
const brD = (src & 255) - dr;
|
|
350
|
+
const bgD = (src >>> 8 & 255) - dg;
|
|
351
|
+
const bbD = (src >>> 16 & 255) - db;
|
|
352
|
+
const br = brD < 0 ? -brD : brD;
|
|
353
|
+
const bg = bgD < 0 ? -bgD : bgD;
|
|
354
|
+
const bb = bbD < 0 ? -bbD : bbD;
|
|
315
355
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
316
356
|
const invA = 255 - sa;
|
|
317
357
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -320,11 +360,11 @@ var differenceColor32 = (src, dst) => {
|
|
|
320
360
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
321
361
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
322
362
|
};
|
|
323
|
-
var
|
|
363
|
+
var exclusionFast = (src, dst) => {
|
|
324
364
|
const sa = src >>> 24 & 255;
|
|
325
365
|
if (sa === 0) return dst;
|
|
326
|
-
const dr = dst & 255, dg = dst
|
|
327
|
-
const sr = src & 255, sg = src
|
|
366
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
367
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
328
368
|
const br = dr + sr - (dr * sr >> 7);
|
|
329
369
|
const bg = dg + sg - (dg * sg >> 7);
|
|
330
370
|
const bb = db + sb - (db * sb >> 7);
|
|
@@ -336,14 +376,17 @@ var exclusionColor32 = (src, dst) => {
|
|
|
336
376
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
337
377
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
338
378
|
};
|
|
339
|
-
var
|
|
379
|
+
var subtractFast = (src, dst) => {
|
|
340
380
|
const sa = src >>> 24 & 255;
|
|
341
381
|
if (sa === 0) return dst;
|
|
342
|
-
const dr = dst & 255, dg = dst
|
|
343
|
-
const sr = src & 255, sg = src
|
|
344
|
-
const
|
|
345
|
-
const
|
|
346
|
-
const
|
|
382
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
383
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
384
|
+
const brU = dr - sr;
|
|
385
|
+
const bgU = dg - sg;
|
|
386
|
+
const bbU = db - sb;
|
|
387
|
+
const br = brU < 0 ? 0 : brU;
|
|
388
|
+
const bg = bgU < 0 ? 0 : bgU;
|
|
389
|
+
const bb = bbU < 0 ? 0 : bbU;
|
|
347
390
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
348
391
|
const invA = 255 - sa;
|
|
349
392
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -352,14 +395,14 @@ var subtractColor32 = (src, dst) => {
|
|
|
352
395
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
353
396
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
354
397
|
};
|
|
355
|
-
var
|
|
398
|
+
var divideFast = (src, dst) => {
|
|
356
399
|
const sa = src >>> 24 & 255;
|
|
357
400
|
if (sa === 0) return dst;
|
|
358
|
-
const dr = dst & 255, dg = dst
|
|
359
|
-
const sr = src & 255, sg = src
|
|
360
|
-
const br = sr === 0 ? 255 : Math.min(255, (dr << 8) / sr);
|
|
361
|
-
const bg = sg === 0 ? 255 : Math.min(255, (dg << 8) / sg);
|
|
362
|
-
const bb = sb === 0 ? 255 : Math.min(255, (db << 8) / sb);
|
|
401
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
402
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
403
|
+
const br = sr === 0 ? 255 : Math.min(255, (dr << 8) / sr | 0);
|
|
404
|
+
const bg = sg === 0 ? 255 : Math.min(255, (dg << 8) / sg | 0);
|
|
405
|
+
const bb = sb === 0 ? 255 : Math.min(255, (db << 8) / sb | 0);
|
|
363
406
|
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
364
407
|
const invA = 255 - sa;
|
|
365
408
|
const r = br * sa + dr * invA >> 8;
|
|
@@ -368,77 +411,76 @@ var divideColor32 = (src, dst) => {
|
|
|
368
411
|
const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
|
|
369
412
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
370
413
|
};
|
|
371
|
-
var
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
return BlendMode2;
|
|
396
|
-
})(BlendMode || {});
|
|
397
|
-
var BLENDER_REGISTRY = [
|
|
398
|
-
[0 /* overwrite */, overwriteColor32],
|
|
399
|
-
[1 /* sourceOver */, sourceOverColor32],
|
|
400
|
-
[2 /* darken */, darkenColor32],
|
|
401
|
-
[3 /* multiply */, multiplyColor32],
|
|
402
|
-
[4 /* colorBurn */, colorBurnColor32],
|
|
403
|
-
[5 /* linearBurn */, linearBurnColor32],
|
|
404
|
-
[6 /* darkerColor */, darkerColor32],
|
|
405
|
-
[7 /* lighten */, lightenColor32],
|
|
406
|
-
[8 /* screen */, screenColor32],
|
|
407
|
-
[9 /* colorDodge */, colorDodgeColor32],
|
|
408
|
-
[10 /* linearDodge */, linearDodgeColor32],
|
|
409
|
-
[11 /* lighterColor */, lighterColor32],
|
|
410
|
-
[12 /* overlay */, overlayColor32],
|
|
411
|
-
[13 /* softLight */, softLightColor32],
|
|
412
|
-
[14 /* hardLight */, hardLightColor32],
|
|
413
|
-
[15 /* vividLight */, vividLightColor32],
|
|
414
|
-
[16 /* linearLight */, linearLightColor32],
|
|
415
|
-
[17 /* pinLight */, pinLightColor32],
|
|
416
|
-
[18 /* hardMix */, hardMixColor32],
|
|
417
|
-
[19 /* difference */, differenceColor32],
|
|
418
|
-
[20 /* exclusion */, exclusionColor32],
|
|
419
|
-
[21 /* subtract */, subtractColor32],
|
|
420
|
-
[22 /* divide */, divideColor32]
|
|
414
|
+
var FAST_BLENDER_REGISTRY = [
|
|
415
|
+
[0 /* overwrite */, overwriteFast],
|
|
416
|
+
[1 /* sourceOver */, sourceOverFast],
|
|
417
|
+
[2 /* darken */, darkenFast],
|
|
418
|
+
[3 /* multiply */, multiplyFast],
|
|
419
|
+
[4 /* colorBurn */, colorBurnFast],
|
|
420
|
+
[5 /* linearBurn */, linearBurnFast],
|
|
421
|
+
[6 /* darkerColor */, darkerFast],
|
|
422
|
+
[7 /* lighten */, lightenFast],
|
|
423
|
+
[8 /* screen */, screenFast],
|
|
424
|
+
[9 /* colorDodge */, colorDodgeFast],
|
|
425
|
+
[10 /* linearDodge */, linearDodgeFast],
|
|
426
|
+
[11 /* lighterColor */, lighterFast],
|
|
427
|
+
[12 /* overlay */, overlayFast],
|
|
428
|
+
[13 /* softLight */, softLightFast],
|
|
429
|
+
[14 /* hardLight */, hardLightFast],
|
|
430
|
+
[15 /* vividLight */, vividLightFast],
|
|
431
|
+
[16 /* linearLight */, linearLightFast],
|
|
432
|
+
[17 /* pinLight */, pinLightFast],
|
|
433
|
+
[18 /* hardMix */, hardMixFast],
|
|
434
|
+
[19 /* difference */, differenceFast],
|
|
435
|
+
[20 /* exclusion */, exclusionFast],
|
|
436
|
+
[21 /* subtract */, subtractFast],
|
|
437
|
+
[22 /* divide */, divideFast]
|
|
421
438
|
];
|
|
422
|
-
var
|
|
423
|
-
for (const [index, blend] of
|
|
424
|
-
|
|
439
|
+
var FAST_BLEND_MODES = [];
|
|
440
|
+
for (const [index, blend] of FAST_BLENDER_REGISTRY) {
|
|
441
|
+
FAST_BLEND_MODES[index] = blend;
|
|
425
442
|
}
|
|
426
|
-
var
|
|
427
|
-
|
|
443
|
+
var FAST_BLEND_TO_INDEX = new Map(
|
|
444
|
+
FAST_BLENDER_REGISTRY.map((entry, index) => {
|
|
428
445
|
return [
|
|
429
446
|
entry[1],
|
|
430
447
|
index
|
|
431
448
|
];
|
|
432
449
|
})
|
|
433
450
|
);
|
|
434
|
-
var
|
|
435
|
-
|
|
451
|
+
var INDEX_TO_FAST_BLEND = new Map(
|
|
452
|
+
FAST_BLENDER_REGISTRY.map((entry, index) => {
|
|
436
453
|
return [
|
|
437
454
|
index,
|
|
438
455
|
entry[1]
|
|
439
456
|
];
|
|
440
457
|
})
|
|
441
458
|
);
|
|
459
|
+
var FAST_BLEND_MODE_BY_NAME = {
|
|
460
|
+
overwrite: overwriteFast,
|
|
461
|
+
sourceOver: sourceOverFast,
|
|
462
|
+
darken: darkenFast,
|
|
463
|
+
multiply: multiplyFast,
|
|
464
|
+
colorBurn: colorBurnFast,
|
|
465
|
+
linearBurn: linearBurnFast,
|
|
466
|
+
darkerColor: darkerFast,
|
|
467
|
+
lighten: lightenFast,
|
|
468
|
+
screen: screenFast,
|
|
469
|
+
colorDodge: colorDodgeFast,
|
|
470
|
+
linearDodge: linearDodgeFast,
|
|
471
|
+
lighterColor: lighterFast,
|
|
472
|
+
overlay: overlayFast,
|
|
473
|
+
softLight: softLightFast,
|
|
474
|
+
hardLight: hardLightFast,
|
|
475
|
+
vividLight: vividLightFast,
|
|
476
|
+
linearLight: linearLightFast,
|
|
477
|
+
pinLight: pinLightFast,
|
|
478
|
+
hardMix: hardMixFast,
|
|
479
|
+
difference: differenceFast,
|
|
480
|
+
exclusion: exclusionFast,
|
|
481
|
+
subtract: subtractFast,
|
|
482
|
+
divide: divideFast
|
|
483
|
+
};
|
|
442
484
|
|
|
443
485
|
// src/_types.ts
|
|
444
486
|
var MaskType = /* @__PURE__ */ ((MaskType2) => {
|
|
@@ -799,6 +841,477 @@ function floodFillSelection(img, startX, startY, {
|
|
|
799
841
|
};
|
|
800
842
|
}
|
|
801
843
|
|
|
844
|
+
// src/BlendModes/blend-modes-perfect.ts
|
|
845
|
+
var overwritePerfect = (src, _dst) => src;
|
|
846
|
+
var sourceOverPerfect = (src, dst) => {
|
|
847
|
+
const sa = src >>> 24 & 255;
|
|
848
|
+
if (sa === 255) return src;
|
|
849
|
+
if (sa === 0) return dst;
|
|
850
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
851
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
852
|
+
const da = dst >>> 24 & 255;
|
|
853
|
+
const invA = 255 - sa;
|
|
854
|
+
const r = (sr * sa + dr * invA) / 255 | 0;
|
|
855
|
+
const g = (sg * sa + dg * invA) / 255 | 0;
|
|
856
|
+
const b = (sb * sa + db * invA) / 255 | 0;
|
|
857
|
+
const a = (255 * sa + da * invA) / 255 | 0;
|
|
858
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
859
|
+
};
|
|
860
|
+
var darkenPerfect = (src, dst) => {
|
|
861
|
+
const sa = src >>> 24 & 255;
|
|
862
|
+
if (sa === 0) return dst;
|
|
863
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
864
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
865
|
+
const br = sr < dr ? sr : dr;
|
|
866
|
+
const bg = sg < dg ? sg : dg;
|
|
867
|
+
const bb = sb < db ? sb : db;
|
|
868
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
869
|
+
const invA = 255 - sa;
|
|
870
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
871
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
872
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
873
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
874
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
875
|
+
};
|
|
876
|
+
var multiplyPerfect = (src, dst) => {
|
|
877
|
+
const sa = src >>> 24 & 255;
|
|
878
|
+
if (sa === 0) return dst;
|
|
879
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
880
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
881
|
+
const br = sr * dr / 255 | 0;
|
|
882
|
+
const bg = sg * dg / 255 | 0;
|
|
883
|
+
const bb = sb * db / 255 | 0;
|
|
884
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
885
|
+
const invA = 255 - sa;
|
|
886
|
+
const da = dst >>> 24 & 255;
|
|
887
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
888
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
889
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
890
|
+
const a = (255 * sa + da * invA) / 255 | 0;
|
|
891
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
892
|
+
};
|
|
893
|
+
var colorBurnPerfect = (src, dst) => {
|
|
894
|
+
const sa = src >>> 24 & 255;
|
|
895
|
+
if (sa === 0) return dst;
|
|
896
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
897
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
898
|
+
const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / sr | 0));
|
|
899
|
+
const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / sg | 0));
|
|
900
|
+
const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / sb | 0));
|
|
901
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
902
|
+
const invA = 255 - sa;
|
|
903
|
+
const da = dst >>> 24 & 255;
|
|
904
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
905
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
906
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
907
|
+
const a = (255 * sa + da * invA) / 255 | 0;
|
|
908
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
909
|
+
};
|
|
910
|
+
var linearBurnPerfect = (src, dst) => {
|
|
911
|
+
const sa = src >>> 24 & 255;
|
|
912
|
+
if (sa === 0) return dst;
|
|
913
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
914
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
915
|
+
const brU = dr + sr - 255;
|
|
916
|
+
const br = brU < 0 ? 0 : brU;
|
|
917
|
+
const bgU = dg + sg - 255;
|
|
918
|
+
const bg = bgU < 0 ? 0 : bgU;
|
|
919
|
+
const bbU = db + sb - 255;
|
|
920
|
+
const bb = bbU < 0 ? 0 : bbU;
|
|
921
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
922
|
+
const invA = 255 - sa;
|
|
923
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
924
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
925
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
926
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
927
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
928
|
+
};
|
|
929
|
+
var darkerPerfect = (src, dst) => {
|
|
930
|
+
const sa = src >>> 24 & 255;
|
|
931
|
+
if (sa === 0) return dst;
|
|
932
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
933
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
934
|
+
const lumSrc = sr * 77 + sg * 151 + sb * 28;
|
|
935
|
+
const lumDst = dr * 77 + dg * 151 + db * 28;
|
|
936
|
+
let br, bg, bb;
|
|
937
|
+
if (lumSrc < lumDst) {
|
|
938
|
+
br = sr;
|
|
939
|
+
bg = sg;
|
|
940
|
+
bb = sb;
|
|
941
|
+
} else {
|
|
942
|
+
br = dr;
|
|
943
|
+
bg = dg;
|
|
944
|
+
bb = db;
|
|
945
|
+
}
|
|
946
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
947
|
+
const invA = 255 - sa;
|
|
948
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
949
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
950
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
951
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
952
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
953
|
+
};
|
|
954
|
+
var lightenPerfect = (src, dst) => {
|
|
955
|
+
const sa = src >>> 24 & 255;
|
|
956
|
+
if (sa === 0) return dst;
|
|
957
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
958
|
+
const br = (src & 255) > dr ? src & 255 : dr;
|
|
959
|
+
const bg = (src >>> 8 & 255) > dg ? src >>> 8 & 255 : dg;
|
|
960
|
+
const bb = (src >>> 16 & 255) > db ? src >>> 16 & 255 : db;
|
|
961
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
962
|
+
const invA = 255 - sa;
|
|
963
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
964
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
965
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
966
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
967
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
968
|
+
};
|
|
969
|
+
var screenPerfect = (src, dst) => {
|
|
970
|
+
const sa = src >>> 24 & 255;
|
|
971
|
+
if (sa === 0) return dst;
|
|
972
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
973
|
+
const br = 255 - ((255 - (src & 255)) * (255 - dr) / 255 | 0);
|
|
974
|
+
const bg = 255 - ((255 - (src >>> 8 & 255)) * (255 - dg) / 255 | 0);
|
|
975
|
+
const bb = 255 - ((255 - (src >>> 16 & 255)) * (255 - db) / 255 | 0);
|
|
976
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
977
|
+
const invA = 255 - sa;
|
|
978
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
979
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
980
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
981
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
982
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
983
|
+
};
|
|
984
|
+
var colorDodgePerfect = (src, dst) => {
|
|
985
|
+
const sa = src >>> 24 & 255;
|
|
986
|
+
if (sa === 0) return dst;
|
|
987
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
988
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
989
|
+
const br = sr === 255 ? 255 : Math.min(255, dr * 255 / (255 - sr) | 0);
|
|
990
|
+
const bg = sg === 255 ? 255 : Math.min(255, dg * 255 / (255 - sg) | 0);
|
|
991
|
+
const bb = sb === 255 ? 255 : Math.min(255, db * 255 / (255 - sb) | 0);
|
|
992
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
993
|
+
const invA = 255 - sa;
|
|
994
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
995
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
996
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
997
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
998
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
999
|
+
};
|
|
1000
|
+
var linearDodgePerfect = (src, dst) => {
|
|
1001
|
+
const sa = src >>> 24 & 255;
|
|
1002
|
+
if (sa === 0) return dst;
|
|
1003
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1004
|
+
const brU = (src & 255) + dr;
|
|
1005
|
+
const br = brU > 255 ? 255 : brU;
|
|
1006
|
+
const bgU = (src >>> 8 & 255) + dg;
|
|
1007
|
+
const bg = bgU > 255 ? 255 : bgU;
|
|
1008
|
+
const bbU = (src >>> 16 & 255) + db;
|
|
1009
|
+
const bb = bbU > 255 ? 255 : bbU;
|
|
1010
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1011
|
+
const invA = 255 - sa;
|
|
1012
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1013
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1014
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1015
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1016
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1017
|
+
};
|
|
1018
|
+
var lighterPerfect = (src, dst) => {
|
|
1019
|
+
const sa = src >>> 24 & 255;
|
|
1020
|
+
if (sa === 0) return dst;
|
|
1021
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1022
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1023
|
+
const lumSrc = sr * 77 + sg * 151 + sb * 28;
|
|
1024
|
+
const lumDst = dr * 77 + dg * 151 + db * 28;
|
|
1025
|
+
let br, bg, bb;
|
|
1026
|
+
if (lumSrc > lumDst) {
|
|
1027
|
+
br = sr;
|
|
1028
|
+
bg = sg;
|
|
1029
|
+
bb = sb;
|
|
1030
|
+
} else {
|
|
1031
|
+
br = dr;
|
|
1032
|
+
bg = dg;
|
|
1033
|
+
bb = db;
|
|
1034
|
+
}
|
|
1035
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1036
|
+
const invA = 255 - sa;
|
|
1037
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1038
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1039
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1040
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1041
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1042
|
+
};
|
|
1043
|
+
var overlayPerfect = (src, dst) => {
|
|
1044
|
+
const sa = src >>> 24 & 255;
|
|
1045
|
+
if (sa === 0) return dst;
|
|
1046
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1047
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1048
|
+
const br = dr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);
|
|
1049
|
+
const bg = dg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);
|
|
1050
|
+
const bb = db < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);
|
|
1051
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1052
|
+
const invA = 255 - sa;
|
|
1053
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1054
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1055
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1056
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1057
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1058
|
+
};
|
|
1059
|
+
var softLightPerfect = (src, dst) => {
|
|
1060
|
+
const sa = src >>> 24 & 255;
|
|
1061
|
+
if (sa === 0) return dst;
|
|
1062
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1063
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1064
|
+
const br = ((255 - dr) * (sr * dr / 255 | 0) + dr * (255 - ((255 - sr) * (255 - dr) / 255 | 0))) / 255 | 0;
|
|
1065
|
+
const bg = ((255 - dg) * (sg * dg / 255 | 0) + dg * (255 - ((255 - sg) * (255 - dg) / 255 | 0))) / 255 | 0;
|
|
1066
|
+
const bb = ((255 - db) * (sb * db / 255 | 0) + db * (255 - ((255 - sb) * (255 - db) / 255 | 0))) / 255 | 0;
|
|
1067
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1068
|
+
const invA = 255 - sa;
|
|
1069
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1070
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1071
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1072
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1073
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1074
|
+
};
|
|
1075
|
+
var hardLightPerfect = (src, dst) => {
|
|
1076
|
+
const sa = src >>> 24 & 255;
|
|
1077
|
+
if (sa === 0) return dst;
|
|
1078
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1079
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1080
|
+
const br = sr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);
|
|
1081
|
+
const bg = sg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);
|
|
1082
|
+
const bb = sb < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);
|
|
1083
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1084
|
+
const invA = 255 - sa;
|
|
1085
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1086
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1087
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1088
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1089
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1090
|
+
};
|
|
1091
|
+
var vividLightPerfect = (src, dst) => {
|
|
1092
|
+
const sa = src >>> 24 & 255;
|
|
1093
|
+
if (sa === 0) return dst;
|
|
1094
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1095
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1096
|
+
const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0);
|
|
1097
|
+
const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0);
|
|
1098
|
+
const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0);
|
|
1099
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1100
|
+
const invA = 255 - sa;
|
|
1101
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1102
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1103
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1104
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1105
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1106
|
+
};
|
|
1107
|
+
var linearLightPerfect = (src, dst) => {
|
|
1108
|
+
const sa = src >>> 24 & 255;
|
|
1109
|
+
if (sa === 0) return dst;
|
|
1110
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1111
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1112
|
+
const brU = dr + 2 * sr - 255;
|
|
1113
|
+
const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;
|
|
1114
|
+
const bgU = dg + 2 * sg - 255;
|
|
1115
|
+
const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;
|
|
1116
|
+
const bbU = db + 2 * sb - 255;
|
|
1117
|
+
const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;
|
|
1118
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1119
|
+
const invA = 255 - sa;
|
|
1120
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1121
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1122
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1123
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1124
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1125
|
+
};
|
|
1126
|
+
var pinLightPerfect = (src, dst) => {
|
|
1127
|
+
const sa = src >>> 24 & 255;
|
|
1128
|
+
if (sa === 0) return dst;
|
|
1129
|
+
const dr = dst & 255;
|
|
1130
|
+
const dg = dst >>> 8 & 255;
|
|
1131
|
+
const db = dst >>> 16 & 255;
|
|
1132
|
+
const sr = src & 255;
|
|
1133
|
+
const sg = src >>> 8 & 255;
|
|
1134
|
+
const sb = src >>> 16 & 255;
|
|
1135
|
+
const br = sr < 128 ? dr < sr << 1 ? dr : sr << 1 : dr > sr - 128 << 1 ? dr : sr - 128 << 1;
|
|
1136
|
+
const bg = sg < 128 ? dg < sg << 1 ? dg : sg << 1 : dg > sg - 128 << 1 ? dg : sg - 128 << 1;
|
|
1137
|
+
const bb = sb < 128 ? db < sb << 1 ? db : sb << 1 : db > sb - 128 << 1 ? db : sb - 128 << 1;
|
|
1138
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1139
|
+
const invA = 255 - sa;
|
|
1140
|
+
const da = dst >>> 24 & 255;
|
|
1141
|
+
const r = (br * sa + dr * invA + 128) / 255 | 0;
|
|
1142
|
+
const g = (bg * sa + dg * invA + 128) / 255 | 0;
|
|
1143
|
+
const b = (bb * sa + db * invA + 128) / 255 | 0;
|
|
1144
|
+
const a = (255 * sa + da * invA + 128) / 255 | 0;
|
|
1145
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1146
|
+
};
|
|
1147
|
+
var hardMixPerfect = (src, dst) => {
|
|
1148
|
+
const sa = src >>> 24 & 255;
|
|
1149
|
+
if (sa === 0) return dst;
|
|
1150
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1151
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1152
|
+
const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;
|
|
1153
|
+
const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;
|
|
1154
|
+
const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;
|
|
1155
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1156
|
+
const invA = 255 - sa;
|
|
1157
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1158
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1159
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1160
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1161
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1162
|
+
};
|
|
1163
|
+
var differencePerfect = (src, dst) => {
|
|
1164
|
+
const sa = src >>> 24 & 255;
|
|
1165
|
+
if (sa === 0) return dst;
|
|
1166
|
+
const dr = dst & 255;
|
|
1167
|
+
const dg = dst >>> 8 & 255;
|
|
1168
|
+
const db = dst >>> 16 & 255;
|
|
1169
|
+
const sr = src & 255;
|
|
1170
|
+
const sg = src >>> 8 & 255;
|
|
1171
|
+
const sb = src >>> 16 & 255;
|
|
1172
|
+
const br = Math.abs(dr - sr);
|
|
1173
|
+
const bg = Math.abs(dg - sg);
|
|
1174
|
+
const bb = Math.abs(db - sb);
|
|
1175
|
+
if (sa === 255) {
|
|
1176
|
+
return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1177
|
+
}
|
|
1178
|
+
const invA = 255 - sa;
|
|
1179
|
+
const da = dst >>> 24 & 255;
|
|
1180
|
+
const r = (br * sa + dr * invA + 128) / 255 | 0;
|
|
1181
|
+
const g = (bg * sa + dg * invA + 128) / 255 | 0;
|
|
1182
|
+
const b = (bb * sa + db * invA + 128) / 255 | 0;
|
|
1183
|
+
const a = (255 * sa + da * invA + 128) / 255 | 0;
|
|
1184
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1185
|
+
};
|
|
1186
|
+
var exclusionPerfect = (src, dst) => {
|
|
1187
|
+
const sa = src >>> 24 & 255;
|
|
1188
|
+
if (sa === 0) return dst;
|
|
1189
|
+
const dr = dst & 255;
|
|
1190
|
+
const dg = dst >>> 8 & 255;
|
|
1191
|
+
const db = dst >>> 16 & 255;
|
|
1192
|
+
const sr = src & 255;
|
|
1193
|
+
const sg = src >>> 8 & 255;
|
|
1194
|
+
const sb = src >>> 16 & 255;
|
|
1195
|
+
const br = dr + sr - (dr * sr >> 7);
|
|
1196
|
+
const bg = dg + sg - (dg * sg >> 7);
|
|
1197
|
+
const bb = db + sb - (db * sb >> 7);
|
|
1198
|
+
if (sa === 255) {
|
|
1199
|
+
return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1200
|
+
}
|
|
1201
|
+
const invA = 255 - sa;
|
|
1202
|
+
const da = dst >>> 24 & 255;
|
|
1203
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1204
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1205
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1206
|
+
const a = (255 * sa + da * invA) / 255 | 0;
|
|
1207
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1208
|
+
};
|
|
1209
|
+
var subtractPerfect = (src, dst) => {
|
|
1210
|
+
const sa = src >>> 24 & 255;
|
|
1211
|
+
if (sa === 0) return dst;
|
|
1212
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1213
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1214
|
+
const brU = dr - sr;
|
|
1215
|
+
const br = brU < 0 ? 0 : brU;
|
|
1216
|
+
const bgU = dg - sg;
|
|
1217
|
+
const bg = bgU < 0 ? 0 : bgU;
|
|
1218
|
+
const bbU = db - sb;
|
|
1219
|
+
const bb = bbU < 0 ? 0 : bbU;
|
|
1220
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1221
|
+
const invA = 255 - sa;
|
|
1222
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1223
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1224
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1225
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1226
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1227
|
+
};
|
|
1228
|
+
var dividePerfect = (src, dst) => {
|
|
1229
|
+
const sa = src >>> 24 & 255;
|
|
1230
|
+
if (sa === 0) return dst;
|
|
1231
|
+
const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
|
|
1232
|
+
const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
|
|
1233
|
+
const br = sr === 0 ? 255 : Math.min(255, dr * 255 / sr | 0);
|
|
1234
|
+
const bg = sg === 0 ? 255 : Math.min(255, dg * 255 / sg | 0);
|
|
1235
|
+
const bb = sb === 0 ? 255 : Math.min(255, db * 255 / sb | 0);
|
|
1236
|
+
if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
|
|
1237
|
+
const invA = 255 - sa;
|
|
1238
|
+
const r = (br * sa + dr * invA) / 255 | 0;
|
|
1239
|
+
const g = (bg * sa + dg * invA) / 255 | 0;
|
|
1240
|
+
const b = (bb * sa + db * invA) / 255 | 0;
|
|
1241
|
+
const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
|
|
1242
|
+
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
1243
|
+
};
|
|
1244
|
+
var PERFECT_BLENDER_REGISTRY = [
|
|
1245
|
+
[0 /* overwrite */, overwritePerfect],
|
|
1246
|
+
[1 /* sourceOver */, sourceOverPerfect],
|
|
1247
|
+
[2 /* darken */, darkenPerfect],
|
|
1248
|
+
[3 /* multiply */, multiplyPerfect],
|
|
1249
|
+
[4 /* colorBurn */, colorBurnPerfect],
|
|
1250
|
+
[5 /* linearBurn */, linearBurnPerfect],
|
|
1251
|
+
[6 /* darkerColor */, darkerPerfect],
|
|
1252
|
+
[7 /* lighten */, lightenPerfect],
|
|
1253
|
+
[8 /* screen */, screenPerfect],
|
|
1254
|
+
[9 /* colorDodge */, colorDodgePerfect],
|
|
1255
|
+
[10 /* linearDodge */, linearDodgePerfect],
|
|
1256
|
+
[11 /* lighterColor */, lighterPerfect],
|
|
1257
|
+
[12 /* overlay */, overlayPerfect],
|
|
1258
|
+
[13 /* softLight */, softLightPerfect],
|
|
1259
|
+
[14 /* hardLight */, hardLightPerfect],
|
|
1260
|
+
[15 /* vividLight */, vividLightPerfect],
|
|
1261
|
+
[16 /* linearLight */, linearLightPerfect],
|
|
1262
|
+
[17 /* pinLight */, pinLightPerfect],
|
|
1263
|
+
[18 /* hardMix */, hardMixPerfect],
|
|
1264
|
+
[19 /* difference */, differencePerfect],
|
|
1265
|
+
[20 /* exclusion */, exclusionPerfect],
|
|
1266
|
+
[21 /* subtract */, subtractPerfect],
|
|
1267
|
+
[22 /* divide */, dividePerfect]
|
|
1268
|
+
];
|
|
1269
|
+
var PERFECT_BLEND_MODES = [];
|
|
1270
|
+
for (const [index, blend] of PERFECT_BLENDER_REGISTRY) {
|
|
1271
|
+
PERFECT_BLEND_MODES[index] = blend;
|
|
1272
|
+
}
|
|
1273
|
+
var PERFECT_BLEND_TO_INDEX = new Map(
|
|
1274
|
+
PERFECT_BLENDER_REGISTRY.map((entry, index) => {
|
|
1275
|
+
return [
|
|
1276
|
+
entry[1],
|
|
1277
|
+
index
|
|
1278
|
+
];
|
|
1279
|
+
})
|
|
1280
|
+
);
|
|
1281
|
+
var INDEX_TO_PERFECT_BLEND = new Map(
|
|
1282
|
+
PERFECT_BLENDER_REGISTRY.map((entry, index) => {
|
|
1283
|
+
return [
|
|
1284
|
+
index,
|
|
1285
|
+
entry[1]
|
|
1286
|
+
];
|
|
1287
|
+
})
|
|
1288
|
+
);
|
|
1289
|
+
var PERFECT_BLEND_MODE_BY_NAME = {
|
|
1290
|
+
overwrite: overwritePerfect,
|
|
1291
|
+
sourceOver: sourceOverPerfect,
|
|
1292
|
+
darken: darkenPerfect,
|
|
1293
|
+
multiply: multiplyPerfect,
|
|
1294
|
+
colorBurn: colorBurnPerfect,
|
|
1295
|
+
linearBurn: linearBurnPerfect,
|
|
1296
|
+
darkerColor: darkerPerfect,
|
|
1297
|
+
lighten: lightenPerfect,
|
|
1298
|
+
screen: screenPerfect,
|
|
1299
|
+
colorDodge: colorDodgePerfect,
|
|
1300
|
+
linearDodge: linearDodgePerfect,
|
|
1301
|
+
lighterColor: lighterPerfect,
|
|
1302
|
+
overlay: overlayPerfect,
|
|
1303
|
+
softLight: softLightPerfect,
|
|
1304
|
+
hardLight: hardLightPerfect,
|
|
1305
|
+
vividLight: vividLightPerfect,
|
|
1306
|
+
linearLight: linearLightPerfect,
|
|
1307
|
+
pinLight: pinLightPerfect,
|
|
1308
|
+
hardMix: hardMixPerfect,
|
|
1309
|
+
difference: differencePerfect,
|
|
1310
|
+
exclusion: exclusionPerfect,
|
|
1311
|
+
subtract: subtractPerfect,
|
|
1312
|
+
divide: dividePerfect
|
|
1313
|
+
};
|
|
1314
|
+
|
|
802
1315
|
// src/Canvas/_constants.ts
|
|
803
1316
|
var OFFSCREEN_CANVAS_CTX_FAILED = "Failed to create OffscreenCanvas context";
|
|
804
1317
|
var CANVAS_CTX_FAILED = "Failed to create Canvas context";
|
|
@@ -1079,40 +1592,27 @@ function writeImageDataPixels(imageData, data, _x, _y, _w, _h) {
|
|
|
1079
1592
|
function makeIndexedImage(imageData) {
|
|
1080
1593
|
const width = imageData.width;
|
|
1081
1594
|
const height = imageData.height;
|
|
1082
|
-
const rawData = imageData.data;
|
|
1083
|
-
const indexedData = new Int32Array(rawData.length
|
|
1595
|
+
const rawData = new Uint32Array(imageData.data.buffer);
|
|
1596
|
+
const indexedData = new Int32Array(rawData.length);
|
|
1084
1597
|
const colorMap = /* @__PURE__ */ new Map();
|
|
1085
1598
|
const tempPalette = [];
|
|
1086
|
-
const
|
|
1599
|
+
const transparentColor = 0;
|
|
1087
1600
|
const transparentPalletIndex = 0;
|
|
1088
|
-
colorMap.set(
|
|
1089
|
-
tempPalette.push(
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
const g = rawData[i * 4 + 1];
|
|
1096
|
-
const b = rawData[i * 4 + 2];
|
|
1097
|
-
const a = rawData[i * 4 + 3];
|
|
1098
|
-
let key;
|
|
1099
|
-
if (a === 0) {
|
|
1100
|
-
key = transparentKey;
|
|
1101
|
-
} else {
|
|
1102
|
-
key = `${r},${g},${b},${a}`;
|
|
1103
|
-
}
|
|
1104
|
-
let id = colorMap.get(key);
|
|
1601
|
+
colorMap.set(transparentColor, transparentPalletIndex);
|
|
1602
|
+
tempPalette.push(transparentColor);
|
|
1603
|
+
for (let i = 0; i < rawData.length; i++) {
|
|
1604
|
+
const pixel = rawData[i];
|
|
1605
|
+
const isTransparent = pixel >>> 24 === 0;
|
|
1606
|
+
const colorKey = isTransparent ? transparentColor : pixel;
|
|
1607
|
+
let id = colorMap.get(colorKey);
|
|
1105
1608
|
if (id === void 0) {
|
|
1106
1609
|
id = colorMap.size;
|
|
1107
|
-
tempPalette.push(
|
|
1108
|
-
|
|
1109
|
-
tempPalette.push(b);
|
|
1110
|
-
tempPalette.push(a);
|
|
1111
|
-
colorMap.set(key, id);
|
|
1610
|
+
tempPalette.push(colorKey);
|
|
1611
|
+
colorMap.set(colorKey, id);
|
|
1112
1612
|
}
|
|
1113
1613
|
indexedData[i] = id;
|
|
1114
1614
|
}
|
|
1115
|
-
const palette = new
|
|
1615
|
+
const palette = new Int32Array(tempPalette);
|
|
1116
1616
|
return {
|
|
1117
1617
|
width,
|
|
1118
1618
|
height,
|
|
@@ -1334,7 +1834,7 @@ function mergeMasks(dst, dstWidth, src, opts) {
|
|
|
1334
1834
|
}
|
|
1335
1835
|
|
|
1336
1836
|
// src/PixelData/PixelData.ts
|
|
1337
|
-
var PixelData = class {
|
|
1837
|
+
var PixelData = class _PixelData {
|
|
1338
1838
|
constructor(imageData) {
|
|
1339
1839
|
this.imageData = imageData;
|
|
1340
1840
|
this.width = imageData.width;
|
|
@@ -1342,12 +1842,22 @@ var PixelData = class {
|
|
|
1342
1842
|
this.data32 = new Uint32Array(
|
|
1343
1843
|
imageData.data.buffer,
|
|
1344
1844
|
imageData.data.byteOffset,
|
|
1845
|
+
// Shift right by 2 is a fast bitwise division by 4.
|
|
1345
1846
|
imageData.data.byteLength >> 2
|
|
1346
1847
|
);
|
|
1347
1848
|
}
|
|
1348
1849
|
data32;
|
|
1349
1850
|
width;
|
|
1350
1851
|
height;
|
|
1852
|
+
copy() {
|
|
1853
|
+
const buffer = new Uint8ClampedArray(this.data32.buffer.slice(0));
|
|
1854
|
+
const imageData = {
|
|
1855
|
+
data: buffer,
|
|
1856
|
+
width: this.width,
|
|
1857
|
+
height: this.height
|
|
1858
|
+
};
|
|
1859
|
+
return new _PixelData(imageData);
|
|
1860
|
+
}
|
|
1351
1861
|
};
|
|
1352
1862
|
|
|
1353
1863
|
// src/PixelData/applyMaskToPixelData.ts
|
|
@@ -1445,7 +1955,7 @@ function blendColorPixelData(dst, color, opts) {
|
|
|
1445
1955
|
w: width = dst.width,
|
|
1446
1956
|
h: height = dst.height,
|
|
1447
1957
|
alpha: globalAlpha = 255,
|
|
1448
|
-
blendFn =
|
|
1958
|
+
blendFn = FAST_BLEND_MODES[1 /* sourceOver */],
|
|
1449
1959
|
mask,
|
|
1450
1960
|
maskType = 0 /* ALPHA */,
|
|
1451
1961
|
mw,
|
|
@@ -1554,7 +2064,7 @@ function blendPixelData(dst, src, opts) {
|
|
|
1554
2064
|
w: width = src.width,
|
|
1555
2065
|
h: height = src.height,
|
|
1556
2066
|
alpha: globalAlpha = 255,
|
|
1557
|
-
blendFn =
|
|
2067
|
+
blendFn = FAST_BLEND_MODES[1 /* sourceOver */],
|
|
1558
2068
|
mask,
|
|
1559
2069
|
maskType = 0 /* ALPHA */,
|
|
1560
2070
|
mw,
|
|
@@ -1744,10 +2254,17 @@ function invertPixelData(pixelData) {
|
|
|
1744
2254
|
}
|
|
1745
2255
|
export {
|
|
1746
2256
|
BlendMode,
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
2257
|
+
FAST_BLENDER_REGISTRY,
|
|
2258
|
+
FAST_BLEND_MODES,
|
|
2259
|
+
FAST_BLEND_MODE_BY_NAME,
|
|
2260
|
+
FAST_BLEND_TO_INDEX,
|
|
2261
|
+
INDEX_TO_FAST_BLEND,
|
|
2262
|
+
INDEX_TO_PERFECT_BLEND,
|
|
1750
2263
|
MaskType,
|
|
2264
|
+
PERFECT_BLENDER_REGISTRY,
|
|
2265
|
+
PERFECT_BLEND_MODES,
|
|
2266
|
+
PERFECT_BLEND_MODE_BY_NAME,
|
|
2267
|
+
PERFECT_BLEND_TO_INDEX,
|
|
1751
2268
|
PixelData,
|
|
1752
2269
|
UnsupportedFormatError,
|
|
1753
2270
|
applyMaskToPixelData,
|
|
@@ -1758,20 +2275,27 @@ export {
|
|
|
1758
2275
|
clearPixelData,
|
|
1759
2276
|
color32ToCssRGBA,
|
|
1760
2277
|
color32ToHex,
|
|
1761
|
-
|
|
2278
|
+
colorBurnFast,
|
|
2279
|
+
colorBurnPerfect,
|
|
1762
2280
|
colorDistance,
|
|
1763
|
-
|
|
2281
|
+
colorDodgeFast,
|
|
2282
|
+
colorDodgePerfect,
|
|
1764
2283
|
copyImageData,
|
|
1765
2284
|
copyImageDataLike,
|
|
1766
2285
|
copyMask,
|
|
1767
|
-
|
|
1768
|
-
|
|
2286
|
+
darkenFast,
|
|
2287
|
+
darkenPerfect,
|
|
2288
|
+
darkerFast,
|
|
2289
|
+
darkerPerfect,
|
|
1769
2290
|
deserializeImageData,
|
|
1770
2291
|
deserializeNullableImageData,
|
|
1771
2292
|
deserializeRawImageData,
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
2293
|
+
differenceFast,
|
|
2294
|
+
differencePerfect,
|
|
2295
|
+
divideFast,
|
|
2296
|
+
dividePerfect,
|
|
2297
|
+
exclusionFast,
|
|
2298
|
+
exclusionPerfect,
|
|
1775
2299
|
extractImageDataPixels,
|
|
1776
2300
|
extractMask,
|
|
1777
2301
|
fileInputChangeToImageData,
|
|
@@ -1780,8 +2304,10 @@ export {
|
|
|
1780
2304
|
floodFillSelection,
|
|
1781
2305
|
getImageDataFromClipboard,
|
|
1782
2306
|
getSupportedPixelFormats,
|
|
1783
|
-
|
|
1784
|
-
|
|
2307
|
+
hardLightFast,
|
|
2308
|
+
hardLightPerfect,
|
|
2309
|
+
hardMixFast,
|
|
2310
|
+
hardMixPerfect,
|
|
1785
2311
|
imageDataToAlphaMask,
|
|
1786
2312
|
imageDataToDataUrl,
|
|
1787
2313
|
imageDataToImgBlob,
|
|
@@ -1793,29 +2319,42 @@ export {
|
|
|
1793
2319
|
invertPixelData,
|
|
1794
2320
|
lerpColor32,
|
|
1795
2321
|
lerpColor32Fast,
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
2322
|
+
lightenFast,
|
|
2323
|
+
lightenPerfect,
|
|
2324
|
+
lighterFast,
|
|
2325
|
+
lighterPerfect,
|
|
2326
|
+
linearBurnFast,
|
|
2327
|
+
linearBurnPerfect,
|
|
2328
|
+
linearDodgeFast,
|
|
2329
|
+
linearDodgePerfect,
|
|
2330
|
+
linearLightFast,
|
|
2331
|
+
linearLightPerfect,
|
|
1801
2332
|
makeIndexedImage,
|
|
1802
2333
|
makePixelCanvas,
|
|
1803
2334
|
makeReusableCanvas,
|
|
1804
2335
|
mergeMasks,
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
2336
|
+
multiplyFast,
|
|
2337
|
+
multiplyPerfect,
|
|
2338
|
+
overlayFast,
|
|
2339
|
+
overlayPerfect,
|
|
2340
|
+
overwriteFast,
|
|
2341
|
+
overwritePerfect,
|
|
1808
2342
|
packColor,
|
|
1809
2343
|
packRGBA,
|
|
1810
|
-
|
|
2344
|
+
pinLightFast,
|
|
2345
|
+
pinLightPerfect,
|
|
1811
2346
|
pixelDataToAlphaMask,
|
|
1812
2347
|
resizeImageData,
|
|
1813
|
-
|
|
2348
|
+
screenFast,
|
|
2349
|
+
screenPerfect,
|
|
1814
2350
|
serializeImageData,
|
|
1815
2351
|
serializeNullableImageData,
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
2352
|
+
softLightFast,
|
|
2353
|
+
softLightPerfect,
|
|
2354
|
+
sourceOverFast,
|
|
2355
|
+
sourceOverPerfect,
|
|
2356
|
+
subtractFast,
|
|
2357
|
+
subtractPerfect,
|
|
1819
2358
|
trimRectBounds,
|
|
1820
2359
|
unpackAlpha,
|
|
1821
2360
|
unpackBlue,
|
|
@@ -1823,7 +2362,8 @@ export {
|
|
|
1823
2362
|
unpackColorTo,
|
|
1824
2363
|
unpackGreen,
|
|
1825
2364
|
unpackRed,
|
|
1826
|
-
|
|
2365
|
+
vividLightFast,
|
|
2366
|
+
vividLightPerfect,
|
|
1827
2367
|
writeImageDataPixels,
|
|
1828
2368
|
writeImageDataToClipboard,
|
|
1829
2369
|
writeImgBlobToClipboard
|