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.
- package/dist/index.dev.cjs +871 -257
- package/dist/index.dev.cjs.map +1 -1
- package/dist/index.dev.js +814 -231
- package/dist/index.dev.js.map +1 -1
- package/dist/index.prod.cjs +871 -257
- package/dist/index.prod.cjs.map +1 -1
- package/dist/index.prod.d.ts +171 -100
- package/dist/index.prod.js +814 -231
- package/dist/index.prod.js.map +1 -1
- package/package.json +1 -1
- package/src/Algorithm/floodFillSelection.ts +1 -1
- package/src/{blend-modes.ts → BlendModes/blend-modes-fast.ts} +215 -217
- package/src/BlendModes/blend-modes-perfect.ts +651 -0
- package/src/BlendModes/blend-modes.ts +31 -0
- package/src/IndexedImage/IndexedImage.ts +32 -49
- package/src/IndexedImage/indexedImageToAverageColor.ts +65 -0
- package/src/PixelData/PixelData.ts +31 -0
- package/src/PixelData/applyMaskToPixelData.ts +1 -1
- package/src/PixelData/blendColorPixelData.ts +4 -3
- package/src/PixelData/blendPixelData.ts +4 -3
- package/src/PixelData/clearPixelData.ts +1 -1
- package/src/PixelData/fillPixelData.ts +1 -1
- package/src/PixelData/invertPixelData.ts +1 -1
- package/src/PixelData/pixelDataToAlphaMask.ts +1 -1
- package/src/PixelData/reflectPixelData.ts +42 -0
- package/src/PixelData/rotatePixelData.ts +56 -0
- package/src/_types.ts +3 -3
- package/src/index.ts +7 -2
- package/src/PixelData.ts +0 -20
package/dist/index.dev.cjs
CHANGED
|
@@ -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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
45
|
+
colorBurnFast: () => colorBurnFast,
|
|
46
|
+
colorBurnPerfect: () => colorBurnPerfect,
|
|
39
47
|
colorDistance: () => colorDistance,
|
|
40
|
-
|
|
48
|
+
colorDodgeFast: () => colorDodgeFast,
|
|
49
|
+
colorDodgePerfect: () => colorDodgePerfect,
|
|
41
50
|
copyImageData: () => copyImageData,
|
|
42
51
|
copyImageDataLike: () => copyImageDataLike,
|
|
43
52
|
copyMask: () => copyMask,
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
61
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
111
|
+
pinLightFast: () => pinLightFast,
|
|
112
|
+
pinLightPerfect: () => pinLightPerfect,
|
|
87
113
|
pixelDataToAlphaMask: () => pixelDataToAlphaMask,
|
|
88
114
|
resizeImageData: () => resizeImageData,
|
|
89
|
-
|
|
115
|
+
screenFast: () => screenFast,
|
|
116
|
+
screenPerfect: () => screenPerfect,
|
|
90
117
|
serializeImageData: () => serializeImageData,
|
|
91
118
|
serializeNullableImageData: () => serializeNullableImageData,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
|
184
|
+
var darkenFast = (src, dst) => {
|
|
128
185
|
const sa = src >>> 24 & 255;
|
|
129
186
|
if (sa === 0) return dst;
|
|
130
|
-
const
|
|
131
|
-
const
|
|
132
|
-
const
|
|
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
|
|
200
|
+
var multiplyFast = (src, dst) => {
|
|
145
201
|
const sa = src >>> 24 & 255;
|
|
146
202
|
if (sa === 0) return dst;
|
|
147
|
-
const
|
|
148
|
-
const
|
|
149
|
-
const
|
|
150
|
-
const
|
|
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 +
|
|
214
|
+
const a = 255 * sa + da * invA >> 8;
|
|
157
215
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
158
216
|
};
|
|
159
|
-
var
|
|
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
|
|
163
|
-
const dr = dst & 255, dg = dst
|
|
164
|
-
const br = dr === 255 ? 255 : Math.max(0, 255 - (255 - dr << 8) /
|
|
165
|
-
const bg = dg === 255 ? 255 : Math.max(0, 255 - (255 - dg << 8) /
|
|
166
|
-
const bb = db === 255 ? 255 : Math.max(0, 255 - (255 - db << 8) /
|
|
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 +
|
|
231
|
+
const a = 255 * sa + da * invA >> 8;
|
|
173
232
|
return (a << 24 | b << 16 | g << 8 | r) >>> 0;
|
|
174
233
|
};
|
|
175
|
-
var
|
|
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
|
|
179
|
-
const sr = src & 255, sg = src
|
|
180
|
-
const
|
|
181
|
-
const
|
|
182
|
-
const
|
|
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
|
|
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
|
|
195
|
-
const sr = src & 255, sg = src
|
|
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
|
|
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
|
|
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
|
|
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
|
|
239
|
-
const bb = 255 - ((255 - (src
|
|
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
|
|
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
|
|
252
|
-
const sr = src & 255, sg = src
|
|
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
|
|
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
|
|
268
|
-
const
|
|
269
|
-
const
|
|
270
|
-
const
|
|
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
|
|
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
|
|
283
|
-
const sr = src & 255, sg = src
|
|
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
|
|
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
|
|
308
|
-
const dr = dst & 255, dg = dst
|
|
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
|
|
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
|
|
324
|
-
const sr = src & 255, sg = src
|
|
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
|
|
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
|
|
340
|
-
const sr = src & 255, sg = src
|
|
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
|
|
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
|
|
356
|
-
const sr = src & 255, sg = src
|
|
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
|
|
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
|
|
372
|
-
const sr = src & 255, sg = src
|
|
373
|
-
const
|
|
374
|
-
const
|
|
375
|
-
const
|
|
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
|
|
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
|
|
388
|
-
const sr = src & 255, sg = src
|
|
389
|
-
const br = sr < 128 ?
|
|
390
|
-
const bg = sg < 128 ?
|
|
391
|
-
const bb = 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
|
|
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
|
|
404
|
-
const sr = src & 255, sg = src
|
|
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
|
|
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
|
|
420
|
-
const
|
|
421
|
-
const
|
|
422
|
-
const
|
|
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
|
|
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
|
|
435
|
-
const sr = src & 255, sg = src
|
|
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
|
|
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
|
|
451
|
-
const sr = src & 255, sg = src
|
|
452
|
-
const
|
|
453
|
-
const
|
|
454
|
-
const
|
|
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
|
|
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
|
|
467
|
-
const sr = src & 255, sg = src
|
|
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
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
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
|
|
531
|
-
for (const [index, blend] of
|
|
532
|
-
|
|
578
|
+
var FAST_BLEND_MODES = [];
|
|
579
|
+
for (const [index, blend] of FAST_BLENDER_REGISTRY) {
|
|
580
|
+
FAST_BLEND_MODES[index] = blend;
|
|
533
581
|
}
|
|
534
|
-
var
|
|
535
|
-
|
|
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
|
|
543
|
-
|
|
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
|
|
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
|
|
1738
|
+
const transparentColor = 0;
|
|
1195
1739
|
const transparentPalletIndex = 0;
|
|
1196
|
-
colorMap.set(
|
|
1197
|
-
tempPalette.push(
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
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(
|
|
1216
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
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
|
-
|
|
2418
|
+
colorBurnFast,
|
|
2419
|
+
colorBurnPerfect,
|
|
1829
2420
|
colorDistance,
|
|
1830
|
-
|
|
2421
|
+
colorDodgeFast,
|
|
2422
|
+
colorDodgePerfect,
|
|
1831
2423
|
copyImageData,
|
|
1832
2424
|
copyImageDataLike,
|
|
1833
2425
|
copyMask,
|
|
1834
|
-
|
|
1835
|
-
|
|
2426
|
+
darkenFast,
|
|
2427
|
+
darkenPerfect,
|
|
2428
|
+
darkerFast,
|
|
2429
|
+
darkerPerfect,
|
|
1836
2430
|
deserializeImageData,
|
|
1837
2431
|
deserializeNullableImageData,
|
|
1838
2432
|
deserializeRawImageData,
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
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
|
-
|
|
1851
|
-
|
|
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
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
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
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
2476
|
+
multiplyFast,
|
|
2477
|
+
multiplyPerfect,
|
|
2478
|
+
overlayFast,
|
|
2479
|
+
overlayPerfect,
|
|
2480
|
+
overwriteFast,
|
|
2481
|
+
overwritePerfect,
|
|
1874
2482
|
packColor,
|
|
1875
2483
|
packRGBA,
|
|
1876
|
-
|
|
2484
|
+
pinLightFast,
|
|
2485
|
+
pinLightPerfect,
|
|
1877
2486
|
pixelDataToAlphaMask,
|
|
1878
2487
|
resizeImageData,
|
|
1879
|
-
|
|
2488
|
+
screenFast,
|
|
2489
|
+
screenPerfect,
|
|
1880
2490
|
serializeImageData,
|
|
1881
2491
|
serializeNullableImageData,
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
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
|
-
|
|
2505
|
+
vividLightFast,
|
|
2506
|
+
vividLightPerfect,
|
|
1893
2507
|
writeImageDataPixels,
|
|
1894
2508
|
writeImageDataToClipboard,
|
|
1895
2509
|
writeImgBlobToClipboard
|