pixel-data-js 0.5.2 → 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,41 +71,57 @@ __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,
65
81
  imgBlobToImageData: () => imgBlobToImageData,
82
+ indexedImageToAverageColor: () => indexedImageToAverageColor,
66
83
  invertAlphaMask: () => invertAlphaMask,
67
84
  invertBinaryMask: () => invertBinaryMask,
68
85
  invertImageData: () => invertImageData,
69
86
  invertPixelData: () => invertPixelData,
70
87
  lerpColor32: () => lerpColor32,
71
88
  lerpColor32Fast: () => lerpColor32Fast,
72
- lightenColor32: () => lightenColor32,
73
- lighterColor32: () => lighterColor32,
74
- linearBurnColor32: () => linearBurnColor32,
75
- linearDodgeColor32: () => linearDodgeColor32,
76
- 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,
77
99
  makeIndexedImage: () => makeIndexedImage,
78
100
  makePixelCanvas: () => makePixelCanvas,
79
101
  makeReusableCanvas: () => makeReusableCanvas,
80
102
  mergeMasks: () => mergeMasks,
81
- multiplyColor32: () => multiplyColor32,
82
- overlayColor32: () => overlayColor32,
83
- overwriteColor32: () => overwriteColor32,
103
+ multiplyFast: () => multiplyFast,
104
+ multiplyPerfect: () => multiplyPerfect,
105
+ overlayFast: () => overlayFast,
106
+ overlayPerfect: () => overlayPerfect,
107
+ overwriteFast: () => overwriteFast,
108
+ overwritePerfect: () => overwritePerfect,
84
109
  packColor: () => packColor,
85
110
  packRGBA: () => packRGBA,
86
- pinLightColor32: () => pinLightColor32,
111
+ pinLightFast: () => pinLightFast,
112
+ pinLightPerfect: () => pinLightPerfect,
87
113
  pixelDataToAlphaMask: () => pixelDataToAlphaMask,
88
114
  resizeImageData: () => resizeImageData,
89
- screenColor32: () => screenColor32,
115
+ screenFast: () => screenFast,
116
+ screenPerfect: () => screenPerfect,
90
117
  serializeImageData: () => serializeImageData,
91
118
  serializeNullableImageData: () => serializeNullableImageData,
92
- softLightColor32: () => softLightColor32,
93
- sourceOverColor32: () => sourceOverColor32,
94
- subtractColor32: () => subtractColor32,
119
+ softLightFast: () => softLightFast,
120
+ softLightPerfect: () => softLightPerfect,
121
+ sourceOverFast: () => sourceOverFast,
122
+ sourceOverPerfect: () => sourceOverPerfect,
123
+ subtractFast: () => subtractFast,
124
+ subtractPerfect: () => subtractPerfect,
95
125
  trimRectBounds: () => trimRectBounds,
96
126
  unpackAlpha: () => unpackAlpha,
97
127
  unpackBlue: () => unpackBlue,
@@ -99,41 +129,67 @@ __export(src_exports, {
99
129
  unpackColorTo: () => unpackColorTo,
100
130
  unpackGreen: () => unpackGreen,
101
131
  unpackRed: () => unpackRed,
102
- vividLightColor32: () => vividLightColor32,
132
+ vividLightFast: () => vividLightFast,
133
+ vividLightPerfect: () => vividLightPerfect,
103
134
  writeImageDataPixels: () => writeImageDataPixels,
104
135
  writeImageDataToClipboard: () => writeImageDataToClipboard,
105
136
  writeImgBlobToClipboard: () => writeImgBlobToClipboard
106
137
  });
107
138
  module.exports = __toCommonJS(src_exports);
108
139
 
109
- // src/blend-modes.ts
110
- var overwriteColor32 = (src, dst) => src;
111
- var sourceOverColor32 = (src, dst) => {
112
- const a = src >>> 24 & 255;
113
- if (a === 255) return src;
114
- if (a === 0) return dst;
115
- const rbMask = 16711935;
116
- const gMask = 65280;
117
- const sRB = src & rbMask;
118
- const sG = src & gMask;
119
- const dRB = dst & rbMask;
120
- const dG = dst & gMask;
121
- const invA = 255 - a;
122
- const outRB = sRB * a + dRB * invA >> 8 & rbMask;
123
- const outG = sG * a + dG * invA >> 8 & gMask;
124
- const outA = a + ((dst >>> 24 & 255) * invA >> 8);
125
- 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;
126
183
  };
127
- var darkenColor32 = (src, dst) => {
184
+ var darkenFast = (src, dst) => {
128
185
  const sa = src >>> 24 & 255;
129
186
  if (sa === 0) return dst;
130
- const br = Math.min(src & 255, dst & 255);
131
- const bg = Math.min(src >> 8 & 255, dst >> 8 & 255);
132
- 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;
133
192
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
134
- const dr = dst & 255;
135
- const dg = dst >> 8 & 255;
136
- const db = dst >> 16 & 255;
137
193
  const invA = 255 - sa;
138
194
  const r = br * sa + dr * invA >> 8;
139
195
  const g = bg * sa + dg * invA >> 8;
@@ -141,45 +197,51 @@ var darkenColor32 = (src, dst) => {
141
197
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
142
198
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
143
199
  };
144
- var multiplyColor32 = (src, dst) => {
200
+ var multiplyFast = (src, dst) => {
145
201
  const sa = src >>> 24 & 255;
146
202
  if (sa === 0) return dst;
147
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
148
- const br = (src & 255) * dr + 128 >> 8;
149
- const bg = (src >> 8 & 255) * dg >> 8;
150
- 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;
151
208
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
152
209
  const invA = 255 - sa;
210
+ const da = dst >>> 24 & 255;
153
211
  const r = br * sa + dr * invA >> 8;
154
212
  const g = bg * sa + dg * invA >> 8;
155
213
  const b = bb * sa + db * invA >> 8;
156
- const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
214
+ const a = 255 * sa + da * invA >> 8;
157
215
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
158
216
  };
159
- var colorBurnColor32 = (src, dst) => {
217
+ var colorBurnFast = (src, dst) => {
160
218
  const sa = src >>> 24 & 255;
161
219
  if (sa === 0) return dst;
162
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
163
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
164
- const br = dr === 255 ? 255 : Math.max(0, 255 - (255 - dr << 8) / (sr || 1));
165
- const bg = dg === 255 ? 255 : Math.max(0, 255 - (255 - dg << 8) / (sg || 1));
166
- 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);
167
225
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
168
226
  const invA = 255 - sa;
227
+ const da = dst >>> 24 & 255;
169
228
  const r = br * sa + dr * invA >> 8;
170
229
  const g = bg * sa + dg * invA >> 8;
171
230
  const b = bb * sa + db * invA >> 8;
172
- const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
231
+ const a = 255 * sa + da * invA >> 8;
173
232
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
174
233
  };
175
- var linearBurnColor32 = (src, dst) => {
234
+ var linearBurnFast = (src, dst) => {
176
235
  const sa = src >>> 24 & 255;
177
236
  if (sa === 0) return dst;
178
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
179
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
180
- const br = Math.max(0, dr + sr - 255);
181
- const bg = Math.max(0, dg + sg - 255);
182
- 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;
183
245
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
184
246
  const invA = 255 - sa;
185
247
  const r = br * sa + dr * invA >> 8;
@@ -188,11 +250,11 @@ var linearBurnColor32 = (src, dst) => {
188
250
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
189
251
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
190
252
  };
191
- var darkerColor32 = (src, dst) => {
253
+ var darkerFast = (src, dst) => {
192
254
  const sa = src >>> 24 & 255;
193
255
  if (sa === 0) return dst;
194
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
195
- 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;
196
258
  const lumSrc = sr * 77 + sg * 151 + sb * 28;
197
259
  const lumDst = dr * 77 + dg * 151 + db * 28;
198
260
  let br, bg, bb;
@@ -213,7 +275,7 @@ var darkerColor32 = (src, dst) => {
213
275
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
214
276
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
215
277
  };
216
- var lightenColor32 = (src, dst) => {
278
+ var lightenFast = (src, dst) => {
217
279
  const sa = src >>> 24 & 255;
218
280
  if (sa === 0) return dst;
219
281
  const br = Math.max(src & 255, dst & 255);
@@ -230,13 +292,13 @@ var lightenColor32 = (src, dst) => {
230
292
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
231
293
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
232
294
  };
233
- var screenColor32 = (src, dst) => {
295
+ var screenFast = (src, dst) => {
234
296
  const sa = src >>> 24 & 255;
235
297
  if (sa === 0) return dst;
236
- 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;
237
299
  const br = 255 - ((255 - (src & 255)) * (255 - dr) >> 8);
238
- const bg = 255 - ((255 - (src >> 8 & 255)) * (255 - dg) >> 8);
239
- 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);
240
302
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
241
303
  const invA = 255 - sa;
242
304
  const r = br * sa + dr * invA >> 8;
@@ -245,14 +307,14 @@ var screenColor32 = (src, dst) => {
245
307
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
246
308
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
247
309
  };
248
- var colorDodgeColor32 = (src, dst) => {
310
+ var colorDodgeFast = (src, dst) => {
249
311
  const sa = src >>> 24 & 255;
250
312
  if (sa === 0) return dst;
251
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
252
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
253
- const br = sr === 255 ? 255 : Math.min(255, (dr << 8) / (255 - sr));
254
- const bg = sg === 255 ? 255 : Math.min(255, (dg << 8) / (255 - sg));
255
- 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);
256
318
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
257
319
  const invA = 255 - sa;
258
320
  const r = br * sa + dr * invA >> 8;
@@ -261,13 +323,16 @@ var colorDodgeColor32 = (src, dst) => {
261
323
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
262
324
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
263
325
  };
264
- var linearDodgeColor32 = (src, dst) => {
326
+ var linearDodgeFast = (src, dst) => {
265
327
  const sa = src >>> 24 & 255;
266
328
  if (sa === 0) return dst;
267
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
268
- const br = Math.min(255, (src & 255) + dr);
269
- const bg = Math.min(255, (src >> 8 & 255) + dg);
270
- 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;
271
336
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
272
337
  const invA = 255 - sa;
273
338
  const r = br * sa + dr * invA >> 8;
@@ -276,11 +341,11 @@ var linearDodgeColor32 = (src, dst) => {
276
341
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
277
342
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
278
343
  };
279
- var lighterColor32 = (src, dst) => {
344
+ var lighterFast = (src, dst) => {
280
345
  const sa = src >>> 24 & 255;
281
346
  if (sa === 0) return dst;
282
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
283
- 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;
284
349
  const lumSrc = sr * 77 + sg * 151 + sb * 28;
285
350
  const lumDst = dr * 77 + dg * 151 + db * 28;
286
351
  let br, bg, bb;
@@ -301,11 +366,11 @@ var lighterColor32 = (src, dst) => {
301
366
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
302
367
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
303
368
  };
304
- var overlayColor32 = (src, dst) => {
369
+ var overlayFast = (src, dst) => {
305
370
  const sa = src >>> 24 & 255;
306
371
  if (sa === 0) return dst;
307
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
308
- 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;
309
374
  const br = dr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);
310
375
  const bg = dg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);
311
376
  const bb = db < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);
@@ -317,11 +382,11 @@ var overlayColor32 = (src, dst) => {
317
382
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
318
383
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
319
384
  };
320
- var softLightColor32 = (src, dst) => {
385
+ var softLightFast = (src, dst) => {
321
386
  const sa = src >>> 24 & 255;
322
387
  if (sa === 0) return dst;
323
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
324
- 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;
325
390
  const br = (255 - dr) * (sr * dr >> 8) + dr * (255 - ((255 - sr) * (255 - dr) >> 8)) >> 8;
326
391
  const bg = (255 - dg) * (sg * dg >> 8) + dg * (255 - ((255 - sg) * (255 - dg) >> 8)) >> 8;
327
392
  const bb = (255 - db) * (sb * db >> 8) + db * (255 - ((255 - sb) * (255 - db) >> 8)) >> 8;
@@ -333,11 +398,11 @@ var softLightColor32 = (src, dst) => {
333
398
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
334
399
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
335
400
  };
336
- var hardLightColor32 = (src, dst) => {
401
+ var hardLightFast = (src, dst) => {
337
402
  const sa = src >>> 24 & 255;
338
403
  if (sa === 0) return dst;
339
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
340
- 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;
341
406
  const br = sr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);
342
407
  const bg = sg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);
343
408
  const bb = sb < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);
@@ -349,14 +414,14 @@ var hardLightColor32 = (src, dst) => {
349
414
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
350
415
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
351
416
  };
352
- var vividLightColor32 = (src, dst) => {
417
+ var vividLightFast = (src, dst) => {
353
418
  const sa = src >>> 24 & 255;
354
419
  if (sa === 0) return dst;
355
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
356
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
357
- 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)));
358
- 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)));
359
- 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);
360
425
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
361
426
  const invA = 255 - sa;
362
427
  const r = br * sa + dr * invA >> 8;
@@ -365,14 +430,17 @@ var vividLightColor32 = (src, dst) => {
365
430
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
366
431
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
367
432
  };
368
- var linearLightColor32 = (src, dst) => {
433
+ var linearLightFast = (src, dst) => {
369
434
  const sa = src >>> 24 & 255;
370
435
  if (sa === 0) return dst;
371
- 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 br = Math.max(0, Math.min(255, dr + 2 * sr - 255));
374
- const bg = Math.max(0, Math.min(255, dg + 2 * sg - 255));
375
- 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;
376
444
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
377
445
  const invA = 255 - sa;
378
446
  const r = br * sa + dr * invA >> 8;
@@ -381,14 +449,14 @@ var linearLightColor32 = (src, dst) => {
381
449
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
382
450
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
383
451
  };
384
- var pinLightColor32 = (src, dst) => {
452
+ var pinLightFast = (src, dst) => {
385
453
  const sa = src >>> 24 & 255;
386
454
  if (sa === 0) return dst;
387
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
388
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
389
- const br = sr < 128 ? Math.min(dr, 2 * sr) : Math.max(dr, 2 * (sr - 128));
390
- const bg = sg < 128 ? Math.min(dg, 2 * sg) : Math.max(dg, 2 * (sg - 128));
391
- 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;
392
460
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
393
461
  const invA = 255 - sa;
394
462
  const r = br * sa + dr * invA >> 8;
@@ -397,14 +465,14 @@ var pinLightColor32 = (src, dst) => {
397
465
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
398
466
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
399
467
  };
400
- var hardMixColor32 = (src, dst) => {
468
+ var hardMixFast = (src, dst) => {
401
469
  const sa = src >>> 24 & 255;
402
470
  if (sa === 0) return dst;
403
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
404
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
405
- 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;
406
- 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;
407
- 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;
408
476
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
409
477
  const invA = 255 - sa;
410
478
  const r = br * sa + dr * invA >> 8;
@@ -413,13 +481,16 @@ var hardMixColor32 = (src, dst) => {
413
481
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
414
482
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
415
483
  };
416
- var differenceColor32 = (src, dst) => {
484
+ var differenceFast = (src, dst) => {
417
485
  const sa = src >>> 24 & 255;
418
486
  if (sa === 0) return dst;
419
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
420
- const br = Math.abs((src & 255) - dr);
421
- const bg = Math.abs((src >> 8 & 255) - dg);
422
- 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;
423
494
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
424
495
  const invA = 255 - sa;
425
496
  const r = br * sa + dr * invA >> 8;
@@ -428,11 +499,11 @@ var differenceColor32 = (src, dst) => {
428
499
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
429
500
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
430
501
  };
431
- var exclusionColor32 = (src, dst) => {
502
+ var exclusionFast = (src, dst) => {
432
503
  const sa = src >>> 24 & 255;
433
504
  if (sa === 0) return dst;
434
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
435
- 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;
436
507
  const br = dr + sr - (dr * sr >> 7);
437
508
  const bg = dg + sg - (dg * sg >> 7);
438
509
  const bb = db + sb - (db * sb >> 7);
@@ -444,14 +515,17 @@ var exclusionColor32 = (src, dst) => {
444
515
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
445
516
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
446
517
  };
447
- var subtractColor32 = (src, dst) => {
518
+ var subtractFast = (src, dst) => {
448
519
  const sa = src >>> 24 & 255;
449
520
  if (sa === 0) return dst;
450
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
451
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
452
- const br = Math.max(0, dr - sr);
453
- const bg = Math.max(0, dg - sg);
454
- 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;
455
529
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
456
530
  const invA = 255 - sa;
457
531
  const r = br * sa + dr * invA >> 8;
@@ -460,14 +534,14 @@ var subtractColor32 = (src, dst) => {
460
534
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
461
535
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
462
536
  };
463
- var divideColor32 = (src, dst) => {
537
+ var divideFast = (src, dst) => {
464
538
  const sa = src >>> 24 & 255;
465
539
  if (sa === 0) return dst;
466
- const dr = dst & 255, dg = dst >> 8 & 255, db = dst >> 16 & 255;
467
- const sr = src & 255, sg = src >> 8 & 255, sb = src >> 16 & 255;
468
- const br = sr === 0 ? 255 : Math.min(255, (dr << 8) / sr);
469
- const bg = sg === 0 ? 255 : Math.min(255, (dg << 8) / sg);
470
- 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);
471
545
  if (sa === 255) return (4278190080 | bb << 16 | bg << 8 | br) >>> 0;
472
546
  const invA = 255 - sa;
473
547
  const r = br * sa + dr * invA >> 8;
@@ -476,77 +550,76 @@ var divideColor32 = (src, dst) => {
476
550
  const a = 255 * sa + (dst >>> 24 & 255) * invA >> 8;
477
551
  return (a << 24 | b << 16 | g << 8 | r) >>> 0;
478
552
  };
479
- var BlendMode = /* @__PURE__ */ ((BlendMode2) => {
480
- BlendMode2[BlendMode2["overwrite"] = 0] = "overwrite";
481
- BlendMode2[BlendMode2["sourceOver"] = 1] = "sourceOver";
482
- BlendMode2[BlendMode2["darken"] = 2] = "darken";
483
- BlendMode2[BlendMode2["multiply"] = 3] = "multiply";
484
- BlendMode2[BlendMode2["colorBurn"] = 4] = "colorBurn";
485
- BlendMode2[BlendMode2["linearBurn"] = 5] = "linearBurn";
486
- BlendMode2[BlendMode2["darkerColor"] = 6] = "darkerColor";
487
- BlendMode2[BlendMode2["lighten"] = 7] = "lighten";
488
- BlendMode2[BlendMode2["screen"] = 8] = "screen";
489
- BlendMode2[BlendMode2["colorDodge"] = 9] = "colorDodge";
490
- BlendMode2[BlendMode2["linearDodge"] = 10] = "linearDodge";
491
- BlendMode2[BlendMode2["lighterColor"] = 11] = "lighterColor";
492
- BlendMode2[BlendMode2["overlay"] = 12] = "overlay";
493
- BlendMode2[BlendMode2["softLight"] = 13] = "softLight";
494
- BlendMode2[BlendMode2["hardLight"] = 14] = "hardLight";
495
- BlendMode2[BlendMode2["vividLight"] = 15] = "vividLight";
496
- BlendMode2[BlendMode2["linearLight"] = 16] = "linearLight";
497
- BlendMode2[BlendMode2["pinLight"] = 17] = "pinLight";
498
- BlendMode2[BlendMode2["hardMix"] = 18] = "hardMix";
499
- BlendMode2[BlendMode2["difference"] = 19] = "difference";
500
- BlendMode2[BlendMode2["exclusion"] = 20] = "exclusion";
501
- BlendMode2[BlendMode2["subtract"] = 21] = "subtract";
502
- BlendMode2[BlendMode2["divide"] = 22] = "divide";
503
- return BlendMode2;
504
- })(BlendMode || {});
505
- var BLENDER_REGISTRY = [
506
- [0 /* overwrite */, overwriteColor32],
507
- [1 /* sourceOver */, sourceOverColor32],
508
- [2 /* darken */, darkenColor32],
509
- [3 /* multiply */, multiplyColor32],
510
- [4 /* colorBurn */, colorBurnColor32],
511
- [5 /* linearBurn */, linearBurnColor32],
512
- [6 /* darkerColor */, darkerColor32],
513
- [7 /* lighten */, lightenColor32],
514
- [8 /* screen */, screenColor32],
515
- [9 /* colorDodge */, colorDodgeColor32],
516
- [10 /* linearDodge */, linearDodgeColor32],
517
- [11 /* lighterColor */, lighterColor32],
518
- [12 /* overlay */, overlayColor32],
519
- [13 /* softLight */, softLightColor32],
520
- [14 /* hardLight */, hardLightColor32],
521
- [15 /* vividLight */, vividLightColor32],
522
- [16 /* linearLight */, linearLightColor32],
523
- [17 /* pinLight */, pinLightColor32],
524
- [18 /* hardMix */, hardMixColor32],
525
- [19 /* difference */, differenceColor32],
526
- [20 /* exclusion */, exclusionColor32],
527
- [21 /* subtract */, subtractColor32],
528
- [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]
529
577
  ];
530
- var COLOR_32_BLEND_MODES = [];
531
- for (const [index, blend] of BLENDER_REGISTRY) {
532
- 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;
533
581
  }
534
- var COLOR_32_BLEND_TO_INDEX = new Map(
535
- BLENDER_REGISTRY.map((entry, index) => {
582
+ var FAST_BLEND_TO_INDEX = new Map(
583
+ FAST_BLENDER_REGISTRY.map((entry, index) => {
536
584
  return [
537
585
  entry[1],
538
586
  index
539
587
  ];
540
588
  })
541
589
  );
542
- var INDEX_TO_COLOR_32_BLEND = new Map(
543
- BLENDER_REGISTRY.map((entry, index) => {
590
+ var INDEX_TO_FAST_BLEND = new Map(
591
+ FAST_BLENDER_REGISTRY.map((entry, index) => {
544
592
  return [
545
593
  index,
546
594
  entry[1]
547
595
  ];
548
596
  })
549
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
+ };
550
623
 
551
624
  // src/_types.ts
552
625
  var MaskType = /* @__PURE__ */ ((MaskType2) => {
@@ -907,6 +980,477 @@ function floodFillSelection(img, startX, startY, {
907
980
  };
908
981
  }
909
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
+
910
1454
  // src/Canvas/_constants.ts
911
1455
  var OFFSCREEN_CANVAS_CTX_FAILED = "Failed to create OffscreenCanvas context";
912
1456
  var CANVAS_CTX_FAILED = "Failed to create Canvas context";
@@ -1187,40 +1731,27 @@ function writeImageDataPixels(imageData, data, _x, _y, _w, _h) {
1187
1731
  function makeIndexedImage(imageData) {
1188
1732
  const width = imageData.width;
1189
1733
  const height = imageData.height;
1190
- const rawData = imageData.data;
1191
- const indexedData = new Int32Array(rawData.length / 4);
1734
+ const rawData = new Uint32Array(imageData.data.buffer);
1735
+ const indexedData = new Int32Array(rawData.length);
1192
1736
  const colorMap = /* @__PURE__ */ new Map();
1193
1737
  const tempPalette = [];
1194
- const transparentKey = "0,0,0,0";
1738
+ const transparentColor = 0;
1195
1739
  const transparentPalletIndex = 0;
1196
- colorMap.set(transparentKey, transparentPalletIndex);
1197
- tempPalette.push(0);
1198
- tempPalette.push(0);
1199
- tempPalette.push(0);
1200
- tempPalette.push(0);
1201
- for (let i = 0; i < indexedData.length; i++) {
1202
- const r = rawData[i * 4];
1203
- const g = rawData[i * 4 + 1];
1204
- const b = rawData[i * 4 + 2];
1205
- const a = rawData[i * 4 + 3];
1206
- let key;
1207
- if (a === 0) {
1208
- key = transparentKey;
1209
- } else {
1210
- key = `${r},${g},${b},${a}`;
1211
- }
1212
- 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);
1213
1747
  if (id === void 0) {
1214
1748
  id = colorMap.size;
1215
- tempPalette.push(r);
1216
- tempPalette.push(g);
1217
- tempPalette.push(b);
1218
- tempPalette.push(a);
1219
- colorMap.set(key, id);
1749
+ tempPalette.push(colorKey);
1750
+ colorMap.set(colorKey, id);
1220
1751
  }
1221
1752
  indexedData[i] = id;
1222
1753
  }
1223
- const palette = new Uint8Array(tempPalette);
1754
+ const palette = new Int32Array(tempPalette);
1224
1755
  return {
1225
1756
  width,
1226
1757
  height,
@@ -1230,6 +1761,48 @@ function makeIndexedImage(imageData) {
1230
1761
  };
1231
1762
  }
1232
1763
 
1764
+ // src/IndexedImage/indexedImageToAverageColor.ts
1765
+ function indexedImageToAverageColor(indexedImage, includeTransparent = false) {
1766
+ const { data, palette, transparentPalletIndex } = indexedImage;
1767
+ const counts = new Uint32Array(palette.length / 4);
1768
+ for (let i = 0; i < data.length; i++) {
1769
+ const id = data[i];
1770
+ counts[id]++;
1771
+ }
1772
+ let rSum = 0;
1773
+ let gSum = 0;
1774
+ let bSum = 0;
1775
+ let aSum = 0;
1776
+ let totalWeight = 0;
1777
+ for (let id = 0; id < counts.length; id++) {
1778
+ const weight = counts[id];
1779
+ if (weight === 0) {
1780
+ continue;
1781
+ }
1782
+ if (!includeTransparent && id === transparentPalletIndex) {
1783
+ continue;
1784
+ }
1785
+ const pIdx = id * 4;
1786
+ const r2 = palette[pIdx];
1787
+ const g2 = palette[pIdx + 1];
1788
+ const b2 = palette[pIdx + 2];
1789
+ const a2 = palette[pIdx + 3];
1790
+ rSum += r2 * weight;
1791
+ gSum += g2 * weight;
1792
+ bSum += b2 * weight;
1793
+ aSum += a2 * weight;
1794
+ totalWeight += weight;
1795
+ }
1796
+ if (totalWeight === 0) {
1797
+ return packColor(0, 0, 0, 0);
1798
+ }
1799
+ const r = rSum / totalWeight | 0;
1800
+ const g = gSum / totalWeight | 0;
1801
+ const b = bSum / totalWeight | 0;
1802
+ const a = aSum / totalWeight | 0;
1803
+ return packColor(r, g, b, a);
1804
+ }
1805
+
1233
1806
  // src/Input/fileInputChangeToImageData.ts
1234
1807
  async function fileInputChangeToImageData(event) {
1235
1808
  const target = event.target;
@@ -1399,8 +1972,8 @@ function mergeMasks(dst, dstWidth, src, opts) {
1399
1972
  }
1400
1973
  }
1401
1974
 
1402
- // src/PixelData.ts
1403
- var PixelData = class {
1975
+ // src/PixelData/PixelData.ts
1976
+ var PixelData = class _PixelData {
1404
1977
  constructor(imageData) {
1405
1978
  this.imageData = imageData;
1406
1979
  this.width = imageData.width;
@@ -1408,12 +1981,22 @@ var PixelData = class {
1408
1981
  this.data32 = new Uint32Array(
1409
1982
  imageData.data.buffer,
1410
1983
  imageData.data.byteOffset,
1984
+ // Shift right by 2 is a fast bitwise division by 4.
1411
1985
  imageData.data.byteLength >> 2
1412
1986
  );
1413
1987
  }
1414
1988
  data32;
1415
1989
  width;
1416
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
+ }
1417
2000
  };
1418
2001
 
1419
2002
  // src/PixelData/applyMaskToPixelData.ts
@@ -1511,7 +2094,7 @@ function blendColorPixelData(dst, color, opts) {
1511
2094
  w: width = dst.width,
1512
2095
  h: height = dst.height,
1513
2096
  alpha: globalAlpha = 255,
1514
- blendFn = sourceOverColor32,
2097
+ blendFn = FAST_BLEND_MODES[1 /* sourceOver */],
1515
2098
  mask,
1516
2099
  maskType = 0 /* ALPHA */,
1517
2100
  mw,
@@ -1620,7 +2203,7 @@ function blendPixelData(dst, src, opts) {
1620
2203
  w: width = src.width,
1621
2204
  h: height = src.height,
1622
2205
  alpha: globalAlpha = 255,
1623
- blendFn = sourceOverColor32,
2206
+ blendFn = FAST_BLEND_MODES[1 /* sourceOver */],
1624
2207
  mask,
1625
2208
  maskType = 0 /* ALPHA */,
1626
2209
  mw,
@@ -1811,10 +2394,17 @@ function invertPixelData(pixelData) {
1811
2394
  // Annotate the CommonJS export names for ESM import in node:
1812
2395
  0 && (module.exports = {
1813
2396
  BlendMode,
1814
- COLOR_32_BLEND_MODES,
1815
- COLOR_32_BLEND_TO_INDEX,
1816
- 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,
1817
2403
  MaskType,
2404
+ PERFECT_BLENDER_REGISTRY,
2405
+ PERFECT_BLEND_MODES,
2406
+ PERFECT_BLEND_MODE_BY_NAME,
2407
+ PERFECT_BLEND_TO_INDEX,
1818
2408
  PixelData,
1819
2409
  UnsupportedFormatError,
1820
2410
  applyMaskToPixelData,
@@ -1825,20 +2415,27 @@ function invertPixelData(pixelData) {
1825
2415
  clearPixelData,
1826
2416
  color32ToCssRGBA,
1827
2417
  color32ToHex,
1828
- colorBurnColor32,
2418
+ colorBurnFast,
2419
+ colorBurnPerfect,
1829
2420
  colorDistance,
1830
- colorDodgeColor32,
2421
+ colorDodgeFast,
2422
+ colorDodgePerfect,
1831
2423
  copyImageData,
1832
2424
  copyImageDataLike,
1833
2425
  copyMask,
1834
- darkenColor32,
1835
- darkerColor32,
2426
+ darkenFast,
2427
+ darkenPerfect,
2428
+ darkerFast,
2429
+ darkerPerfect,
1836
2430
  deserializeImageData,
1837
2431
  deserializeNullableImageData,
1838
2432
  deserializeRawImageData,
1839
- differenceColor32,
1840
- divideColor32,
1841
- exclusionColor32,
2433
+ differenceFast,
2434
+ differencePerfect,
2435
+ divideFast,
2436
+ dividePerfect,
2437
+ exclusionFast,
2438
+ exclusionPerfect,
1842
2439
  extractImageDataPixels,
1843
2440
  extractMask,
1844
2441
  fileInputChangeToImageData,
@@ -1847,41 +2444,57 @@ function invertPixelData(pixelData) {
1847
2444
  floodFillSelection,
1848
2445
  getImageDataFromClipboard,
1849
2446
  getSupportedPixelFormats,
1850
- hardLightColor32,
1851
- hardMixColor32,
2447
+ hardLightFast,
2448
+ hardLightPerfect,
2449
+ hardMixFast,
2450
+ hardMixPerfect,
1852
2451
  imageDataToAlphaMask,
1853
2452
  imageDataToDataUrl,
1854
2453
  imageDataToImgBlob,
1855
2454
  imgBlobToImageData,
2455
+ indexedImageToAverageColor,
1856
2456
  invertAlphaMask,
1857
2457
  invertBinaryMask,
1858
2458
  invertImageData,
1859
2459
  invertPixelData,
1860
2460
  lerpColor32,
1861
2461
  lerpColor32Fast,
1862
- lightenColor32,
1863
- lighterColor32,
1864
- linearBurnColor32,
1865
- linearDodgeColor32,
1866
- linearLightColor32,
2462
+ lightenFast,
2463
+ lightenPerfect,
2464
+ lighterFast,
2465
+ lighterPerfect,
2466
+ linearBurnFast,
2467
+ linearBurnPerfect,
2468
+ linearDodgeFast,
2469
+ linearDodgePerfect,
2470
+ linearLightFast,
2471
+ linearLightPerfect,
1867
2472
  makeIndexedImage,
1868
2473
  makePixelCanvas,
1869
2474
  makeReusableCanvas,
1870
2475
  mergeMasks,
1871
- multiplyColor32,
1872
- overlayColor32,
1873
- overwriteColor32,
2476
+ multiplyFast,
2477
+ multiplyPerfect,
2478
+ overlayFast,
2479
+ overlayPerfect,
2480
+ overwriteFast,
2481
+ overwritePerfect,
1874
2482
  packColor,
1875
2483
  packRGBA,
1876
- pinLightColor32,
2484
+ pinLightFast,
2485
+ pinLightPerfect,
1877
2486
  pixelDataToAlphaMask,
1878
2487
  resizeImageData,
1879
- screenColor32,
2488
+ screenFast,
2489
+ screenPerfect,
1880
2490
  serializeImageData,
1881
2491
  serializeNullableImageData,
1882
- softLightColor32,
1883
- sourceOverColor32,
1884
- subtractColor32,
2492
+ softLightFast,
2493
+ softLightPerfect,
2494
+ sourceOverFast,
2495
+ sourceOverPerfect,
2496
+ subtractFast,
2497
+ subtractPerfect,
1885
2498
  trimRectBounds,
1886
2499
  unpackAlpha,
1887
2500
  unpackBlue,
@@ -1889,7 +2502,8 @@ function invertPixelData(pixelData) {
1889
2502
  unpackColorTo,
1890
2503
  unpackGreen,
1891
2504
  unpackRed,
1892
- vividLightColor32,
2505
+ vividLightFast,
2506
+ vividLightPerfect,
1893
2507
  writeImageDataPixels,
1894
2508
  writeImageDataToClipboard,
1895
2509
  writeImgBlobToClipboard