@swf2es/render 0.0.0-stage → 0.1.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.
Files changed (143) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +17 -2
  3. package/dist/commands.d.ts +67 -0
  4. package/dist/commands.d.ts.map +1 -0
  5. package/dist/commands.js +93 -0
  6. package/dist/commands.js.map +1 -0
  7. package/dist/filter-plan.d.ts +110 -0
  8. package/dist/filter-plan.d.ts.map +1 -0
  9. package/dist/filter-plan.js +480 -0
  10. package/dist/filter-plan.js.map +1 -0
  11. package/dist/filter-shaders.d.ts +63 -0
  12. package/dist/filter-shaders.d.ts.map +1 -0
  13. package/dist/filter-shaders.js +350 -0
  14. package/dist/filter-shaders.js.map +1 -0
  15. package/dist/filters.d.ts +107 -0
  16. package/dist/filters.d.ts.map +1 -0
  17. package/dist/filters.js +187 -0
  18. package/dist/filters.js.map +1 -0
  19. package/dist/geometry.d.ts +83 -0
  20. package/dist/geometry.d.ts.map +1 -0
  21. package/dist/geometry.js +93 -0
  22. package/dist/geometry.js.map +1 -0
  23. package/dist/index.d.ts +11 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +13 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/keeps.d.ts +17 -0
  28. package/dist/keeps.d.ts.map +1 -0
  29. package/dist/keeps.js +17 -0
  30. package/dist/keeps.js.map +1 -0
  31. package/dist/kernel-shaders.d.ts +74 -0
  32. package/dist/kernel-shaders.d.ts.map +1 -0
  33. package/dist/kernel-shaders.js +323 -0
  34. package/dist/kernel-shaders.js.map +1 -0
  35. package/dist/measure.d.ts +56 -0
  36. package/dist/measure.d.ts.map +1 -0
  37. package/dist/measure.js +287 -0
  38. package/dist/measure.js.map +1 -0
  39. package/dist/plan.d.ts +14 -0
  40. package/dist/plan.d.ts.map +1 -0
  41. package/dist/plan.js +247 -0
  42. package/dist/plan.js.map +1 -0
  43. package/dist/registry.d.ts +49 -0
  44. package/dist/registry.d.ts.map +1 -0
  45. package/dist/registry.js +87 -0
  46. package/dist/registry.js.map +1 -0
  47. package/dist/rows.d.ts +39 -0
  48. package/dist/rows.d.ts.map +1 -0
  49. package/dist/rows.js +60 -0
  50. package/dist/rows.js.map +1 -0
  51. package/dist/scene.d.ts +179 -0
  52. package/dist/scene.d.ts.map +1 -0
  53. package/dist/scene.js +265 -0
  54. package/dist/scene.js.map +1 -0
  55. package/dist/shelves.d.ts +23 -0
  56. package/dist/shelves.d.ts.map +1 -0
  57. package/dist/shelves.js +63 -0
  58. package/dist/shelves.js.map +1 -0
  59. package/dist/textures.d.ts +72 -0
  60. package/dist/textures.d.ts.map +1 -0
  61. package/dist/textures.js +160 -0
  62. package/dist/textures.js.map +1 -0
  63. package/dist/webgl/atlas.d.ts +63 -0
  64. package/dist/webgl/atlas.d.ts.map +1 -0
  65. package/dist/webgl/atlas.js +328 -0
  66. package/dist/webgl/atlas.js.map +1 -0
  67. package/dist/webgl/backend.d.ts +141 -0
  68. package/dist/webgl/backend.d.ts.map +1 -0
  69. package/dist/webgl/backend.js +659 -0
  70. package/dist/webgl/backend.js.map +1 -0
  71. package/dist/webgl/composite.d.ts +101 -0
  72. package/dist/webgl/composite.d.ts.map +1 -0
  73. package/dist/webgl/composite.js +293 -0
  74. package/dist/webgl/composite.js.map +1 -0
  75. package/dist/webgl/draws.d.ts +213 -0
  76. package/dist/webgl/draws.d.ts.map +1 -0
  77. package/dist/webgl/draws.js +714 -0
  78. package/dist/webgl/draws.js.map +1 -0
  79. package/dist/webgl/filters.d.ts +107 -0
  80. package/dist/webgl/filters.d.ts.map +1 -0
  81. package/dist/webgl/filters.js +351 -0
  82. package/dist/webgl/filters.js.map +1 -0
  83. package/dist/webgl/gpu-textures.d.ts +44 -0
  84. package/dist/webgl/gpu-textures.d.ts.map +1 -0
  85. package/dist/webgl/gpu-textures.js +178 -0
  86. package/dist/webgl/gpu-textures.js.map +1 -0
  87. package/dist/webgl/holds.d.ts +97 -0
  88. package/dist/webgl/holds.d.ts.map +1 -0
  89. package/dist/webgl/holds.js +453 -0
  90. package/dist/webgl/holds.js.map +1 -0
  91. package/dist/webgl/index.d.ts +2 -0
  92. package/dist/webgl/index.d.ts.map +1 -0
  93. package/dist/webgl/index.js +4 -0
  94. package/dist/webgl/index.js.map +1 -0
  95. package/dist/webgl/kernels.d.ts +64 -0
  96. package/dist/webgl/kernels.d.ts.map +1 -0
  97. package/dist/webgl/kernels.js +160 -0
  98. package/dist/webgl/kernels.js.map +1 -0
  99. package/dist/webgl/pool.d.ts +71 -0
  100. package/dist/webgl/pool.d.ts.map +1 -0
  101. package/dist/webgl/pool.js +192 -0
  102. package/dist/webgl/pool.js.map +1 -0
  103. package/dist/webgl/programs.d.ts +130 -0
  104. package/dist/webgl/programs.d.ts.map +1 -0
  105. package/dist/webgl/programs.js +582 -0
  106. package/dist/webgl/programs.js.map +1 -0
  107. package/dist/webgl/stage.d.ts +67 -0
  108. package/dist/webgl/stage.d.ts.map +1 -0
  109. package/dist/webgl/stage.js +173 -0
  110. package/dist/webgl/stage.js.map +1 -0
  111. package/dist/webgl/targets.d.ts +172 -0
  112. package/dist/webgl/targets.d.ts.map +1 -0
  113. package/dist/webgl/targets.js +323 -0
  114. package/dist/webgl/targets.js.map +1 -0
  115. package/package.json +35 -3
  116. package/src/commands.ts +98 -0
  117. package/src/filter-plan.ts +755 -0
  118. package/src/filter-shaders.ts +360 -0
  119. package/src/filters.ts +220 -0
  120. package/src/geometry.ts +143 -0
  121. package/src/index.ts +87 -0
  122. package/src/keeps.ts +21 -0
  123. package/src/kernel-shaders.ts +375 -0
  124. package/src/measure.ts +400 -0
  125. package/src/plan.ts +331 -0
  126. package/src/registry.ts +105 -0
  127. package/src/rows.ts +93 -0
  128. package/src/scene.ts +297 -0
  129. package/src/shelves.ts +70 -0
  130. package/src/textures.ts +198 -0
  131. package/src/webgl/atlas.ts +370 -0
  132. package/src/webgl/backend.ts +973 -0
  133. package/src/webgl/composite.ts +372 -0
  134. package/src/webgl/draws.ts +902 -0
  135. package/src/webgl/filters.ts +502 -0
  136. package/src/webgl/gpu-textures.ts +253 -0
  137. package/src/webgl/holds.ts +624 -0
  138. package/src/webgl/index.ts +3 -0
  139. package/src/webgl/kernels.ts +205 -0
  140. package/src/webgl/pool.ts +245 -0
  141. package/src/webgl/programs.ts +620 -0
  142. package/src/webgl/stage.ts +214 -0
  143. package/src/webgl/targets.ts +464 -0
@@ -0,0 +1,480 @@
1
+ // A filtered layer's chain of Flash's filters as passes planned ahead of the
2
+ // GPU: for each pass, its program, the targets it reads and draws into, by
3
+ // slot, their frames, and its uniforms' values, as the backend's runner
4
+ // (webgl/filters.ts) draws them. Pure, so that a frame's chains can be
5
+ // planned all at once and their passes run in any order their slots allow.
6
+ import { BEVEL, BLUR, blurShrink, COLOR_MATRIX, CONVOLUTION, DISPLACEMENT, GLOW, GRADIENT, SHADER, } from "./filters.js";
7
+ import { filterKernel, kernelImagesFit, PIXELS_BACK, PIXELS_DOWN, } from "./kernel-shaders.js";
8
+ /** The passes' programs, each a fragment shader of filter-shaders.ts. */
9
+ export const BOX_PASS = 1;
10
+ export const SHRINK_PASS = 2;
11
+ export const READ_BACK_PASS = 3;
12
+ export const GLOW_PASS = 4;
13
+ export const BEVEL_PASS = 5;
14
+ export const GRADIENT_PASS = 6;
15
+ export const MATRIX_PASS = 7;
16
+ export const CONVOLUTION_PASS = 8;
17
+ export const DISPLACE_PASS = 9;
18
+ /** A Pixel Bender kernel's pass, its program FilterPass.kernel. */
19
+ export const KERNEL_PASS = 10;
20
+ /**
21
+ * How a uniform's values are set: one to four floats, an array of vec4s, a
22
+ * 4 by 4 matrix, an array of ivec4s, or a sampler, its value the texture of
23
+ * the frame's it reads.
24
+ */
25
+ export const FLOATS = 1;
26
+ export const VEC4S = 2;
27
+ export const MATRIX4 = 3;
28
+ export const IVEC4S = 4;
29
+ export const SAMPLER = 5;
30
+ /** A pass's blurred input (FilterPass.blurred): none read, or the pass's input itself. */
31
+ export const NO_BLUR = -2;
32
+ export const INPUT_BLUR = -1;
33
+ /** The most floats a convolution's matrix takes in its shader: 57 vec4s. */
34
+ const CONVOLUTION_FLOATS = 57 * 4;
35
+ /**
36
+ * A chain's passes, its targets by slot, each a frame of a width and
37
+ * height, slot 0 the layer it runs on, and the slot its output is left
38
+ * in. Kept from chain to chain, its records reused.
39
+ */
40
+ export class FilterPlan {
41
+ passes = [];
42
+ count = 0;
43
+ slotWidth = [];
44
+ slotHeight = [];
45
+ slots = 0;
46
+ result = 0;
47
+ /** The target's pixels a unit of its own, which the shaders read their input's size in. */
48
+ resolution = 1;
49
+ /** The uniforms: each one's name, how it is set, where its values start and how many. */
50
+ uniformName = [];
51
+ uniformKind = [];
52
+ uniformAt = [];
53
+ uniformCount = [];
54
+ uniforms = 0;
55
+ values = new Float32Array(1024);
56
+ valueCount = 0;
57
+ /** The ints of the IVEC4S uniforms, which floats would round: their uniformAt is in here. */
58
+ ints = new Int32Array(64);
59
+ intCount = 0;
60
+ /** Empty, for a chain run at `resolution` on a layer of `width` by `height`. */
61
+ reset(width, height, resolution) {
62
+ this.count = 0;
63
+ this.slots = 0;
64
+ this.uniforms = 0;
65
+ this.valueCount = 0;
66
+ this.intCount = 0;
67
+ this.resolution = resolution;
68
+ this.result = this.slot(width, height);
69
+ }
70
+ /** A new slot, a target of `width` by `height`. */
71
+ slot(width, height) {
72
+ this.slotWidth[this.slots] = width;
73
+ this.slotHeight[this.slots] = height;
74
+ return this.slots++;
75
+ }
76
+ /** A pass begun, its uniforms the ones set after it until the next. */
77
+ pass(program, input, readWidth, readHeight, output, width, height) {
78
+ let pass = this.passes[this.count];
79
+ if (!pass) {
80
+ pass = {
81
+ program: 0,
82
+ input: 0,
83
+ readWidth: 0,
84
+ readHeight: 0,
85
+ output: 0,
86
+ width: 0,
87
+ height: 0,
88
+ blurred: NO_BLUR,
89
+ across: 1,
90
+ down: 1,
91
+ texture: -1,
92
+ kernel: null,
93
+ first: 0,
94
+ end: 0,
95
+ };
96
+ this.passes[this.count] = pass;
97
+ }
98
+ this.count++;
99
+ pass.program = program;
100
+ pass.input = input;
101
+ pass.readWidth = readWidth;
102
+ pass.readHeight = readHeight;
103
+ pass.output = output;
104
+ pass.width = width;
105
+ pass.height = height;
106
+ pass.blurred = NO_BLUR;
107
+ pass.across = 1;
108
+ pass.down = 1;
109
+ pass.texture = -1;
110
+ pass.kernel = null;
111
+ pass.first = this.uniforms;
112
+ pass.end = this.uniforms;
113
+ return pass;
114
+ }
115
+ /** A uniform of `count` floats of the pass begun last, `x` and those after. */
116
+ uniform(name, count, x, y = 0, z = 0, w = 0) {
117
+ const four = this.four;
118
+ four[0] = x;
119
+ four[1] = y;
120
+ four[2] = z;
121
+ four[3] = w;
122
+ this.uniformFrom(name, FLOATS, four, 0, count);
123
+ }
124
+ /** uniform's values, passed on without an array of their own. */
125
+ four = new Float64Array(4);
126
+ /** A uniform of the pass begun last, set `kind` from `count` of `source` from `at`. */
127
+ uniformFrom(name, kind, source, at, count) {
128
+ const u = this.uniforms++;
129
+ this.uniformName[u] = name;
130
+ this.uniformKind[u] = kind;
131
+ this.uniformAt[u] = this.valueCount;
132
+ this.uniformCount[u] = count;
133
+ if (this.valueCount + count > this.values.length) {
134
+ const grown = new Float32Array(Math.max(this.values.length * 2, this.valueCount + count));
135
+ grown.set(this.values);
136
+ this.values = grown;
137
+ }
138
+ for (let k = 0; k < count; k++) {
139
+ this.values[this.valueCount + k] = source[at + k];
140
+ }
141
+ this.valueCount += count;
142
+ this.passes[this.count - 1].end = this.uniforms;
143
+ }
144
+ /** An array of ivec4s of the pass begun last, `count` ints of `source` from `at`. */
145
+ uniformInts(name, source, at, count) {
146
+ const u = this.uniforms++;
147
+ this.uniformName[u] = name;
148
+ this.uniformKind[u] = IVEC4S;
149
+ this.uniformAt[u] = this.intCount;
150
+ this.uniformCount[u] = count;
151
+ if (this.intCount + count > this.ints.length) {
152
+ const grown = new Int32Array(Math.max(this.ints.length * 2, this.intCount + count));
153
+ grown.set(this.ints);
154
+ this.ints = grown;
155
+ }
156
+ this.ints.set(source.subarray(at, at + count), this.intCount);
157
+ this.intCount += count;
158
+ this.passes[this.count - 1].end = this.uniforms;
159
+ }
160
+ }
161
+ /**
162
+ * Chain `chain` of `filters` planned into `plan` over a layer of `width` by
163
+ * `height` texels at `resolution`, `hasTexture` telling which of the
164
+ * frame's textures there are: a filter whose texture is not leaves its
165
+ * input as it is, as one that changes nothing does; `links` whether a
166
+ * kernel's pass's fragment shader links, as one that does not leaves it
167
+ * too; `object` where the layer's object lies in it.
168
+ */
169
+ export function planChain(plan, filters, chain, width, height, resolution, hasTexture, links = () => true, object = null) {
170
+ plan.reset(width, height, resolution);
171
+ const end = filters.chains[chain + 1];
172
+ for (let i = filters.chains[chain]; i < end; i++) {
173
+ plan.result =
174
+ filters.kind[i] === SHADER
175
+ ? shader(plan, filters, i, plan.result, width, height, hasTexture, links, object)
176
+ : planFilter(plan, filters.kind[i], filters.values, filters.start[i], filters.texture[i], plan.result, width, height, hasTexture);
177
+ }
178
+ }
179
+ /** One filter, its values from `v[at]`, over slot `input`: the slot it drew into, or `input`. */
180
+ function planFilter(plan, kind, v, at, texture, input, width, height, hasTexture) {
181
+ switch (kind) {
182
+ case BLUR:
183
+ return blurFilter(plan, v, at, input, width, height);
184
+ case GLOW:
185
+ return glow(plan, v, at, input, width, height);
186
+ case BEVEL:
187
+ return bevel(plan, v, at, input, width, height);
188
+ case GRADIENT:
189
+ return hasTexture(texture) ? gradient(plan, v, at, texture, input, width, height) : input;
190
+ case COLOR_MATRIX:
191
+ return colorMatrix(plan, v, at, input, width, height);
192
+ case CONVOLUTION:
193
+ return convolution(plan, v, at, input, width, height);
194
+ case DISPLACEMENT:
195
+ return hasTexture(texture) ? displacement(plan, v, at, texture, input, width, height) : input;
196
+ default:
197
+ return input;
198
+ }
199
+ }
200
+ /** A blur: the box's runs, done coarser and drawn back between their texels where that is close enough. */
201
+ function blurFilter(plan, v, at, input, width, height) {
202
+ const blurX = v[at];
203
+ const blurY = v[at + 1];
204
+ const quality = v[at + 2];
205
+ if (!(quality > 0 && (blurX > 1 || blurY > 1))) {
206
+ return input;
207
+ }
208
+ const texels = plan.resolution * v[at + 3];
209
+ const across = blurShrink(blurX, quality, 1, texels);
210
+ const down = blurShrink(blurY, quality, 1, texels);
211
+ if (across === 1 && down === 1) {
212
+ const out = plan.slot(width, height);
213
+ boxRuns(plan, input, width, height, out, blurX, blurY, quality, texels, texels);
214
+ return out;
215
+ }
216
+ const blurred = blurredOf(plan, input, width, height, blurX, blurY, quality, texels, across, down);
217
+ const out = plan.slot(width, height);
218
+ readBlurred(plan.pass(READ_BACK_PASS, input, width, height, out, width, height), blurred);
219
+ return out;
220
+ }
221
+ /** A glow or a drop shadow: the input's alpha blurred, coarser where close enough, in its colour. */
222
+ function glow(plan, v, at, input, width, height) {
223
+ const blurX = v[at];
224
+ const blurY = v[at + 1];
225
+ const quality = v[at + 2];
226
+ const strength = v[at + 8];
227
+ const texels = plan.resolution * v[at + 3];
228
+ const across = blurShrink(blurX, quality, strength, texels);
229
+ const down = blurShrink(blurY, quality, strength, texels);
230
+ const blurred = blurredOf(plan, input, width, height, blurX, blurY, quality, texels, across, down);
231
+ const out = plan.slot(width, height);
232
+ readBlurred(plan.pass(GLOW_PASS, input, width, height, out, width, height), blurred);
233
+ plan.uniformFrom("uColor", FLOATS, v, at + 4, 3);
234
+ plan.uniform("uAlpha", 1, v[at + 7]);
235
+ plan.uniform("uStrength", 1, strength);
236
+ plan.uniformFrom("uOffset", FLOATS, v, at + 9, 2);
237
+ plan.uniform("uInner", 1, v[at + 11]);
238
+ plan.uniform("uKnockout", 1, v[at + 12]);
239
+ plan.uniform("uHide", 1, v[at + 13]);
240
+ return out;
241
+ }
242
+ /** A bevel: the input's alpha blurred, read on and back by its offset. */
243
+ function bevel(plan, v, at, input, width, height) {
244
+ const texels = plan.resolution * v[at + 3];
245
+ const blurred = blurredOf(plan, input, width, height, v[at], v[at + 1], v[at + 2], texels, 1, 1);
246
+ const out = plan.slot(width, height);
247
+ readBlurred(plan.pass(BEVEL_PASS, input, width, height, out, width, height), blurred);
248
+ plan.uniformFrom("uHighlight", FLOATS, v, at + 4, 3);
249
+ plan.uniformFrom("uShadow", FLOATS, v, at + 7, 3);
250
+ plan.uniform("uHighlightAlpha", 1, v[at + 10]);
251
+ plan.uniform("uShadowAlpha", 1, v[at + 11]);
252
+ plan.uniform("uStrength", 1, v[at + 12]);
253
+ plan.uniformFrom("uOffset", FLOATS, v, at + 13, 2);
254
+ plan.uniform("uType", 1, v[at + 15]);
255
+ plan.uniform("uKnockout", 1, v[at + 16]);
256
+ return out;
257
+ }
258
+ /** A gradient glow or bevel: the blurred alpha picking a colour of its gradient, texture `id`. */
259
+ function gradient(plan, v, at, id, input, width, height) {
260
+ const units = v[at + 3];
261
+ const texels = plan.resolution * units;
262
+ const blurred = blurredOf(plan, input, width, height, v[at], v[at + 1], v[at + 2], texels, 1, 1);
263
+ const out = plan.slot(width, height);
264
+ const pass = plan.pass(GRADIENT_PASS, input, width, height, out, width, height);
265
+ readBlurred(pass, blurred);
266
+ pass.texture = id;
267
+ plan.uniform("uStrength", 1, v[at + 4]);
268
+ plan.uniformFrom("uOffset", FLOATS, v, at + 5, 2);
269
+ plan.uniform("uType", 1, v[at + 7]);
270
+ plan.uniform("uKnockout", 1, v[at + 8]);
271
+ plan.uniform("uBevel", 1, v[at + 9]);
272
+ const inset = v[at + 10];
273
+ plan.uniform("uRegion", 4, inset - v[at + 11] * units, inset - v[at + 12] * units, width / plan.resolution - inset + units + v[at + 13] * units, height / plan.resolution - inset + units + v[at + 14] * units);
274
+ return out;
275
+ }
276
+ function colorMatrix(plan, v, at, input, width, height) {
277
+ const out = plan.slot(width, height);
278
+ plan.pass(MATRIX_PASS, input, width, height, out, width, height);
279
+ plan.uniformFrom("uMatrix", MATRIX4, v, at, 16);
280
+ plan.uniformFrom("uOffset", FLOATS, v, at + 16, 4);
281
+ return out;
282
+ }
283
+ /** A convolution's weights, its matrix by rows padded to the shader's array. */
284
+ const weights = new Float32Array(CONVOLUTION_FLOATS);
285
+ function convolution(plan, v, at, input, width, height) {
286
+ const columns = v[at];
287
+ const rows = v[at + 1];
288
+ weights.fill(0);
289
+ weights.set(v.subarray(at + 12, at + 12 + Math.min(columns * rows, weights.length)));
290
+ const out = plan.slot(width, height);
291
+ plan.pass(CONVOLUTION_PASS, input, width, height, out, width, height);
292
+ plan.uniformFrom("uMatrix", VEC4S, weights, 0, weights.length);
293
+ plan.uniform("uSize", 2, columns, rows);
294
+ plan.uniformFrom("uEdge", FLOATS, v, at + 2, 4);
295
+ plan.uniform("uDivisor", 1, v[at + 6]);
296
+ plan.uniform("uReciprocal", 1, v[at + 7]);
297
+ plan.uniform("uBias", 1, v[at + 8]);
298
+ plan.uniform("uClamp", 1, v[at + 9]);
299
+ plan.uniform("uPreserve", 1, v[at + 10]);
300
+ const inset = v[at + 11];
301
+ plan.uniform("uBox", 4, inset, inset, width / plan.resolution - inset + 1, height / plan.resolution - inset + 1);
302
+ return out;
303
+ }
304
+ /** A displacement map: each of the object's pixels read from where its map, texture `id`, moves it. */
305
+ function displacement(plan, v, at, id, input, width, height) {
306
+ const out = plan.slot(width, height);
307
+ const pass = plan.pass(DISPLACE_PASS, input, width, height, out, width, height);
308
+ pass.texture = id;
309
+ plan.uniformFrom("uComponentX", FLOATS, v, at, 4);
310
+ plan.uniformFrom("uComponentY", FLOATS, v, at + 4, 4);
311
+ plan.uniformFrom("uScale", FLOATS, v, at + 8, 2);
312
+ plan.uniform("uMode", 1, v[at + 10]);
313
+ plan.uniformFrom("uColor", FLOATS, v, at + 11, 4);
314
+ plan.uniformFrom("uGrow", FLOATS, v, at + 15, 2);
315
+ const inset = v[at + 17];
316
+ plan.uniform("uBox", 4, inset, inset, width / plan.resolution - inset + 1, height / plan.resolution - inset + 1);
317
+ plan.uniform("uMapAt", 4, inset + v[at + 18], inset + v[at + 19], v[at + 20], v[at + 21]);
318
+ return out;
319
+ }
320
+ /** A kernel's images, read as the plan's of a ShaderFilter are: each one's number and kind. */
321
+ const kernelImages = [];
322
+ /**
323
+ * A ShaderFilter, filter `i` of `filters`: its kernel (kernel-shaders.ts,
324
+ * filterKernel) over the input, the bitmap it reads lying where the
325
+ * object's does, grown by the filters before it, and its output that
326
+ * grown by its extensions; its images and parameters as uniforms. Run
327
+ * once a stage pixel, as Flash runs it over its bitmap of the object:
328
+ * where a whole number of the input's texels make a stage pixel and the
329
+ * bitmap starts on a texel, the input is shrunk to one a pixel on the
330
+ * bitmap's grid, the mean of its texels within the frame, run, and drawn
331
+ * back, each texel its pixel's; else run at each texel. One of whose
332
+ * images there is no texture, of more images than a program binds, or
333
+ * whose shader will not link, leaves its input be.
334
+ */
335
+ function shader(plan, filters, i, input, width, height, hasTexture, links, object) {
336
+ const v = filters.values;
337
+ const at = filters.start[i];
338
+ const kernel = filters.kernels[i];
339
+ const units = v[at];
340
+ const inset = v[at + 1];
341
+ const padding = v[at + 2];
342
+ const count = v[at + 7];
343
+ kernelImages.length = 0;
344
+ for (let k = 0; k < count; k++) {
345
+ const id = v[at + 9 + k * 3];
346
+ if (id >= 0 && !hasTexture(id)) {
347
+ return input;
348
+ }
349
+ kernelImages.push({ texture: v[at + 8 + k * 3], layer: id < 0, float: v[at + 10 + k * 3] > 0 });
350
+ }
351
+ const fragment = kernel ? filterKernel(kernel, kernelImages) : null;
352
+ if (!fragment || !kernelImagesFit(kernelImages) || !links(fragment)) {
353
+ return input;
354
+ }
355
+ // The bitmap this filter reads: the object's, grown by the filters before it.
356
+ const res = plan.resolution;
357
+ const texels = units * res;
358
+ const before = (padding - inset) * res;
359
+ const x = (object ? object.x : padding * res) - before;
360
+ const y = (object ? object.y : padding * res) - before;
361
+ const bitmapWidth = (object ? object.width : width - padding * res * 2) + before * 2;
362
+ const bitmapHeight = (object ? object.height : height - padding * res * 2) + before * 2;
363
+ const shrink = texels > 1 &&
364
+ texels <= 16 &&
365
+ Number.isInteger(texels) &&
366
+ Number.isInteger(x) &&
367
+ Number.isInteger(y)
368
+ ? texels
369
+ : 1;
370
+ // The grid's first pixel from the frame's corner, at or before it, a line of it on the bitmap's.
371
+ const startX = x - shrink * Math.ceil(x / shrink);
372
+ const startY = y - shrink * Math.ceil(y / shrink);
373
+ let from = input;
374
+ let w = width;
375
+ let h = height;
376
+ if (shrink > 1) {
377
+ w = Math.ceil((width - startX) / shrink);
378
+ h = Math.ceil((height - startY) / shrink);
379
+ from = plan.slot(w, h);
380
+ plan.pass(KERNEL_PASS, input, width, height, from, w, h).kernel = PIXELS_DOWN;
381
+ plan.uniform("uDown", 3, shrink, startX, startY);
382
+ plan.uniform("uKernelFrame", 2, width, height);
383
+ }
384
+ let out = plan.slot(w, h);
385
+ const pass = plan.pass(KERNEL_PASS, from, w, h, out, w, h);
386
+ pass.kernel = fragment;
387
+ plan.uniform("uKernelAt", 3, (x - startX) / shrink, (y - startY) / shrink, texels / shrink);
388
+ plan.uniform("uKernelFrame", 2, w, h);
389
+ plan.uniform("uKernelRegion", 4, -v[at + 3], -v[at + 4], bitmapWidth / texels + v[at + 5], bitmapHeight / texels + v[at + 6]);
390
+ for (let k = 0; k < count; k++) {
391
+ if (v[at + 9 + k * 3] >= 0) {
392
+ plan.uniformFrom(`pbImage${v[at + 8 + k * 3]}`, SAMPLER, v, at + 9 + k * 3, 1);
393
+ }
394
+ }
395
+ const floats = at + 8 + count * 3;
396
+ if (v[floats] > 0) {
397
+ plan.uniformFrom("pbFloats", VEC4S, v, floats + 1, v[floats]);
398
+ }
399
+ const intsAt = filters.intStart[i];
400
+ const ints = filters.intStart[i + 1] - intsAt;
401
+ if (ints > 0) {
402
+ plan.uniformInts("pbInts", filters.ints, intsAt, ints);
403
+ }
404
+ if (shrink > 1) {
405
+ const pixels = out;
406
+ out = plan.slot(width, height);
407
+ plan.pass(KERNEL_PASS, pixels, w, h, out, width, height).kernel = PIXELS_BACK;
408
+ plan.uniform("uDown", 3, shrink, startX, startY);
409
+ }
410
+ return out;
411
+ }
412
+ /** `pass` reading `blurred` as its blur, or its input where nothing blurred it. */
413
+ function readBlurred(pass, blurred) {
414
+ pass.blurred = blurred ? blurred.slot : INPUT_BLUR;
415
+ pass.across = blurred ? blurred.across : 1;
416
+ pass.down = blurred ? blurred.down : 1;
417
+ }
418
+ /**
419
+ * The box's runs over `input`'s frame into a new slot, `across` times
420
+ * narrower and `down` times lower (blurShrink); null where no run would
421
+ * change it.
422
+ */
423
+ function blurredOf(plan, input, width, height, blurX, blurY, quality, texels, across, down) {
424
+ if (!(quality > 0 && (blurX > 1 || blurY > 1))) {
425
+ return null;
426
+ }
427
+ let source = input;
428
+ let w = width;
429
+ let h = height;
430
+ if (across > 1 || down > 1) {
431
+ w = Math.ceil(width / across);
432
+ h = Math.ceil(height / down);
433
+ source = plan.slot(w, h);
434
+ plan.pass(SHRINK_PASS, input, w * across, h * down, source, w, h);
435
+ plan.uniform("uFactor", 2, across, down);
436
+ }
437
+ const out = plan.slot(w, h);
438
+ boxRuns(plan, source, w, h, out, blurX, blurY, quality, texels / across, texels / down);
439
+ blurredScratch.slot = out;
440
+ blurredScratch.across = across;
441
+ blurredScratch.down = down;
442
+ return blurredScratch;
443
+ }
444
+ /** What blurredOf gives, read before it is asked again. */
445
+ const blurredScratch = { slot: 0, across: 1, down: 1 };
446
+ /**
447
+ * The box's runs over slot `input`'s frame into slot `output`'s, through
448
+ * slots between them, the second only where a third run needs one:
449
+ * `texelsX` and `texelsY` to a stage pixel each way, which the blur is in,
450
+ * each step a texel of the input.
451
+ */
452
+ function boxRuns(plan, input, width, height, output, blurX, blurY, quality, texelsX, texelsY) {
453
+ const step = 1 / plan.resolution;
454
+ const across = blurX > 1;
455
+ const down = blurY > 1;
456
+ const runs = quality * ((across ? 1 : 0) + (down ? 1 : 0));
457
+ if (runs === 0) {
458
+ plan.pass(BOX_PASS, input, width, height, output, width, height);
459
+ plan.uniform("uDirection", 2, 1, 0);
460
+ plan.uniform("uWidth", 1, 1);
461
+ return;
462
+ }
463
+ const first = runs > 1 ? plan.slot(width, height) : -1;
464
+ const second = runs > 2 ? plan.slot(width, height) : -1;
465
+ let from = input;
466
+ for (let k = 0; k < runs; k++) {
467
+ const to = k === runs - 1 ? output : k % 2 === 0 ? first : second;
468
+ plan.pass(BOX_PASS, from, width, height, to, width, height);
469
+ if (across && (!down || k % 2 === 0)) {
470
+ plan.uniform("uDirection", 2, step, 0);
471
+ plan.uniform("uWidth", 1, blurX * texelsX);
472
+ }
473
+ else {
474
+ plan.uniform("uDirection", 2, 0, step);
475
+ plan.uniform("uWidth", 1, blurY * texelsY);
476
+ }
477
+ from = to;
478
+ }
479
+ }
480
+ //# sourceMappingURL=filter-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-plan.js","sourceRoot":"","sources":["../src/filter-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /** Truncated to 8 bits, as adl's each pass is: a hair over, so that an exact value stays. */
2
+ export declare const TRUNCATE = "floor(c * 255.0 + 0.001) / 255.0";
3
+ /**
4
+ * One run of the box one way: `uWidth` texels wide, its end texels weighted
5
+ * by their part; `uDirection` a texel's step in the input's pixels, which
6
+ * uInputSize gives the coordinates in.
7
+ */
8
+ export declare const BOX = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\n// As the vertex shader has it, which is highp: a program's uniforms agree.\nuniform highp vec4 uInputSize;\nuniform vec2 uDirection;\nuniform float uWidth;\nvoid main(void) {\n float half_ = uWidth * 0.5;\n int reach = int(ceil(half_));\n vec4 sum = vec4(0.0);\n // As far as 255 pixels at 4 texels a pixel, each way.\n for (int i = 0; i <= 2040; i++) {\n if (i > 2 * reach) { break; }\n float f = float(i - reach);\n float weight = max(0.0, min(f + 0.5, half_) - max(f - 0.5, -half_));\n sum += texture(uTexture, vTextureCoord + uDirection * uInputSize.zw * f) * weight;\n }\n vec4 c = sum / uWidth;\n finalColor = floor(c * 255.0 + 0.001) / 255.0;\n}";
9
+ export declare const SHRINK = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform highp vec4 uInputPixel;\nuniform vec2 uFactor;\nvoid main(void) {\n vec4 sum = vec4(0.0);\n vec2 centre = (uFactor - 1.0) * 0.5;\n for (int j = 0; j < 16; j += 2) {\n float y = float(j);\n if (y >= uFactor.y) { break; }\n float ny = min(2.0, uFactor.y - y);\n for (int i = 0; i < 16; i += 2) {\n float x = float(i);\n if (x >= uFactor.x) { break; }\n float nx = min(2.0, uFactor.x - x);\n vec2 at = vec2(x, y) + (vec2(nx, ny) - 1.0) * 0.5 - centre;\n sum += texture(uTexture, vTextureCoord + at * uInputPixel.zw) * (nx * ny);\n }\n }\n finalColor = sum / (uFactor.x * uFactor.y);\n}";
10
+ /** A blur's runs, done coarser (blurred), drawn back between their texels over the input's frame. */
11
+ export declare const READ_BACK = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uBlurred;\nuniform vec2 uBlurredScale;\nvoid main(void) {\n finalColor = texture(uBlurred, vTextureCoord * uBlurredScale);\n}";
12
+ /**
13
+ * A glow or a shadow: the input's blurred alpha (uBlurred), from `uOffset`
14
+ * texels back for a shadow, times strength and alpha, in its colour; behind
15
+ * the object, or inside it for an inner one; the object kept, or not.
16
+ */
17
+ export declare const GLOW = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform sampler2D uBlurred;\nuniform highp vec4 uInputSize;\nuniform vec3 uColor;\nuniform float uAlpha;\nuniform float uStrength;\nuniform vec2 uOffset;\nuniform vec2 uBlurredScale;\nuniform float uInner;\nuniform float uKnockout;\nuniform float uHide;\nvoid main(void) {\n vec4 src = texture(uTexture, vTextureCoord);\n float a = texture(uBlurred, (vTextureCoord - uOffset * uInputSize.zw) * uBlurredScale).a;\n vec4 c;\n if (uInner > 0.5) {\n float g = clamp((1.0 - a) * uStrength, 0.0, 1.0) * uAlpha * src.a;\n vec4 glow = vec4(uColor * g, g);\n c = uKnockout > 0.5 ? glow : glow + src * (1.0 - g);\n } else {\n float g = clamp(a * uStrength, 0.0, 1.0) * uAlpha;\n vec4 glow = vec4(uColor * g, g);\n c = uKnockout > 0.5 ? glow * (1.0 - src.a) : uHide > 0.5 ? glow : src + glow * (1.0 - src.a);\n }\n finalColor = floor(c * 255.0 + 0.001) / 255.0;\n}";
18
+ /**
19
+ * A bevel: the input's blurred alpha (uBlurred) from uOffset texels on and
20
+ * back; their difference times strength, clamped, times the colour's alpha,
21
+ * the highlight where on is more and the shadow where it is less. Inner
22
+ * (uType 0) atop the object, outer (1) behind it, full (2) over it;
23
+ * knocked out, alone, masked to where the object is (inner) or is not
24
+ * (outer).
25
+ */
26
+ export declare const BEVEL = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform sampler2D uBlurred;\nuniform highp vec4 uInputSize;\nuniform vec3 uHighlight;\nuniform vec3 uShadow;\nuniform float uHighlightAlpha;\nuniform float uShadowAlpha;\nuniform float uStrength;\nuniform vec2 uOffset;\nuniform float uType;\nuniform float uKnockout;\nvoid main(void) {\n // Keep source samples sharp; the bevel reads alpha at a stage pixel's centre.\n vec2 at = (floor(vTextureCoord * uInputSize.xy) + 0.5) * uInputSize.zw;\n vec4 src = texture(uTexture, vTextureCoord);\n vec2 step_ = uOffset * uInputSize.zw;\n // In 255ths, each read truncated, as adl's are.\n float on = floor(texture(uBlurred, at + step_).a * 255.0 + 0.001);\n float back = floor(texture(uBlurred, at - step_).a * 255.0 + 0.001);\n float d = on - back;\n bool lit = d > 0.0;\n float strong = min(255.0, floor(abs(d) * uStrength + 0.001));\n float la = floor(strong * (lit ? uHighlightAlpha : uShadowAlpha) + 0.5) / 255.0;\n float m = uType < 0.5 ? src.a : (uType < 1.5 && uKnockout > 0.5 ? 1.0 - src.a : 1.0);\n vec4 layer = vec4((lit ? uHighlight : uShadow) * la, la) * m;\n vec4 c;\n if (uKnockout > 0.5) {\n c = layer;\n } else if (uType > 0.5 && uType < 1.5) {\n c = src + layer * (1.0 - src.a);\n } else {\n c = layer + src * (1.0 - (uType < 0.5 ? la : layer.a));\n }\n finalColor = floor(c * 255.0 + 0.001) / 255.0;\n}";
27
+ /**
28
+ * How a bevel or a gradient filter places its layer (premultiplied) on the
29
+ * object's pixel, as bitmap/filters' placer does: masked to where the
30
+ * object is (uType 0, inner) or, knocked out, is not (1, outer); inner
31
+ * atop it, outer behind it, full (2) over it, knocked out alone.
32
+ */
33
+ export declare const PLACE = "vec4 place(vec4 src, vec4 layer) {\n float m = uType < 0.5 ? src.a : (uType < 1.5 && uKnockout > 0.5 ? 1.0 - src.a : 1.0);\n vec4 masked = layer * m;\n if (uKnockout > 0.5) {\n return masked;\n }\n if (uType > 0.5 && uType < 1.5) {\n return src + masked * (1.0 - src.a);\n }\n return masked + src * (1.0 - (uType < 0.5 ? layer.a : masked.a));\n}";
34
+ /**
35
+ * A gradient glow: the input's blurred alpha (uBlurred) from uOffset back,
36
+ * as a shadow reads it, times strength, picking a texel of the gradient
37
+ * (uGradient, 256 wide); a gradient bevel (uBevel 1): the difference of
38
+ * that alpha on and back, the middle of the gradient where they agree.
39
+ * Each pixel is evaluated once, at its centre, in 255ths truncated.
40
+ */
41
+ export declare const GRADIENT = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform sampler2D uBlurred;\nuniform sampler2D uGradient;\nuniform highp vec4 uInputSize;\nuniform float uStrength;\nuniform vec2 uOffset;\nuniform float uType;\nuniform float uKnockout;\nuniform float uBevel;\nuniform vec4 uRegion;\nvec4 place(vec4 src, vec4 layer) {\n float m = uType < 0.5 ? src.a : (uType < 1.5 && uKnockout > 0.5 ? 1.0 - src.a : 1.0);\n vec4 masked = layer * m;\n if (uKnockout > 0.5) {\n return masked;\n }\n if (uType > 0.5 && uType < 1.5) {\n return src + masked * (1.0 - src.a);\n }\n return masked + src * (1.0 - (uType < 0.5 ? layer.a : masked.a));\n}\nfloat alphaAt(vec2 at) {\n return floor(texture(uBlurred, at).a * 255.0 + 0.001);\n}\nvoid main(void) {\n vec2 p = floor(vTextureCoord * uInputSize.xy) + 0.5;\n // Past the filter's rect it draws nothing, though its gradient may have colour at 0.\n if (any(lessThan(p, uRegion.xy)) || any(greaterThanEqual(p, uRegion.zw))) {\n finalColor = vec4(0.0);\n return;\n }\n vec2 at = p * uInputSize.zw;\n vec4 src = texture(uTexture, at);\n vec2 step_ = uOffset * uInputSize.zw;\n float index;\n if (uBevel > 0.5) {\n float d = clamp(floor((alphaAt(at + step_) - alphaAt(at - step_)) * uStrength), -255.0, 255.0);\n index = floor((d + 256.0) / 2.0);\n } else {\n index = min(255.0, floor(alphaAt(at - step_) * uStrength + 0.001));\n }\n vec4 layer = texture(uGradient, vec2((index + 0.5) / 256.0, 0.5));\n vec4 c = place(src, layer);\n finalColor = floor(c * 255.0 + 0.001) / 255.0;\n}";
42
+ /**
43
+ * A displacement map, in the input's pixels from its frame's corner: each
44
+ * pixel of the object's (uBox) where the map lies (uMapAt, uMapSize) takes
45
+ * the input at itself moved by the map's channel (uComponents picks one
46
+ * for x, one for y) less 128, times scale, in 256ths toward 0, between
47
+ * pixels with weights in 256ths; past the object's pixels as uMode says:
48
+ * 0 wrap, 1 clamp, 2 its own place, 3 uColor, which also fills uGrow pixels
49
+ * round the object, as adl's drawing of it does. Each pixel once, at its
50
+ * centre.
51
+ */
52
+ export declare const DISPLACE = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\nuniform highp vec4 uInputSize;\nuniform vec4 uBox;\nuniform vec4 uMapAt;\nuniform vec4 uComponentX;\nuniform vec4 uComponentY;\nuniform vec2 uScale;\nuniform float uMode;\nuniform vec4 uColor;\nuniform vec2 uGrow;\nvec4 read(vec2 at, vec2 own) {\n vec2 size = uBox.zw - uBox.xy;\n vec2 i = at - uBox.xy;\n if (any(lessThan(i, vec2(0.0))) || any(greaterThanEqual(i, size))) {\n if (uMode < 0.5) {\n i = mod(i, size);\n } else if (uMode < 2.5) {\n i = clamp(i, vec2(0.0), size - 1.0);\n } else {\n return uColor;\n }\n }\n return texture(uTexture, (uBox.xy + i + 0.5) * uInputSize.zw);\n}\nvoid main(void) {\n vec2 p = floor(vTextureCoord * uInputSize.xy);\n vec4 own = texture(uTexture, (p + 0.5) * uInputSize.zw);\n vec2 m = p - uMapAt.xy;\n if (any(lessThan(p, uBox.xy)) || any(greaterThanEqual(p, uBox.zw))) {\n bool near = all(greaterThanEqual(p, uBox.xy - uGrow)) && all(lessThan(p, uBox.zw + uGrow));\n finalColor = uMode > 2.5 && near ? uColor : vec4(0.0);\n return;\n }\n if (any(lessThan(m, vec2(0.0))) || any(greaterThanEqual(m, uMapAt.zw))) {\n finalColor = own;\n return;\n }\n vec4 map = texture(uMap, (m + 0.5) / uMapAt.zw);\n vec4 straight = map.a > 0.0 ? vec4(map.rgb / map.a, map.a) : vec4(0.0);\n vec2 c = floor(vec2(dot(straight, uComponentX), dot(straight, uComponentY)) * 255.0 + 0.5);\n // None picked: no move.\n c = vec2(uComponentX == vec4(0.0) ? 128.0 : c.x, uComponentY == vec4(0.0) ? 128.0 : c.y);\n // Toward 0, without trunc, which GLSL ES 1 has not.\n vec2 moved = (c - 128.0) * uScale;\n vec2 q = p * 256.0 + sign(moved) * floor(abs(moved));\n vec2 whole = floor(q / 256.0);\n vec2 f = q - whole * 256.0;\n if (uMode > 1.5 && uMode < 2.5) {\n vec2 i = whole - uBox.xy;\n vec2 size = uBox.zw - uBox.xy;\n whole = vec2(i.x < 0.0 || i.x >= size.x ? p.x : whole.x, i.y < 0.0 || i.y >= size.y ? p.y : whole.y);\n }\n float w00 = floor((256.0 - f.x) * (256.0 - f.y) / 256.0);\n float w10 = floor(f.x * (256.0 - f.y) / 256.0);\n float w01 = floor((256.0 - f.x) * f.y / 256.0);\n float w11 = floor(f.x * f.y / 256.0);\n vec4 v = read(whole, p) * w00 + read(whole + vec2(1.0, 0.0), p) * w10 +\n read(whole + vec2(0.0, 1.0), p) * w01 + read(whole + vec2(1.0, 1.0), p) * w11;\n vec4 c8 = floor(v * 255.0 / 256.0 + 0.001) / 255.0;\n finalColor = c8;\n}";
53
+ /** A colour matrix of a pixel's straight colour, its offsets in 255ths, transparent pixels too. */
54
+ export declare const MATRIX = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform mat4 uMatrix;\nuniform vec4 uOffset;\nvoid main(void) {\n vec4 src = texture(uTexture, vTextureCoord);\n vec4 straight = src.a > 0.0 ? vec4(src.rgb / src.a, src.a) : vec4(0.0);\n vec4 s = clamp(uMatrix * straight + uOffset, 0.0, 1.0);\n vec4 c = vec4(s.rgb * s.a, s.a);\n finalColor = floor(c * 255.0 + 0.001) / 255.0;\n}";
55
+ /**
56
+ * A convolution, in 255ths: the taps' straight colour over uBox, the
57
+ * object's pixels as adl filters them, in the input's pixels from its
58
+ * frame's corner; past it the nearest edge's or uEdge; summed, divided,
59
+ * biased, clamped and premultiplied as bitmap/filters' convolve does, the
60
+ * fixed-point way too (uReciprocal not 0) where every tap lies in the box.
61
+ */
62
+ export declare const CONVOLUTION = "in vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform highp vec4 uInputSize;\nuniform vec4 uMatrix[57];\nuniform vec2 uSize;\nuniform vec4 uBox;\nuniform vec4 uEdge;\nuniform float uDivisor;\nuniform float uReciprocal;\nuniform float uBias;\nuniform float uClamp;\nuniform float uPreserve;\nvec4 straight(vec2 p) {\n if (any(lessThan(p, uBox.xy)) || any(greaterThanEqual(p, uBox.zw))) {\n if (uClamp < 0.5) { return uEdge; }\n p = clamp(p, floor(uBox.xy) + 0.5, floor(uBox.zw) - 0.5);\n }\n vec4 c = texture(uTexture, p * uInputSize.zw);\n return c.a > 0.0 ? floor(vec4(c.rgb / c.a, c.a) * 255.0 + 0.5) : vec4(0.0);\n}\nvoid main(void) {\n // The pixel's centre, which all its texels read alike, as adl's one pixel.\n vec2 p = floor(vTextureCoord * uInputSize.xy) + 0.5;\n vec2 reach = floor(uSize * 0.5);\n if (any(lessThan(p, uBox.xy - reach)) || any(greaterThanEqual(p, uBox.zw + reach))) {\n finalColor = vec4(0.0);\n return;\n }\n bool fixed_ = uReciprocal != 0.0 && all(greaterThanEqual(p - 1.0, uBox.xy)) &&\n all(lessThan(p + 1.0, uBox.zw));\n int cols = int(uSize.x);\n int count = cols * int(uSize.y);\n vec4 sum = vec4(0.0);\n // One loop, its index alone indexing the weights, as GLSL ES 1 allows.\n for (int k = 0; k < 225; k++) {\n if (k >= count) { break; }\n float w = dot(uMatrix[k / 4], vec4(equal(vec4(float(k - k / 4 * 4)), vec4(0.0, 1.0, 2.0, 3.0))));\n if (w != 0.0) {\n int j = k / cols;\n vec2 at = vec2(float(k - j * cols), float(j)) - reach;\n sum += straight(fixed_ && k == 8 ? p : p + at) * w;\n }\n }\n sum = fixed_ ? floor(sum * uReciprocal) : sum / uDivisor;\n vec4 v = floor(clamp(sum + uBias, 0.0, 255.0) + 0.0001);\n float a = uPreserve > 0.5 ? straight(p).a : v.a;\n vec3 c = fixed_ ? floor(v.rgb * a / 255.0) : floor((v.rgb * a + 127.0) / 255.0);\n finalColor = vec4(c, a) / 255.0;\n}";
63
+ //# sourceMappingURL=filter-shaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-shaders.d.ts","sourceRoot":"","sources":["../src/filter-shaders.ts"],"names":[],"mappings":"AAKA,6FAA6F;AAC7F,eAAO,MAAM,QAAQ,qCAAqC,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,GAAG,ivBAoBd,CAAC;AAMH,eAAO,MAAM,MAAM,2sBAqBjB,CAAC;AAEH,qGAAqG;AACrG,eAAO,MAAM,SAAS,mMAMpB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,IAAI,87BA2Bf,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,64CAoChB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,2WAUhB,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,8iDAoCnB,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,65EA+DnB,CAAC;AAEH,mGAAmG;AACnG,eAAO,MAAM,MAAM,8ZAWjB,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,63DAiDtB,CAAC"}