@lightningjs/renderer 0.4.1 → 0.5.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 (162) hide show
  1. package/README.md +13 -13
  2. package/dist/exports/utils.d.ts +1 -1
  3. package/dist/exports/utils.js +1 -1
  4. package/dist/exports/utils.js.map +1 -1
  5. package/dist/src/common/CommonTypes.d.ts +32 -12
  6. package/dist/src/core/CoreNode.d.ts +14 -18
  7. package/dist/src/core/CoreNode.js +90 -124
  8. package/dist/src/core/CoreNode.js.map +1 -1
  9. package/dist/src/core/CoreTextNode.d.ts +0 -2
  10. package/dist/src/core/CoreTextNode.js +39 -17
  11. package/dist/src/core/CoreTextNode.js.map +1 -1
  12. package/dist/src/core/Stage.js +11 -8
  13. package/dist/src/core/Stage.js.map +1 -1
  14. package/dist/src/core/lib/Matrix3d.d.ts +59 -0
  15. package/dist/src/core/lib/Matrix3d.js +253 -0
  16. package/dist/src/core/lib/Matrix3d.js.map +1 -0
  17. package/dist/src/core/lib/utils.d.ts +1 -0
  18. package/dist/src/core/lib/utils.js +3 -0
  19. package/dist/src/core/lib/utils.js.map +1 -1
  20. package/dist/src/core/renderers/CoreRenderer.d.ts +2 -4
  21. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  22. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +1 -1
  23. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +16 -16
  24. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  25. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +1 -1
  26. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +2 -2
  27. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  28. package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +2 -1
  29. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +15 -6
  30. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  31. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +2 -1
  32. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +27 -30
  33. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  34. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +2 -1
  35. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +7 -9
  36. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  37. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -1
  38. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  39. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +24 -2
  40. package/dist/src/core/text-rendering/renderers/TextRenderer.js +6 -3
  41. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  42. package/dist/src/core/textures/SubTexture.js +1 -1
  43. package/dist/src/core/textures/SubTexture.js.map +1 -1
  44. package/dist/src/core/textures/Texture.d.ts +13 -1
  45. package/dist/src/core/textures/Texture.js.map +1 -1
  46. package/dist/src/main-api/INode.d.ts +30 -5
  47. package/dist/src/main-api/RendererMain.js +3 -1
  48. package/dist/src/main-api/RendererMain.js.map +1 -1
  49. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +6 -4
  50. package/dist/src/render-drivers/main/MainOnlyNode.js +31 -16
  51. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
  52. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -2
  53. package/dist/src/render-drivers/main/MainOnlyTextNode.js +3 -10
  54. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
  55. package/dist/src/render-drivers/threadx/NodeStruct.d.ts +6 -3
  56. package/dist/src/render-drivers/threadx/NodeStruct.js +12 -3
  57. package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -1
  58. package/dist/src/render-drivers/threadx/SharedNode.d.ts +2 -1
  59. package/dist/src/render-drivers/threadx/SharedNode.js +2 -1
  60. package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -1
  61. package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +2 -0
  62. package/dist/src/render-drivers/threadx/ThreadXMainNode.js +14 -0
  63. package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -1
  64. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +4 -2
  65. package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +1 -1
  66. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +6 -5
  67. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -1
  68. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +2 -7
  69. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
  70. package/dist/src/render-drivers/threadx/worker/renderer.js +2 -1
  71. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  72. package/dist/src/utils.d.ts +7 -12
  73. package/dist/src/utils.js +9 -25
  74. package/dist/src/utils.js.map +1 -1
  75. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  76. package/exports/utils.ts +1 -1
  77. package/package.json +22 -19
  78. package/src/common/CommonTypes.ts +42 -16
  79. package/src/core/CoreNode.ts +120 -158
  80. package/src/core/CoreTextNode.ts +54 -24
  81. package/src/core/Stage.ts +16 -11
  82. package/src/core/lib/Matrix3d.ts +290 -0
  83. package/src/core/lib/utils.ts +4 -0
  84. package/src/core/renderers/CoreRenderer.ts +2 -4
  85. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +18 -21
  86. package/src/core/renderers/webgl/WebGlCoreShader.ts +2 -2
  87. package/src/core/renderers/webgl/shaders/SdfShader.ts +17 -8
  88. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +30 -28
  89. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +9 -20
  90. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -1
  91. package/src/core/text-rendering/renderers/TextRenderer.ts +37 -5
  92. package/src/core/textures/SubTexture.ts +6 -5
  93. package/src/core/textures/Texture.ts +19 -6
  94. package/src/main-api/INode.ts +32 -5
  95. package/src/main-api/RendererMain.ts +3 -1
  96. package/src/render-drivers/main/MainOnlyNode.ts +39 -22
  97. package/src/render-drivers/main/MainOnlyTextNode.ts +2 -15
  98. package/src/render-drivers/threadx/NodeStruct.ts +13 -3
  99. package/src/render-drivers/threadx/SharedNode.ts +4 -2
  100. package/src/render-drivers/threadx/ThreadXMainNode.ts +16 -0
  101. package/src/render-drivers/threadx/ThreadXRenderDriver.ts +4 -2
  102. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +18 -8
  103. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +2 -14
  104. package/src/render-drivers/threadx/worker/renderer.ts +2 -1
  105. package/src/utils.ts +10 -27
  106. package/dist/src/core/Matrix2DContext.d.ts +0 -15
  107. package/dist/src/core/Matrix2DContext.js +0 -45
  108. package/dist/src/core/Matrix2DContext.js.map +0 -1
  109. package/dist/src/core/lib/glm/common.d.ts +0 -162
  110. package/dist/src/core/lib/glm/common.js +0 -81
  111. package/dist/src/core/lib/glm/common.js.map +0 -1
  112. package/dist/src/core/lib/glm/index.d.ts +0 -11
  113. package/dist/src/core/lib/glm/index.js +0 -30
  114. package/dist/src/core/lib/glm/index.js.map +0 -1
  115. package/dist/src/core/lib/glm/mat2.d.ts +0 -219
  116. package/dist/src/core/lib/glm/mat2.js +0 -396
  117. package/dist/src/core/lib/glm/mat2.js.map +0 -1
  118. package/dist/src/core/lib/glm/mat2d.d.ts +0 -237
  119. package/dist/src/core/lib/glm/mat2d.js +0 -442
  120. package/dist/src/core/lib/glm/mat2d.js.map +0 -1
  121. package/dist/src/core/lib/glm/mat3.d.ts +0 -283
  122. package/dist/src/core/lib/glm/mat3.js +0 -680
  123. package/dist/src/core/lib/glm/mat3.js.map +0 -1
  124. package/dist/src/core/lib/glm/mat4.d.ts +0 -550
  125. package/dist/src/core/lib/glm/mat4.js +0 -1802
  126. package/dist/src/core/lib/glm/mat4.js.map +0 -1
  127. package/dist/src/core/lib/glm/quat.d.ts +0 -363
  128. package/dist/src/core/lib/glm/quat.js +0 -693
  129. package/dist/src/core/lib/glm/quat.js.map +0 -1
  130. package/dist/src/core/lib/glm/quat2.d.ts +0 -356
  131. package/dist/src/core/lib/glm/quat2.js +0 -754
  132. package/dist/src/core/lib/glm/quat2.js.map +0 -1
  133. package/dist/src/core/lib/glm/vec2.d.ts +0 -365
  134. package/dist/src/core/lib/glm/vec2.js +0 -569
  135. package/dist/src/core/lib/glm/vec2.js.map +0 -1
  136. package/dist/src/core/lib/glm/vec3.d.ts +0 -406
  137. package/dist/src/core/lib/glm/vec3.js +0 -720
  138. package/dist/src/core/lib/glm/vec3.js.map +0 -1
  139. package/dist/src/core/lib/glm/vec4.d.ts +0 -330
  140. package/dist/src/core/lib/glm/vec4.js +0 -608
  141. package/dist/src/core/lib/glm/vec4.js.map +0 -1
  142. package/dist/src/core/textures/utils.d.ts +0 -11
  143. package/dist/src/core/textures/utils.js +0 -32
  144. package/dist/src/core/textures/utils.js.map +0 -1
  145. package/dist/src/main-api/TextureRegistry.d.ts +0 -33
  146. package/dist/src/main-api/TextureRegistry.js +0 -97
  147. package/dist/src/main-api/TextureRegistry.js.map +0 -1
  148. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.d.ts +0 -33
  149. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js +0 -97
  150. package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js.map +0 -1
  151. package/src/core/Matrix2DContext.ts +0 -52
  152. package/src/core/lib/glm/common.ts +0 -231
  153. package/src/core/lib/glm/index.ts +0 -31
  154. package/src/core/lib/glm/mat2.ts +0 -499
  155. package/src/core/lib/glm/mat2d.ts +0 -547
  156. package/src/core/lib/glm/mat3.ts +0 -849
  157. package/src/core/lib/glm/mat4.ts +0 -2169
  158. package/src/core/lib/glm/quat.ts +0 -828
  159. package/src/core/lib/glm/quat2.ts +0 -951
  160. package/src/core/lib/glm/vec2.ts +0 -671
  161. package/src/core/lib/glm/vec3.ts +0 -859
  162. package/src/core/lib/glm/vec4.ts +0 -708
@@ -0,0 +1,290 @@
1
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
+
3
+ // Matrix3d is a 3x3 matrix in column-major order because that's how WebGL likes it.
4
+ // The matrix is stored in a Float32Array in the following order:
5
+ // | 0 3 6 |
6
+ // | 1 4 7 |
7
+ // | 2 5 8 |
8
+ // The following constants are used to index into the array in a row-major way.
9
+ const m0 = 0;
10
+ const m1 = 3;
11
+ const m2 = 6;
12
+ const m3 = 1;
13
+ const m4 = 4;
14
+ const m5 = 7;
15
+ const m6 = 2;
16
+ const m7 = 5;
17
+ const m8 = 8;
18
+
19
+ /**
20
+ * A 3x3 matrix representing a 2D transformation.
21
+ *
22
+ * @remarks
23
+ * The matrix is stored in column-major order in the `data` property which can
24
+ * be passed directly to a WebGL shader uniform.
25
+ *
26
+ * The matrix is stored in a Float32Array in the following index order:
27
+ * | 0 3 6 |
28
+ * | 1 4 7 |
29
+ * | 2 5 8 |
30
+ *
31
+ * Only the first two rows are really used for the transformation. The last row is
32
+ * generally always `[0, 0, 1]` if you only use the 2D transformation methods
33
+ * provided by this class.
34
+ *
35
+ * For convenience, entries in the first two rows can be accessed by the following
36
+ * getter properties:
37
+ * | ta tb tx |
38
+ * | tc td ty |
39
+ * | 0 0 1 |
40
+ */
41
+ export class Matrix3d {
42
+ public data: Float32Array;
43
+
44
+ /**
45
+ * Creates a new 3x3 matrix.
46
+ *
47
+ * @param entries Row-major 3x3 matrix
48
+ */
49
+ public constructor(
50
+ entries?:
51
+ | [number, number, number, number, number, number, number, number, number]
52
+ | Float32Array,
53
+ ) {
54
+ if (entries) {
55
+ // Transpose the input matrix so that it's in column-major order.
56
+ this.data = new Float32Array(9);
57
+ this.data[m0] = entries[0]!;
58
+ this.data[m1] = entries[3]!;
59
+ this.data[m2] = entries[6]!;
60
+ this.data[m3] = entries[1]!;
61
+ this.data[m4] = entries[4]!;
62
+ this.data[m5] = entries[7]!;
63
+ this.data[m6] = entries[2]!;
64
+ this.data[m7] = entries[5]!;
65
+ this.data[m8] = entries[8]!;
66
+ } else {
67
+ this.data = new Float32Array(9);
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Returns a temporary matrix that can be used for calculations.
73
+ *
74
+ * @remarks
75
+ * This is useful for avoiding allocations in tight loops.
76
+ *
77
+ * The matrix is not guaranteed to be the same between calls.
78
+ *
79
+ * @returns
80
+ */
81
+ public static get temp(): Matrix3d {
82
+ return tempMatrix;
83
+ }
84
+
85
+ public static multiply(a: Matrix3d, b: Matrix3d, out?: Matrix3d): Matrix3d {
86
+ const e0 =
87
+ a.data[m0]! * b.data[m0]! +
88
+ a.data[m1]! * b.data[m3]! +
89
+ a.data[m2]! * b.data[m6]!;
90
+ const e1 =
91
+ a.data[m0]! * b.data[m1]! +
92
+ a.data[m1]! * b.data[m4]! +
93
+ a.data[m2]! * b.data[m7]!;
94
+ const e2 =
95
+ a.data[m0]! * b.data[m2]! +
96
+ a.data[m1]! * b.data[m5]! +
97
+ a.data[m2]! * b.data[m8]!;
98
+ const e3 =
99
+ a.data[m3]! * b.data[m0]! +
100
+ a.data[m4]! * b.data[m3]! +
101
+ a.data[m5]! * b.data[m6]!;
102
+ const e4 =
103
+ a.data[m3]! * b.data[m1]! +
104
+ a.data[m4]! * b.data[m4]! +
105
+ a.data[m5]! * b.data[m7]!;
106
+ const e5 =
107
+ a.data[m3]! * b.data[m2]! +
108
+ a.data[m4]! * b.data[m5]! +
109
+ a.data[m5]! * b.data[m8]!;
110
+ const e6 =
111
+ a.data[m6]! * b.data[m0]! +
112
+ a.data[m7]! * b.data[m3]! +
113
+ a.data[m8]! * b.data[m6]!;
114
+ const e7 =
115
+ a.data[m6]! * b.data[m1]! +
116
+ a.data[m7]! * b.data[m4]! +
117
+ a.data[m8]! * b.data[m7]!;
118
+ const e8 =
119
+ a.data[m6]! * b.data[m2]! +
120
+ a.data[m7]! * b.data[m5]! +
121
+ a.data[m8]! * b.data[m8]!;
122
+ if (!out) {
123
+ out = new Matrix3d();
124
+ }
125
+ out.data[m0] = e0;
126
+ out.data[m1] = e1;
127
+ out.data[m2] = e2;
128
+ out.data[m3] = e3;
129
+ out.data[m4] = e4;
130
+ out.data[m5] = e5;
131
+ out.data[m6] = e6;
132
+ out.data[m7] = e7;
133
+ out.data[m8] = e8;
134
+ return out;
135
+ }
136
+
137
+ public static identity(out?: Matrix3d): Matrix3d {
138
+ if (!out) {
139
+ out = new Matrix3d();
140
+ }
141
+ out.data[m0] = 1;
142
+ out.data[m1] = 0;
143
+ out.data[m2] = 0;
144
+ out.data[m3] = 0;
145
+ out.data[m4] = 1;
146
+ out.data[m5] = 0;
147
+ out.data[m6] = 0;
148
+ out.data[m7] = 0;
149
+ out.data[m8] = 1;
150
+ return out;
151
+ }
152
+
153
+ public static translate(x: number, y: number, out?: Matrix3d): Matrix3d {
154
+ if (!out) {
155
+ out = new Matrix3d();
156
+ }
157
+ out.data[m0] = 1;
158
+ out.data[m1] = 0;
159
+ out.data[m2] = x;
160
+ out.data[m3] = 0;
161
+ out.data[m4] = 1;
162
+ out.data[m5] = y;
163
+ out.data[m6] = 0;
164
+ out.data[m7] = 0;
165
+ out.data[m8] = 1;
166
+ return out;
167
+ }
168
+
169
+ public static scale(sx: number, sy: number, out?: Matrix3d): Matrix3d {
170
+ if (!out) {
171
+ out = new Matrix3d();
172
+ }
173
+ out.data[m0] = sx;
174
+ out.data[m1] = 0;
175
+ out.data[m2] = 0;
176
+ out.data[m3] = 0;
177
+ out.data[m4] = sy;
178
+ out.data[m5] = 0;
179
+ out.data[m6] = 0;
180
+ out.data[m7] = 0;
181
+ out.data[m8] = 1;
182
+ return out;
183
+ }
184
+
185
+ public static rotate(angle: number, out?: Matrix3d): Matrix3d {
186
+ const cos = Math.cos(angle);
187
+ const sin = Math.sin(angle);
188
+ if (!out) {
189
+ out = new Matrix3d();
190
+ }
191
+ out.data[m0] = cos;
192
+ out.data[m1] = -sin;
193
+ out.data[m2] = 0;
194
+ out.data[m3] = sin;
195
+ out.data[m4] = cos;
196
+ out.data[m5] = 0;
197
+ out.data[m6] = 0;
198
+ out.data[m7] = 0;
199
+ out.data[m8] = 1;
200
+ return out;
201
+ }
202
+
203
+ public static copy(
204
+ src: Matrix3d,
205
+ dst?: Matrix3d,
206
+ transpose?: boolean,
207
+ ): Matrix3d {
208
+ if (!dst) {
209
+ dst = new Matrix3d();
210
+ }
211
+ dst.data[0] = src.data[0]!;
212
+ dst.data[1] = src.data[1]!;
213
+ dst.data[2] = src.data[2]!;
214
+ dst.data[3] = src.data[3]!;
215
+ dst.data[4] = src.data[4]!;
216
+ dst.data[5] = src.data[5]!;
217
+ dst.data[6] = src.data[6]!;
218
+ dst.data[7] = src.data[7]!;
219
+ dst.data[8] = src.data[8]!;
220
+ return dst;
221
+ }
222
+
223
+ public translate(x: number, y: number): Matrix3d {
224
+ this.data[m2] = this.data[m0]! * x + this.data[m1]! * y + this.data[m2]!;
225
+ this.data[m5] = this.data[m3]! * x + this.data[m4]! * y + this.data[m5]!;
226
+ return this;
227
+ }
228
+
229
+ public scale(sx: number, sy: number): Matrix3d {
230
+ this.data[m0] = this.data[m0]! * sx;
231
+ this.data[m1] = this.data[m1]! * sy;
232
+ this.data[m3] = this.data[m3]! * sx;
233
+ this.data[m4] = this.data[m4]! * sy;
234
+ return this;
235
+ }
236
+
237
+ public rotate(angle: number): Matrix3d {
238
+ if (angle === 0 || !((angle % Math.PI) * 2)) {
239
+ return this;
240
+ }
241
+ const cos = Math.cos(angle);
242
+ const sin = Math.sin(angle);
243
+ const e0 = this.data[m0]! * cos + this.data[m1]! * sin;
244
+ const e1 = this.data[m1]! * cos - this.data[m0]! * sin;
245
+ const e3 = this.data[m3]! * cos + this.data[m4]! * sin;
246
+ const e4 = this.data[m4]! * cos - this.data[m3]! * sin;
247
+ this.data[m0] = e0;
248
+ this.data[m1] = e1;
249
+ this.data[m3] = e3;
250
+ this.data[m4] = e4;
251
+ return this;
252
+ }
253
+
254
+ public multiply(other: Matrix3d): Matrix3d {
255
+ return Matrix3d.multiply(this, other, this);
256
+ }
257
+
258
+ get tx(): number {
259
+ return this.data[m2]!;
260
+ }
261
+
262
+ get ty(): number {
263
+ return this.data[m5]!;
264
+ }
265
+
266
+ get ta(): number {
267
+ return this.data[m0]!;
268
+ }
269
+
270
+ get tb(): number {
271
+ return this.data[m1]!;
272
+ }
273
+
274
+ get tc(): number {
275
+ return this.data[m3]!;
276
+ }
277
+
278
+ get td(): number {
279
+ return this.data[m4]!;
280
+ }
281
+
282
+ transformPoint(x: number, y: number): [number, number] {
283
+ return [
284
+ this.data[m0]! * x + this.data[m1]! * y + this.data[m2]!,
285
+ this.data[m3]! * x + this.data[m4]! * y + this.data[m3]!,
286
+ ];
287
+ }
288
+ }
289
+
290
+ const tempMatrix = new Matrix3d();
@@ -56,6 +56,10 @@ export const norm = (rgba: number): number => {
56
56
  return v;
57
57
  };
58
58
 
59
+ export function getNormalizedAlphaComponent(rgba: number): number {
60
+ return (rgba & 0xff) / 255.0;
61
+ }
62
+
59
63
  /**
60
64
  * Get a CSS color string from a RGBA color
61
65
  *
@@ -39,15 +39,13 @@ export interface QuadOptions {
39
39
  shader: CoreShader | null;
40
40
  shaderProps: Record<string, unknown> | null;
41
41
  alpha: number;
42
- scale: number;
43
42
  clippingRect: Rect | null;
44
- wpx: number;
45
- wpy: number;
43
+ tx: number;
44
+ ty: number;
46
45
  ta: number;
47
46
  tb: number;
48
47
  tc: number;
49
48
  td: number;
50
- worldScale: number;
51
49
  }
52
50
 
53
51
  export abstract class CoreRenderer {
@@ -23,10 +23,7 @@ import {
23
23
  hasOwn,
24
24
  mergeColorAlphaPremultiplied,
25
25
  } from '../../../utils.js';
26
- import {
27
- CoreRenderer,
28
- type QuadOptions as QuadOptions,
29
- } from '../CoreRenderer.js';
26
+ import { CoreRenderer, type QuadOptions } from '../CoreRenderer.js';
30
27
  import { WebGlCoreRenderOp } from './WebGlCoreRenderOp.js';
31
28
  import type { CoreContextTexture } from '../CoreContextTexture.js';
32
29
  import {
@@ -220,7 +217,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
220
217
  const {
221
218
  width,
222
219
  height,
223
- clippingRect,
224
220
  colorTl,
225
221
  colorTr,
226
222
  colorBl,
@@ -229,8 +225,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
229
225
  shader,
230
226
  shaderProps,
231
227
  alpha,
232
- wpx,
233
- wpy,
228
+ clippingRect,
229
+ tx,
230
+ ty,
234
231
  ta,
235
232
  tb,
236
233
  tc,
@@ -331,8 +328,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
331
328
  // render quad advanced
332
329
  if (tb !== 0 || tc !== 0) {
333
330
  // Upper-Left
334
- fQuadBuffer[bufferIdx++] = wpx; // vertexX
335
- fQuadBuffer[bufferIdx++] = wpy; // vertexY
331
+ fQuadBuffer[bufferIdx++] = tx; // vertexX
332
+ fQuadBuffer[bufferIdx++] = ty; // vertexY
336
333
  fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
337
334
  fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
338
335
  uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
@@ -343,8 +340,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
343
340
  fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
344
341
 
345
342
  // Upper-Right
346
- fQuadBuffer[bufferIdx++] = wpx + width * ta;
347
- fQuadBuffer[bufferIdx++] = wpy + width * tc;
343
+ fQuadBuffer[bufferIdx++] = tx + width * ta;
344
+ fQuadBuffer[bufferIdx++] = ty + width * tc;
348
345
  fQuadBuffer[bufferIdx++] = texCoordX2;
349
346
  fQuadBuffer[bufferIdx++] = texCoordY1;
350
347
  uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
@@ -355,8 +352,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
355
352
  fQuadBuffer[bufferIdx++] = textureIdx;
356
353
 
357
354
  // Lower-Left
358
- fQuadBuffer[bufferIdx++] = wpx + height * tb;
359
- fQuadBuffer[bufferIdx++] = wpy + height * td;
355
+ fQuadBuffer[bufferIdx++] = tx + height * tb;
356
+ fQuadBuffer[bufferIdx++] = ty + height * td;
360
357
  fQuadBuffer[bufferIdx++] = texCoordX1;
361
358
  fQuadBuffer[bufferIdx++] = texCoordY2;
362
359
  uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
@@ -367,8 +364,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
367
364
  fQuadBuffer[bufferIdx++] = textureIdx;
368
365
 
369
366
  // Lower-Right
370
- fQuadBuffer[bufferIdx++] = wpx + width * ta + height * tb;
371
- fQuadBuffer[bufferIdx++] = wpy + width * tc + height * td;
367
+ fQuadBuffer[bufferIdx++] = tx + width * ta + height * tb;
368
+ fQuadBuffer[bufferIdx++] = ty + width * tc + height * td;
372
369
  fQuadBuffer[bufferIdx++] = texCoordX2;
373
370
  fQuadBuffer[bufferIdx++] = texCoordY2;
374
371
  uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
@@ -380,12 +377,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
380
377
  } else {
381
378
  // Calculate the right corner of the quad
382
379
  // multiplied by the scale
383
- const rightCornerX = wpx + width * ta;
384
- const rightCornerY = wpy + height * td;
380
+ const rightCornerX = tx + width * ta;
381
+ const rightCornerY = ty + height * td;
385
382
 
386
383
  // Upper-Left
387
- fQuadBuffer[bufferIdx++] = wpx; // vertexX
388
- fQuadBuffer[bufferIdx++] = wpy; // vertexY
384
+ fQuadBuffer[bufferIdx++] = tx; // vertexX
385
+ fQuadBuffer[bufferIdx++] = ty; // vertexY
389
386
  fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
390
387
  fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
391
388
  uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
@@ -397,7 +394,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
397
394
 
398
395
  // Upper-Right
399
396
  fQuadBuffer[bufferIdx++] = rightCornerX;
400
- fQuadBuffer[bufferIdx++] = wpy;
397
+ fQuadBuffer[bufferIdx++] = ty;
401
398
  fQuadBuffer[bufferIdx++] = texCoordX2;
402
399
  fQuadBuffer[bufferIdx++] = texCoordY1;
403
400
  uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
@@ -408,7 +405,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
408
405
  fQuadBuffer[bufferIdx++] = textureIdx;
409
406
 
410
407
  // Lower-Left
411
- fQuadBuffer[bufferIdx++] = wpx;
408
+ fQuadBuffer[bufferIdx++] = tx;
412
409
  fQuadBuffer[bufferIdx++] = rightCornerY;
413
410
  fQuadBuffer[bufferIdx++] = texCoordX1;
414
411
  fQuadBuffer[bufferIdx++] = texCoordY2;
@@ -282,9 +282,9 @@ export abstract class WebGlCoreShader extends CoreShader {
282
282
  }
283
283
  }
284
284
 
285
- setUniform(name: string, value: any): void {
285
+ setUniform(name: string, ...value: any[]): void {
286
286
  // @ts-expect-error Typing of args is too funky apparently for TS
287
- this.gl[this.uniformTypes[name]](this.uniformLocations[name], value);
287
+ this.gl[this.uniformTypes[name]](this.uniformLocations[name], ...value);
288
288
  }
289
289
 
290
290
  bindBufferCollection(buffer: BufferCollection) {
@@ -16,13 +16,14 @@
16
16
  * See the License for the specific language governing permissions and
17
17
  * limitations under the License.
18
18
  */
19
-
20
19
  import { getNormalizedRgbaComponents } from '../../../lib/utils.js';
21
20
  import type { WebGlCoreCtxTexture } from '../WebGlCoreCtxTexture.js';
22
21
  import type { WebGlCoreRenderer } from '../WebGlCoreRenderer.js';
23
22
  import { WebGlCoreShader } from '../WebGlCoreShader.js';
24
23
  import type { ShaderProgramSources } from '../internal/ShaderUtils.js';
25
24
 
25
+ const IDENTITY_MATRIX_3x3 = new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
26
+
26
27
  declare module '../../../CoreShaderManager.js' {
27
28
  interface ShaderMap {
28
29
  SdfShader: typeof SdfShader;
@@ -33,7 +34,8 @@ declare module '../../../CoreShaderManager.js' {
33
34
  * Properties of the {@link SdfShader}
34
35
  */
35
36
  export interface SdfShaderProps {
36
- offset?: [number, number];
37
+ transform?: Float32Array;
38
+ scrollY?: number;
37
39
  /**
38
40
  * Color in RGBA format
39
41
  *
@@ -65,9 +67,10 @@ export class SdfShader extends WebGlCoreShader {
65
67
  attributes: ['a_position', 'a_textureCoordinate'],
66
68
  uniforms: [
67
69
  { name: 'u_resolution', uniform: 'uniform2fv' },
70
+ { name: 'u_transform', uniform: 'uniformMatrix3fv' },
71
+ { name: 'u_scrollY', uniform: 'uniform1f' },
68
72
  { name: 'u_pixelRatio', uniform: 'uniform1f' },
69
73
  { name: 'u_texture', uniform: 'uniform2f' },
70
- { name: 'u_offset', uniform: 'uniform2fv' },
71
74
  { name: 'u_color', uniform: 'uniform4fv' },
72
75
  { name: 'u_size', uniform: 'uniform1f' },
73
76
  { name: 'u_distanceRange', uniform: 'uniform1f' },
@@ -85,8 +88,10 @@ export class SdfShader extends WebGlCoreShader {
85
88
  protected override bindProps(props: SdfShaderProps): void {
86
89
  const resolvedProps = SdfShader.resolveDefaults(props);
87
90
  for (const key in resolvedProps) {
88
- if (key === 'offset') {
89
- this.setUniform('u_offset', resolvedProps[key]);
91
+ if (key === 'transform') {
92
+ this.setUniform('u_transform', false, resolvedProps[key]);
93
+ } else if (key === 'scrollY') {
94
+ this.setUniform('u_scrollY', resolvedProps[key]);
90
95
  } else if (key === 'color') {
91
96
  const components = getNormalizedRgbaComponents(resolvedProps.color);
92
97
  this.setUniform('u_color', components);
@@ -104,7 +109,8 @@ export class SdfShader extends WebGlCoreShader {
104
109
  props: SdfShaderProps = {},
105
110
  ): Required<SdfShaderProps> {
106
111
  return {
107
- offset: props.offset ?? [0.0, 0.0],
112
+ transform: props.transform ?? IDENTITY_MATRIX_3x3,
113
+ scrollY: props.scrollY ?? 0,
108
114
  color: props.color ?? 0xffffffff,
109
115
  size: props.size ?? 16,
110
116
  distanceRange: props.distanceRange ?? 1.0,
@@ -119,15 +125,18 @@ export class SdfShader extends WebGlCoreShader {
119
125
  attribute vec2 a_position;
120
126
  attribute vec2 a_textureCoordinate;
121
127
 
122
- uniform vec2 u_offset;
123
128
  uniform vec2 u_resolution;
129
+ uniform mat3 u_transform;
130
+ uniform float u_scrollY;
124
131
  uniform float u_pixelRatio;
125
132
  uniform float u_size;
126
133
 
127
134
  varying vec2 v_texcoord;
128
135
 
129
136
  void main() {
130
- gl_Position = vec4(((a_position * u_size + u_offset) * u_pixelRatio / u_resolution * 2.0 - 1.0) * vec2(1, -1), 0, 1);
137
+ vec2 scrolledPosition = a_position * u_size - vec2(0, u_scrollY);
138
+ vec2 transformedPosition = (u_transform * vec3(scrolledPosition, 1)).xy;
139
+ gl_Position = vec4((transformedPosition * u_pixelRatio / u_resolution * 2.0 - 1.0) * vec2(1, -1), 0, 1);
131
140
  v_texcoord = a_textureCoordinate;
132
141
  }
133
142
  `,
@@ -20,12 +20,14 @@
20
20
  import { EventEmitter } from '../../../common/EventEmitter.js';
21
21
  import { assertTruthy } from '../../../utils.js';
22
22
  import type { Stage } from '../../Stage.js';
23
+ import type { Matrix3d } from '../../lib/Matrix3d.js';
23
24
  import {
24
25
  intersectRect,
25
26
  type Bound,
26
27
  intersectBound,
27
28
  getNormalizedRgbaComponents,
28
29
  type Rect,
30
+ getNormalizedAlphaComponent,
29
31
  } from '../../lib/utils.js';
30
32
  import type { ImageTexture } from '../../textures/ImageTexture.js';
31
33
  import type { TrFontFace } from '../font-face-types/TrFontFace.js';
@@ -456,7 +458,9 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
456
458
 
457
459
  override renderQuads(
458
460
  state: CanvasTextRendererState,
461
+ transform: Matrix3d,
459
462
  clippingRect: Rect | null,
463
+ alpha: number,
460
464
  ): void {
461
465
  const { stage } = this;
462
466
 
@@ -498,11 +502,15 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
498
502
  const renderWindowHeight = renderWindow.y2 - renderWindow.y1;
499
503
  const pageSize = renderWindowHeight / 3.0;
500
504
 
501
- const { zIndex, alpha } = state.props;
505
+ const { zIndex, color } = state.props;
506
+
507
+ // Color alpha of text is not properly rendered to the Canvas texture, so we
508
+ // need to apply it here.
509
+ const combinedAlpha = alpha * getNormalizedAlphaComponent(color);
502
510
 
503
511
  if (canvasPages[0].valid) {
504
512
  this.stage.renderer.addRenderable({
505
- alpha,
513
+ alpha: combinedAlpha,
506
514
  clippingRect,
507
515
  colorBl: 0xffffffff,
508
516
  colorBr: 0xffffffff,
@@ -515,19 +523,17 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
515
523
  shader: null,
516
524
  shaderProps: null,
517
525
  zIndex,
518
- worldScale: 1,
519
- scale: 1,
520
- wpx: x,
521
- wpy: y - scrollY + renderWindow.y1,
522
- ta: 1,
523
- tb: 0,
524
- tc: 0,
525
- td: 1,
526
+ tx: transform.tx,
527
+ ty: transform.ty - scrollY + renderWindow.y1,
528
+ ta: transform.ta,
529
+ tb: transform.tb,
530
+ tc: transform.tc,
531
+ td: transform.td,
526
532
  });
527
533
  }
528
534
  if (canvasPages[1].valid) {
529
535
  this.stage.renderer.addRenderable({
530
- alpha,
536
+ alpha: combinedAlpha,
531
537
  clippingRect,
532
538
  colorBl: 0xffffffff,
533
539
  colorBr: 0xffffffff,
@@ -540,19 +546,17 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
540
546
  shader: null,
541
547
  shaderProps: null,
542
548
  zIndex,
543
- worldScale: 1,
544
- scale: 1,
545
- wpx: x,
546
- wpy: y - scrollY + renderWindow.y1 + pageSize,
547
- ta: 1,
548
- tb: 0,
549
- tc: 0,
550
- td: 1,
549
+ tx: transform.tx,
550
+ ty: transform.ty - scrollY + renderWindow.y1 + pageSize,
551
+ ta: transform.ta,
552
+ tb: transform.tb,
553
+ tc: transform.tc,
554
+ td: transform.td,
551
555
  });
552
556
  }
553
557
  if (canvasPages[2].valid) {
554
558
  this.stage.renderer.addRenderable({
555
- alpha,
559
+ alpha: combinedAlpha,
556
560
  clippingRect,
557
561
  colorBl: 0xffffffff,
558
562
  colorBr: 0xffffffff,
@@ -565,14 +569,12 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
565
569
  shader: null,
566
570
  shaderProps: null,
567
571
  zIndex,
568
- worldScale: 1,
569
- scale: 1,
570
- wpx: x,
571
- wpy: y - scrollY + renderWindow.y1 + pageSize + pageSize,
572
- ta: 1,
573
- tb: 0,
574
- tc: 0,
575
- td: 1,
572
+ tx: transform.tx,
573
+ ty: transform.ty - scrollY + renderWindow.y1 + pageSize + pageSize,
574
+ ta: transform.ta,
575
+ tb: transform.tb,
576
+ tc: transform.tc,
577
+ td: transform.td,
576
578
  });
577
579
  }
578
580