akarisub 0.2.0 → 0.2.1
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/README.md +3 -3
- package/dist/akarisub-worker.js +2 -2
- package/dist/akarisub-worker.wasm +0 -0
- package/dist/akarisub.umd.js +3 -3
- package/dist/index.js +3 -3
- package/dist/ts/index.d.ts +14 -0
- package/dist/ts/index.d.ts.map +1 -0
- package/dist/ts/index.js +17 -0
- package/dist/ts/index.js.map +1 -0
- package/dist/ts/ts/akarisub.d.ts +229 -0
- package/dist/ts/ts/akarisub.d.ts.map +1 -0
- package/dist/ts/ts/akarisub.js +1079 -0
- package/dist/ts/ts/akarisub.js.map +1 -0
- package/dist/ts/ts/types.d.ts +424 -0
- package/dist/ts/ts/types.d.ts.map +1 -0
- package/dist/ts/ts/types.js +5 -0
- package/dist/ts/ts/types.js.map +1 -0
- package/dist/ts/ts/utils.d.ts +78 -0
- package/dist/ts/ts/utils.d.ts.map +1 -0
- package/dist/ts/ts/utils.js +395 -0
- package/dist/ts/ts/utils.js.map +1 -0
- package/dist/ts/ts/webgl2-renderer.d.ts +51 -0
- package/dist/ts/ts/webgl2-renderer.d.ts.map +1 -0
- package/dist/ts/ts/webgl2-renderer.js +388 -0
- package/dist/ts/ts/webgl2-renderer.js.map +1 -0
- package/dist/ts/ts/webgpu-renderer.d.ts +64 -0
- package/dist/ts/ts/webgpu-renderer.d.ts.map +1 -0
- package/dist/ts/ts/webgpu-renderer.js +610 -0
- package/dist/ts/ts/webgpu-renderer.js.map +1 -0
- package/dist/ts/ts/worker.d.ts +6 -0
- package/dist/ts/ts/worker.d.ts.map +1 -0
- package/dist/ts/ts/worker.js +1695 -0
- package/dist/ts/ts/worker.js.map +1 -0
- package/dist/ts/wrapper.d.ts +8 -0
- package/dist/ts/wrapper.d.ts.map +1 -0
- package/dist/ts/wrapper.js +9 -0
- package/dist/ts/wrapper.js.map +1 -0
- package/package.json +7 -6
- package/src/ts/akarisub.ts +46 -4
- package/src/ts/types.ts +18 -4
- package/src/ts/worker.ts +177 -23
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for AkariSub.
|
|
3
|
+
*/
|
|
4
|
+
// =============================================================================
|
|
5
|
+
// Color Space Utilities
|
|
6
|
+
// =============================================================================
|
|
7
|
+
/** Map video color space to standard name */
|
|
8
|
+
export const webYCbCrMap = {
|
|
9
|
+
bt709: 'BT709',
|
|
10
|
+
bt470bg: 'BT601', // BT.601 PAL
|
|
11
|
+
smpte170m: 'BT601' // BT.601 NTSC
|
|
12
|
+
};
|
|
13
|
+
/** Color matrix conversion values for SVG filter */
|
|
14
|
+
export const colorMatrixConversionMap = {
|
|
15
|
+
BT601: {
|
|
16
|
+
BT709: '1.0863 -0.0723 -0.014 0 0 0.0965 0.8451 0.0584 0 0 -0.0141 -0.0277 1.0418'
|
|
17
|
+
},
|
|
18
|
+
BT709: {
|
|
19
|
+
BT601: '0.9137 0.0784 0.0079 0 0 -0.1049 1.1722 -0.0671 0 0 0.0096 0.0322 0.9582'
|
|
20
|
+
},
|
|
21
|
+
FCC: {
|
|
22
|
+
BT709: '1.0873 -0.0736 -0.0137 0 0 0.0974 0.8494 0.0531 0 0 -0.0127 -0.0251 1.0378',
|
|
23
|
+
BT601: '1.001 -0.0008 -0.0002 0 0 0.0009 1.005 -0.006 0 0 0.0013 0.0027 0.996'
|
|
24
|
+
},
|
|
25
|
+
SMPTE240M: {
|
|
26
|
+
BT709: '0.9993 0.0006 0.0001 0 0 -0.0004 0.9812 0.0192 0 0 -0.0034 -0.0114 1.0148',
|
|
27
|
+
BT601: '0.913 0.0774 0.0096 0 0 -0.1051 1.1508 -0.0456 0 0 0.0063 0.0207 0.973'
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
/** libass YCbCr color space index map */
|
|
31
|
+
export const libassYCbCrMap = [
|
|
32
|
+
null,
|
|
33
|
+
'BT601',
|
|
34
|
+
null,
|
|
35
|
+
'BT601',
|
|
36
|
+
'BT601',
|
|
37
|
+
'BT709',
|
|
38
|
+
'BT709',
|
|
39
|
+
'SMPTE240M',
|
|
40
|
+
'SMPTE240M',
|
|
41
|
+
'FCC',
|
|
42
|
+
'FCC'
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* Generate SVG filter URL for color space conversion.
|
|
46
|
+
*/
|
|
47
|
+
export function getColorSpaceFilterUrl(subtitleColorSpace, videoColorSpace) {
|
|
48
|
+
if (!subtitleColorSpace || !videoColorSpace)
|
|
49
|
+
return null;
|
|
50
|
+
if (subtitleColorSpace === videoColorSpace)
|
|
51
|
+
return null;
|
|
52
|
+
const matrix = colorMatrixConversionMap[subtitleColorSpace]?.[videoColorSpace];
|
|
53
|
+
if (!matrix)
|
|
54
|
+
return null;
|
|
55
|
+
return `url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${matrix} 0 0 0 0 0 1 0'/></filter></svg>#f")`;
|
|
56
|
+
}
|
|
57
|
+
// =============================================================================
|
|
58
|
+
// Canvas Utilities
|
|
59
|
+
// =============================================================================
|
|
60
|
+
/**
|
|
61
|
+
* Compute canvas size with prescaling.
|
|
62
|
+
*/
|
|
63
|
+
export function computeCanvasSize(width, height, prescaleFactor, prescaleHeightLimit, maxRenderHeight) {
|
|
64
|
+
const scalefactor = prescaleFactor <= 0 ? 1.0 : prescaleFactor;
|
|
65
|
+
const ratio = globalThis.devicePixelRatio || 1;
|
|
66
|
+
if (height <= 0 || width <= 0) {
|
|
67
|
+
return { width: 0, height: 0 };
|
|
68
|
+
}
|
|
69
|
+
const sgn = scalefactor < 1 ? -1 : 1;
|
|
70
|
+
let newH = height * ratio;
|
|
71
|
+
if (sgn * newH * scalefactor <= sgn * prescaleHeightLimit) {
|
|
72
|
+
newH *= scalefactor;
|
|
73
|
+
}
|
|
74
|
+
else if (sgn * newH < sgn * prescaleHeightLimit) {
|
|
75
|
+
newH = prescaleHeightLimit;
|
|
76
|
+
}
|
|
77
|
+
if (maxRenderHeight > 0 && newH > maxRenderHeight) {
|
|
78
|
+
newH = maxRenderHeight;
|
|
79
|
+
}
|
|
80
|
+
width *= newH / height;
|
|
81
|
+
height = newH;
|
|
82
|
+
return { width, height };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get video position and size accounting for aspect ratio.
|
|
86
|
+
*/
|
|
87
|
+
export function getVideoPosition(video, videoWidth = video.videoWidth, videoHeight = video.videoHeight) {
|
|
88
|
+
const videoRatio = videoWidth / videoHeight;
|
|
89
|
+
const { offsetWidth, offsetHeight } = video;
|
|
90
|
+
const elementRatio = offsetWidth / offsetHeight;
|
|
91
|
+
let width = offsetWidth;
|
|
92
|
+
let height = offsetHeight;
|
|
93
|
+
if (elementRatio > videoRatio) {
|
|
94
|
+
width = Math.floor(offsetHeight * videoRatio);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
height = Math.floor(offsetWidth / videoRatio);
|
|
98
|
+
}
|
|
99
|
+
const x = (offsetWidth - width) / 2;
|
|
100
|
+
const y = (offsetHeight - height) / 2;
|
|
101
|
+
return { width, height, x, y };
|
|
102
|
+
}
|
|
103
|
+
// =============================================================================
|
|
104
|
+
// Alpha Bug Fix
|
|
105
|
+
// =============================================================================
|
|
106
|
+
/**
|
|
107
|
+
* Fix alpha bug in some browsers (transparent pixels rendered as non-black).
|
|
108
|
+
*/
|
|
109
|
+
export function fixAlpha(uint8, hasAlphaBug) {
|
|
110
|
+
if (!hasAlphaBug)
|
|
111
|
+
return uint8;
|
|
112
|
+
const len = uint8.length;
|
|
113
|
+
const len4 = len - (len % 16); // Process 4 pixels at a time (16 bytes)
|
|
114
|
+
// Unrolled loop for 4 pixels at a time
|
|
115
|
+
let j = 3;
|
|
116
|
+
for (; j < len4; j += 16) {
|
|
117
|
+
if (uint8[j] < 2)
|
|
118
|
+
uint8[j] = 1;
|
|
119
|
+
if (uint8[j + 4] < 2)
|
|
120
|
+
uint8[j + 4] = 1;
|
|
121
|
+
if (uint8[j + 8] < 2)
|
|
122
|
+
uint8[j + 8] = 1;
|
|
123
|
+
if (uint8[j + 12] < 2)
|
|
124
|
+
uint8[j + 12] = 1;
|
|
125
|
+
}
|
|
126
|
+
// Handle remaining pixels
|
|
127
|
+
for (; j < len; j += 4) {
|
|
128
|
+
if (uint8[j] < 2)
|
|
129
|
+
uint8[j] = 1;
|
|
130
|
+
}
|
|
131
|
+
return uint8;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Parse ASS file content.
|
|
135
|
+
* @param content - ASS file content
|
|
136
|
+
* @param stopAtEvents - Stop parsing when [Events] section is reached (for font detection)
|
|
137
|
+
*/
|
|
138
|
+
export function parseAss(content, stopAtEvents = false) {
|
|
139
|
+
const sections = [];
|
|
140
|
+
const lines = content.split(/[\r\n]+/g);
|
|
141
|
+
const lineCount = lines.length;
|
|
142
|
+
let format = null;
|
|
143
|
+
let currentSection = null;
|
|
144
|
+
for (let i = 0; i < lineCount; i++) {
|
|
145
|
+
const line = lines[i];
|
|
146
|
+
if (!line || /^\s*$/.test(line))
|
|
147
|
+
continue;
|
|
148
|
+
const firstChar = line[0];
|
|
149
|
+
if (firstChar === '[') {
|
|
150
|
+
const m = line.match(/^\[(.*)\]$/);
|
|
151
|
+
if (m) {
|
|
152
|
+
// Early termination for font detection performance
|
|
153
|
+
if (stopAtEvents && m[1].toLowerCase() === 'events') {
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
format = null;
|
|
157
|
+
currentSection = { name: m[1], body: [] };
|
|
158
|
+
sections.push(currentSection);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!currentSection)
|
|
163
|
+
continue;
|
|
164
|
+
if (firstChar === ';') {
|
|
165
|
+
currentSection.body.push({
|
|
166
|
+
type: 'comment',
|
|
167
|
+
value: line.substring(1)
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
const colonIdx = line.indexOf(':');
|
|
172
|
+
if (colonIdx === -1)
|
|
173
|
+
continue;
|
|
174
|
+
const key = line.substring(0, colonIdx);
|
|
175
|
+
let value = line.substring(colonIdx + 1).trim();
|
|
176
|
+
if (format || key === 'Format') {
|
|
177
|
+
let valueArr = value.split(',');
|
|
178
|
+
if (format && valueArr.length > format.length) {
|
|
179
|
+
const lastPart = valueArr.slice(format.length - 1).join(',');
|
|
180
|
+
valueArr = valueArr.slice(0, format.length - 1);
|
|
181
|
+
valueArr.push(lastPart);
|
|
182
|
+
}
|
|
183
|
+
const arrLen = valueArr.length;
|
|
184
|
+
for (let j = 0; j < arrLen; j++) {
|
|
185
|
+
valueArr[j] = valueArr[j].trim();
|
|
186
|
+
}
|
|
187
|
+
if (format) {
|
|
188
|
+
const tmp = {};
|
|
189
|
+
const formatLen = Math.min(format.length, arrLen);
|
|
190
|
+
for (let j = 0; j < formatLen; j++) {
|
|
191
|
+
tmp[format[j]] = valueArr[j];
|
|
192
|
+
}
|
|
193
|
+
value = tmp;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
value = valueArr;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (key === 'Format') {
|
|
200
|
+
format = value;
|
|
201
|
+
}
|
|
202
|
+
currentSection.body.push({ key, value });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return sections;
|
|
206
|
+
}
|
|
207
|
+
// =============================================================================
|
|
208
|
+
// ASS Content Transformation Utilities
|
|
209
|
+
// =============================================================================
|
|
210
|
+
const blurRegex = /\\blur(?:[0-9]+\.)?[0-9]+/gm;
|
|
211
|
+
/**
|
|
212
|
+
* Remove all blur tags from subtitle content.
|
|
213
|
+
*/
|
|
214
|
+
export function dropBlur(subContent) {
|
|
215
|
+
return subContent.replace(blurRegex, '');
|
|
216
|
+
}
|
|
217
|
+
// Common video resolutions to detect source resolution
|
|
218
|
+
const commonResolutions = [
|
|
219
|
+
{ w: 7680, h: 4320 }, // 8K
|
|
220
|
+
{ w: 3840, h: 2160 }, // 4K UHD
|
|
221
|
+
{ w: 2560, h: 1440 }, // 1440p
|
|
222
|
+
{ w: 1920, h: 1080 }, // 1080p
|
|
223
|
+
{ w: 1280, h: 720 } // 720p
|
|
224
|
+
];
|
|
225
|
+
/**
|
|
226
|
+
* Detect the likely source resolution based on max position values.
|
|
227
|
+
*/
|
|
228
|
+
function detectSourceResolution(maxX, maxY) {
|
|
229
|
+
const sorted = [...commonResolutions].sort((a, b) => a.w - b.w);
|
|
230
|
+
for (const res of sorted) {
|
|
231
|
+
if (maxX <= res.w && maxY <= res.h) {
|
|
232
|
+
return res;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return { w: Math.ceil(maxX / 100) * 100, h: Math.ceil(maxY / 100) * 100 };
|
|
236
|
+
}
|
|
237
|
+
function formatValue(value, original) {
|
|
238
|
+
const hasDecimal = original && original.includes('.');
|
|
239
|
+
return hasDecimal ? value.toFixed(2).replace(/\.?0+$/, '') : Math.round(value);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Scale override tags in Events from detected source resolution to PlayRes.
|
|
243
|
+
* Only scales tags within override blocks {...} in the Events section.
|
|
244
|
+
*/
|
|
245
|
+
export function fixPlayRes(subContent) {
|
|
246
|
+
const playResXMatch = subContent.match(/PlayResX:\s*(\d+)/i);
|
|
247
|
+
const playResYMatch = subContent.match(/PlayResY:\s*(\d+)/i);
|
|
248
|
+
const playResX = playResXMatch ? parseInt(playResXMatch[1], 10) : 1920;
|
|
249
|
+
const playResY = playResYMatch ? parseInt(playResYMatch[1], 10) : 1080;
|
|
250
|
+
const posRegex = /\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g;
|
|
251
|
+
const moveRegex = /\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g;
|
|
252
|
+
const orgRegex = /\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g;
|
|
253
|
+
const clipRectRegex = /\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g;
|
|
254
|
+
let maxX = 0;
|
|
255
|
+
let maxY = 0;
|
|
256
|
+
const findMax = (regex, xIndices, yIndices) => {
|
|
257
|
+
let match;
|
|
258
|
+
const regexCopy = new RegExp(regex.source, 'g');
|
|
259
|
+
while ((match = regexCopy.exec(subContent)) !== null) {
|
|
260
|
+
for (const i of xIndices) {
|
|
261
|
+
if (match[i]) {
|
|
262
|
+
const x = Math.abs(parseFloat(match[i]));
|
|
263
|
+
if (x > maxX)
|
|
264
|
+
maxX = x;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
for (const i of yIndices) {
|
|
268
|
+
if (match[i]) {
|
|
269
|
+
const y = Math.abs(parseFloat(match[i]));
|
|
270
|
+
if (y > maxY)
|
|
271
|
+
maxY = y;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
findMax(posRegex, [1], [2]);
|
|
277
|
+
findMax(moveRegex, [1, 3], [2, 4]);
|
|
278
|
+
findMax(orgRegex, [1], [2]);
|
|
279
|
+
findMax(clipRectRegex, [1, 3], [2, 4]);
|
|
280
|
+
if (maxX <= playResX && maxY <= playResY)
|
|
281
|
+
return subContent;
|
|
282
|
+
const sourceRes = detectSourceResolution(maxX, maxY);
|
|
283
|
+
const xnsize = playResX / sourceRes.w;
|
|
284
|
+
const ynsize = playResY / sourceRes.h;
|
|
285
|
+
const val = Math.min(xnsize, ynsize);
|
|
286
|
+
const val1 = Math.max(xnsize, ynsize);
|
|
287
|
+
const valFscx = 1.0;
|
|
288
|
+
let newContent = subContent;
|
|
289
|
+
const eventsMatch = newContent.match(/(\[Events\][\s\S]*)/i);
|
|
290
|
+
if (!eventsMatch)
|
|
291
|
+
return newContent;
|
|
292
|
+
let eventsSection = eventsMatch[1];
|
|
293
|
+
eventsSection = eventsSection.replace(posRegex, (_m, x, y) => `\\pos(${formatValue(parseFloat(x) * xnsize, x)},${formatValue(parseFloat(y) * ynsize, y)})`);
|
|
294
|
+
eventsSection = eventsSection.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g, (_m, x1, y1, x2, y2, t1, t2) => {
|
|
295
|
+
const res = `\\move(${formatValue(parseFloat(x1) * xnsize, x1)},${formatValue(parseFloat(y1) * ynsize, y1)},${formatValue(parseFloat(x2) * xnsize, x2)},${formatValue(parseFloat(y2) * ynsize, y2)}`;
|
|
296
|
+
return t1 ? `${res},${t1},${t2})` : `${res})`;
|
|
297
|
+
});
|
|
298
|
+
eventsSection = eventsSection.replace(orgRegex, (_m, x, y) => `\\org(${formatValue(parseFloat(x) * xnsize, x)},${formatValue(parseFloat(y) * ynsize, y)})`);
|
|
299
|
+
eventsSection = eventsSection.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g, (_m, type, x1, y1, x2, y2) => `\\${type}(${formatValue(parseFloat(x1) * xnsize, x1)},${formatValue(parseFloat(y1) * ynsize, y1)},${formatValue(parseFloat(x2) * xnsize, x2)},${formatValue(parseFloat(y2) * ynsize, y2)})`);
|
|
300
|
+
eventsSection = eventsSection.replace(/\\fs([\d.]+)/g, (_m, s) => `\\fs${formatValue(parseFloat(s) * val1, s)}`);
|
|
301
|
+
eventsSection = eventsSection.replace(/\\fscx([\d.]+)/g, (_m, s) => `\\fscx${formatValue(parseFloat(s) * valFscx, s)}`);
|
|
302
|
+
eventsSection = eventsSection.replace(/\\xbord([\d.]+)/g, (_m, s) => `\\xbord${formatValue(parseFloat(s) * xnsize, s)}`);
|
|
303
|
+
eventsSection = eventsSection.replace(/\\ybord([\d.]+)/g, (_m, s) => `\\ybord${formatValue(parseFloat(s) * ynsize, s)}`);
|
|
304
|
+
eventsSection = eventsSection.replace(/\\xshad(-?[\d.]+)/g, (_m, s) => `\\xshad${formatValue(parseFloat(s) * xnsize, s)}`);
|
|
305
|
+
eventsSection = eventsSection.replace(/\\yshad(-?[\d.]+)/g, (_m, s) => `\\yshad${formatValue(parseFloat(s) * ynsize, s)}`);
|
|
306
|
+
const minTags = ['fsp', 'bord', 'shad', 'be', 'blur'];
|
|
307
|
+
minTags.forEach((tag) => {
|
|
308
|
+
const rgx = new RegExp(`\\\\${tag}(-?[\\d.]+)`, 'g');
|
|
309
|
+
eventsSection = eventsSection.replace(rgx, (_m, s) => `\\${tag}${formatValue(parseFloat(s) * val, s)}`);
|
|
310
|
+
});
|
|
311
|
+
eventsSection = eventsSection.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g, (match) => {
|
|
312
|
+
return match.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g, (_m, x, y) => {
|
|
313
|
+
return `${formatValue(parseFloat(x) * xnsize, x)} ${formatValue(parseFloat(y) * ynsize, y)}`;
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
return newContent.substring(0, eventsMatch.index) + eventsSection;
|
|
317
|
+
}
|
|
318
|
+
// =============================================================================
|
|
319
|
+
// Feature Detection
|
|
320
|
+
// =============================================================================
|
|
321
|
+
let _hasAlphaBug = null;
|
|
322
|
+
let _hasBitmapBug = null;
|
|
323
|
+
/**
|
|
324
|
+
* Test for browser image bugs.
|
|
325
|
+
*/
|
|
326
|
+
export async function testImageBugs() {
|
|
327
|
+
if (_hasAlphaBug !== null && _hasBitmapBug !== null) {
|
|
328
|
+
return { hasAlphaBug: _hasAlphaBug, hasBitmapBug: _hasBitmapBug };
|
|
329
|
+
}
|
|
330
|
+
const canvas1 = document.createElement('canvas');
|
|
331
|
+
const ctx1 = canvas1.getContext('2d', { willReadFrequently: true });
|
|
332
|
+
if (!ctx1)
|
|
333
|
+
throw new Error('Canvas rendering not supported');
|
|
334
|
+
// Test ImageData constructor
|
|
335
|
+
if (typeof ImageData.prototype.constructor === 'function') {
|
|
336
|
+
try {
|
|
337
|
+
new ImageData(new Uint8ClampedArray([0, 0, 0, 0]), 1, 1);
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
console.log('Detected that ImageData is not constructable despite browser saying so');
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// Test for alpha bug
|
|
344
|
+
const canvas2 = document.createElement('canvas');
|
|
345
|
+
const ctx2 = canvas2.getContext('2d', { willReadFrequently: true });
|
|
346
|
+
if (!ctx2)
|
|
347
|
+
throw new Error('Canvas rendering not supported');
|
|
348
|
+
canvas1.width = canvas2.width = 1;
|
|
349
|
+
canvas1.height = canvas2.height = 1;
|
|
350
|
+
ctx1.clearRect(0, 0, 1, 1);
|
|
351
|
+
ctx2.clearRect(0, 0, 1, 1);
|
|
352
|
+
const prePut = ctx2.getImageData(0, 0, 1, 1).data;
|
|
353
|
+
ctx1.putImageData(new ImageData(new Uint8ClampedArray([0, 255, 0, 0]), 1, 1), 0, 0);
|
|
354
|
+
ctx2.drawImage(canvas1, 0, 0);
|
|
355
|
+
const postPut = ctx2.getImageData(0, 0, 1, 1).data;
|
|
356
|
+
_hasAlphaBug = prePut[1] !== postPut[1];
|
|
357
|
+
if (_hasAlphaBug) {
|
|
358
|
+
console.log('Detected a browser having issue with transparent pixels, applying workaround');
|
|
359
|
+
}
|
|
360
|
+
// Test for bitmap bug
|
|
361
|
+
if (typeof createImageBitmap !== 'undefined') {
|
|
362
|
+
const subarray = new Uint8ClampedArray([255, 0, 255, 0, 255]).subarray(1, 5);
|
|
363
|
+
ctx2.drawImage(await createImageBitmap(new ImageData(subarray, 1)), 0, 0);
|
|
364
|
+
const { data } = ctx2.getImageData(0, 0, 1, 1);
|
|
365
|
+
_hasBitmapBug = false;
|
|
366
|
+
for (let i = 0; i < data.length; i++) {
|
|
367
|
+
if (Math.abs(subarray[i] - data[i]) > 15) {
|
|
368
|
+
_hasBitmapBug = true;
|
|
369
|
+
console.log('Detected a browser having issue with partial bitmaps, applying workaround');
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
_hasBitmapBug = false;
|
|
376
|
+
}
|
|
377
|
+
canvas1.remove();
|
|
378
|
+
canvas2.remove();
|
|
379
|
+
return { hasAlphaBug: _hasAlphaBug, hasBitmapBug: _hasBitmapBug };
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Run all feature detection tests.
|
|
383
|
+
*/
|
|
384
|
+
export async function runFeatureTests() {
|
|
385
|
+
return testImageBugs();
|
|
386
|
+
}
|
|
387
|
+
/** Get cached alpha bug value */
|
|
388
|
+
export function getAlphaBug() {
|
|
389
|
+
return _hasAlphaBug;
|
|
390
|
+
}
|
|
391
|
+
/** Get cached bitmap bug value */
|
|
392
|
+
export function getBitmapBug() {
|
|
393
|
+
return _hasBitmapBug;
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/ts/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAuC;IAC7D,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO,EAAE,aAAa;IAC/B,SAAS,EAAE,OAAO,CAAC,cAAc;CAClC,CAAA;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,wBAAwB,GAA2C;IAC9E,KAAK,EAAE;QACL,KAAK,EAAE,2EAA2E;KACnF;IACD,KAAK,EAAE;QACL,KAAK,EAAE,0EAA0E;KAClF;IACD,GAAG,EAAE;QACH,KAAK,EAAE,4EAA4E;QACnF,KAAK,EAAE,uEAAuE;KAC/E;IACD,SAAS,EAAE;QACT,KAAK,EAAE,2EAA2E;QAClF,KAAK,EAAE,wEAAwE;KAChF;CACF,CAAA;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAkC;IAC3D,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,WAAW;IACX,WAAW;IACX,KAAK;IACL,KAAK;CACN,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,kBAAsC,EACtC,eAAmC;IAEnC,IAAI,CAAC,kBAAkB,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAA;IACxD,IAAI,kBAAkB,KAAK,eAAe;QAAE,OAAO,IAAI,CAAA;IAEvD,MAAM,MAAM,GAAG,wBAAwB,CAAC,kBAAkB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAA;IAC9E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,OAAO,4HAA4H,MAAM,sCAAsC,CAAA;AACjL,CAAC;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,MAAc,EACd,cAAsB,EACtB,mBAA2B,EAC3B,eAAuB;IAEvB,MAAM,WAAW,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAA;IAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,gBAAgB,IAAI,CAAC,CAAA;IAE9C,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;IAChC,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,IAAI,GAAG,MAAM,GAAG,KAAK,CAAA;IAEzB,IAAI,GAAG,GAAG,IAAI,GAAG,WAAW,IAAI,GAAG,GAAG,mBAAmB,EAAE,CAAC;QAC1D,IAAI,IAAI,WAAW,CAAA;IACrB,CAAC;SAAM,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,mBAAmB,EAAE,CAAC;QAClD,IAAI,GAAG,mBAAmB,CAAA;IAC5B,CAAC;IAED,IAAI,eAAe,GAAG,CAAC,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;QAClD,IAAI,GAAG,eAAe,CAAA;IACxB,CAAC;IAED,KAAK,IAAI,IAAI,GAAG,MAAM,CAAA;IACtB,MAAM,GAAG,IAAI,CAAA;IAEb,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAuB,EACvB,UAAU,GAAW,KAAK,CAAC,UAAU,EACrC,WAAW,GAAW,KAAK,CAAC,WAAW;IAEvC,MAAM,UAAU,GAAG,UAAU,GAAG,WAAW,CAAA;IAC3C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,KAAK,CAAA;IAC3C,MAAM,YAAY,GAAG,WAAW,GAAG,YAAY,CAAA;IAE/C,IAAI,KAAK,GAAG,WAAW,CAAA;IACvB,IAAI,MAAM,GAAG,YAAY,CAAA;IAEzB,IAAI,YAAY,GAAG,UAAU,EAAE,CAAC;QAC9B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC,CAAA;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,CAAA;IAC/C,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACnC,MAAM,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAErC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AAChC,CAAC;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAwB,EAAE,WAAoB;IACrE,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAA;IAE9B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAA;IACxB,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAA,CAAC,wCAAwC;IAEtE,uCAAuC;IACvC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAiBD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,YAAY,GAAY,KAAK;IACrE,MAAM,QAAQ,GAAiB,EAAE,CAAA;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAA;IAC9B,IAAI,MAAM,GAAoB,IAAI,CAAA;IAClC,IAAI,cAAc,GAAsB,IAAI,CAAA;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAQ;QAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAEzB,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAClC,IAAI,CAAC,EAAE,CAAC;gBACN,mDAAmD;gBACnD,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;oBACpD,MAAK;gBACP,CAAC;gBACD,MAAM,GAAG,IAAI,CAAA;gBACb,cAAc,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;gBACzC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;gBAC7B,SAAQ;YACV,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc;YAAE,SAAQ;QAE7B,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aACzB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAClC,IAAI,QAAQ,KAAK,CAAC,CAAC;gBAAE,SAAQ;YAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACvC,IAAI,KAAK,GAA+C,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAE3F,IAAI,MAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC/B,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;oBAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAC5D,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;oBAC/C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACzB,CAAC;gBAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAChC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBAClC,CAAC;gBAED,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,GAA2B,EAAE,CAAA;oBACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;oBACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;wBACnC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;oBAC9B,CAAC;oBACD,KAAK,GAAG,GAAG,CAAA;gBACb,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,QAAQ,CAAA;gBAClB,CAAC;YACH,CAAC;YAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACrB,MAAM,GAAG,KAAiB,CAAA;YAC5B,CAAC;YAED,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,gFAAgF;AAChF,uCAAuC;AACvC,gFAAgF;AAEhF,MAAM,SAAS,GAAG,6BAA6B,CAAA;AAE/C;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,UAAkB;IACzC,OAAO,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,uDAAuD;AACvD,MAAM,iBAAiB,GAAG;IACxB,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK;IAC3B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;IAC/B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ;IAC9B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ;IAC9B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO;CAC5B,CAAA;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAY,EAAE,IAAY;IACxD,MAAM,MAAM,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;YACnC,OAAO,GAAG,CAAA;QACZ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAA;AAC3E,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,QAAiB;IACnD,MAAM,UAAU,GAAG,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACrD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAChF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAC5D,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAE5D,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEtE,MAAM,QAAQ,GAAG,gDAAgD,CAAA;IACjE,MAAM,SAAS,GAAG,8EAA8E,CAAA;IAChG,MAAM,QAAQ,GAAG,gDAAgD,CAAA;IACjE,MAAM,aAAa,GAAG,qFAAqF,CAAA;IAE3G,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,IAAI,GAAG,CAAC,CAAA;IAEZ,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,QAAkB,EAAE,QAAkB,EAAE,EAAE;QACxE,IAAI,KAA6B,CAAA;QACjC,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC/C,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACrD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;oBACxC,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAA;gBACxB,CAAC;YACH,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;oBACxC,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAA;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3B,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAClC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3B,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAEtC,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ;QAAE,OAAO,UAAU,CAAA;IAE3D,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACpD,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAA;IAErC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,GAAG,CAAA;IAEnB,IAAI,UAAU,GAAG,UAAU,CAAA;IAE3B,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;IAC5D,IAAI,CAAC,WAAW;QAAE,OAAO,UAAU,CAAA;IAEnC,IAAI,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IAElC,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,QAAQ,EACR,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,CAC3G,CAAA;IAED,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,0HAA0H,EAC1H,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,UAAU,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAA;QACpM,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAA;IAC/C,CAAC,CACF,CAAA;IAED,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,QAAQ,EACR,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,CAC3G,CAAA;IAED,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,uFAAuF,EACvF,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAC3B,KAAK,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,GAAG,CAC/L,CAAA;IAED,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAChH,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,iBAAiB,EACjB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,EAAE,CAC9D,CAAA;IACD,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,kBAAkB,EAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,CAC9D,CAAA;IACD,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,kBAAkB,EAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,CAC9D,CAAA;IACD,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,oBAAoB,EACpB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,CAC9D,CAAA;IACD,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,oBAAoB,EACpB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,CAC9D,CAAA;IAED,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACrD,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,GAAG,aAAa,EAAE,GAAG,CAAC,CAAA;QACpD,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IACzG,CAAC,CAAC,CAAA;IAEF,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,0DAA0D,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1G,OAAO,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5D,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,CAAA;QAC9F,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,KAAM,CAAC,GAAG,aAAa,CAAA;AACpE,CAAC;AAED,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF,IAAI,YAAY,GAAmB,IAAI,CAAA;AACvC,IAAI,aAAa,GAAmB,IAAI,CAAA;AAExC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,YAAY,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,CAAA;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAA;IACnE,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAE5D,6BAA6B;IAC7B,IAAI,OAAO,SAAS,CAAC,SAAS,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,IAAI,SAAS,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAA;IACnE,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAE5D,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAA;IACjC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;IACnC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IACjD,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACnF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAElD,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAA;IAC7F,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,iBAAiB,KAAK,WAAW,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5E,IAAI,CAAC,SAAS,CAAC,MAAM,iBAAiB,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACzE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9C,aAAa,GAAG,KAAK,CAAA;QAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzC,aAAa,GAAG,IAAI,CAAA;gBACpB,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAA;gBACxF,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,KAAK,CAAA;IACvB,CAAC;IAED,OAAO,CAAC,MAAM,EAAE,CAAA;IAChB,OAAO,CAAC,MAAM,EAAE,CAAA;IAEhB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,CAAA;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IAInC,OAAO,aAAa,EAAE,CAAA;AACxB,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,YAAY;IAC1B,OAAO,aAAa,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { RenderImage } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Check if WebGL2 is supported in the current browser.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isWebGL2Supported(): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* High-performance WebGL2 subtitle renderer for AkariSub.
|
|
8
|
+
*/
|
|
9
|
+
export declare class WebGL2Renderer {
|
|
10
|
+
private _gl;
|
|
11
|
+
private _canvas;
|
|
12
|
+
private _program;
|
|
13
|
+
private _vao;
|
|
14
|
+
private _instanceBuffer;
|
|
15
|
+
private _texArray;
|
|
16
|
+
private _texWidth;
|
|
17
|
+
private _texHeight;
|
|
18
|
+
private _texLayers;
|
|
19
|
+
private _resolutionLoc;
|
|
20
|
+
private _texArraySizeLoc;
|
|
21
|
+
private readonly _instanceData;
|
|
22
|
+
private _lastCanvasWidth;
|
|
23
|
+
private _lastCanvasHeight;
|
|
24
|
+
private _initialized;
|
|
25
|
+
private _initPromise;
|
|
26
|
+
constructor();
|
|
27
|
+
init(): Promise<void>;
|
|
28
|
+
private _checkSupport;
|
|
29
|
+
private _initGL;
|
|
30
|
+
private _nextPow2;
|
|
31
|
+
private _allocateTextureArray;
|
|
32
|
+
private _ensureTextureArray;
|
|
33
|
+
setCanvas(canvas: HTMLCanvasElement, width: number, height: number): Promise<void>;
|
|
34
|
+
updateSize(width: number, height: number): void;
|
|
35
|
+
/**
|
|
36
|
+
* Render from ImageBitmaps (async render mode)
|
|
37
|
+
*/
|
|
38
|
+
renderBitmaps(images: {
|
|
39
|
+
image: ImageBitmap;
|
|
40
|
+
x: number;
|
|
41
|
+
y: number;
|
|
42
|
+
}[], _canvasWidth: number, _canvasHeight: number): void;
|
|
43
|
+
/**
|
|
44
|
+
* Render from raw ArrayBuffer data (non-async render mode)
|
|
45
|
+
*/
|
|
46
|
+
render(images: RenderImage[], _canvasWidth: number, _canvasHeight: number): void;
|
|
47
|
+
clear(): void;
|
|
48
|
+
get initialized(): boolean;
|
|
49
|
+
destroy(): void;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=webgl2-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl2-renderer.d.ts","sourceRoot":"","sources":["../../../src/ts/webgl2-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAgE1C;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C;AAkBD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAsC;IACjD,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,SAAS,CAA4B;IAE7C,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,UAAU,CAAI;IAEtB,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;IAE5C,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,YAAY,CAA6B;IAEjD,cAEC;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1B;YAEa,aAAa;IAM3B,OAAO,CAAC,OAAO;IA+Df,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,mBAAmB;IAgBrB,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUvF;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ9C;IAED;;OAEG;IACH,aAAa,CACX,MAAM,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,EACtD,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,IAAI,CAwDN;IAED;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,WAAW,EAAE,EACrB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,IAAI,CA8DN;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,OAAO,IAAI,IAAI,CAgBd;CACF"}
|