@solidtv/renderer 1.1.2 → 1.1.4

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 (62) hide show
  1. package/README.md +1 -4
  2. package/dist/src/core/CoreNode.d.ts +5 -0
  3. package/dist/src/core/CoreNode.js +33 -18
  4. package/dist/src/core/CoreNode.js.map +1 -1
  5. package/dist/src/core/CoreTextureManager.d.ts +0 -4
  6. package/dist/src/core/CoreTextureManager.js +70 -17
  7. package/dist/src/core/CoreTextureManager.js.map +1 -1
  8. package/dist/src/core/Stage.js +2 -2
  9. package/dist/src/core/Stage.js.map +1 -1
  10. package/dist/src/core/lib/WebGlContextWrapper.js +0 -4
  11. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  12. package/dist/src/core/lib/collectionUtils.js +1 -1
  13. package/dist/src/core/lib/collectionUtils.js.map +1 -1
  14. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +3 -3
  15. package/dist/src/core/renderers/canvas/CanvasRenderer.js +3 -3
  16. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  17. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +0 -3
  18. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  19. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +1 -1
  20. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +3 -2
  21. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  22. package/dist/src/core/shaders/webgl/Border.js +8 -10
  23. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  24. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +15 -18
  25. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  26. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +17 -21
  27. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  28. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +1 -1
  29. package/dist/src/core/text-rendering/CanvasFontHandler.js +3 -3
  30. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -1
  31. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +2 -3
  32. package/dist/src/core/text-rendering/CanvasTextRenderer.js +2 -1
  33. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -1
  34. package/dist/src/core/text-rendering/SdfFontHandler.js +3 -3
  35. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -1
  36. package/dist/src/core/text-rendering/Utils.js.map +1 -1
  37. package/dist/src/core/textures/ImageTexture.js +1 -1
  38. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  39. package/dist/src/core/textures/SubTexture.js.map +1 -1
  40. package/dist/src/core/textures/Texture.d.ts +6 -0
  41. package/dist/src/core/textures/Texture.js +6 -0
  42. package/dist/src/core/textures/Texture.js.map +1 -1
  43. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  44. package/package.json +7 -7
  45. package/src/core/CoreNode.ts +36 -22
  46. package/src/core/CoreTextureManager.ts +77 -20
  47. package/src/core/Stage.ts +7 -5
  48. package/src/core/lib/WebGlContextWrapper.ts +0 -2
  49. package/src/core/lib/collectionUtils.ts +1 -1
  50. package/src/core/renderers/canvas/CanvasRenderer.ts +3 -3
  51. package/src/core/renderers/webgl/WebGlShaderProgram.ts +0 -4
  52. package/src/core/renderers/webgl/internal/ShaderUtils.ts +4 -2
  53. package/src/core/shaders/webgl/Border.ts +8 -10
  54. package/src/core/shaders/webgl/RoundedWithBorder.ts +15 -18
  55. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +17 -21
  56. package/src/core/text-rendering/CanvasFontHandler.ts +4 -4
  57. package/src/core/text-rendering/CanvasTextRenderer.ts +7 -2
  58. package/src/core/text-rendering/SdfFontHandler.ts +4 -4
  59. package/src/core/text-rendering/Utils.ts +0 -2
  60. package/src/core/textures/ImageTexture.ts +1 -4
  61. package/src/core/textures/SubTexture.ts +0 -2
  62. package/src/core/textures/Texture.ts +7 -0
@@ -42,12 +42,10 @@ export const Border: WebGlShaderType<BorderProps> = {
42
42
  varying vec2 v_outerBorderUv;
43
43
  varying vec2 v_innerBorderUv;
44
44
  varying vec2 v_halfDimensions;
45
- varying float v_edgeWidth;
46
45
 
47
46
  void main() {
48
47
  vec2 screenSpace = vec2(2.0 / u_resolution.x, -2.0 / u_resolution.y);
49
48
  vec2 edge = clamp(a_nodeCoords * 2.0 - vec2(1.0), -1.0, 1.0);
50
- v_edgeWidth = 1.0 / u_pixelRatio;
51
49
 
52
50
  float borderTop = u_borderWidth.x;
53
51
  float borderRight = u_borderWidth.y;
@@ -120,7 +118,6 @@ export const Border: WebGlShaderType<BorderProps> = {
120
118
  varying vec2 v_outerBorderUv;
121
119
  varying vec2 v_innerBorderUv;
122
120
  varying vec2 v_halfDimensions;
123
- varying float v_edgeWidth;
124
121
 
125
122
  float box(vec2 p, vec2 s) {
126
123
  vec2 q = abs(p) - s;
@@ -131,24 +128,25 @@ export const Border: WebGlShaderType<BorderProps> = {
131
128
  vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
132
129
  vec4 resultColor = vec4(0.0);
133
130
  vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
131
+ float edgeWidth = 1.0 / u_pixelRatio;
134
132
 
135
- float outerDist = box(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth);
136
- float innerDist = box(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth);
133
+ float outerDist = box(boxUv + v_outerBorderUv, v_outerSize - edgeWidth);
134
+ float innerDist = box(boxUv + v_innerBorderUv, v_innerSize - edgeWidth);
137
135
 
138
136
  if(u_borderGap == 0.0) {
139
- float outerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, outerDist);
140
- float innerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist);
137
+ float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
138
+ float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
141
139
  resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
142
140
  resultColor = mix(resultColor, color, innerAlpha);
143
141
  gl_FragColor = resultColor * u_alpha;
144
142
  return;
145
143
  }
146
144
 
147
- float nodeDist = box(boxUv, v_halfDimensions - v_edgeWidth);
148
- float nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
145
+ float nodeDist = box(boxUv, v_halfDimensions - edgeWidth);
146
+ float nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
149
147
 
150
148
  float borderDist = max(-innerDist, outerDist);
151
- float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
149
+ float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);
152
150
  resultColor = mix(resultColor, color, nodeAlpha);
153
151
  resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
154
152
 
@@ -53,20 +53,18 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
53
53
  varying vec4 v_innerBorderRadius;
54
54
  varying vec4 v_outerBorderRadius;
55
55
  varying vec2 v_halfDimensions;
56
- varying float v_edgeWidth;
57
- varying float v_borderZero;
58
56
 
59
57
  void main() {
60
58
  vec2 vertexPos = a_position * u_pixelRatio;
61
59
  vec2 screenSpace = vec2(2.0 / u_resolution.x, -2.0 / u_resolution.y);
62
60
  vec2 edge = clamp(a_nodeCoords * 2.0 - vec2(1.0), -1.0, 1.0);
63
61
  vec2 edgeOffset = vec2(0.0);
62
+ float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));
64
63
 
65
- v_borderZero = u_borderWidth == vec4(0.0) ? 1.0 : 0.0;
66
64
  v_innerSize = vec2(0.0);
67
65
  v_outerSize = vec2(0.0);
68
66
 
69
- if(v_borderZero == 0.0) {
67
+ if(borderZero == 0.0) {
70
68
  float borderTop = u_borderWidth.x;
71
69
  float borderRight = u_borderWidth.y;
72
70
  float borderBottom = u_borderWidth.z;
@@ -125,7 +123,6 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
125
123
  v_textureCoords = a_textureCoords + (screenSpace + edgeOffset) / (u_dimensions);
126
124
 
127
125
  v_halfDimensions = u_dimensions * 0.5;
128
- v_edgeWidth = 1.0 / u_pixelRatio;
129
126
  }
130
127
  `,
131
128
  fragment: `
@@ -159,8 +156,6 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
159
156
  varying vec4 v_innerBorderRadius;
160
157
  varying vec4 v_outerBorderRadius;
161
158
  varying vec2 v_halfDimensions;
162
- varying float v_edgeWidth;
163
- varying float v_borderZero;
164
159
 
165
160
  float roundedBox(vec2 p, vec2 s, vec4 r) {
166
161
  r.xy = (p.x > 0.0) ? r.yz : r.xw;
@@ -173,36 +168,38 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
173
168
  vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
174
169
  vec4 resultColor = vec4(0.0);
175
170
  vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
171
+ float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));
172
+ float edgeWidth = 1.0 / u_pixelRatio;
176
173
 
177
174
  float nodeDist;
178
175
  float nodeAlpha;
179
176
 
180
- if(v_borderZero == 1.0) {
181
- nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
182
- nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
177
+ if(borderZero == 1.0) {
178
+ nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
179
+ nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
183
180
  gl_FragColor = (color * nodeAlpha) * u_alpha;
184
181
  return;
185
182
  }
186
183
 
187
- float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth, v_outerBorderRadius);
188
- float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth, v_innerBorderRadius);
184
+ float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - edgeWidth, v_outerBorderRadius);
185
+ float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - edgeWidth, v_innerBorderRadius);
189
186
 
190
187
  if(u_borderGap == 0.0) {
191
- float outerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, outerDist);
192
- float innerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist);
188
+ float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
189
+ float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
193
190
  resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
194
191
  resultColor = mix(resultColor, color, innerAlpha);
195
192
  gl_FragColor = resultColor * u_alpha;
196
193
  return;
197
194
  }
198
195
 
199
- nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
200
- nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
201
- float innerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist);
196
+ nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
197
+ nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
198
+ float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
202
199
  float gapAlpha = max(0.0, innerAlpha - nodeAlpha);
203
200
 
204
201
  float borderDist = max(-innerDist, outerDist);
205
- float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
202
+ float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);
206
203
 
207
204
  resultColor = (color * nodeAlpha) + (u_fillColor * gapAlpha);
208
205
  resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
@@ -59,22 +59,19 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
59
59
  varying vec4 v_innerBorderRadius;
60
60
  varying vec4 v_outerBorderRadius;
61
61
  varying vec2 v_halfDimensions;
62
- varying float v_edgeWidth;
63
- varying float v_borderZero;
64
62
 
65
63
  void main() {
66
64
  vec2 screenSpace = vec2(2.0 / u_resolution.x, -2.0 / u_resolution.y);
67
65
  vec2 edge = clamp(a_nodeCoords * 2.0 - vec2(1.0), -1.0, 1.0);
66
+ float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));
68
67
 
69
68
  vec2 edgeOffset = edge * ((u_shadow.w * 2.0)+ u_shadow.z) + u_shadow.xy;
70
69
  vec2 vertexPos = (a_position + edge + edgeOffset) * u_pixelRatio;
71
70
 
72
- v_borderZero = u_borderWidth == vec4(0.0) ? 1.0 : 0.0;
73
-
74
71
  v_innerSize = vec2(0.0);
75
72
  v_outerSize = vec2(0.0);
76
73
 
77
- if(v_borderZero == 0.0) {
74
+ if(borderZero == 0.0) {
78
75
  float borderTop = u_borderWidth.x;
79
76
  float borderRight = u_borderWidth.y;
80
77
  float borderBottom = u_borderWidth.z;
@@ -129,7 +126,6 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
129
126
  gl_Position = vec4(vertexPos.x * screenSpace.x - 1.0, -sign(screenSpace.y) * (vertexPos.y * -abs(screenSpace.y)) + 1.0, 0.0, 1.0);
130
127
 
131
128
  v_halfDimensions = u_dimensions * 0.5;
132
- v_edgeWidth = 1.0 / u_pixelRatio;
133
129
  v_color = a_color;
134
130
  v_nodeCoords = a_nodeCoords + (screenSpace + edgeOffset) / (u_dimensions);
135
131
  v_textureCoords = a_textureCoords + (screenSpace + edgeOffset) / (u_dimensions);
@@ -167,8 +163,6 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
167
163
  varying vec4 v_innerBorderRadius;
168
164
  varying vec4 v_outerBorderRadius;
169
165
  varying vec2 v_halfDimensions;
170
- varying float v_edgeWidth;
171
- varying float v_borderZero;
172
166
 
173
167
  float roundedBox(vec2 p, vec2 s, vec4 r) {
174
168
  r.xy = (p.x > 0.0) ? r.yz : r.xw;
@@ -189,32 +183,34 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
189
183
  vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
190
184
  vec4 resultColor = vec4(0.0);
191
185
  vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
186
+ float borderZero = 1.0 - step(0.001, dot(abs(u_borderWidth), vec4(1.0)));
187
+ float edgeWidth = 1.0 / u_pixelRatio;
192
188
  float nodeDist;
193
189
  float nodeAlpha;
194
190
  float shadowAlpha;
195
191
 
196
- if(v_borderZero == 1.0) {
197
- nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
198
- nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
199
- shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - v_edgeWidth, u_radius + u_shadow.z);
192
+ if(borderZero == 1.0) {
193
+ nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
194
+ nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
195
+ shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - edgeWidth, u_radius + u_shadow.z);
200
196
  resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
201
197
  gl_FragColor = mix(resultColor, color, nodeAlpha) * u_alpha;
202
198
  return;
203
199
  }
204
200
 
205
201
  if(v_outerSize.x > v_halfDimensions.x || v_outerSize.y > v_halfDimensions.y) {
206
- shadowAlpha = shadowBox(boxUv + v_outerBorderUv - u_shadow.xy, v_outerSize + u_shadow.w - v_edgeWidth, v_outerBorderRadius + u_shadow.z);
202
+ shadowAlpha = shadowBox(boxUv + v_outerBorderUv - u_shadow.xy, v_outerSize + u_shadow.w - edgeWidth, v_outerBorderRadius + u_shadow.z);
207
203
  }
208
204
  else {
209
- shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - v_edgeWidth, u_radius + u_shadow.z);
205
+ shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - edgeWidth, u_radius + u_shadow.z);
210
206
  }
211
207
 
212
- float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth, v_outerBorderRadius);
213
- float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth, v_innerBorderRadius);
208
+ float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - edgeWidth, v_outerBorderRadius);
209
+ float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - edgeWidth, v_innerBorderRadius);
214
210
 
215
211
  if(u_borderGap == 0.0) {
216
- float outerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, outerDist);
217
- float innerAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist);
212
+ float outerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, outerDist);
213
+ float innerAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, innerDist);
218
214
  resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
219
215
  resultColor = mix(resultColor, u_borderColor, outerAlpha * u_borderColor.a);
220
216
  resultColor = mix(resultColor, color, innerAlpha);
@@ -222,10 +218,10 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
222
218
  return;
223
219
  }
224
220
 
225
- nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
226
- nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
221
+ nodeDist = roundedBox(boxUv, v_halfDimensions - edgeWidth, u_radius);
222
+ nodeAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, nodeDist);
227
223
  float borderDist = max(-innerDist, outerDist);
228
- float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
224
+ float borderAlpha = 1.0 - smoothstep(-0.5 * edgeWidth, 0.5 * edgeWidth, borderDist);
229
225
  resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
230
226
  resultColor = mix(resultColor, color, nodeAlpha);
231
227
  resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
@@ -65,7 +65,7 @@ const processFontData = (
65
65
  /**
66
66
  * Load a font by providing fontFamily, fontUrl, and optional metrics
67
67
  */
68
- export const loadFont = async (
68
+ export const loadFont = (
69
69
  stage: Stage,
70
70
  options: FontLoadOptions,
71
71
  ): Promise<void> => {
@@ -73,7 +73,7 @@ export const loadFont = async (
73
73
 
74
74
  // If already loaded, return immediately
75
75
  if (fontCache.has(fontFamily) === true) {
76
- return;
76
+ return Promise.resolve();
77
77
  }
78
78
 
79
79
  const existingPromise = fontLoadPromises.get(fontFamily);
@@ -117,7 +117,7 @@ export const getFontFamilies = (): FontFamilyMap => {
117
117
  */
118
118
  export const init = (
119
119
  c: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
120
- mc: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
120
+ mc?: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,
121
121
  ): void => {
122
122
  if (initialized === true) {
123
123
  return;
@@ -130,7 +130,7 @@ export const init = (
130
130
  }
131
131
 
132
132
  context = c;
133
- measureContext = mc;
133
+ measureContext = mc || c;
134
134
 
135
135
  // Register the default 'sans-serif' font face
136
136
  const defaultMetrics: FontMetrics = {
@@ -1,6 +1,10 @@
1
1
  import { assertTruthy } from '../../utils.js';
2
2
  import type { Stage } from '../Stage.js';
3
- import type { TextLineStruct, TextRenderInfo } from './TextRenderer.js';
3
+ import type {
4
+ FontHandler,
5
+ TextLineStruct,
6
+ TextRenderInfo,
7
+ } from './TextRenderer.js';
4
8
  import * as CanvasFontHandler from './CanvasFontHandler.js';
5
9
  import type { CoreTextNodeProps } from '../CoreTextNode.js';
6
10
  import { hasZeroWidthSpace } from './Utils.js';
@@ -9,6 +13,7 @@ import { mapTextLayout } from './TextLayoutEngine.js';
9
13
  const MAX_TEXTURE_DIMENSION = 4096;
10
14
 
11
15
  const type = 'canvas' as const;
16
+ const font: FontHandler = CanvasFontHandler;
12
17
 
13
18
  let canvas: HTMLCanvasElement | OffscreenCanvas | null = null;
14
19
  let context:
@@ -238,7 +243,7 @@ const renderQuads = (): void => {
238
243
  */
239
244
  const CanvasTextRenderer = {
240
245
  type,
241
- font: CanvasFontHandler,
246
+ font,
242
247
  renderText,
243
248
  addQuads,
244
249
  renderQuads,
@@ -259,14 +259,14 @@ export const canRenderFont = (trProps: TrProps): boolean => {
259
259
  * @param {string} options.atlasUrl - PNG atlas texture URL
260
260
  * @param {FontMetrics} options.metrics - Optional font metrics
261
261
  */
262
- export const loadFont = async (
262
+ export const loadFont = (
263
263
  stage: Stage,
264
264
  options: FontLoadOptions,
265
265
  ): Promise<void> => {
266
266
  const { fontFamily, atlasUrl, atlasDataUrl, metrics } = options;
267
267
  // Early return if already loaded
268
268
  if (fontCache.get(fontFamily) !== undefined) {
269
- return;
269
+ return Promise.resolve();
270
270
  }
271
271
 
272
272
  // Early return if already loading
@@ -276,8 +276,8 @@ export const loadFont = async (
276
276
  }
277
277
 
278
278
  if (atlasDataUrl === undefined) {
279
- throw new Error(
280
- `Atlas data URL must be provided for SDF font: ${fontFamily}`,
279
+ return Promise.reject(
280
+ new Error(`Atlas data URL must be provided for SDF font: ${fontFamily}`),
281
281
  );
282
282
  }
283
283
 
@@ -1,5 +1,3 @@
1
- import type { NormalizedFontMetrics } from './TextRenderer.js';
2
-
3
1
  const invisibleChars = /[\u200B\u200C\u200D\uFEFF\u00AD\u2060]/g;
4
2
 
5
3
  /**
@@ -12,10 +12,7 @@ import {
12
12
  import { isSvgImage, loadSvg } from '../lib/textureSvg.js';
13
13
  import { fetchJson } from '../lib/utils.js';
14
14
  import type { Platform } from '../platforms/Platform.js';
15
- import {
16
- ENABLE_COMPRESSED_TEXTURES,
17
- isProductionEnvironment,
18
- } from '../../utils.js';
15
+ import { ENABLE_COMPRESSED_TEXTURES } from '../../utils.js';
19
16
 
20
17
  /**
21
18
  * Properties of the {@link ImageTexture}
@@ -1,4 +1,3 @@
1
- import type { Dimensions } from '../../common/CommonTypes.js';
2
1
  import { assertTruthy } from '../../utils.js';
3
2
  import type { CoreTextureManager } from '../CoreTextureManager.js';
4
3
  import { ImageTexture } from './ImageTexture.js';
@@ -8,7 +7,6 @@ import {
8
7
  type TextureData,
9
8
  type TextureFailedEventHandler,
10
9
  type TextureLoadedEventHandler,
11
- type TextureState,
12
10
  } from './Texture.js';
13
11
 
14
12
  let subTextureId = 0;
@@ -153,6 +153,13 @@ export abstract class Texture extends EventEmitter {
153
153
 
154
154
  public textureData: TextureData | null = null;
155
155
 
156
+ /**
157
+ * Cache key under which this texture is registered in the
158
+ * {@link CoreTextureManager} keyCache, or `null` if the texture is
159
+ * not cached. Owned by the texture manager.
160
+ */
161
+ public cacheKey: string | null = null;
162
+
156
163
  public memUsed = 0;
157
164
 
158
165
  /**