@lightningjs/renderer 2.19.0 → 2.20.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 (257) hide show
  1. package/dist/exports/utils.d.ts +2 -1
  2. package/dist/exports/utils.js +2 -1
  3. package/dist/exports/utils.js.map +1 -1
  4. package/dist/src/core/CoreNode.js +11 -11
  5. package/dist/src/core/CoreNode.js.map +1 -1
  6. package/dist/src/core/TextureMemoryManager.js +1 -1
  7. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  8. package/dist/src/core/lib/WebGlContextWrapper.d.ts +14 -0
  9. package/dist/src/core/lib/WebGlContextWrapper.js +35 -0
  10. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  11. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  12. package/dist/src/core/lib/textureCompression.js +301 -65
  13. package/dist/src/core/lib/textureCompression.js.map +1 -1
  14. package/dist/src/core/renderers/CoreRenderer.d.ts +2 -2
  15. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +4 -0
  16. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +14 -11
  17. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  18. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +1 -1
  19. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +49 -20
  20. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  21. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +2 -7
  22. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +18 -49
  23. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  24. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +0 -2
  25. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  26. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +3 -6
  27. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
  28. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +0 -11
  29. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  30. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +5 -10
  31. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  32. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +5 -10
  33. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  34. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +0 -12
  35. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  36. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +1 -1
  37. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +1 -1
  38. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +1 -1
  39. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +1 -1
  40. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +5 -5
  41. package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +1 -1
  42. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +1 -1
  43. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +1 -1
  44. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +1 -1
  45. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +5 -5
  46. package/dist/src/core/textures/Texture.d.ts +12 -5
  47. package/dist/src/core/textures/Texture.js.map +1 -1
  48. package/dist/src/main-api/Inspector.js +10 -6
  49. package/dist/src/main-api/Inspector.js.map +1 -1
  50. package/dist/src/main-api/Renderer.js +1 -1
  51. package/dist/src/main-api/Renderer.js.map +1 -1
  52. package/dist/src/utils.d.ts +1 -6
  53. package/dist/src/utils.js +2 -9
  54. package/dist/src/utils.js.map +1 -1
  55. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  56. package/exports/utils.ts +7 -1
  57. package/package.json +1 -1
  58. package/src/core/CoreNode.ts +12 -14
  59. package/src/core/TextureMemoryManager.ts +1 -1
  60. package/src/core/lib/WebGlContextWrapper.ts +49 -0
  61. package/src/core/lib/textureCompression.ts +416 -75
  62. package/src/core/renderers/CoreRenderer.ts +2 -2
  63. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +16 -14
  64. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +1 -1
  65. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +53 -32
  66. package/src/core/renderers/webgl/WebGlCoreShader.ts +27 -75
  67. package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -2
  68. package/src/core/renderers/webgl/shaders/DefaultShader.ts +3 -6
  69. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +0 -11
  70. package/src/core/renderers/webgl/shaders/DynamicShader.ts +5 -10
  71. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +5 -10
  72. package/src/core/renderers/webgl/shaders/SdfShader.ts +0 -12
  73. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +1 -1
  74. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +1 -1
  75. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +1 -1
  76. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +1 -1
  77. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +5 -5
  78. package/src/core/renderers/webgl/shaders/effects/HolePunchEffect.ts +1 -1
  79. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +1 -1
  80. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +1 -1
  81. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +1 -1
  82. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +5 -5
  83. package/src/core/textures/Texture.ts +13 -6
  84. package/src/main-api/Inspector.ts +10 -6
  85. package/src/main-api/Renderer.ts +1 -1
  86. package/src/utils.ts +4 -4
  87. package/dist/exports/canvas-shaders.d.ts +0 -10
  88. package/dist/exports/canvas-shaders.js +0 -27
  89. package/dist/exports/canvas-shaders.js.map +0 -1
  90. package/dist/exports/webgl-shaders.d.ts +0 -11
  91. package/dist/exports/webgl-shaders.js +0 -28
  92. package/dist/exports/webgl-shaders.js.map +0 -1
  93. package/dist/src/core/lib/colorCache.d.ts +0 -1
  94. package/dist/src/core/lib/colorCache.js +0 -19
  95. package/dist/src/core/lib/colorCache.js.map +0 -1
  96. package/dist/src/core/lib/colorParser.d.ts +0 -21
  97. package/dist/src/core/lib/colorParser.js +0 -72
  98. package/dist/src/core/lib/colorParser.js.map +0 -1
  99. package/dist/src/core/platforms/Platform.d.ts +0 -37
  100. package/dist/src/core/platforms/Platform.js +0 -22
  101. package/dist/src/core/platforms/Platform.js.map +0 -1
  102. package/dist/src/core/platforms/web/WebPlatform.d.ts +0 -9
  103. package/dist/src/core/platforms/web/WebPlatform.js +0 -84
  104. package/dist/src/core/platforms/web/WebPlatform.js.map +0 -1
  105. package/dist/src/core/renderers/CoreShaderNode.d.ts +0 -59
  106. package/dist/src/core/renderers/CoreShaderNode.js +0 -113
  107. package/dist/src/core/renderers/CoreShaderNode.js.map +0 -1
  108. package/dist/src/core/renderers/CoreShaderProgram.d.ts +0 -4
  109. package/dist/src/core/renderers/CoreShaderProgram.js +0 -20
  110. package/dist/src/core/renderers/CoreShaderProgram.js.map +0 -1
  111. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +0 -35
  112. package/dist/src/core/renderers/canvas/CanvasRenderer.js +0 -201
  113. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +0 -1
  114. package/dist/src/core/renderers/canvas/CanvasShaderNode.d.ts +0 -21
  115. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +0 -58
  116. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +0 -1
  117. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +0 -16
  118. package/dist/src/core/renderers/canvas/CanvasTexture.js +0 -125
  119. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +0 -1
  120. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +0 -12
  121. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +0 -57
  122. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +0 -1
  123. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +0 -22
  124. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +0 -67
  125. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +0 -1
  126. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +0 -56
  127. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +0 -236
  128. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +0 -1
  129. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -44
  130. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -125
  131. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  132. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +0 -136
  133. package/dist/src/core/renderers/webgl/WebGlRenderer.js +0 -573
  134. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +0 -1
  135. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +0 -222
  136. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +0 -331
  137. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +0 -1
  138. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +0 -37
  139. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +0 -218
  140. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +0 -1
  141. package/dist/src/core/shaders/canvas/Border.d.ts +0 -9
  142. package/dist/src/core/shaders/canvas/Border.js +0 -57
  143. package/dist/src/core/shaders/canvas/Border.js.map +0 -1
  144. package/dist/src/core/shaders/canvas/HolePunch.d.ts +0 -7
  145. package/dist/src/core/shaders/canvas/HolePunch.js +0 -38
  146. package/dist/src/core/shaders/canvas/HolePunch.js.map +0 -1
  147. package/dist/src/core/shaders/canvas/LinearGradient.d.ts +0 -10
  148. package/dist/src/core/shaders/canvas/LinearGradient.js +0 -48
  149. package/dist/src/core/shaders/canvas/LinearGradient.js.map +0 -1
  150. package/dist/src/core/shaders/canvas/RadialGradient.d.ts +0 -11
  151. package/dist/src/core/shaders/canvas/RadialGradient.js +0 -70
  152. package/dist/src/core/shaders/canvas/RadialGradient.js.map +0 -1
  153. package/dist/src/core/shaders/canvas/Rounded.d.ts +0 -7
  154. package/dist/src/core/shaders/canvas/Rounded.js +0 -33
  155. package/dist/src/core/shaders/canvas/Rounded.js.map +0 -1
  156. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +0 -7
  157. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +0 -43
  158. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +0 -1
  159. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +0 -8
  160. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +0 -41
  161. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +0 -1
  162. package/dist/src/core/shaders/canvas/RoundedWithShadow.d.ts +0 -7
  163. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +0 -40
  164. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +0 -1
  165. package/dist/src/core/shaders/canvas/Shadow.d.ts +0 -8
  166. package/dist/src/core/shaders/canvas/Shadow.js +0 -31
  167. package/dist/src/core/shaders/canvas/Shadow.js.map +0 -1
  168. package/dist/src/core/shaders/canvas/utils/render.d.ts +0 -5
  169. package/dist/src/core/shaders/canvas/utils/render.js +0 -84
  170. package/dist/src/core/shaders/canvas/utils/render.js.map +0 -1
  171. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +0 -37
  172. package/dist/src/core/shaders/templates/BorderTemplate.js +0 -73
  173. package/dist/src/core/shaders/templates/BorderTemplate.js.map +0 -1
  174. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +0 -46
  175. package/dist/src/core/shaders/templates/HolePunchTemplate.js +0 -35
  176. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +0 -1
  177. package/dist/src/core/shaders/templates/LinearGradientTemplate.d.ts +0 -23
  178. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -47
  179. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +0 -1
  180. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +0 -31
  181. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +0 -49
  182. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +0 -1
  183. package/dist/src/core/shaders/templates/RoundedTemplate.d.ts +0 -29
  184. package/dist/src/core/shaders/templates/RoundedTemplate.js +0 -67
  185. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +0 -1
  186. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +0 -7
  187. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -24
  188. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +0 -1
  189. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +0 -6
  190. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +0 -23
  191. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +0 -1
  192. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +0 -6
  193. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -23
  194. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +0 -1
  195. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +0 -34
  196. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -66
  197. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +0 -1
  198. package/dist/src/core/shaders/utils.d.ts +0 -5
  199. package/dist/src/core/shaders/utils.js +0 -41
  200. package/dist/src/core/shaders/utils.js.map +0 -1
  201. package/dist/src/core/shaders/webgl/Border.d.ts +0 -3
  202. package/dist/src/core/shaders/webgl/Border.js +0 -110
  203. package/dist/src/core/shaders/webgl/Border.js.map +0 -1
  204. package/dist/src/core/shaders/webgl/Default.d.ts +0 -2
  205. package/dist/src/core/shaders/webgl/Default.js +0 -86
  206. package/dist/src/core/shaders/webgl/Default.js.map +0 -1
  207. package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +0 -2
  208. package/dist/src/core/shaders/webgl/DefaultBatched.js +0 -104
  209. package/dist/src/core/shaders/webgl/DefaultBatched.js.map +0 -1
  210. package/dist/src/core/shaders/webgl/HolePunch.d.ts +0 -3
  211. package/dist/src/core/shaders/webgl/HolePunch.js +0 -65
  212. package/dist/src/core/shaders/webgl/HolePunch.js.map +0 -1
  213. package/dist/src/core/shaders/webgl/LinearGradient.d.ts +0 -3
  214. package/dist/src/core/shaders/webgl/LinearGradient.js +0 -99
  215. package/dist/src/core/shaders/webgl/LinearGradient.js.map +0 -1
  216. package/dist/src/core/shaders/webgl/RadialGradient.d.ts +0 -3
  217. package/dist/src/core/shaders/webgl/RadialGradient.js +0 -96
  218. package/dist/src/core/shaders/webgl/RadialGradient.js.map +0 -1
  219. package/dist/src/core/shaders/webgl/Rounded.d.ts +0 -7
  220. package/dist/src/core/shaders/webgl/Rounded.js +0 -86
  221. package/dist/src/core/shaders/webgl/Rounded.js.map +0 -1
  222. package/dist/src/core/shaders/webgl/RoundedWithBorder.d.ts +0 -3
  223. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +0 -140
  224. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +0 -1
  225. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.d.ts +0 -3
  226. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +0 -162
  227. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +0 -1
  228. package/dist/src/core/shaders/webgl/RoundedWithShadow.d.ts +0 -3
  229. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +0 -84
  230. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +0 -1
  231. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -30
  232. package/dist/src/core/shaders/webgl/SdfShader.js +0 -107
  233. package/dist/src/core/shaders/webgl/SdfShader.js.map +0 -1
  234. package/dist/src/core/shaders/webgl/Shadow.d.ts +0 -3
  235. package/dist/src/core/shaders/webgl/Shadow.js +0 -110
  236. package/dist/src/core/shaders/webgl/Shadow.js.map +0 -1
  237. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +0 -59
  238. package/dist/src/core/text-rendering/CanvasFontHandler.js +0 -221
  239. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +0 -1
  240. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +0 -17
  241. package/dist/src/core/text-rendering/CanvasTextRenderer.js +0 -157
  242. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +0 -1
  243. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +0 -182
  244. package/dist/src/core/text-rendering/SdfFontHandler.js +0 -388
  245. package/dist/src/core/text-rendering/SdfFontHandler.js.map +0 -1
  246. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +0 -17
  247. package/dist/src/core/text-rendering/SdfTextRenderer.js +0 -311
  248. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +0 -1
  249. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +0 -19
  250. package/dist/src/core/text-rendering/TextLayoutEngine.js +0 -324
  251. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +0 -1
  252. package/dist/src/core/text-rendering/TextRenderer.d.ts +0 -368
  253. package/dist/src/core/text-rendering/TextRenderer.js +0 -20
  254. package/dist/src/core/text-rendering/TextRenderer.js.map +0 -1
  255. package/dist/src/core/text-rendering/Utils.d.ts +0 -30
  256. package/dist/src/core/text-rendering/Utils.js +0 -84
  257. package/dist/src/core/text-rendering/Utils.js.map +0 -1
@@ -16,8 +16,14 @@
16
16
  * See the License for the specific language governing permissions and
17
17
  * limitations under the License.
18
18
  */
19
+ import { type CompressedData, type TextureData } from '../textures/Texture.js';
20
+ import type { WebGlContextWrapper } from './WebGlContextWrapper.js';
19
21
 
20
- import { type TextureData } from '../textures/Texture.js';
22
+ export type UploadCompressedTextureFunction = (
23
+ glw: WebGlContextWrapper,
24
+ texture: WebGLTexture,
25
+ data: CompressedData,
26
+ ) => void;
21
27
 
22
28
  /**
23
29
  * Tests if the given location is a compressed texture container
@@ -27,10 +33,38 @@ import { type TextureData } from '../textures/Texture.js';
27
33
  * and only supports the following extensions: .ktx and .pvr
28
34
  * @returns
29
35
  */
30
- export function isCompressedTextureContainer(url: string): boolean {
31
- return /\.(ktx|pvr)$/.test(url);
36
+ export function isCompressedTextureContainer(src: string): boolean {
37
+ return /\.(ktx|pvr)$/.test(src);
32
38
  }
33
39
 
40
+ const PVR_MAGIC = 0x03525650; // 'PVR3' in little-endian
41
+ const PVR_TO_GL_INTERNAL_FORMAT: Record<string, number> = {
42
+ 0: 0x8c01,
43
+ 1: 0x8c03,
44
+ 2: 0x8c00,
45
+ 3: 0x8c02, // PVRTC1
46
+ 6: 0x8d64, // ETC1
47
+ 7: 0x83f0,
48
+ 8: 0x83f2,
49
+ 9: 0x83f2,
50
+ 10: 0x83f3,
51
+ 11: 0x83f3, // DXT variants
52
+ };
53
+ const ASTC_MAGIC = 0x5ca1ab13;
54
+
55
+ const ASTC_TO_GL_INTERNAL_FORMAT: Record<string, number> = {
56
+ '4x4': 0x93b0, // COMPRESSED_RGBA_ASTC_4x4_KHR
57
+ '5x5': 0x93b1, // COMPRESSED_RGBA_ASTC_5x5_KHR
58
+ '6x6': 0x93b2, // COMPRESSED_RGBA_ASTC_6x6_KHR
59
+ '8x8': 0x93b3, // COMPRESSED_RGBA_ASTC_8x8_KHR
60
+ '10x10': 0x93b4, // COMPRESSED_RGBA_ASTC_10x10_KHR
61
+ '12x12': 0x93b5, // COMPRESSED_RGBA_ASTC_12x12_KHR
62
+ };
63
+
64
+ // KTX file identifier
65
+ const KTX_IDENTIFIER = [
66
+ 0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a,
67
+ ];
34
68
  /**
35
69
  * Loads a compressed texture container
36
70
  * @param url
@@ -41,7 +75,6 @@ export const loadCompressedTexture = async (
41
75
  ): Promise<TextureData> => {
42
76
  try {
43
77
  const response = await fetch(url);
44
-
45
78
  if (!response.ok) {
46
79
  throw new Error(
47
80
  `Failed to fetch compressed texture: ${response.status} ${response.statusText}`,
@@ -50,114 +83,422 @@ export const loadCompressedTexture = async (
50
83
 
51
84
  const arrayBuffer = await response.arrayBuffer();
52
85
 
53
- if (url.indexOf('.ktx') !== -1) {
54
- return loadKTXData(arrayBuffer);
86
+ // Ensure we have enough data to check magic numbers
87
+ if (arrayBuffer.byteLength < 16) {
88
+ throw new Error(
89
+ `File too small to be a valid compressed texture (${arrayBuffer.byteLength} bytes). Expected at least 16 bytes for header inspection.`,
90
+ );
91
+ }
92
+
93
+ const view = new DataView(arrayBuffer);
94
+ const magic = view.getUint32(0, true);
95
+
96
+ if (magic === PVR_MAGIC) {
97
+ return loadPVR(view);
98
+ }
99
+
100
+ if (magic === ASTC_MAGIC) {
101
+ return loadASTC(view);
102
+ }
103
+
104
+ let isKTX = true;
105
+
106
+ for (let i = 0; i < KTX_IDENTIFIER.length; i++) {
107
+ if (view.getUint8(i) !== KTX_IDENTIFIER[i]) {
108
+ isKTX = false;
109
+ break;
110
+ }
55
111
  }
56
112
 
57
- return loadPVRData(arrayBuffer);
113
+ if (isKTX === true) {
114
+ return loadKTX(view);
115
+ } else {
116
+ throw new Error('Unrecognized compressed texture format');
117
+ }
58
118
  } catch (error) {
59
119
  throw new Error(`Failed to load compressed texture from ${url}: ${error}`);
60
120
  }
61
121
  };
62
122
 
123
+ function readUint24(view: DataView, offset: number) {
124
+ return (
125
+ view.getUint8(offset) +
126
+ (view.getUint8(offset + 1) << 8) +
127
+ (view.getUint8(offset + 2) << 16)
128
+ );
129
+ }
130
+
63
131
  /**
64
- * Loads a KTX texture container and returns the texture data
65
- * @param buffer
132
+ * Loads an ASTC texture container and returns the texture data
133
+ * @param view
66
134
  * @returns
67
135
  */
68
- const loadKTXData = async (buffer: ArrayBuffer): Promise<TextureData> => {
69
- const view = new DataView(buffer);
70
- const littleEndian = view.getUint32(12) === 16909060 ? true : false;
71
- const mipmaps = [];
72
-
73
- const data = {
74
- glInternalFormat: view.getUint32(28, littleEndian),
75
- pixelWidth: view.getUint32(36, littleEndian),
76
- pixelHeight: view.getUint32(40, littleEndian),
77
- numberOfMipmapLevels: view.getUint32(56, littleEndian),
78
- bytesOfKeyValueData: view.getUint32(60, littleEndian),
79
- };
136
+ const loadASTC = async function (view: DataView): Promise<TextureData> {
137
+ const blockX = view.getUint8(4);
138
+ const blockY = view.getUint8(5);
139
+ const sizeX = readUint24(view, 7);
140
+ const sizeY = readUint24(view, 10);
80
141
 
81
- let offset = 64;
142
+ if (sizeX === 0 || sizeY === 0) {
143
+ throw new Error(`Invalid ASTC texture dimensions: ${sizeX}x${sizeY}`);
144
+ }
145
+ const expected = Math.ceil(sizeX / blockX) * Math.ceil(sizeY / blockY) * 16;
146
+ const dataSize = view.byteLength - 16;
147
+ if (expected !== dataSize) {
148
+ throw new Error(
149
+ `Invalid ASTC texture data size: expected ${expected}, got ${dataSize}`,
150
+ );
151
+ }
82
152
 
83
- // Key Value Pairs of data start at byte offset 64
84
- // But the only known kvp is the API version, so skipping parsing.
85
- offset += data.bytesOfKeyValueData;
153
+ const internalFormat = ASTC_TO_GL_INTERNAL_FORMAT[`${blockX}x${blockY}`];
154
+ if (internalFormat === undefined) {
155
+ throw new Error(`Unsupported ASTC block size: ${blockX}x${blockY}`);
156
+ }
86
157
 
87
- for (let i = 0; i < data.numberOfMipmapLevels; i++) {
88
- const imageSize = view.getUint32(offset);
89
- offset += 4;
158
+ const buffer = view.buffer as ArrayBuffer;
90
159
 
91
- mipmaps.push(view.buffer.slice(offset, imageSize));
92
- offset += imageSize;
93
- }
160
+ const mipmaps: ArrayBuffer[] = [];
161
+ mipmaps.push(buffer.slice(16));
94
162
 
95
163
  return {
96
164
  data: {
97
- glInternalFormat: data.glInternalFormat,
165
+ blockInfo: blockInfoMap[internalFormat]!,
166
+ glInternalFormat: internalFormat,
98
167
  mipmaps,
99
- width: data.pixelWidth || 0,
100
- height: data.pixelHeight || 0,
101
- type: 'ktx',
168
+ width: sizeX,
169
+ height: sizeY,
170
+ type: 'astc',
102
171
  },
103
172
  premultiplyAlpha: false,
104
173
  };
105
174
  };
106
175
 
176
+ const uploadASTC = function (
177
+ glw: WebGlContextWrapper,
178
+ texture: WebGLTexture,
179
+ data: CompressedData,
180
+ ) {
181
+ if (glw.getExtension('WEBGL_compressed_texture_astc') === null) {
182
+ throw new Error('ASTC compressed textures not supported by this device');
183
+ }
184
+
185
+ glw.bindTexture(texture);
186
+
187
+ const { glInternalFormat, mipmaps, width, height } = data;
188
+
189
+ const view = new Uint8Array(mipmaps[0]!);
190
+
191
+ glw.compressedTexImage2D(0, glInternalFormat, width, height, 0, view);
192
+
193
+ // ASTC textures MUST use no mipmaps unless stored
194
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
195
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
196
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
197
+ glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
198
+ };
107
199
  /**
108
- * Loads a PVR texture container and returns the texture data
109
- * @param buffer
200
+ * Loads a KTX texture container and returns the texture data
201
+ * @param view
110
202
  * @returns
111
203
  */
112
- const loadPVRData = async (buffer: ArrayBuffer): Promise<TextureData> => {
113
- // pvr header length in 32 bits
114
- const pvrHeaderLength = 13;
115
- // for now only we only support: COMPRESSED_RGB_ETC1_WEBGL
116
- const pvrFormatEtc1 = 0x8d64;
117
- const pvrWidth = 7;
118
- const pvrHeight = 6;
119
- const pvrMipmapCount = 11;
120
- const pvrMetadata = 12;
121
- const arrayBuffer = buffer;
122
- const header = new Int32Array(arrayBuffer, 0, pvrHeaderLength);
123
-
124
- // @ts-expect-error Object possibly undefined
125
-
126
- const dataOffset = header[pvrMetadata] + 52;
127
- const pvrtcData = new Uint8Array(arrayBuffer, dataOffset);
128
- const mipmaps = [];
129
- const data = {
130
- pixelWidth: header[pvrWidth],
131
- pixelHeight: header[pvrHeight],
132
- numberOfMipmapLevels: header[pvrMipmapCount] || 0,
204
+ const loadKTX = async function (view: DataView): Promise<TextureData> {
205
+ const endianness = view.getUint32(12, true);
206
+ const littleEndian = endianness === 0x04030201;
207
+ if (littleEndian === false && endianness !== 0x01020304) {
208
+ throw new Error('Invalid KTX endianness value');
209
+ }
210
+
211
+ const glType = view.getUint32(16, littleEndian);
212
+ const glFormat = view.getUint32(24, littleEndian);
213
+ if (glType !== 0 || glFormat !== 0) {
214
+ throw new Error(
215
+ `KTX texture is not compressed (glType: ${glType}, glFormat: ${glFormat})`,
216
+ );
217
+ }
218
+
219
+ const glInternalFormat = view.getUint32(28, littleEndian);
220
+ if (blockInfoMap[glInternalFormat] === undefined) {
221
+ throw new Error(
222
+ `Unsupported KTX compressed texture format: 0x${glInternalFormat.toString(
223
+ 16,
224
+ )}`,
225
+ );
226
+ }
227
+
228
+ const width = view.getUint32(36, littleEndian);
229
+ const height = view.getUint32(40, littleEndian);
230
+ if (width === 0 || height === 0) {
231
+ throw new Error(`Invalid KTX texture dimensions: ${width}x${height}`);
232
+ }
233
+
234
+ const mipmapLevels = view.getUint32(56, littleEndian);
235
+ if (mipmapLevels === 0) {
236
+ throw new Error('KTX texture has no mipmap levels');
237
+ }
238
+
239
+ const bytesOfKeyValueData = view.getUint32(60, littleEndian);
240
+ const mipmaps: ArrayBuffer[] = [];
241
+ const buffer = view.buffer as ArrayBuffer;
242
+ let offset = 64 + bytesOfKeyValueData;
243
+
244
+ if (offset > view.byteLength) {
245
+ throw new Error('Invalid KTX file: key/value data exceeds file size');
246
+ }
247
+
248
+ for (let i = 0; i < mipmapLevels; i++) {
249
+ const imageSize = view.getUint32(offset, littleEndian);
250
+ offset += 4;
251
+
252
+ const end = offset + imageSize;
253
+
254
+ mipmaps.push(buffer.slice(offset, end));
255
+ offset = end;
256
+ if (offset % 4 !== 0) {
257
+ offset += 4 - (offset % 4);
258
+ }
259
+ }
260
+
261
+ return {
262
+ data: {
263
+ blockInfo: blockInfoMap[glInternalFormat]!,
264
+ glInternalFormat: glInternalFormat,
265
+ mipmaps,
266
+ width: width,
267
+ height: height,
268
+ type: 'ktx',
269
+ },
270
+ premultiplyAlpha: false,
133
271
  };
272
+ };
273
+
274
+ const uploadKTX = function (
275
+ glw: WebGlContextWrapper,
276
+ texture: WebGLTexture,
277
+ data: CompressedData,
278
+ ) {
279
+ const { glInternalFormat, mipmaps, width, height, blockInfo } = data;
280
+
281
+ glw.bindTexture(texture);
282
+
283
+ const blockWidth = blockInfo.width;
284
+ const blockHeight = blockInfo.height;
285
+ let w = width;
286
+ let h = height;
134
287
 
135
- let offset = 0;
136
- let width = data.pixelWidth || 0;
137
- let height = data.pixelHeight || 0;
288
+ for (let i = 0; i < mipmaps.length; i++) {
289
+ let view = new Uint8Array(mipmaps[i]!);
290
+
291
+ const uploadW = Math.ceil(w / blockWidth) * blockWidth;
292
+ const uploadH = Math.ceil(h / blockHeight) * blockHeight;
293
+
294
+ const expectedBytes =
295
+ Math.ceil(w / blockWidth) * Math.ceil(h / blockHeight) * blockInfo.bytes;
296
+
297
+ if (view.byteLength < expectedBytes) {
298
+ const padded = new Uint8Array(expectedBytes);
299
+ padded.set(view);
300
+ view = padded;
301
+ }
302
+
303
+ glw.compressedTexImage2D(i, glInternalFormat, uploadW, uploadH, 0, view);
304
+
305
+ w = Math.max(1, w >> 1);
306
+ h = Math.max(1, h >> 1);
307
+ }
138
308
 
139
- for (let i = 0; i < data.numberOfMipmapLevels; i++) {
140
- const level = ((width + 3) >> 2) * ((height + 3) >> 2) * 8;
141
- const view = new Uint8Array(
142
- arrayBuffer,
143
- pvrtcData.byteOffset + offset,
144
- level,
309
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
310
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
311
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
312
+ glw.texParameteri(
313
+ glw.TEXTURE_MIN_FILTER,
314
+ mipmaps.length > 1 ? glw.LINEAR_MIPMAP_LINEAR : glw.LINEAR,
315
+ );
316
+ };
317
+
318
+ function pvrtcMipSize(width: number, height: number, bpp: 2 | 4) {
319
+ const minW = bpp === 2 ? 16 : 8;
320
+ const minH = 8;
321
+ const w = Math.max(width, minW);
322
+ const h = Math.max(height, minH);
323
+ return (w * h * bpp) / 8;
324
+ }
325
+
326
+ const loadPVR = async function (view: DataView): Promise<TextureData> {
327
+ const pixelFormatLow = view.getUint32(8, true);
328
+ const internalFormat = PVR_TO_GL_INTERNAL_FORMAT[pixelFormatLow];
329
+
330
+ if (internalFormat === undefined) {
331
+ throw new Error(
332
+ `Unsupported PVR pixel format: 0x${pixelFormatLow.toString(16)}`,
145
333
  );
334
+ }
335
+
336
+ const height = view.getInt32(24, true);
337
+ const width = view.getInt32(28, true);
146
338
 
147
- mipmaps.push(view);
148
- offset += level;
149
- width = width >> 1;
150
- height = height >> 1;
339
+ // validate dimensions
340
+ if (width === 0 || height === 0) {
341
+ throw new Error(`Invalid PVR texture dimensions: ${width}x${height}`);
342
+ }
343
+ const mipmapLevels = view.getInt32(44, true);
344
+ const metadataSize = view.getUint32(48, true);
345
+ const buffer = view.buffer as ArrayBuffer;
346
+
347
+ let offset = 52 + metadataSize;
348
+ if (offset > buffer.byteLength) {
349
+ throw new Error('Invalid PVR file: metadata exceeds file size');
350
+ }
351
+
352
+ const mipmaps: ArrayBuffer[] = [];
353
+
354
+ const block = blockInfoMap[internalFormat]!;
355
+
356
+ for (let i = 0; i < mipmapLevels; i++) {
357
+ const declaredSize = view.getUint32(offset, true);
358
+ const max = buffer.byteLength - (offset + 4);
359
+
360
+ if (declaredSize > 0 && declaredSize <= max) {
361
+ offset += 4;
362
+ const start = offset;
363
+ const end = offset + declaredSize;
364
+
365
+ mipmaps.push(buffer.slice(start, end));
366
+ offset = end;
367
+ offset = (offset + 3) & ~3; // align to 4 bytes
368
+ continue;
369
+ }
370
+
371
+ if (
372
+ pixelFormatLow === 0 ||
373
+ pixelFormatLow === 1 ||
374
+ pixelFormatLow === 2 ||
375
+ pixelFormatLow === 3
376
+ ) {
377
+ const bpp = pixelFormatLow === 0 || pixelFormatLow === 1 ? 2 : 4;
378
+ const computed = pvrtcMipSize(width >> i, height >> i, bpp);
379
+
380
+ mipmaps.push(buffer.slice(offset, offset + computed));
381
+ offset += computed;
382
+ offset = (offset + 3) & ~3; // align to 4 bytes
383
+ continue;
384
+ }
385
+
386
+ if (block !== undefined) {
387
+ const blockW = Math.ceil((width >> i) / block.width);
388
+ const blockH = Math.ceil((height >> i) / block.height);
389
+ const computed = blockW * blockH * block.bytes;
390
+
391
+ mipmaps.push(buffer.slice(offset, offset + computed));
392
+ offset += computed;
393
+ offset = (offset + 3) & ~3;
394
+ }
151
395
  }
152
396
 
153
397
  return {
154
398
  data: {
155
- glInternalFormat: pvrFormatEtc1,
156
- mipmaps: mipmaps,
157
- width: data.pixelWidth || 0,
158
- height: data.pixelHeight || 0,
399
+ blockInfo: blockInfoMap[internalFormat]!,
400
+ glInternalFormat: internalFormat,
401
+ mipmaps,
402
+ width: width,
403
+ height: height,
159
404
  type: 'pvr',
160
405
  },
161
406
  premultiplyAlpha: false,
162
407
  };
163
408
  };
409
+
410
+ const uploadPVR = function (
411
+ glw: WebGlContextWrapper,
412
+ texture: WebGLTexture,
413
+ data: CompressedData,
414
+ ) {
415
+ const { glInternalFormat, mipmaps, width, height } = data;
416
+
417
+ glw.bindTexture(texture);
418
+
419
+ let w = width;
420
+ let h = height;
421
+
422
+ for (let i = 0; i < mipmaps.length; i++) {
423
+ glw.compressedTexImage2D(
424
+ i,
425
+ glInternalFormat,
426
+ w,
427
+ h,
428
+ 0,
429
+ new Uint8Array(mipmaps[i]!),
430
+ );
431
+
432
+ w = Math.max(1, w >> 1);
433
+ h = Math.max(1, h >> 1);
434
+ }
435
+
436
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
437
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
438
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
439
+ glw.texParameteri(
440
+ glw.TEXTURE_MIN_FILTER,
441
+ mipmaps.length > 1 ? glw.LINEAR_MIPMAP_LINEAR : glw.LINEAR,
442
+ );
443
+ };
444
+
445
+ type BlockInfo = {
446
+ width: number;
447
+ height: number;
448
+ bytes: number;
449
+ };
450
+
451
+ // Predefined block info for common compressed texture formats
452
+ const BLOCK_4x4x8: BlockInfo = { width: 4, height: 4, bytes: 8 };
453
+ const BLOCK_4x4x16: BlockInfo = { width: 4, height: 4, bytes: 16 };
454
+ const BLOCK_5x5x16: BlockInfo = { width: 5, height: 5, bytes: 16 };
455
+ const BLOCK_6x6x16: BlockInfo = { width: 6, height: 6, bytes: 16 };
456
+ const BLOCK_8x4x8: BlockInfo = { width: 8, height: 4, bytes: 8 };
457
+ const BLOCK_8x8x16: BlockInfo = { width: 8, height: 8, bytes: 16 };
458
+ const BLOCK_10x10x16: BlockInfo = { width: 10, height: 10, bytes: 16 };
459
+ const BLOCK_12x12x16: BlockInfo = { width: 12, height: 12, bytes: 16 };
460
+
461
+ // Map of GL internal formats to their corresponding block info
462
+ export const blockInfoMap: { [key: number]: BlockInfo } = {
463
+ // S3TC / DXTn (WEBGL_compressed_texture_s3tc, sRGB variants)
464
+ 0x83f0: BLOCK_4x4x8, // COMPRESSED_RGB_S3TC_DXT1_EXT
465
+ 0x83f1: BLOCK_4x4x8, // COMPRESSED_RGBA_S3TC_DXT1_EXT
466
+ 0x83f2: BLOCK_4x4x16, // COMPRESSED_RGBA_S3TC_DXT3_EXT
467
+ 0x83f3: BLOCK_4x4x16, // COMPRESSED_RGBA_S3TC_DXT5_EXT
468
+
469
+ // ETC1 / ETC2 / EAC
470
+ 0x8d64: BLOCK_4x4x8, // COMPRESSED_RGB_ETC1_WEBGL
471
+ 0x9274: BLOCK_4x4x8, // COMPRESSED_RGB8_ETC2
472
+ 0x9275: BLOCK_4x4x8, // COMPRESSED_SRGB8_ETC2
473
+ 0x9278: BLOCK_4x4x16, // COMPRESSED_RGBA8_ETC2_EAC
474
+ 0x9279: BLOCK_4x4x16, // COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
475
+
476
+ // PVRTC (WEBGL_compressed_texture_pvrtc)
477
+ 0x8c00: BLOCK_4x4x8, // COMPRESSED_RGB_PVRTC_4BPPV1_IMG
478
+ 0x8c02: BLOCK_4x4x8, // COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
479
+ 0x8c01: BLOCK_8x4x8, // COMPRESSED_RGB_PVRTC_2BPPV1_IMG
480
+ 0x8c03: BLOCK_8x4x8,
481
+
482
+ // ASTC (WEBGL_compressed_texture_astc)
483
+ 0x93b0: BLOCK_4x4x16, // COMPRESSED_RGBA_ASTC_4x4_KHR
484
+ 0x93d0: BLOCK_4x4x16, // COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
485
+ 0x93b1: BLOCK_5x5x16, // 5x5
486
+ 0x93d1: BLOCK_5x5x16,
487
+ 0x93b2: BLOCK_6x6x16, // 6x6
488
+ 0x93d2: BLOCK_6x6x16,
489
+ 0x93b3: BLOCK_8x8x16, // 8x8
490
+ 0x93d3: BLOCK_8x8x16,
491
+ 0x93b4: BLOCK_10x10x16, // 10x10
492
+ 0x93d4: BLOCK_10x10x16,
493
+ 0x93b5: BLOCK_12x12x16, // 12x12
494
+ 0x93d5: BLOCK_12x12x16,
495
+ };
496
+
497
+ export const uploadCompressedTexture: Record<
498
+ string,
499
+ UploadCompressedTextureFunction
500
+ > = {
501
+ ktx: uploadKTX,
502
+ pvr: uploadPVR,
503
+ astc: uploadASTC,
504
+ };
@@ -44,8 +44,8 @@ export interface QuadOptions {
44
44
  texture: Texture | null;
45
45
  textureOptions: TextureOptions | null;
46
46
  zIndex: number;
47
- shader: CoreShader | null;
48
- shaderProps: Record<string, unknown> | null;
47
+ shader: CoreShader;
48
+ shaderProps: Record<string, unknown>;
49
49
  alpha: number;
50
50
  clippingRect: RectWithValid;
51
51
  tx: number;
@@ -21,6 +21,7 @@ import type { Dimensions } from '../../../common/CommonTypes.js';
21
21
  import { assertTruthy } from '../../../utils.js';
22
22
  import type { TextureMemoryManager } from '../../TextureMemoryManager.js';
23
23
  import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
24
+ import { uploadCompressedTexture } from '../../lib/textureCompression.js';
24
25
  import type { Texture } from '../../textures/Texture.js';
25
26
  import { CoreContextTexture } from '../CoreContextTexture.js';
26
27
  import { isHTMLImageElement } from './internal/RendererUtils.js';
@@ -43,6 +44,11 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
43
44
  private _w = 0;
44
45
  private _h = 0;
45
46
 
47
+ txCoordX1 = 0;
48
+ txCoordY1 = 0;
49
+ txCoordX2 = 1;
50
+ txCoordY2 = 1;
51
+
46
52
  constructor(
47
53
  protected glw: WebGlContextWrapper,
48
54
  memManager: TextureMemoryManager,
@@ -211,26 +217,22 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
211
217
 
212
218
  this.setTextureMemUse(height * width * formatBytes * memoryPadding);
213
219
  } else if (tdata && 'mipmaps' in tdata && tdata.mipmaps) {
214
- const { mipmaps, width = 0, height = 0, type, glInternalFormat } = tdata;
215
- const view =
216
- type === 'ktx'
217
- ? new DataView(mipmaps[0] ?? new ArrayBuffer(0))
218
- : (mipmaps[0] as unknown as ArrayBufferView);
219
-
220
- glw.bindTexture(this._nativeCtxTexture);
221
-
222
- glw.compressedTexImage2D(0, glInternalFormat, width, height, 0, view);
223
- glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
224
- glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
225
- glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
226
- glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
220
+ const { mipmaps, type, blockInfo } = tdata;
221
+ uploadCompressedTexture[type]!(glw, this._nativeCtxTexture, tdata);
227
222
 
228
223
  // Check for errors after compressed texture operations
229
224
  if (this.checkGLError() === true) {
230
225
  return { width: 0, height: 0 };
231
226
  }
232
227
 
233
- this.setTextureMemUse(view.byteLength);
228
+ width = tdata.width;
229
+ height = tdata.height;
230
+ this.txCoordX2 =
231
+ width / (Math.ceil(width / blockInfo.width) * blockInfo.width);
232
+ this.txCoordY2 =
233
+ height / (Math.ceil(height / blockInfo.height) * blockInfo.height);
234
+
235
+ this.setTextureMemUse(mipmaps[0]?.byteLength ?? 0);
234
236
  } else if (tdata && tdata instanceof Uint8Array) {
235
237
  // Color Texture
236
238
  width = 1;
@@ -88,7 +88,7 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
88
88
  shader.bindRenderOp(this, shaderProps);
89
89
 
90
90
  // TODO: Reduce calculations required
91
- const quadIdx = (this.bufferIdx / 24) * 6 * 2;
91
+ const quadIdx = (this.bufferIdx / 32) * 6 * 2;
92
92
 
93
93
  // Clipping
94
94
  if (this.clippingRect.valid) {