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.
@@ -21,10 +21,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  BlendMode: () => BlendMode,
24
- COLOR_32_BLEND_MODES: () => COLOR_32_BLEND_MODES,
25
- COLOR_32_BLEND_TO_INDEX: () => COLOR_32_BLEND_TO_INDEX,
26
- INDEX_TO_COLOR_32_BLEND: () => INDEX_TO_COLOR_32_BLEND,
24
+ FAST_BLENDER_REGISTRY: () => FAST_BLENDER_REGISTRY,
25
+ FAST_BLEND_MODES: () => FAST_BLEND_MODES,
26
+ FAST_BLEND_MODE_BY_NAME: () => FAST_BLEND_MODE_BY_NAME,
27
+ FAST_BLEND_TO_INDEX: () => FAST_BLEND_TO_INDEX,
28
+ INDEX_TO_FAST_BLEND: () => INDEX_TO_FAST_BLEND,
29
+ INDEX_TO_PERFECT_BLEND: () => INDEX_TO_PERFECT_BLEND,
27
30
  MaskType: () => MaskType,
31
+ PERFECT_BLENDER_REGISTRY: () => PERFECT_BLENDER_REGISTRY,
32
+ PERFECT_BLEND_MODES: () => PERFECT_BLEND_MODES,
33
+ PERFECT_BLEND_MODE_BY_NAME: () => PERFECT_BLEND_MODE_BY_NAME,
34
+ PERFECT_BLEND_TO_INDEX: () => PERFECT_BLEND_TO_INDEX,
28
35
  PixelData: () => PixelData,
29
36
  UnsupportedFormatError: () => UnsupportedFormatError,
30
37
  applyMaskToPixelData: () => applyMaskToPixelData,
@@ -35,20 +42,27 @@ __export(src_exports, {
35
42
  clearPixelData: () => clearPixelData,
36
43
  color32ToCssRGBA: () => color32ToCssRGBA,
37
44
  color32ToHex: () => color32ToHex,
38
- colorBurnColor32: () => colorBurnColor32,
45
+ colorBurnFast: () => colorBurnFast,
46
+ colorBurnPerfect: () => colorBurnPerfect,
39
47
  colorDistance: () => colorDistance,
40
- colorDodgeColor32: () => colorDodgeColor32,
48
+ colorDodgeFast: () => colorDodgeFast,
49
+ colorDodgePerfect: () => colorDodgePerfect,
41
50
  copyImageData: () => copyImageData,
42
51
  copyImageDataLike: () => copyImageDataLike,
43
52
  copyMask: () => copyMask,
44
- darkenColor32: () => darkenColor32,
45
- darkerColor32: () => darkerColor32,
53
+ darkenFast: () => darkenFast,
54
+ darkenPerfect: () => darkenPerfect,
55
+ darkerFast: () => darkerFast,
56
+ darkerPerfect: () => darkerPerfect,
46
57
  deserializeImageData: () => deserializeImageData,
47
58
  deserializeNullableImageData: () => deserializeNullableImageData,
48
59
  deserializeRawImageData: () => deserializeRawImageData,
49
- differenceColor32: () => differenceColor32,
50
- divideColor32: () => divideColor32,
51
- exclusionColor32: () => exclusionColor32,
60
+ differenceFast: () => differenceFast,
61
+ differencePerfect: () => differencePerfect,
62
+ divideFast: () => divideFast,
63
+ dividePerfect: () => dividePerfect,
64
+ exclusionFast: () => exclusionFast,
65
+ exclusionPerfect: () => exclusionPerfect,
52
66
  extractImageDataPixels: () => extractImageDataPixels,
53
67
  extractMask: () => extractMask,
54
68
  fileInputChangeToImageData: () => fileInputChangeToImageData,
@@ -57,8 +71,10 @@ __export(src_exports, {
57
71
  floodFillSelection: () => floodFillSelection,
58
72
  getImageDataFromClipboard: () => getImageDataFromClipboard,
59
73
  getSupportedPixelFormats: () => getSupportedPixelFormats,
60
- hardLightColor32: () => hardLightColor32,
61
- hardMixColor32: () => hardMixColor32,
74
+ hardLightFast: () => hardLightFast,
75
+ hardLightPerfect: () => hardLightPerfect,
76
+ hardMixFast: () => hardMixFast,
77
+ hardMixPerfect: () => hardMixPerfect,
62
78
  imageDataToAlphaMask: () => imageDataToAlphaMask,
63
79
  imageDataToDataUrl: () => imageDataToDataUrl,
64
80
  imageDataToImgBlob: () => imageDataToImgBlob,
@@ -70,29 +86,42 @@ __export(src_exports, {
70
86
  invertPixelData: () => invertPixelData,
71
87
  lerpColor32: () => lerpColor32,
72
88
  lerpColor32Fast: () => lerpColor32Fast,
73
- lightenColor32: () => lightenColor32,
74
- lighterColor32: () => lighterColor32,
75
- linearBurnColor32: () => linearBurnColor32,
76
- linearDodgeColor32: () => linearDodgeColor32,
77
- linearLightColor32: () => linearLightColor32,
89
+ lightenFast: () => lightenFast,
90
+ lightenPerfect: () => lightenPerfect,
91
+ lighterFast: () => lighterFast,
92
+ lighterPerfect: () => lighterPerfect,
93
+ linearBurnFast: () => linearBurnFast,
94
+ linearBurnPerfect: () => linearBurnPerfect,
95
+ linearDodgeFast: () => linearDodgeFast,
96
+ linearDodgePerfect: () => linearDodgePerfect,
97
+ linearLightFast: () => linearLightFast,
98
+ linearLightPerfect: () => linearLightPerfect,
78
99
  makeIndexedImage: () => makeIndexedImage,
79
100
  makePixelCanvas: () => makePixelCanvas,
80
101
  makeReusableCanvas: () => makeReusableCanvas,
81
102
  mergeMasks: () => mergeMasks,
82
- multiplyColor32: () => multiplyColor32,
83
- overlayColor32: () => overlayColor32,
84
- overwriteColor32: () => overwriteColor32,
103
+ multiplyFast: () => multiplyFast,
104
+ multiplyPerfect: () => multiplyPerfect,
105
+ overlayFast: () => overlayFast,
106
+ overlayPerfect: () => overlayPerfect,
107
+ overwriteFast: () => overwriteFast,
108
+ overwritePerfect: () => overwritePerfect,
85
109
  packColor: () => packColor,
86
110
  packRGBA: () => packRGBA,
87
- pinLightColor32: () => pinLightColor32,
111
+ pinLightFast: () => pinLightFast,
112
+ pinLightPerfect: () => pinLightPerfect,
88
113
  pixelDataToAlphaMask: () => pixelDataToAlphaMask,
89
114
  resizeImageData: () => resizeImageData,
90
- screenColor32: () => screenColor32,
115
+ screenFast: () => screenFast,
116
+ screenPerfect: () => screenPerfect,
91
117
  serializeImageData: () => serializeImageData,
92
118
  serializeNullableImageData: () => serializeNullableImageData,
93
- softLightColor32: () => softLightColor32,
94
- sourceOverColor32: () => sourceOverColor32,
95
- subtractColor32: () => subtractColor32,
119
+ softLightFast: () => softLightFast,
120
+ softLightPerfect: () => softLightPerfect,
121
+ sourceOverFast: () => sourceOverFast,
122
+ sourceOverPerfect: () => sourceOverPerfect,
123
+ subtractFast: () => subtractFast,
124
+ subtractPerfect: () => subtractPerfect,
96
125
  trimRectBounds: () => trimRectBounds,
97
126
  unpackAlpha: () => unpackAlpha,
98
127
  unpackBlue: () => unpackBlue,
@@ -100,41 +129,67 @@ __export(src_exports, {
100
129
  unpackColorTo: () => unpackColorTo,
101
130
  unpackGreen: () => unpackGreen,
102
131
  unpackRed: () => unpackRed,
103
- vividLightColor32: () => vividLightColor32,
132
+ vividLightFast: () => vividLightFast,
133
+ vividLightPerfect: () => vividLightPerfect,
104
134
  writeImageDataPixels: () => writeImageDataPixels,
105
135
  writeImageDataToClipboard: () => writeImageDataToClipboard,
106
136
  writeImgBlobToClipboard: () => writeImgBlobToClipboard
107
137
  });
108
138
  module.exports = __toCommonJS(src_exports);
109
139
 
110
- // src/blend-modes.ts
111
- var overwriteColor32 = (src, dst) => src;
112
- var sourceOverColor32 = (src, dst) => {
113
- const a = src >>> 24 & 255;
114
- if (a === 255) return src;
115
- if (a === 0) return dst;
116
- const rbMask = 16711935;
117
- const gMask = 65280;
118
- const sRB = src & rbMask;
119
- const sG = src & gMask;
120
- const dRB = dst & rbMask;
121
- const dG = dst & gMask;
122
- const invA = 255 - a;
123
- const outRB = sRB * a + dRB * invA >> 8 & rbMask;
124
- const outG = sG * a + dG * invA >> 8 & gMask;
125
- const outA = a + ((dst >>> 24 & 255) * invA >> 8);
126
- return (outA << 24 | outRB | outG) >>> 0;
140
+ // src/BlendModes/blend-modes.ts
141
+ var BlendMode = /* @__PURE__ */ ((BlendMode2) => {
142
+ BlendMode2[BlendMode2["overwrite"] = 0] = "overwrite";
143
+ BlendMode2[BlendMode2["sourceOver"] = 1] = "sourceOver";
144
+ BlendMode2[BlendMode2["darken"] = 2] = "darken";
145
+ BlendMode2[BlendMode2["multiply"] = 3] = "multiply";
146
+ BlendMode2[BlendMode2["colorBurn"] = 4] = "colorBurn";
147
+ BlendMode2[BlendMode2["linearBurn"] = 5] = "linearBurn";
148
+ BlendMode2[BlendMode2["darkerColor"] = 6] = "darkerColor";
149
+ BlendMode2[BlendMode2["lighten"] = 7] = "lighten";
150
+ BlendMode2[BlendMode2["screen"] = 8] = "screen";
151
+ BlendMode2[BlendMode2["colorDodge"] = 9] = "colorDodge";
152
+ BlendMode2[BlendMode2["linearDodge"] = 10] = "linearDodge";
153
+ BlendMode2[BlendMode2["lighterColor"] = 11] = "lighterColor";
154
+ BlendMode2[BlendMode2["overlay"] = 12] = "overlay";
155
+ BlendMode2[BlendMode2["softLight"] = 13] = "softLight";
156
+ BlendMode2[BlendMode2["hardLight"] = 14] = "hardLight";
157
+ BlendMode2[BlendMode2["vividLight"] = 15] = "vividLight";
158
+ BlendMode2[BlendMode2["linearLight"] = 16] = "linearLight";
159
+ BlendMode2[BlendMode2["pinLight"] = 17] = "pinLight";
160
+ BlendMode2[BlendMode2["hardMix"] = 18] = "hardMix";
161
+ BlendMode2[BlendMode2["difference"] = 19] = "difference";
162
+ BlendMode2[BlendMode2["exclusion"] = 20] = "exclusion";
163
+ BlendMode2[BlendMode2["subtract"] = 21] = "subtract";
164
+ BlendMode2[BlendMode2["divide"] = 22] = "divide";
165
+ return BlendMode2;
166
+ })(BlendMode || {});
167
+
168
+ // src/BlendModes/blend-modes-fast.ts
169
+ var overwriteFast = (src, _dst) => src;
170
+ var sourceOverFast = (src, dst) => {
171
+ const sa = src >>> 24 & 255;
172
+ if (sa === 255) return src;
173
+ if (sa === 0) return dst;
174
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
175
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
176
+ const da = dst >>> 24 & 255;
177
+ const invA = 255 - sa;
178
+ const r = sr * sa + dr * invA >> 8;
179
+ const g = sg * sa + dg * invA >> 8;
180
+ const b = sb * sa + db * invA >> 8;
181
+ const a = 255 * sa + da * invA >> 8;
182
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
127
183
  };
128
- var darkenColor32 = (src, dst) => {
184
+ var darkenFast = (src, dst) => {
129
185
  const sa = src >>> 24 & 255;
130
186
  if (sa === 0) return dst;
131
- const br = Math.min(src & 255, dst & 255);
132
- const bg = Math.min(src >> 8 & 255, dst >> 8 & 255);
133
- const bb = Math.min(src >> 16 & 255, dst >> 16 & 255);
187
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
188
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
189
+ const br = sr < dr ? sr : dr;
190
+ const bg = sg < dg ? sg : dg;
191
+ const bb = sb < db ? sb : db;
134
192
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
135
- const dr = dst & 255;
136
- const dg = dst >> 8 & 255;
137
- const db = dst >> 16 & 255;
138
193
  const invA = 255 - sa;
139
194
  const r = br * sa + dr * invA >> 8;
140
195
  const g = bg * sa + dg * invA >> 8;
@@ -142,45 +197,51 @@ var darkenColor32 = (src, dst) => {
142
197
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
143
198
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
144
199
  };
145
- var multiplyColor32 = (src, dst) => {
200
+ var multiplyFast = (src, dst) => {
146
201
  const sa = src >>> 24 & 255;
147
202
  if (sa === 0) return dst;
148
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
149
- const br = (src & 255) * dr + 128 >> 8;
150
- const bg = (src >> 8 & 255) * dg >> 8;
151
- const bb = (src >> 16 & 255) * db >> 8;
203
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
204
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
205
+ const br = sr * dr >> 8;
206
+ const bg = sg * dg >> 8;
207
+ const bb = sb * db >> 8;
152
208
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
153
209
  const invA = 255 - sa;
210
+ const da = dst >>> 24 & 255;
154
211
  const r = br * sa + dr * invA >> 8;
155
212
  const g = bg * sa + dg * invA >> 8;
156
213
  const b = bb * sa + db * invA >> 8;
157
- const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
214
+ const a = 255 * sa + da * invA >> 8;
158
215
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
159
216
  };
160
- var colorBurnColor32 = (src, dst) => {
217
+ var colorBurnFast = (src, dst) => {
161
218
  const sa = src >>> 24 & 255;
162
219
  if (sa === 0) return dst;
163
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
164
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
165
- const br = dr === 255 ? 255 : Math.max(0, 255 - (255 - dr << 8) / (sr || 1));
166
- const bg = dg === 255 ? 255 : Math.max(0, 255 - (255 - dg << 8) / (sg || 1));
167
- const bb = db === 255 ? 255 : Math.max(0, 255 - (255 - db << 8) / (sb || 1));
220
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
221
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
222
+ const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / sr | 0);
223
+ const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / sg | 0);
224
+ const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / sb | 0);
168
225
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
169
226
  const invA = 255 - sa;
227
+ const da = dst >>> 24 & 255;
170
228
  const r = br * sa + dr * invA >> 8;
171
229
  const g = bg * sa + dg * invA >> 8;
172
230
  const b = bb * sa + db * invA >> 8;
173
- const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
231
+ const a = 255 * sa + da * invA >> 8;
174
232
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
175
233
  };
176
- var linearBurnColor32 = (src, dst) => {
234
+ var linearBurnFast = (src, dst) => {
177
235
  const sa = src >>> 24 & 255;
178
236
  if (sa === 0) return dst;
179
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
180
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
181
- const br = Math.max(0, dr + sr - 255);
182
- const bg = Math.max(0, dg + sg - 255);
183
- const bb = Math.max(0, db + sb - 255);
237
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
238
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
239
+ const brU = dr + sr - 255;
240
+ const bgU = dg + sg - 255;
241
+ const bbU = db + sb - 255;
242
+ const br = brU < 0 ? 0 : brU;
243
+ const bg = bgU < 0 ? 0 : bgU;
244
+ const bb = bbU < 0 ? 0 : bbU;
184
245
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
185
246
  const invA = 255 - sa;
186
247
  const r = br * sa + dr * invA >> 8;
@@ -189,11 +250,11 @@ var linearBurnColor32 = (src, dst) => {
189
250
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
190
251
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
191
252
  };
192
- var darkerColor32 = (src, dst) => {
253
+ var darkerFast = (src, dst) => {
193
254
  const sa = src >>> 24 & 255;
194
255
  if (sa === 0) return dst;
195
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
196
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
256
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
257
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
197
258
  const lumSrc = sr * 77 + sg * 151 + sb * 28;
198
259
  const lumDst = dr * 77 + dg * 151 + db * 28;
199
260
  let br, bg, bb;
@@ -214,7 +275,7 @@ var darkerColor32 = (src, dst) => {
214
275
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
215
276
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
216
277
  };
217
- var lightenColor32 = (src, dst) => {
278
+ var lightenFast = (src, dst) => {
218
279
  const sa = src >>> 24 & 255;
219
280
  if (sa === 0) return dst;
220
281
  const br = Math.max(src & 255, dst & 255);
@@ -231,13 +292,13 @@ var lightenColor32 = (src, dst) => {
231
292
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
232
293
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
233
294
  };
234
- var screenColor32 = (src, dst) => {
295
+ var screenFast = (src, dst) => {
235
296
  const sa = src >>> 24 & 255;
236
297
  if (sa === 0) return dst;
237
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
298
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
238
299
  const br = 255 - ((255 - (src & 255)) * (255 - dr) >> 8);
239
- const bg = 255 - ((255 - (src >> 8 & 255)) * (255 - dg) >> 8);
240
- const bb = 255 - ((255 - (src >> 16 & 255)) * (255 - db) >> 8);
300
+ const bg = 255 - ((255 - (src >>> 8 & 255)) * (255 - dg) >> 8);
301
+ const bb = 255 - ((255 - (src >>> 16 & 255)) * (255 - db) >> 8);
241
302
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
242
303
  const invA = 255 - sa;
243
304
  const r = br * sa + dr * invA >> 8;
@@ -246,14 +307,14 @@ var screenColor32 = (src, dst) => {
246
307
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
247
308
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
248
309
  };
249
- var colorDodgeColor32 = (src, dst) => {
310
+ var colorDodgeFast = (src, dst) => {
250
311
  const sa = src >>> 24 & 255;
251
312
  if (sa === 0) return dst;
252
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
253
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
254
- const br = sr === 255 ? 255 : Math.min(255, (dr << 8) / (255 - sr));
255
- const bg = sg === 255 ? 255 : Math.min(255, (dg << 8) / (255 - sg));
256
- const bb = sb === 255 ? 255 : Math.min(255, (db << 8) / (255 - sb));
313
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
314
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
315
+ const br = sr === 255 ? 255 : Math.min(255, (dr << 8) / (255 - sr) | 0);
316
+ const bg = sg === 255 ? 255 : Math.min(255, (dg << 8) / (255 - sg) | 0);
317
+ const bb = sb === 255 ? 255 : Math.min(255, (db << 8) / (255 - sb) | 0);
257
318
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
258
319
  const invA = 255 - sa;
259
320
  const r = br * sa + dr * invA >> 8;
@@ -262,13 +323,16 @@ var colorDodgeColor32 = (src, dst) => {
262
323
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
263
324
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
264
325
  };
265
- var linearDodgeColor32 = (src, dst) => {
326
+ var linearDodgeFast = (src, dst) => {
266
327
  const sa = src >>> 24 & 255;
267
328
  if (sa === 0) return dst;
268
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
269
- const br = Math.min(255, (src & 255) + dr);
270
- const bg = Math.min(255, (src >> 8 & 255) + dg);
271
- const bb = Math.min(255, (src >> 16 & 255) + db);
329
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
330
+ const brU = (src & 255) + dr;
331
+ const bgU = (src >>> 8 & 255) + dg;
332
+ const bbU = (src >>> 16 & 255) + db;
333
+ const br = brU > 255 ? 255 : brU;
334
+ const bg = bgU > 255 ? 255 : bgU;
335
+ const bb = bbU > 255 ? 255 : bbU;
272
336
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
273
337
  const invA = 255 - sa;
274
338
  const r = br * sa + dr * invA >> 8;
@@ -277,11 +341,11 @@ var linearDodgeColor32 = (src, dst) => {
277
341
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
278
342
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
279
343
  };
280
- var lighterColor32 = (src, dst) => {
344
+ var lighterFast = (src, dst) => {
281
345
  const sa = src >>> 24 & 255;
282
346
  if (sa === 0) return dst;
283
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
284
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
347
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
348
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
285
349
  const lumSrc = sr * 77 + sg * 151 + sb * 28;
286
350
  const lumDst = dr * 77 + dg * 151 + db * 28;
287
351
  let br, bg, bb;
@@ -302,11 +366,11 @@ var lighterColor32 = (src, dst) => {
302
366
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
303
367
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
304
368
  };
305
- var overlayColor32 = (src, dst) => {
369
+ var overlayFast = (src, dst) => {
306
370
  const sa = src >>> 24 & 255;
307
371
  if (sa === 0) return dst;
308
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
309
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
372
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
373
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
310
374
  const br = dr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);
311
375
  const bg = dg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);
312
376
  const bb = db < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);
@@ -318,11 +382,11 @@ var overlayColor32 = (src, dst) => {
318
382
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
319
383
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
320
384
  };
321
- var softLightColor32 = (src, dst) => {
385
+ var softLightFast = (src, dst) => {
322
386
  const sa = src >>> 24 & 255;
323
387
  if (sa === 0) return dst;
324
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
325
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
388
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
389
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
326
390
  const br = (255 - dr) * (sr * dr >> 8) + dr * (255 - ((255 - sr) * (255 - dr) >> 8)) >> 8;
327
391
  const bg = (255 - dg) * (sg * dg >> 8) + dg * (255 - ((255 - sg) * (255 - dg) >> 8)) >> 8;
328
392
  const bb = (255 - db) * (sb * db >> 8) + db * (255 - ((255 - sb) * (255 - db) >> 8)) >> 8;
@@ -334,11 +398,11 @@ var softLightColor32 = (src, dst) => {
334
398
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
335
399
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
336
400
  };
337
- var hardLightColor32 = (src, dst) => {
401
+ var hardLightFast = (src, dst) => {
338
402
  const sa = src >>> 24 & 255;
339
403
  if (sa === 0) return dst;
340
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
341
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
404
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
405
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
342
406
  const br = sr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);
343
407
  const bg = sg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);
344
408
  const bb = sb < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);
@@ -350,14 +414,14 @@ var hardLightColor32 = (src, dst) => {
350
414
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
351
415
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
352
416
  };
353
- var vividLightColor32 = (src, dst) => {
417
+ var vividLightFast = (src, dst) => {
354
418
  const sa = src >>> 24 & 255;
355
419
  if (sa === 0) return dst;
356
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
357
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
358
- 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)));
359
- 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)));
360
- 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)));
420
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
421
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
422
+ 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);
423
+ 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);
424
+ 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);
361
425
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
362
426
  const invA = 255 - sa;
363
427
  const r = br * sa + dr * invA >> 8;
@@ -366,14 +430,17 @@ var vividLightColor32 = (src, dst) => {
366
430
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
367
431
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
368
432
  };
369
- var linearLightColor32 = (src, dst) => {
433
+ var linearLightFast = (src, dst) => {
370
434
  const sa = src >>> 24 & 255;
371
435
  if (sa === 0) return dst;
372
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
373
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
374
- const br = Math.max(0, Math.min(255, dr + 2 * sr - 255));
375
- const bg = Math.max(0, Math.min(255, dg + 2 * sg - 255));
376
- const bb = Math.max(0, Math.min(255, db + 2 * sb - 255));
436
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
437
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
438
+ const brU = dr + 2 * sr - 255;
439
+ const bgU = dg + 2 * sg - 255;
440
+ const bbU = db + 2 * sb - 255;
441
+ const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;
442
+ const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;
443
+ const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;
377
444
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
378
445
  const invA = 255 - sa;
379
446
  const r = br * sa + dr * invA >> 8;
@@ -382,14 +449,14 @@ var linearLightColor32 = (src, dst) => {
382
449
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
383
450
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
384
451
  };
385
- var pinLightColor32 = (src, dst) => {
452
+ var pinLightFast = (src, dst) => {
386
453
  const sa = src >>> 24 & 255;
387
454
  if (sa === 0) return dst;
388
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
389
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
390
- const br = sr < 128 ? Math.min(dr, 2 * sr) : Math.max(dr, 2 * (sr - 128));
391
- const bg = sg < 128 ? Math.min(dg, 2 * sg) : Math.max(dg, 2 * (sg - 128));
392
- const bb = sb < 128 ? Math.min(db, 2 * sb) : Math.max(db, 2 * (sb - 128));
455
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
456
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
457
+ const br = sr < 128 ? dr < 2 * sr ? dr : 2 * sr : dr > 2 * sr - 256 ? dr : 2 * sr - 256;
458
+ const bg = sg < 128 ? dg < 2 * sg ? dg : 2 * sg : dg > 2 * sg - 256 ? dg : 2 * sg - 256;
459
+ const bb = sb < 128 ? db < 2 * sb ? db : 2 * sb : db > 2 * sb - 256 ? db : 2 * sb - 256;
393
460
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
394
461
  const invA = 255 - sa;
395
462
  const r = br * sa + dr * invA >> 8;
@@ -398,14 +465,14 @@ var pinLightColor32 = (src, dst) => {
398
465
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
399
466
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
400
467
  };
401
- var hardMixColor32 = (src, dst) => {
468
+ var hardMixFast = (src, dst) => {
402
469
  const sa = src >>> 24 & 255;
403
470
  if (sa === 0) return dst;
404
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
405
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
406
- 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;
407
- 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;
408
- 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;
471
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
472
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
473
+ 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;
474
+ 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;
475
+ 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;
409
476
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
410
477
  const invA = 255 - sa;
411
478
  const r = br * sa + dr * invA >> 8;
@@ -414,13 +481,16 @@ var hardMixColor32 = (src, dst) => {
414
481
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
415
482
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
416
483
  };
417
- var differenceColor32 = (src, dst) => {
484
+ var differenceFast = (src, dst) => {
418
485
  const sa = src >>> 24 & 255;
419
486
  if (sa === 0) return dst;
420
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
421
- const br = Math.abs((src & 255) - dr);
422
- const bg = Math.abs((src >> 8 & 255) - dg);
423
- const bb = Math.abs((src >> 16 & 255) - db);
487
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
488
+ const brD = (src & 255) - dr;
489
+ const bgD = (src >>> 8 & 255) - dg;
490
+ const bbD = (src >>> 16 & 255) - db;
491
+ const br = brD < 0 ? -brD : brD;
492
+ const bg = bgD < 0 ? -bgD : bgD;
493
+ const bb = bbD < 0 ? -bbD : bbD;
424
494
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
425
495
  const invA = 255 - sa;
426
496
  const r = br * sa + dr * invA >> 8;
@@ -429,11 +499,11 @@ var differenceColor32 = (src, dst) => {
429
499
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
430
500
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
431
501
  };
432
- var exclusionColor32 = (src, dst) => {
502
+ var exclusionFast = (src, dst) => {
433
503
  const sa = src >>> 24 & 255;
434
504
  if (sa === 0) return dst;
435
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
436
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
505
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
506
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
437
507
  const br = dr + sr - (dr * sr >> 7);
438
508
  const bg = dg + sg - (dg * sg >> 7);
439
509
  const bb = db + sb - (db * sb >> 7);
@@ -445,14 +515,17 @@ var exclusionColor32 = (src, dst) => {
445
515
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
446
516
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
447
517
  };
448
- var subtractColor32 = (src, dst) => {
518
+ var subtractFast = (src, dst) => {
449
519
  const sa = src >>> 24 & 255;
450
520
  if (sa === 0) return dst;
451
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
452
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
453
- const br = Math.max(0, dr - sr);
454
- const bg = Math.max(0, dg - sg);
455
- const bb = Math.max(0, db - sb);
521
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
522
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
523
+ const brU = dr - sr;
524
+ const bgU = dg - sg;
525
+ const bbU = db - sb;
526
+ const br = brU < 0 ? 0 : brU;
527
+ const bg = bgU < 0 ? 0 : bgU;
528
+ const bb = bbU < 0 ? 0 : bbU;
456
529
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
457
530
  const invA = 255 - sa;
458
531
  const r = br * sa + dr * invA >> 8;
@@ -461,14 +534,14 @@ var subtractColor32 = (src, dst) => {
461
534
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
462
535
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
463
536
  };
464
- var divideColor32 = (src, dst) => {
537
+ var divideFast = (src, dst) => {
465
538
  const sa = src >>> 24 & 255;
466
539
  if (sa === 0) return dst;
467
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
468
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
469
- const br = sr === 0 ? 255 : Math.min(255, (dr << 8) / sr);
470
- const bg = sg === 0 ? 255 : Math.min(255, (dg << 8) / sg);
471
- const bb = sb === 0 ? 255 : Math.min(255, (db << 8) / sb);
540
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
541
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
542
+ const br = sr === 0 ? 255 : Math.min(255, (dr << 8) / sr | 0);
543
+ const bg = sg === 0 ? 255 : Math.min(255, (dg << 8) / sg | 0);
544
+ const bb = sb === 0 ? 255 : Math.min(255, (db << 8) / sb | 0);
472
545
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
473
546
  const invA = 255 - sa;
474
547
  const r = br * sa + dr * invA >> 8;
@@ -477,77 +550,76 @@ var divideColor32 = (src, dst) => {
477
550
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
478
551
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
479
552
  };
480
- var BlendMode = /* @__PURE__ */ ((BlendMode2) => {
481
- BlendMode2[BlendMode2["overwrite"] = 0] = "overwrite";
482
- BlendMode2[BlendMode2["sourceOver"] = 1] = "sourceOver";
483
- BlendMode2[BlendMode2["darken"] = 2] = "darken";
484
- BlendMode2[BlendMode2["multiply"] = 3] = "multiply";
485
- BlendMode2[BlendMode2["colorBurn"] = 4] = "colorBurn";
486
- BlendMode2[BlendMode2["linearBurn"] = 5] = "linearBurn";
487
- BlendMode2[BlendMode2["darkerColor"] = 6] = "darkerColor";
488
- BlendMode2[BlendMode2["lighten"] = 7] = "lighten";
489
- BlendMode2[BlendMode2["screen"] = 8] = "screen";
490
- BlendMode2[BlendMode2["colorDodge"] = 9] = "colorDodge";
491
- BlendMode2[BlendMode2["linearDodge"] = 10] = "linearDodge";
492
- BlendMode2[BlendMode2["lighterColor"] = 11] = "lighterColor";
493
- BlendMode2[BlendMode2["overlay"] = 12] = "overlay";
494
- BlendMode2[BlendMode2["softLight"] = 13] = "softLight";
495
- BlendMode2[BlendMode2["hardLight"] = 14] = "hardLight";
496
- BlendMode2[BlendMode2["vividLight"] = 15] = "vividLight";
497
- BlendMode2[BlendMode2["linearLight"] = 16] = "linearLight";
498
- BlendMode2[BlendMode2["pinLight"] = 17] = "pinLight";
499
- BlendMode2[BlendMode2["hardMix"] = 18] = "hardMix";
500
- BlendMode2[BlendMode2["difference"] = 19] = "difference";
501
- BlendMode2[BlendMode2["exclusion"] = 20] = "exclusion";
502
- BlendMode2[BlendMode2["subtract"] = 21] = "subtract";
503
- BlendMode2[BlendMode2["divide"] = 22] = "divide";
504
- return BlendMode2;
505
- })(BlendMode || {});
506
- var BLENDER_REGISTRY = [
507
- [0 /* overwrite */, overwriteColor32],
508
- [1 /* sourceOver */, sourceOverColor32],
509
- [2 /* darken */, darkenColor32],
510
- [3 /* multiply */, multiplyColor32],
511
- [4 /* colorBurn */, colorBurnColor32],
512
- [5 /* linearBurn */, linearBurnColor32],
513
- [6 /* darkerColor */, darkerColor32],
514
- [7 /* lighten */, lightenColor32],
515
- [8 /* screen */, screenColor32],
516
- [9 /* colorDodge */, colorDodgeColor32],
517
- [10 /* linearDodge */, linearDodgeColor32],
518
- [11 /* lighterColor */, lighterColor32],
519
- [12 /* overlay */, overlayColor32],
520
- [13 /* softLight */, softLightColor32],
521
- [14 /* hardLight */, hardLightColor32],
522
- [15 /* vividLight */, vividLightColor32],
523
- [16 /* linearLight */, linearLightColor32],
524
- [17 /* pinLight */, pinLightColor32],
525
- [18 /* hardMix */, hardMixColor32],
526
- [19 /* difference */, differenceColor32],
527
- [20 /* exclusion */, exclusionColor32],
528
- [21 /* subtract */, subtractColor32],
529
- [22 /* divide */, divideColor32]
553
+ var FAST_BLENDER_REGISTRY = [
554
+ [0 /* overwrite */, overwriteFast],
555
+ [1 /* sourceOver */, sourceOverFast],
556
+ [2 /* darken */, darkenFast],
557
+ [3 /* multiply */, multiplyFast],
558
+ [4 /* colorBurn */, colorBurnFast],
559
+ [5 /* linearBurn */, linearBurnFast],
560
+ [6 /* darkerColor */, darkerFast],
561
+ [7 /* lighten */, lightenFast],
562
+ [8 /* screen */, screenFast],
563
+ [9 /* colorDodge */, colorDodgeFast],
564
+ [10 /* linearDodge */, linearDodgeFast],
565
+ [11 /* lighterColor */, lighterFast],
566
+ [12 /* overlay */, overlayFast],
567
+ [13 /* softLight */, softLightFast],
568
+ [14 /* hardLight */, hardLightFast],
569
+ [15 /* vividLight */, vividLightFast],
570
+ [16 /* linearLight */, linearLightFast],
571
+ [17 /* pinLight */, pinLightFast],
572
+ [18 /* hardMix */, hardMixFast],
573
+ [19 /* difference */, differenceFast],
574
+ [20 /* exclusion */, exclusionFast],
575
+ [21 /* subtract */, subtractFast],
576
+ [22 /* divide */, divideFast]
530
577
  ];
531
- var COLOR_32_BLEND_MODES = [];
532
- for (const [index, blend] of BLENDER_REGISTRY) {
533
- COLOR_32_BLEND_MODES[index] = blend;
578
+ var FAST_BLEND_MODES = [];
579
+ for (const [index, blend] of FAST_BLENDER_REGISTRY) {
580
+ FAST_BLEND_MODES[index] = blend;
534
581
  }
535
- var COLOR_32_BLEND_TO_INDEX = new Map(
536
- BLENDER_REGISTRY.map((entry, index) => {
582
+ var FAST_BLEND_TO_INDEX = new Map(
583
+ FAST_BLENDER_REGISTRY.map((entry, index) => {
537
584
  return [
538
585
  entry[1],
539
586
  index
540
587
  ];
541
588
  })
542
589
  );
543
- var INDEX_TO_COLOR_32_BLEND = new Map(
544
- BLENDER_REGISTRY.map((entry, index) => {
590
+ var INDEX_TO_FAST_BLEND = new Map(
591
+ FAST_BLENDER_REGISTRY.map((entry, index) => {
545
592
  return [
546
593
  index,
547
594
  entry[1]
548
595
  ];
549
596
  })
550
597
  );
598
+ var FAST_BLEND_MODE_BY_NAME = {
599
+ overwrite: overwriteFast,
600
+ sourceOver: sourceOverFast,
601
+ darken: darkenFast,
602
+ multiply: multiplyFast,
603
+ colorBurn: colorBurnFast,
604
+ linearBurn: linearBurnFast,
605
+ darkerColor: darkerFast,
606
+ lighten: lightenFast,
607
+ screen: screenFast,
608
+ colorDodge: colorDodgeFast,
609
+ linearDodge: linearDodgeFast,
610
+ lighterColor: lighterFast,
611
+ overlay: overlayFast,
612
+ softLight: softLightFast,
613
+ hardLight: hardLightFast,
614
+ vividLight: vividLightFast,
615
+ linearLight: linearLightFast,
616
+ pinLight: pinLightFast,
617
+ hardMix: hardMixFast,
618
+ difference: differenceFast,
619
+ exclusion: exclusionFast,
620
+ subtract: subtractFast,
621
+ divide: divideFast
622
+ };
551
623
 
552
624
  // src/_types.ts
553
625
  var MaskType = /* @__PURE__ */ ((MaskType2) => {
@@ -908,6 +980,477 @@ function floodFillSelection(img, startX, startY, {
908
980
  };
909
981
  }
910
982
 
983
+ // src/BlendModes/blend-modes-perfect.ts
984
+ var overwritePerfect = (src, _dst) => src;
985
+ var sourceOverPerfect = (src, dst) => {
986
+ const sa = src >>> 24 & 255;
987
+ if (sa === 255) return src;
988
+ if (sa === 0) return dst;
989
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
990
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
991
+ const da = dst >>> 24 & 255;
992
+ const invA = 255 - sa;
993
+ const r = (sr * sa + dr * invA) / 255 | 0;
994
+ const g = (sg * sa + dg * invA) / 255 | 0;
995
+ const b = (sb * sa + db * invA) / 255 | 0;
996
+ const a = (255 * sa + da * invA) / 255 | 0;
997
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
998
+ };
999
+ var darkenPerfect = (src, dst) => {
1000
+ const sa = src >>> 24 & 255;
1001
+ if (sa === 0) return dst;
1002
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1003
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1004
+ const br = sr < dr ? sr : dr;
1005
+ const bg = sg < dg ? sg : dg;
1006
+ const bb = sb < db ? sb : db;
1007
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1008
+ const invA = 255 - sa;
1009
+ const r = (br * sa + dr * invA) / 255 | 0;
1010
+ const g = (bg * sa + dg * invA) / 255 | 0;
1011
+ const b = (bb * sa + db * invA) / 255 | 0;
1012
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1013
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1014
+ };
1015
+ var multiplyPerfect = (src, dst) => {
1016
+ const sa = src >>> 24 & 255;
1017
+ if (sa === 0) return dst;
1018
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1019
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1020
+ const br = sr * dr / 255 | 0;
1021
+ const bg = sg * dg / 255 | 0;
1022
+ const bb = sb * db / 255 | 0;
1023
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1024
+ const invA = 255 - sa;
1025
+ const da = dst >>> 24 & 255;
1026
+ const r = (br * sa + dr * invA) / 255 | 0;
1027
+ const g = (bg * sa + dg * invA) / 255 | 0;
1028
+ const b = (bb * sa + db * invA) / 255 | 0;
1029
+ const a = (255 * sa + da * invA) / 255 | 0;
1030
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1031
+ };
1032
+ var colorBurnPerfect = (src, dst) => {
1033
+ const sa = src >>> 24 & 255;
1034
+ if (sa === 0) return dst;
1035
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1036
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1037
+ const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / sr | 0));
1038
+ const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / sg | 0));
1039
+ const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / sb | 0));
1040
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1041
+ const invA = 255 - sa;
1042
+ const da = dst >>> 24 & 255;
1043
+ const r = (br * sa + dr * invA) / 255 | 0;
1044
+ const g = (bg * sa + dg * invA) / 255 | 0;
1045
+ const b = (bb * sa + db * invA) / 255 | 0;
1046
+ const a = (255 * sa + da * invA) / 255 | 0;
1047
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1048
+ };
1049
+ var linearBurnPerfect = (src, dst) => {
1050
+ const sa = src >>> 24 & 255;
1051
+ if (sa === 0) return dst;
1052
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1053
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1054
+ const brU = dr + sr - 255;
1055
+ const br = brU < 0 ? 0 : brU;
1056
+ const bgU = dg + sg - 255;
1057
+ const bg = bgU < 0 ? 0 : bgU;
1058
+ const bbU = db + sb - 255;
1059
+ const bb = bbU < 0 ? 0 : bbU;
1060
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1061
+ const invA = 255 - sa;
1062
+ const r = (br * sa + dr * invA) / 255 | 0;
1063
+ const g = (bg * sa + dg * invA) / 255 | 0;
1064
+ const b = (bb * sa + db * invA) / 255 | 0;
1065
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1066
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1067
+ };
1068
+ var darkerPerfect = (src, dst) => {
1069
+ const sa = src >>> 24 & 255;
1070
+ if (sa === 0) return dst;
1071
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1072
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1073
+ const lumSrc = sr * 77 + sg * 151 + sb * 28;
1074
+ const lumDst = dr * 77 + dg * 151 + db * 28;
1075
+ let br, bg, bb;
1076
+ if (lumSrc < lumDst) {
1077
+ br = sr;
1078
+ bg = sg;
1079
+ bb = sb;
1080
+ } else {
1081
+ br = dr;
1082
+ bg = dg;
1083
+ bb = db;
1084
+ }
1085
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1086
+ const invA = 255 - sa;
1087
+ const r = (br * sa + dr * invA) / 255 | 0;
1088
+ const g = (bg * sa + dg * invA) / 255 | 0;
1089
+ const b = (bb * sa + db * invA) / 255 | 0;
1090
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1091
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1092
+ };
1093
+ var lightenPerfect = (src, dst) => {
1094
+ const sa = src >>> 24 & 255;
1095
+ if (sa === 0) return dst;
1096
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1097
+ const br = (src & 255) > dr ? src & 255 : dr;
1098
+ const bg = (src >>> 8 & 255) > dg ? src >>> 8 & 255 : dg;
1099
+ const bb = (src >>> 16 & 255) > db ? src >>> 16 & 255 : db;
1100
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1101
+ const invA = 255 - sa;
1102
+ const r = (br * sa + dr * invA) / 255 | 0;
1103
+ const g = (bg * sa + dg * invA) / 255 | 0;
1104
+ const b = (bb * sa + db * invA) / 255 | 0;
1105
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1106
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1107
+ };
1108
+ var screenPerfect = (src, dst) => {
1109
+ const sa = src >>> 24 & 255;
1110
+ if (sa === 0) return dst;
1111
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1112
+ const br = 255 - ((255 - (src & 255)) * (255 - dr) / 255 | 0);
1113
+ const bg = 255 - ((255 - (src >>> 8 & 255)) * (255 - dg) / 255 | 0);
1114
+ const bb = 255 - ((255 - (src >>> 16 & 255)) * (255 - db) / 255 | 0);
1115
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1116
+ const invA = 255 - sa;
1117
+ const r = (br * sa + dr * invA) / 255 | 0;
1118
+ const g = (bg * sa + dg * invA) / 255 | 0;
1119
+ const b = (bb * sa + db * invA) / 255 | 0;
1120
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1121
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1122
+ };
1123
+ var colorDodgePerfect = (src, dst) => {
1124
+ const sa = src >>> 24 & 255;
1125
+ if (sa === 0) return dst;
1126
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1127
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1128
+ const br = sr === 255 ? 255 : Math.min(255, dr * 255 / (255 - sr) | 0);
1129
+ const bg = sg === 255 ? 255 : Math.min(255, dg * 255 / (255 - sg) | 0);
1130
+ const bb = sb === 255 ? 255 : Math.min(255, db * 255 / (255 - sb) | 0);
1131
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1132
+ const invA = 255 - sa;
1133
+ const r = (br * sa + dr * invA) / 255 | 0;
1134
+ const g = (bg * sa + dg * invA) / 255 | 0;
1135
+ const b = (bb * sa + db * invA) / 255 | 0;
1136
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1137
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1138
+ };
1139
+ var linearDodgePerfect = (src, dst) => {
1140
+ const sa = src >>> 24 & 255;
1141
+ if (sa === 0) return dst;
1142
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1143
+ const brU = (src & 255) + dr;
1144
+ const br = brU > 255 ? 255 : brU;
1145
+ const bgU = (src >>> 8 & 255) + dg;
1146
+ const bg = bgU > 255 ? 255 : bgU;
1147
+ const bbU = (src >>> 16 & 255) + db;
1148
+ const bb = bbU > 255 ? 255 : bbU;
1149
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1150
+ const invA = 255 - sa;
1151
+ const r = (br * sa + dr * invA) / 255 | 0;
1152
+ const g = (bg * sa + dg * invA) / 255 | 0;
1153
+ const b = (bb * sa + db * invA) / 255 | 0;
1154
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1155
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1156
+ };
1157
+ var lighterPerfect = (src, dst) => {
1158
+ const sa = src >>> 24 & 255;
1159
+ if (sa === 0) return dst;
1160
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1161
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1162
+ const lumSrc = sr * 77 + sg * 151 + sb * 28;
1163
+ const lumDst = dr * 77 + dg * 151 + db * 28;
1164
+ let br, bg, bb;
1165
+ if (lumSrc > lumDst) {
1166
+ br = sr;
1167
+ bg = sg;
1168
+ bb = sb;
1169
+ } else {
1170
+ br = dr;
1171
+ bg = dg;
1172
+ bb = db;
1173
+ }
1174
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1175
+ const invA = 255 - sa;
1176
+ const r = (br * sa + dr * invA) / 255 | 0;
1177
+ const g = (bg * sa + dg * invA) / 255 | 0;
1178
+ const b = (bb * sa + db * invA) / 255 | 0;
1179
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1180
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1181
+ };
1182
+ var overlayPerfect = (src, dst) => {
1183
+ const sa = src >>> 24 & 255;
1184
+ if (sa === 0) return dst;
1185
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1186
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1187
+ const br = dr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);
1188
+ const bg = dg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);
1189
+ const bb = db < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);
1190
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1191
+ const invA = 255 - sa;
1192
+ const r = (br * sa + dr * invA) / 255 | 0;
1193
+ const g = (bg * sa + dg * invA) / 255 | 0;
1194
+ const b = (bb * sa + db * invA) / 255 | 0;
1195
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1196
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1197
+ };
1198
+ var softLightPerfect = (src, dst) => {
1199
+ const sa = src >>> 24 & 255;
1200
+ if (sa === 0) return dst;
1201
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1202
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1203
+ const br = ((255 - dr) * (sr * dr / 255 | 0) + dr * (255 - ((255 - sr) * (255 - dr) / 255 | 0))) / 255 | 0;
1204
+ const bg = ((255 - dg) * (sg * dg / 255 | 0) + dg * (255 - ((255 - sg) * (255 - dg) / 255 | 0))) / 255 | 0;
1205
+ const bb = ((255 - db) * (sb * db / 255 | 0) + db * (255 - ((255 - sb) * (255 - db) / 255 | 0))) / 255 | 0;
1206
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1207
+ const invA = 255 - sa;
1208
+ const r = (br * sa + dr * invA) / 255 | 0;
1209
+ const g = (bg * sa + dg * invA) / 255 | 0;
1210
+ const b = (bb * sa + db * invA) / 255 | 0;
1211
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1212
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1213
+ };
1214
+ var hardLightPerfect = (src, dst) => {
1215
+ const sa = src >>> 24 & 255;
1216
+ if (sa === 0) return dst;
1217
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1218
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1219
+ const br = sr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);
1220
+ const bg = sg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);
1221
+ const bb = sb < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);
1222
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1223
+ const invA = 255 - sa;
1224
+ const r = (br * sa + dr * invA) / 255 | 0;
1225
+ const g = (bg * sa + dg * invA) / 255 | 0;
1226
+ const b = (bb * sa + db * invA) / 255 | 0;
1227
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1228
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1229
+ };
1230
+ var vividLightPerfect = (src, dst) => {
1231
+ const sa = src >>> 24 & 255;
1232
+ if (sa === 0) return dst;
1233
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1234
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1235
+ 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);
1236
+ 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);
1237
+ 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);
1238
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1239
+ const invA = 255 - sa;
1240
+ const r = (br * sa + dr * invA) / 255 | 0;
1241
+ const g = (bg * sa + dg * invA) / 255 | 0;
1242
+ const b = (bb * sa + db * invA) / 255 | 0;
1243
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1244
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1245
+ };
1246
+ var linearLightPerfect = (src, dst) => {
1247
+ const sa = src >>> 24 & 255;
1248
+ if (sa === 0) return dst;
1249
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1250
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1251
+ const brU = dr + 2 * sr - 255;
1252
+ const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;
1253
+ const bgU = dg + 2 * sg - 255;
1254
+ const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;
1255
+ const bbU = db + 2 * sb - 255;
1256
+ const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;
1257
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1258
+ const invA = 255 - sa;
1259
+ const r = (br * sa + dr * invA) / 255 | 0;
1260
+ const g = (bg * sa + dg * invA) / 255 | 0;
1261
+ const b = (bb * sa + db * invA) / 255 | 0;
1262
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1263
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1264
+ };
1265
+ var pinLightPerfect = (src, dst) => {
1266
+ const sa = src >>> 24 & 255;
1267
+ if (sa === 0) return dst;
1268
+ const dr = dst & 255;
1269
+ const dg = dst >>> 8 & 255;
1270
+ const db = dst >>> 16 & 255;
1271
+ const sr = src & 255;
1272
+ const sg = src >>> 8 & 255;
1273
+ const sb = src >>> 16 & 255;
1274
+ const br = sr < 128 ? dr < sr << 1 ? dr : sr << 1 : dr > sr - 128 << 1 ? dr : sr - 128 << 1;
1275
+ const bg = sg < 128 ? dg < sg << 1 ? dg : sg << 1 : dg > sg - 128 << 1 ? dg : sg - 128 << 1;
1276
+ const bb = sb < 128 ? db < sb << 1 ? db : sb << 1 : db > sb - 128 << 1 ? db : sb - 128 << 1;
1277
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1278
+ const invA = 255 - sa;
1279
+ const da = dst >>> 24 & 255;
1280
+ const r = (br * sa + dr * invA + 128) / 255 | 0;
1281
+ const g = (bg * sa + dg * invA + 128) / 255 | 0;
1282
+ const b = (bb * sa + db * invA + 128) / 255 | 0;
1283
+ const a = (255 * sa + da * invA + 128) / 255 | 0;
1284
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1285
+ };
1286
+ var hardMixPerfect = (src, dst) => {
1287
+ const sa = src >>> 24 & 255;
1288
+ if (sa === 0) return dst;
1289
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1290
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1291
+ 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;
1292
+ 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;
1293
+ 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;
1294
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1295
+ const invA = 255 - sa;
1296
+ const r = (br * sa + dr * invA) / 255 | 0;
1297
+ const g = (bg * sa + dg * invA) / 255 | 0;
1298
+ const b = (bb * sa + db * invA) / 255 | 0;
1299
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1300
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1301
+ };
1302
+ var differencePerfect = (src, dst) => {
1303
+ const sa = src >>> 24 & 255;
1304
+ if (sa === 0) return dst;
1305
+ const dr = dst & 255;
1306
+ const dg = dst >>> 8 & 255;
1307
+ const db = dst >>> 16 & 255;
1308
+ const sr = src & 255;
1309
+ const sg = src >>> 8 & 255;
1310
+ const sb = src >>> 16 & 255;
1311
+ const br = Math.abs(dr - sr);
1312
+ const bg = Math.abs(dg - sg);
1313
+ const bb = Math.abs(db - sb);
1314
+ if (sa === 255) {
1315
+ return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1316
+ }
1317
+ const invA = 255 - sa;
1318
+ const da = dst >>> 24 & 255;
1319
+ const r = (br * sa + dr * invA + 128) / 255 | 0;
1320
+ const g = (bg * sa + dg * invA + 128) / 255 | 0;
1321
+ const b = (bb * sa + db * invA + 128) / 255 | 0;
1322
+ const a = (255 * sa + da * invA + 128) / 255 | 0;
1323
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1324
+ };
1325
+ var exclusionPerfect = (src, dst) => {
1326
+ const sa = src >>> 24 & 255;
1327
+ if (sa === 0) return dst;
1328
+ const dr = dst & 255;
1329
+ const dg = dst >>> 8 & 255;
1330
+ const db = dst >>> 16 & 255;
1331
+ const sr = src & 255;
1332
+ const sg = src >>> 8 & 255;
1333
+ const sb = src >>> 16 & 255;
1334
+ const br = dr + sr - (dr * sr >> 7);
1335
+ const bg = dg + sg - (dg * sg >> 7);
1336
+ const bb = db + sb - (db * sb >> 7);
1337
+ if (sa === 255) {
1338
+ return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1339
+ }
1340
+ const invA = 255 - sa;
1341
+ const da = dst >>> 24 & 255;
1342
+ const r = (br * sa + dr * invA) / 255 | 0;
1343
+ const g = (bg * sa + dg * invA) / 255 | 0;
1344
+ const b = (bb * sa + db * invA) / 255 | 0;
1345
+ const a = (255 * sa + da * invA) / 255 | 0;
1346
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1347
+ };
1348
+ var subtractPerfect = (src, dst) => {
1349
+ const sa = src >>> 24 & 255;
1350
+ if (sa === 0) return dst;
1351
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1352
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1353
+ const brU = dr - sr;
1354
+ const br = brU < 0 ? 0 : brU;
1355
+ const bgU = dg - sg;
1356
+ const bg = bgU < 0 ? 0 : bgU;
1357
+ const bbU = db - sb;
1358
+ const bb = bbU < 0 ? 0 : bbU;
1359
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1360
+ const invA = 255 - sa;
1361
+ const r = (br * sa + dr * invA) / 255 | 0;
1362
+ const g = (bg * sa + dg * invA) / 255 | 0;
1363
+ const b = (bb * sa + db * invA) / 255 | 0;
1364
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1365
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1366
+ };
1367
+ var dividePerfect = (src, dst) => {
1368
+ const sa = src >>> 24 & 255;
1369
+ if (sa === 0) return dst;
1370
+ const dr = dst & 255, dg = dst >>> 8 & 255, db = dst >>> 16 & 255;
1371
+ const sr = src & 255, sg = src >>> 8 & 255, sb = src >>> 16 & 255;
1372
+ const br = sr === 0 ? 255 : Math.min(255, dr * 255 / sr | 0);
1373
+ const bg = sg === 0 ? 255 : Math.min(255, dg * 255 / sg | 0);
1374
+ const bb = sb === 0 ? 255 : Math.min(255, db * 255 / sb | 0);
1375
+ if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
1376
+ const invA = 255 - sa;
1377
+ const r = (br * sa + dr * invA) / 255 | 0;
1378
+ const g = (bg * sa + dg * invA) / 255 | 0;
1379
+ const b = (bb * sa + db * invA) / 255 | 0;
1380
+ const a = (255 * sa + (dst >>> 24 & 255) * invA) / 255 | 0;
1381
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
1382
+ };
1383
+ var PERFECT_BLENDER_REGISTRY = [
1384
+ [0 /* overwrite */, overwritePerfect],
1385
+ [1 /* sourceOver */, sourceOverPerfect],
1386
+ [2 /* darken */, darkenPerfect],
1387
+ [3 /* multiply */, multiplyPerfect],
1388
+ [4 /* colorBurn */, colorBurnPerfect],
1389
+ [5 /* linearBurn */, linearBurnPerfect],
1390
+ [6 /* darkerColor */, darkerPerfect],
1391
+ [7 /* lighten */, lightenPerfect],
1392
+ [8 /* screen */, screenPerfect],
1393
+ [9 /* colorDodge */, colorDodgePerfect],
1394
+ [10 /* linearDodge */, linearDodgePerfect],
1395
+ [11 /* lighterColor */, lighterPerfect],
1396
+ [12 /* overlay */, overlayPerfect],
1397
+ [13 /* softLight */, softLightPerfect],
1398
+ [14 /* hardLight */, hardLightPerfect],
1399
+ [15 /* vividLight */, vividLightPerfect],
1400
+ [16 /* linearLight */, linearLightPerfect],
1401
+ [17 /* pinLight */, pinLightPerfect],
1402
+ [18 /* hardMix */, hardMixPerfect],
1403
+ [19 /* difference */, differencePerfect],
1404
+ [20 /* exclusion */, exclusionPerfect],
1405
+ [21 /* subtract */, subtractPerfect],
1406
+ [22 /* divide */, dividePerfect]
1407
+ ];
1408
+ var PERFECT_BLEND_MODES = [];
1409
+ for (const [index, blend] of PERFECT_BLENDER_REGISTRY) {
1410
+ PERFECT_BLEND_MODES[index] = blend;
1411
+ }
1412
+ var PERFECT_BLEND_TO_INDEX = new Map(
1413
+ PERFECT_BLENDER_REGISTRY.map((entry, index) => {
1414
+ return [
1415
+ entry[1],
1416
+ index
1417
+ ];
1418
+ })
1419
+ );
1420
+ var INDEX_TO_PERFECT_BLEND = new Map(
1421
+ PERFECT_BLENDER_REGISTRY.map((entry, index) => {
1422
+ return [
1423
+ index,
1424
+ entry[1]
1425
+ ];
1426
+ })
1427
+ );
1428
+ var PERFECT_BLEND_MODE_BY_NAME = {
1429
+ overwrite: overwritePerfect,
1430
+ sourceOver: sourceOverPerfect,
1431
+ darken: darkenPerfect,
1432
+ multiply: multiplyPerfect,
1433
+ colorBurn: colorBurnPerfect,
1434
+ linearBurn: linearBurnPerfect,
1435
+ darkerColor: darkerPerfect,
1436
+ lighten: lightenPerfect,
1437
+ screen: screenPerfect,
1438
+ colorDodge: colorDodgePerfect,
1439
+ linearDodge: linearDodgePerfect,
1440
+ lighterColor: lighterPerfect,
1441
+ overlay: overlayPerfect,
1442
+ softLight: softLightPerfect,
1443
+ hardLight: hardLightPerfect,
1444
+ vividLight: vividLightPerfect,
1445
+ linearLight: linearLightPerfect,
1446
+ pinLight: pinLightPerfect,
1447
+ hardMix: hardMixPerfect,
1448
+ difference: differencePerfect,
1449
+ exclusion: exclusionPerfect,
1450
+ subtract: subtractPerfect,
1451
+ divide: dividePerfect
1452
+ };
1453
+
911
1454
  // src/Canvas/_constants.ts
912
1455
  var OFFSCREEN_CANVAS_CTX_FAILED = "Failed to create OffscreenCanvas context";
913
1456
  var CANVAS_CTX_FAILED = "Failed to create Canvas context";
@@ -1188,40 +1731,27 @@ function writeImageDataPixels(imageData, data, _x, _y, _w, _h) {
1188
1731
  function makeIndexedImage(imageData) {
1189
1732
  const width = imageData.width;
1190
1733
  const height = imageData.height;
1191
- const rawData = imageData.data;
1192
- const indexedData = new Int32Array(rawData.length / 4);
1734
+ const rawData = new Uint32Array(imageData.data.buffer);
1735
+ const indexedData = new Int32Array(rawData.length);
1193
1736
  const colorMap = /* @__PURE__ */ new Map();
1194
1737
  const tempPalette = [];
1195
- const transparentKey = "0,0,0,0";
1738
+ const transparentColor = 0;
1196
1739
  const transparentPalletIndex = 0;
1197
- colorMap.set(transparentKey, transparentPalletIndex);
1198
- tempPalette.push(0);
1199
- tempPalette.push(0);
1200
- tempPalette.push(0);
1201
- tempPalette.push(0);
1202
- for (let i = 0; i < indexedData.length; i++) {
1203
- const r = rawData[i * 4];
1204
- const g = rawData[i * 4 + 1];
1205
- const b = rawData[i * 4 + 2];
1206
- const a = rawData[i * 4 + 3];
1207
- let key;
1208
- if (a === 0) {
1209
- key = transparentKey;
1210
- } else {
1211
- key = `${r},${g},${b},${a}`;
1212
- }
1213
- let id = colorMap.get(key);
1740
+ colorMap.set(transparentColor, transparentPalletIndex);
1741
+ tempPalette.push(transparentColor);
1742
+ for (let i = 0; i < rawData.length; i++) {
1743
+ const pixel = rawData[i];
1744
+ const isTransparent = pixel >>> 24 === 0;
1745
+ const colorKey = isTransparent ? transparentColor : pixel;
1746
+ let id = colorMap.get(colorKey);
1214
1747
  if (id === void 0) {
1215
1748
  id = colorMap.size;
1216
- tempPalette.push(r);
1217
- tempPalette.push(g);
1218
- tempPalette.push(b);
1219
- tempPalette.push(a);
1220
- colorMap.set(key, id);
1749
+ tempPalette.push(colorKey);
1750
+ colorMap.set(colorKey, id);
1221
1751
  }
1222
1752
  indexedData[i] = id;
1223
1753
  }
1224
- const palette = new Uint8Array(tempPalette);
1754
+ const palette = new Int32Array(tempPalette);
1225
1755
  return {
1226
1756
  width,
1227
1757
  height,
@@ -1443,7 +1973,7 @@ function mergeMasks(dst, dstWidth, src, opts) {
1443
1973
  }
1444
1974
 
1445
1975
  // src/PixelData/PixelData.ts
1446
- var PixelData = class {
1976
+ var PixelData = class _PixelData {
1447
1977
  constructor(imageData) {
1448
1978
  this.imageData = imageData;
1449
1979
  this.width = imageData.width;
@@ -1451,12 +1981,22 @@ var PixelData = class {
1451
1981
  this.data32 = new Uint32Array(
1452
1982
  imageData.data.buffer,
1453
1983
  imageData.data.byteOffset,
1984
+ // Shift right by 2 is a fast bitwise division by 4.
1454
1985
  imageData.data.byteLength >> 2
1455
1986
  );
1456
1987
  }
1457
1988
  data32;
1458
1989
  width;
1459
1990
  height;
1991
+ copy() {
1992
+ const buffer = new Uint8ClampedArray(this.data32.buffer.slice(0));
1993
+ const imageData = {
1994
+ data: buffer,
1995
+ width: this.width,
1996
+ height: this.height
1997
+ };
1998
+ return new _PixelData(imageData);
1999
+ }
1460
2000
  };
1461
2001
 
1462
2002
  // src/PixelData/applyMaskToPixelData.ts
@@ -1554,7 +2094,7 @@ function blendColorPixelData(dst, color, opts) {
1554
2094
  w: width = dst.width,
1555
2095
  h: height = dst.height,
1556
2096
  alpha: globalAlpha = 255,
1557
- blendFn = sourceOverColor32,
2097
+ blendFn = FAST_BLEND_MODES[1 /* sourceOver */],
1558
2098
  mask,
1559
2099
  maskType = 0 /* ALPHA */,
1560
2100
  mw,
@@ -1663,7 +2203,7 @@ function blendPixelData(dst, src, opts) {
1663
2203
  w: width = src.width,
1664
2204
  h: height = src.height,
1665
2205
  alpha: globalAlpha = 255,
1666
- blendFn = sourceOverColor32,
2206
+ blendFn = FAST_BLEND_MODES[1 /* sourceOver */],
1667
2207
  mask,
1668
2208
  maskType = 0 /* ALPHA */,
1669
2209
  mw,
@@ -1854,10 +2394,17 @@ function invertPixelData(pixelData) {
1854
2394
  // Annotate the CommonJS export names for ESM import in node:
1855
2395
  0 && (module.exports = {
1856
2396
  BlendMode,
1857
- COLOR_32_BLEND_MODES,
1858
- COLOR_32_BLEND_TO_INDEX,
1859
- INDEX_TO_COLOR_32_BLEND,
2397
+ FAST_BLENDER_REGISTRY,
2398
+ FAST_BLEND_MODES,
2399
+ FAST_BLEND_MODE_BY_NAME,
2400
+ FAST_BLEND_TO_INDEX,
2401
+ INDEX_TO_FAST_BLEND,
2402
+ INDEX_TO_PERFECT_BLEND,
1860
2403
  MaskType,
2404
+ PERFECT_BLENDER_REGISTRY,
2405
+ PERFECT_BLEND_MODES,
2406
+ PERFECT_BLEND_MODE_BY_NAME,
2407
+ PERFECT_BLEND_TO_INDEX,
1861
2408
  PixelData,
1862
2409
  UnsupportedFormatError,
1863
2410
  applyMaskToPixelData,
@@ -1868,20 +2415,27 @@ function invertPixelData(pixelData) {
1868
2415
  clearPixelData,
1869
2416
  color32ToCssRGBA,
1870
2417
  color32ToHex,
1871
- colorBurnColor32,
2418
+ colorBurnFast,
2419
+ colorBurnPerfect,
1872
2420
  colorDistance,
1873
- colorDodgeColor32,
2421
+ colorDodgeFast,
2422
+ colorDodgePerfect,
1874
2423
  copyImageData,
1875
2424
  copyImageDataLike,
1876
2425
  copyMask,
1877
- darkenColor32,
1878
- darkerColor32,
2426
+ darkenFast,
2427
+ darkenPerfect,
2428
+ darkerFast,
2429
+ darkerPerfect,
1879
2430
  deserializeImageData,
1880
2431
  deserializeNullableImageData,
1881
2432
  deserializeRawImageData,
1882
- differenceColor32,
1883
- divideColor32,
1884
- exclusionColor32,
2433
+ differenceFast,
2434
+ differencePerfect,
2435
+ divideFast,
2436
+ dividePerfect,
2437
+ exclusionFast,
2438
+ exclusionPerfect,
1885
2439
  extractImageDataPixels,
1886
2440
  extractMask,
1887
2441
  fileInputChangeToImageData,
@@ -1890,8 +2444,10 @@ function invertPixelData(pixelData) {
1890
2444
  floodFillSelection,
1891
2445
  getImageDataFromClipboard,
1892
2446
  getSupportedPixelFormats,
1893
- hardLightColor32,
1894
- hardMixColor32,
2447
+ hardLightFast,
2448
+ hardLightPerfect,
2449
+ hardMixFast,
2450
+ hardMixPerfect,
1895
2451
  imageDataToAlphaMask,
1896
2452
  imageDataToDataUrl,
1897
2453
  imageDataToImgBlob,
@@ -1903,29 +2459,42 @@ function invertPixelData(pixelData) {
1903
2459
  invertPixelData,
1904
2460
  lerpColor32,
1905
2461
  lerpColor32Fast,
1906
- lightenColor32,
1907
- lighterColor32,
1908
- linearBurnColor32,
1909
- linearDodgeColor32,
1910
- linearLightColor32,
2462
+ lightenFast,
2463
+ lightenPerfect,
2464
+ lighterFast,
2465
+ lighterPerfect,
2466
+ linearBurnFast,
2467
+ linearBurnPerfect,
2468
+ linearDodgeFast,
2469
+ linearDodgePerfect,
2470
+ linearLightFast,
2471
+ linearLightPerfect,
1911
2472
  makeIndexedImage,
1912
2473
  makePixelCanvas,
1913
2474
  makeReusableCanvas,
1914
2475
  mergeMasks,
1915
- multiplyColor32,
1916
- overlayColor32,
1917
- overwriteColor32,
2476
+ multiplyFast,
2477
+ multiplyPerfect,
2478
+ overlayFast,
2479
+ overlayPerfect,
2480
+ overwriteFast,
2481
+ overwritePerfect,
1918
2482
  packColor,
1919
2483
  packRGBA,
1920
- pinLightColor32,
2484
+ pinLightFast,
2485
+ pinLightPerfect,
1921
2486
  pixelDataToAlphaMask,
1922
2487
  resizeImageData,
1923
- screenColor32,
2488
+ screenFast,
2489
+ screenPerfect,
1924
2490
  serializeImageData,
1925
2491
  serializeNullableImageData,
1926
- softLightColor32,
1927
- sourceOverColor32,
1928
- subtractColor32,
2492
+ softLightFast,
2493
+ softLightPerfect,
2494
+ sourceOverFast,
2495
+ sourceOverPerfect,
2496
+ subtractFast,
2497
+ subtractPerfect,
1929
2498
  trimRectBounds,
1930
2499
  unpackAlpha,
1931
2500
  unpackBlue,
@@ -1933,7 +2502,8 @@ function invertPixelData(pixelData) {
1933
2502
  unpackColorTo,
1934
2503
  unpackGreen,
1935
2504
  unpackRed,
1936
- vividLightColor32,
2505
+ vividLightFast,
2506
+ vividLightPerfect,
1937
2507
  writeImageDataPixels,
1938
2508
  writeImageDataToClipboard,
1939
2509
  writeImgBlobToClipboard