ranger-compiler 3.5.0 → 3.5.2

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 (338) hide show
  1. package/CHANGELOG.md +1160 -19
  2. package/LICENSE +3 -1
  3. package/README.md +124 -29
  4. package/dist/Lang.rgr +1188 -290
  5. package/dist/api.d.ts +2343 -879
  6. package/dist/api.js +79924 -56922
  7. package/dist/lib/JSON.rgr +102 -91
  8. package/dist/lib/Shell.rgr +4 -4
  9. package/dist/lib/apple/AppleToolchain.rgr +4 -4
  10. package/dist/lib/apple/README.md +5 -4
  11. package/dist/lib/apple/apple_test.rgr +1 -1
  12. package/dist/lib/core/README.md +1 -1
  13. package/dist/lib/evg/EVG.rgr +12 -0
  14. package/dist/lib/evg/EVGA11yFromTree.rgr +302 -0
  15. package/dist/lib/evg/EVGA11yTree.rgr +894 -0
  16. package/dist/lib/evg/EVGBox.rgr +267 -0
  17. package/dist/lib/evg/EVGBoxShorthandTest.rgr +220 -0
  18. package/dist/lib/evg/EVGCodepoint.rgr +316 -0
  19. package/dist/lib/evg/EVGColor.rgr +700 -0
  20. package/dist/lib/evg/EVGCommands.rgr +177 -0
  21. package/dist/lib/evg/EVGComponent.rgr +331 -0
  22. package/dist/lib/evg/EVGComponentTest.rgr +387 -0
  23. package/dist/lib/evg/EVGConnector.rgr +541 -0
  24. package/dist/lib/evg/EVGConnectorTest.rgr +306 -0
  25. package/dist/lib/evg/EVGDisplayList.rgr +4186 -0
  26. package/dist/lib/evg/EVGEasing.rgr +370 -0
  27. package/dist/lib/evg/EVGEffectTest.rgr +253 -0
  28. package/dist/lib/evg/EVGElement.rgr +4914 -0
  29. package/dist/lib/evg/EVGFixedTest.rgr +289 -0
  30. package/dist/lib/evg/EVGFlexRulesTest.rgr +317 -0
  31. package/dist/lib/evg/EVGFlexWrapTest.rgr +246 -0
  32. package/dist/lib/evg/EVGFling.rgr +244 -0
  33. package/dist/lib/evg/EVGFocus.rgr +400 -0
  34. package/dist/lib/evg/EVGFocusTest.rgr +399 -0
  35. package/dist/lib/evg/EVGGradient.rgr +322 -0
  36. package/dist/lib/evg/EVGGrapheme.rgr +190 -0
  37. package/dist/lib/evg/EVGGrid.rgr +975 -0
  38. package/dist/lib/evg/EVGHitTest.rgr +208 -0
  39. package/dist/lib/evg/EVGHoles.rgr +294 -0
  40. package/dist/lib/evg/EVGHostMeasurerTest.rgr +281 -0
  41. package/dist/lib/evg/EVGHostTextMeasurer.rgr +331 -0
  42. package/dist/lib/evg/EVGHostTree.rgr +834 -0
  43. package/dist/lib/evg/EVGHostTreeTest.rgr +447 -0
  44. package/dist/lib/evg/EVGImageDecode.rgr +117 -0
  45. package/dist/lib/evg/EVGImageMeasurer.rgr +86 -0
  46. package/dist/lib/evg/EVGInspect.rgr +883 -0
  47. package/dist/lib/evg/EVGInvalidateTest.rgr +432 -0
  48. package/dist/lib/evg/EVGJsonTest.rgr +535 -0
  49. package/dist/lib/evg/EVGLayout.rgr +4220 -0
  50. package/dist/lib/evg/EVGMeasure.rgr +1267 -0
  51. package/dist/lib/evg/EVGOverlayTest.rgr +626 -0
  52. package/dist/lib/evg/EVGPatch.rgr +1721 -0
  53. package/dist/lib/evg/EVGPatchTest.rgr +692 -0
  54. package/dist/lib/evg/EVGPopoverTest.rgr +395 -0
  55. package/dist/lib/evg/EVGReconcile.rgr +226 -0
  56. package/dist/lib/evg/EVGReconcileTest.rgr +421 -0
  57. package/dist/lib/evg/EVGReject.rgr +126 -0
  58. package/dist/lib/evg/EVGRelayoutTest.rgr +375 -0
  59. package/dist/lib/evg/EVGRtlLayoutTest.rgr +319 -0
  60. package/dist/lib/evg/EVGRuler.rgr +232 -0
  61. package/dist/lib/evg/EVGRulerTest.rgr +172 -0
  62. package/dist/lib/evg/EVGSelectChrome.rgr +178 -0
  63. package/dist/lib/evg/EVGStyleCacheTest.rgr +419 -0
  64. package/dist/lib/evg/EVGStyleSheet.rgr +2148 -0
  65. package/dist/lib/evg/EVGStyleStateTest.rgr +407 -0
  66. package/dist/lib/evg/EVGStyleVarTest.rgr +471 -0
  67. package/dist/lib/evg/EVGText.rgr +105 -0
  68. package/dist/lib/evg/EVGTextEngine.rgr +536 -0
  69. package/dist/lib/evg/EVGTextMeasurer.rgr +720 -0
  70. package/dist/lib/evg/EVGTimingTest.rgr +1417 -0
  71. package/dist/lib/evg/EVGToolbar.rgr +1369 -0
  72. package/dist/lib/evg/EVGTransition.rgr +728 -0
  73. package/dist/lib/evg/EVGTreeJson.rgr +721 -0
  74. package/dist/lib/evg/EVGUnit.rgr +554 -0
  75. package/dist/lib/evg/EVGViewportUnitTest.rgr +236 -0
  76. package/dist/lib/evg/EvgApp.rgr +189 -0
  77. package/dist/lib/evg/EvgBitmapTracer.rgr +4277 -0
  78. package/dist/lib/evg/EvgBitmapTracerTest.rgr +2119 -0
  79. package/dist/lib/evg/EvgHost.rgr +451 -0
  80. package/dist/lib/evg/EvgTest.rgr +91 -0
  81. package/dist/lib/evg/EvgTraceColor.rgr +236 -0
  82. package/dist/lib/evg/EvgTraceCurve.rgr +648 -0
  83. package/dist/lib/evg/EvgTraceFit.rgr +767 -0
  84. package/dist/lib/evg/EvgTracePath.rgr +435 -0
  85. package/dist/lib/evg/EvgTraceTypes.rgr +559 -0
  86. package/dist/lib/evg/EvgViewport.rgr +313 -0
  87. package/dist/lib/evg/FxDemoDoc.rgr +185 -0
  88. package/dist/lib/evg/HOSTS.md +227 -0
  89. package/dist/lib/evg/ISSUES.md +835 -0
  90. package/dist/lib/evg/PLAN_ACCESSIBILITY.md +650 -0
  91. package/dist/lib/evg/PLAN_CSS_LAYOUT_AND_FONTS.md +1124 -0
  92. package/dist/lib/evg/PLAN_EFFECTS.md +431 -0
  93. package/dist/lib/evg/PLAN_EVG.md +518 -0
  94. package/dist/lib/evg/PLAN_EVG_RENDERER.md +1674 -0
  95. package/dist/lib/evg/PLAN_INSPECTOR.md +788 -0
  96. package/dist/lib/evg/PLAN_LINKS_AND_FORMS.md +157 -0
  97. package/dist/lib/evg/PLAN_NATIVE_HOSTS.md +671 -0
  98. package/dist/lib/evg/PLAN_VECTOR_IR.md +664 -0
  99. package/dist/lib/evg/PLAN_VIEW_TRANSFORM.md +322 -0
  100. package/dist/lib/evg/PathBuilder.rgr +333 -0
  101. package/dist/lib/evg/README.md +1236 -0
  102. package/dist/lib/evg/SPEC.md +1252 -0
  103. package/dist/lib/evg/SVGPathParser.rgr +1199 -0
  104. package/dist/lib/evg/SvgParser.rgr +1736 -0
  105. package/dist/lib/evg/TODO_EVG_RENDERER.md +595 -0
  106. package/dist/lib/evg/VectorShapes.rgr +331 -0
  107. package/dist/lib/evg/VectorStroke.rgr +107 -0
  108. package/dist/lib/evg/VectorViewBox.rgr +380 -0
  109. package/dist/lib/evg/agent/README.md +290 -0
  110. package/dist/lib/evg/agent/evg_agent.rgr +899 -0
  111. package/dist/lib/evg/agent/fixtures/broken.evg.json +7 -0
  112. package/dist/lib/evg/agent/fixtures/card.evg.json +9 -0
  113. package/dist/lib/evg/agent/fixtures/connector.css +63 -0
  114. package/dist/lib/evg/agent/fixtures/connector.evg.json +14 -0
  115. package/dist/lib/evg/agent/fixtures/drawn.evg.json +129 -0
  116. package/dist/lib/evg/agent/fixtures/gradient.evg.json +4 -0
  117. package/dist/lib/evg/agent/fixtures/popover.css +99 -0
  118. package/dist/lib/evg/agent/fixtures/popover.evg.json +30 -0
  119. package/dist/lib/evg/agent/roundtrip.sh +74 -0
  120. package/dist/lib/evg/agent/smoke.sh +230 -0
  121. package/dist/lib/evg/android/README.md +97 -0
  122. package/dist/lib/evg/android/androidstubs/AndroidStubs.kt +175 -0
  123. package/dist/lib/evg/android/androidstubs/Annotation.kt +10 -0
  124. package/dist/lib/evg/android/androidstubs/App.kt +30 -0
  125. package/dist/lib/evg/android/androidstubs/Content.kt +41 -0
  126. package/dist/lib/evg/android/androidstubs/ContentRes.kt +12 -0
  127. package/dist/lib/evg/android/androidstubs/InputMethod.kt +46 -0
  128. package/dist/lib/evg/android/androidstubs/Net.kt +6 -0
  129. package/dist/lib/evg/android/androidstubs/Os.kt +30 -0
  130. package/dist/lib/evg/android/androidstubs/Util.kt +15 -0
  131. package/dist/lib/evg/android/androidstubs/View.kt +113 -0
  132. package/dist/lib/evg/android/androidstubs/Widget.kt +16 -0
  133. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidEvgSurface.kt +323 -0
  134. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidTextMeasurer.kt +56 -0
  135. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/RippleEffect.kt +262 -0
  136. package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtEvgSurface.kt +238 -0
  137. package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtTextMeasurer.kt +85 -0
  138. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgEngineThread.kt +115 -0
  139. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgPainter.kt +231 -0
  140. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgSurface.kt +117 -0
  141. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/RecordingSurface.kt +94 -0
  142. package/dist/lib/evg/apple/README.md +128 -0
  143. package/dist/lib/evg/apple/Sources/CoreGraphicsEvgSurface.swift +329 -0
  144. package/dist/lib/evg/apple/Sources/CoreTextMeasurer.swift +70 -0
  145. package/dist/lib/evg/apple/Sources/EvgEngineQueue.swift +105 -0
  146. package/dist/lib/evg/apple/Sources/EvgPainter.swift +225 -0
  147. package/dist/lib/evg/apple/Sources/EvgSurface.swift +163 -0
  148. package/dist/lib/evg/apple/Sources/RecordingSurface.swift +110 -0
  149. package/dist/lib/evg/bench/EvgLayoutBench.rgr +34 -0
  150. package/dist/lib/evg/bench/README.md +64 -0
  151. package/dist/lib/evg/bench/layout-bench.mjs +316 -0
  152. package/dist/lib/evg/bench/layout-cases.mjs +510 -0
  153. package/dist/lib/evg/bench/layout-conformance.mjs +254 -0
  154. package/dist/lib/evg/bin/.gitignore +17 -0
  155. package/dist/lib/evg/evg_test.rgr +313 -0
  156. package/dist/lib/evg/gl/README.md +198 -0
  157. package/dist/lib/evg/gl/a11y-paint-check.mjs +73 -0
  158. package/dist/lib/evg/gl/blur-check.mjs +399 -0
  159. package/dist/lib/evg/gl/boxmodel.json +1 -0
  160. package/dist/lib/evg/gl/demo.html +46 -0
  161. package/dist/lib/evg/gl/effect-presets.css +285 -0
  162. package/dist/lib/evg/gl/effect-presets.js +63 -0
  163. package/dist/lib/evg/gl/effect-shots.mjs +135 -0
  164. package/dist/lib/evg/gl/evg-a11y.js +566 -0
  165. package/dist/lib/evg/gl/evg-binary.js +160 -0
  166. package/dist/lib/evg/gl/evg-engine.js +296 -0
  167. package/dist/lib/evg/gl/evg-fx.js +237 -0
  168. package/dist/lib/evg/gl/evg-gestures.js +209 -0
  169. package/dist/lib/evg/gl/evg-list.js +167 -0
  170. package/dist/lib/evg/gl/evg-measure.js +186 -0
  171. package/dist/lib/evg/gl/evg-textinput.js +303 -0
  172. package/dist/lib/evg/gl/evg-view.js +144 -0
  173. package/dist/lib/evg/gl/evg-webgl.js +3942 -0
  174. package/dist/lib/evg/gl/fx-check.mjs +998 -0
  175. package/dist/lib/evg/gl/fx-demo.html +166 -0
  176. package/dist/lib/evg/gl/fx-demo.js +2 -0
  177. package/dist/lib/evg/gl/fx-serve.mjs +47 -0
  178. package/dist/lib/evg/gl/gestures-check.mjs +189 -0
  179. package/dist/lib/evg/gl/list-binary-check.mjs +152 -0
  180. package/dist/lib/evg/gl/measure-check.mjs +135 -0
  181. package/dist/lib/evg/gl/rotation-check.mjs +207 -0
  182. package/dist/lib/evg/gl/shift-check.mjs +113 -0
  183. package/dist/lib/evg/gl/stroke-check.mjs +168 -0
  184. package/dist/lib/evg/gl/text-snap-check.mjs +139 -0
  185. package/dist/lib/evg/gl/view-check.mjs +343 -0
  186. package/dist/lib/evg/gl/view-policy-check.mjs +184 -0
  187. package/dist/lib/evg/html/evg-dom.js +318 -0
  188. package/dist/lib/evg/html/evg-html.js +600 -0
  189. package/dist/lib/evg/inspect/README.md +415 -0
  190. package/dist/lib/evg/inspect/browser-smoke.mjs +115 -0
  191. package/dist/lib/evg/inspect/evg-inspect.js +947 -0
  192. package/dist/lib/evg/inspect/shots/css.png +0 -0
  193. package/dist/lib/evg/inspect/shots/dashboard.png +0 -0
  194. package/dist/lib/evg/inspect/shots/pptx-slide.png +0 -0
  195. package/dist/lib/evg/inspect/shots/state.png +0 -0
  196. package/dist/lib/evg/inspect/shots.mjs +226 -0
  197. package/dist/lib/evg/oracle/css-blur.json +576 -0
  198. package/dist/lib/evg/oracle/css-box.json +157 -0
  199. package/dist/lib/evg/oracle/css-timing.json +709 -0
  200. package/dist/lib/evg/oracle/css_blur_oracle.mjs +529 -0
  201. package/dist/lib/evg/oracle/css_box_oracle.mjs +106 -0
  202. package/dist/lib/evg/oracle/css_timing_oracle.mjs +389 -0
  203. package/dist/lib/evg/original/EVGColor.clj +310 -0
  204. package/dist/lib/evg/original/EVGColorContext.rgr +178 -0
  205. package/dist/lib/evg/original/SVGPath.rgr +627 -0
  206. package/dist/lib/evg/original/Vec2.crgr +103 -0
  207. package/dist/lib/evg/ranger.json +9 -0
  208. package/dist/lib/evg/showcase/README.md +246 -0
  209. package/dist/lib/evg/showcase/assets/emblem.svg +30 -0
  210. package/dist/lib/evg/showcase/assets/rosette.svg +22 -0
  211. package/dist/lib/evg/showcase/build.mjs +651 -0
  212. package/dist/lib/evg/showcase/pages/album.tsx +30 -0
  213. package/dist/lib/evg/showcase/pages/boxmodel.tsx +37 -0
  214. package/dist/lib/evg/showcase/pages/cards.tsx +41 -0
  215. package/dist/lib/evg/showcase/pages/chart_api.tsx +170 -0
  216. package/dist/lib/evg/showcase/pages/charts.tsx +219 -0
  217. package/dist/lib/evg/showcase/pages/drawing.tsx +160 -0
  218. package/dist/lib/evg/showcase/pages/emoji.tsx +91 -0
  219. package/dist/lib/evg/showcase/pages/flex.tsx +46 -0
  220. package/dist/lib/evg/showcase/pages/more.tsx +332 -0
  221. package/dist/lib/evg/showcase/pages/plots.tsx +262 -0
  222. package/dist/lib/evg/showcase/pages/svg.tsx +63 -0
  223. package/dist/lib/evg/showcase/pages/tables.tsx +209 -0
  224. package/dist/lib/evg/showcase/pages/typography.tsx +43 -0
  225. package/dist/lib/evg/showcase/pages/units.tsx +35 -0
  226. package/dist/lib/evg/showcase/pages/variants.tsx +233 -0
  227. package/dist/lib/evg/showcase/pages/vector.tsx +75 -0
  228. package/dist/lib/evg/showcase/pages/views.tsx +223 -0
  229. package/dist/lib/evg/showcase/tests/chart_api_smoke.mjs +339 -0
  230. package/dist/lib/evg/showcase/tests/gl_smoke.mjs +125 -0
  231. package/dist/lib/evg/showcase/themes/chart_api-default.css +15 -0
  232. package/dist/lib/evg/showcase/themes/charts-default.css +29 -0
  233. package/dist/lib/evg/showcase/themes/drawing-default.css +35 -0
  234. package/dist/lib/evg/showcase/themes/more-default.css +128 -0
  235. package/dist/lib/evg/showcase/themes/plots-default.css +18 -0
  236. package/dist/lib/evg/showcase/themes/showcase.css +508 -0
  237. package/dist/lib/evg/showcase/themes/tables-default.css +123 -0
  238. package/dist/lib/evg/showcase/themes/variants-default.css +15 -0
  239. package/dist/lib/evg/showcase/themes/views-default.css +15 -0
  240. package/dist/lib/evg/tools/bench_vs_potrace.mjs +290 -0
  241. package/dist/lib/evg/tools/evg_image_tool.rgr +488 -0
  242. package/dist/lib/evg/tools/evg_trace_bench.rgr +114 -0
  243. package/dist/lib/evg/tools/evg_trace_cli.rgr +662 -0
  244. package/dist/lib/evg/tools/evg_trace_cpp_bench.rgr +83 -0
  245. package/dist/lib/evg/tools/run_trace_bench.sh +74 -0
  246. package/dist/lib/evg/tools/run_trace_cli_smoke.sh +128 -0
  247. package/dist/lib/evg/web/responsive/EvgResponsiveCheck.rgr +271 -0
  248. package/dist/lib/evg/web/responsive/EvgResponsiveDemo.rgr +531 -0
  249. package/dist/lib/evg/web/responsive/README.md +97 -0
  250. package/dist/lib/evg/web/responsive/build.mjs +90 -0
  251. package/dist/lib/evg/web/responsive/dom-check.mjs +169 -0
  252. package/dist/lib/evg/web/responsive/index.html +177 -0
  253. package/dist/lib/evg/web/responsive/smoke.mjs +221 -0
  254. package/dist/lib/evg/web/tools/assets-client.mjs +95 -0
  255. package/dist/lib/evg/web/tools/boot-bench.mjs +189 -0
  256. package/dist/lib/evg/web/tools/inline-assets.mjs +119 -0
  257. package/dist/lib/evg/web/tools/minify.mjs +60 -0
  258. package/dist/lib/evg/web/tracer/build.mjs +87 -0
  259. package/dist/lib/evg/web/tracer/index.html +2805 -0
  260. package/dist/lib/evg/web/tracer/sample.png +0 -0
  261. package/dist/lib/evg/web/tracer/smoke.mjs +1162 -0
  262. package/dist/lib/evgr/Cargo.lock +21 -0
  263. package/dist/lib/evgr/Cargo.toml +19 -0
  264. package/dist/lib/evgr/README.md +140 -0
  265. package/dist/lib/evgr/bench/NativeBench.rgr +246 -0
  266. package/dist/lib/evgr/bench/compare.mjs +252 -0
  267. package/dist/lib/evgr/bench/speed.mjs +277 -0
  268. package/dist/lib/evgr/bin/.gitignore +3 -0
  269. package/dist/lib/evgr/src/bin/bench.rs +106 -0
  270. package/dist/lib/evgr/src/bin/smoke.rs +13 -0
  271. package/dist/lib/evgr/src/grid.rs +730 -0
  272. package/dist/lib/evgr/src/lib.rs +1003 -0
  273. package/dist/lib/evgr/src/style.rs +468 -0
  274. package/dist/lib/evgr/src/text.rs +83 -0
  275. package/dist/lib/image/BitReader.rgr +171 -0
  276. package/dist/lib/image/Buffer.rgr +173 -0
  277. package/dist/lib/image/DCT.rgr +283 -0
  278. package/dist/lib/image/Deflate.rgr +339 -0
  279. package/dist/lib/image/HuffmanDecoder.rgr +181 -0
  280. package/dist/lib/image/ImageBuffer.rgr +706 -0
  281. package/dist/lib/image/JPEGDecoder.rgr +808 -0
  282. package/dist/lib/image/PNGDecoder.rgr +544 -0
  283. package/dist/lib/image/PNGEncoder.rgr +388 -0
  284. package/dist/lib/image/PPMImage.rgr +224 -0
  285. package/dist/lib/image/ProgressiveJPEGDecoder.rgr +1154 -0
  286. package/dist/lib/image/README.md +33 -0
  287. package/dist/lib/image/RasterBuffer.rgr +294 -0
  288. package/dist/lib/image/VP8BoolDecoder.rgr +163 -0
  289. package/dist/lib/image/WebPDecoder.rgr +433 -0
  290. package/dist/lib/image/WebPLossless.rgr +1035 -0
  291. package/dist/lib/image/WebPLossy.rgr +1929 -0
  292. package/dist/lib/image/ranger.json +9 -0
  293. package/dist/lib/image/testdata/webp/anim_2f_24x16.webp +0 -0
  294. package/dist/lib/image/testdata/webp/fixtures.txt +33 -0
  295. package/dist/lib/image/testdata/webp/gen_fixtures.py +261 -0
  296. package/dist/lib/image/testdata/webp/ll_1x1.webp +0 -0
  297. package/dist/lib/image/testdata/webp/ll_alpha_29x21.webp +0 -0
  298. package/dist/lib/image/testdata/webp/ll_gradient_64x64.webp +0 -0
  299. package/dist/lib/image/testdata/webp/ll_meta_32x32.webp +0 -0
  300. package/dist/lib/image/testdata/webp/ll_noise_17x9.webp +0 -0
  301. package/dist/lib/image/testdata/webp/ll_pal11_23x11.webp +0 -0
  302. package/dist/lib/image/testdata/webp/ll_pal2_19x7.webp +0 -0
  303. package/dist/lib/image/testdata/webp/ll_pal40_16x16.webp +0 -0
  304. package/dist/lib/image/testdata/webp/ll_pal4_13x5.webp +0 -0
  305. package/dist/lib/image/testdata/webp/ll_photo_40x30.webp +0 -0
  306. package/dist/lib/image/testdata/webp/ll_predictors_64x32.webp +0 -0
  307. package/dist/lib/image/testdata/webp/ly_1x1.webp +0 -0
  308. package/dist/lib/image/testdata/webp/ly_alph_raw_f0_21x13.webp +0 -0
  309. package/dist/lib/image/testdata/webp/ly_alph_raw_f1_21x13.webp +0 -0
  310. package/dist/lib/image/testdata/webp/ly_alph_raw_f2_21x13.webp +0 -0
  311. package/dist/lib/image/testdata/webp/ly_alph_raw_f3_21x13.webp +0 -0
  312. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f0_21x13.webp +0 -0
  313. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f1_21x13.webp +0 -0
  314. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f2_21x13.webp +0 -0
  315. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f3_21x13.webp +0 -0
  316. package/dist/lib/image/testdata/webp/ly_alpha_33x17.webp +0 -0
  317. package/dist/lib/image/testdata/webp/ly_exif_15x11.webp +0 -0
  318. package/dist/lib/image/testdata/webp/ly_i16_96x80.webp +0 -0
  319. package/dist/lib/image/testdata/webp/ly_nofilter_24x20.webp +0 -0
  320. package/dist/lib/image/testdata/webp/ly_odd_17x9.webp +0 -0
  321. package/dist/lib/image/testdata/webp/ly_photo_48x40.webp +0 -0
  322. package/dist/lib/image/testdata/webp/ly_q100_20x18.webp +0 -0
  323. package/dist/lib/image/testdata/webp/ly_sharp_40x36.webp +0 -0
  324. package/dist/lib/image/testdata/webp/ly_simple_filter_33x31.webp +0 -0
  325. package/dist/lib/image/testdata/webp/ly_vpx_parts8_37x45.webp +0 -0
  326. package/dist/lib/image/testdata/webp/ly_vpx_skip_96x80.webp +0 -0
  327. package/dist/lib/image/tests/WebPDecodeTool.rgr +81 -0
  328. package/dist/lib/image/tests/WebPDecoderTest.rgr +1162 -0
  329. package/dist/lib/image/tests/run_webp_tests.sh +39 -0
  330. package/dist/lib/rust/RsJson.rgr +468 -0
  331. package/dist/lib/rust/RsPrelude.rgr +1663 -0
  332. package/dist/lib/shell_test.rgr +7 -7
  333. package/dist/lib/stdlib.rgr +21 -5
  334. package/dist/lib/zip/ranger.json +6 -0
  335. package/dist/rgrc.js +87318 -67610
  336. package/package.json +1010 -1040
  337. package/dist/README.md +0 -117
  338. package/dist/package.json +0 -47
@@ -0,0 +1,544 @@
1
+ ; SPDX-License-Identifier: MIT
2
+
3
+ ; ==============================================================================
4
+ ; png_decoder — indexed-color PNG (type 3) → RGBA ImageBuffer.
5
+ ; ==============================================================================
6
+ ; Supports LPC walk sheets: 8-bit palette + tRNS alpha.
7
+
8
+ Import "Buffer.rgr"
9
+ Import "ImageBuffer.rgr"
10
+ Import "pkg:zip/Inflate.rgr"
11
+
12
+ class PNGDecoder {
13
+ def pos:int 0
14
+ def fileData:buffer (buffer_alloc 0)
15
+ def fileLen:int 0
16
+
17
+ def width:int 0
18
+ def height:int 0
19
+ def colorType:int 0
20
+ def bitDepth:int 0
21
+
22
+ def paletteR:[int]
23
+ def paletteG:[int]
24
+ def paletteB:[int]
25
+ def paletteA:[int]
26
+ def paletteCount:int 0
27
+
28
+ def idatData:GrowableBuffer (new GrowableBuffer())
29
+
30
+ fn clearPalette:void () {
31
+ def emptyR:[int]
32
+ def emptyG:[int]
33
+ def emptyB:[int]
34
+ def emptyA:[int]
35
+ paletteR = emptyR
36
+ paletteG = emptyG
37
+ paletteB = emptyB
38
+ paletteA = emptyA
39
+ paletteCount = 0
40
+ }
41
+
42
+ fn readU8:int () {
43
+ if (pos >= fileLen) {
44
+ return 0
45
+ }
46
+ def v:int (buffer_get fileData pos)
47
+ pos = (pos + 1)
48
+ return v
49
+ }
50
+
51
+ fn readU32BE:int () {
52
+ def b0:int (this.readU8())
53
+ def b1:int (this.readU8())
54
+ def b2:int (this.readU8())
55
+ def b3:int (this.readU8())
56
+ return (((((b0 * 256) + b1) * 256) + b2) * 256) + b3
57
+ }
58
+
59
+ fn parseIHDR:void (chunkLen:int) {
60
+ width = (this.readU32BE())
61
+ height = (this.readU32BE())
62
+ bitDepth = (this.readU8())
63
+ colorType = (this.readU8())
64
+ this.readU8()
65
+ this.readU8()
66
+ this.readU8()
67
+ def remain:int (chunkLen - 13)
68
+ def skip 0
69
+ while (skip < remain) {
70
+ this.readU8()
71
+ skip = (skip + 1)
72
+ }
73
+ }
74
+
75
+ fn parsePLTE:void (chunkLen:int) {
76
+ this.clearPalette()
77
+ def count:int (to_int ((to_double chunkLen) / 3.0))
78
+ paletteCount = count
79
+ def i 0
80
+ while (i < count) {
81
+ push paletteR (this.readU8())
82
+ push paletteG (this.readU8())
83
+ push paletteB (this.readU8())
84
+ push paletteA 255
85
+ i = (i + 1)
86
+ }
87
+ }
88
+
89
+ fn parseTRNS:void (chunkLen:int) {
90
+ def i 0
91
+ while (i < chunkLen) {
92
+ if (i < paletteCount) {
93
+ set paletteA i (this.readU8())
94
+ } {
95
+ this.readU8()
96
+ }
97
+ i = (i + 1)
98
+ }
99
+ }
100
+
101
+ fn appendIDAT:void (chunkLen:int) {
102
+ def i 0
103
+ while (i < chunkLen) {
104
+ idatData.writeByte((this.readU8()))
105
+ i = (i + 1)
106
+ }
107
+ }
108
+
109
+ fn skipBytes:void (n:int) {
110
+ def i 0
111
+ while (i < n) {
112
+ this.readU8()
113
+ i = (i + 1)
114
+ }
115
+ }
116
+
117
+ fn sliceBuffer:buffer (src:buffer start:int count:int) {
118
+ if (count <= 0) {
119
+ return (buffer_alloc 0)
120
+ }
121
+ def out:buffer (buffer_alloc count)
122
+ def i 0
123
+ while (i < count) {
124
+ buffer_set out i (buffer_get src (start + i))
125
+ i = (i + 1)
126
+ }
127
+ return out
128
+ }
129
+
130
+ fn abs:int (n:int) {
131
+ if (n < 0) {
132
+ return (0 - n)
133
+ }
134
+ return n
135
+ }
136
+
137
+ fn paeth:int (a:int b:int c:int) {
138
+ def p:int (a + b)
139
+ p = (p - c)
140
+ def pa:int (this.abs(p - a))
141
+ def pb:int (this.abs(p - b))
142
+ def pc:int (this.abs(p - c))
143
+ if ((pa <= pb) && (pa <= pc)) {
144
+ return a
145
+ }
146
+ if (pb <= pc) {
147
+ return b
148
+ }
149
+ return c
150
+ }
151
+
152
+ fn filterByte:int (n:int) {
153
+ ; PNG scanline reconstruction wraps at 256 (not clamp to 0..255).
154
+ return (bit_and n 255)
155
+ }
156
+
157
+ fn filterBpp:int (ctype:int) {
158
+ ; PNG filter neighbors are prior *pixels* (same channel), not prior bytes.
159
+ if (ctype == 6) {
160
+ return 4
161
+ }
162
+ if (ctype == 2) {
163
+ return 3
164
+ }
165
+ return 1
166
+ }
167
+
168
+ fn unfilter:buffer (raw:buffer rowBytes:int imgHeight:int bpp:int) {
169
+ def out:buffer (buffer_alloc (rowBytes * imgHeight))
170
+ def rawLen:int (buffer_length raw)
171
+ def rawPos:int 0
172
+ def prevRow:[int]
173
+ def y 0
174
+ while (y < imgHeight) {
175
+ if (rawPos >= rawLen) {
176
+ return out
177
+ }
178
+ def filterType:int (buffer_get raw rawPos)
179
+ rawPos = (rawPos + 1)
180
+
181
+ def curRow:[int]
182
+ def x 0
183
+ while (x < rowBytes) {
184
+ push curRow 0
185
+ x = (x + 1)
186
+ }
187
+
188
+ x = 0
189
+ while (x < rowBytes) {
190
+ if (rawPos >= rawLen) {
191
+ return out
192
+ }
193
+ def fv:int (buffer_get raw rawPos)
194
+ rawPos = (rawPos + 1)
195
+ def recon:int fv
196
+
197
+ if (filterType == 1) {
198
+ def left:int 0
199
+ if (x >= bpp) {
200
+ left = (itemAt curRow (x - bpp))
201
+ }
202
+ recon = (fv + left)
203
+ }
204
+ if (filterType == 2) {
205
+ def up:int 0
206
+ if (y > 0) {
207
+ up = (itemAt prevRow x)
208
+ }
209
+ recon = (fv + up)
210
+ }
211
+ if (filterType == 3) {
212
+ def left:int 0
213
+ def up:int 0
214
+ if (x >= bpp) {
215
+ left = (itemAt curRow (x - bpp))
216
+ }
217
+ if (y > 0) {
218
+ up = (itemAt prevRow x)
219
+ }
220
+ recon = (fv + (bit_shr (left + up) 1))
221
+ }
222
+ if (filterType == 4) {
223
+ def left:int 0
224
+ def up:int 0
225
+ def upLeft:int 0
226
+ if (x >= bpp) {
227
+ left = (itemAt curRow (x - bpp))
228
+ }
229
+ if (y > 0) {
230
+ up = (itemAt prevRow x)
231
+ }
232
+ if ((x >= bpp) && (y > 0)) {
233
+ upLeft = (itemAt prevRow (x - bpp))
234
+ }
235
+ recon = (fv + (this.paeth(left up upLeft)))
236
+ }
237
+ recon = (this.filterByte(recon))
238
+ set curRow x recon
239
+ x = (x + 1)
240
+ }
241
+
242
+ x = 0
243
+ while (x < rowBytes) {
244
+ def o:int (((y * rowBytes) + x))
245
+ buffer_set out o (itemAt curRow x)
246
+ x = (x + 1)
247
+ }
248
+ prevRow = curRow
249
+ y = (y + 1)
250
+ }
251
+ return out
252
+ }
253
+
254
+ fn rowByteCount:int (w:int depth:int ctype:int) {
255
+ if (ctype == 6) {
256
+ return (w * 4)
257
+ }
258
+ if (ctype == 2) {
259
+ return (w * 3)
260
+ }
261
+ def bits:int (w * depth)
262
+ return (to_int ((to_double (bits + 7)) / 8.0))
263
+ }
264
+
265
+ fn decodeIndexedPixels:void (img:ImageBuffer indices:buffer rowBytes:int depth:int) {
266
+ def imgW:int (img.width)
267
+ def y 0
268
+ while (y < height) {
269
+ if (depth == 8) {
270
+ def x 0
271
+ while (x < width) {
272
+ def idx:int (buffer_get indices ((y * rowBytes) + x))
273
+ if (idx < paletteCount) {
274
+ def a:int (itemAt paletteA idx)
275
+ if (a > 0) {
276
+ def off:int (((y * imgW) + x) * 4)
277
+ buffer_set img.pixels off (itemAt paletteR idx)
278
+ buffer_set img.pixels (off + 1) (itemAt paletteG idx)
279
+ buffer_set img.pixels (off + 2) (itemAt paletteB idx)
280
+ buffer_set img.pixels (off + 3) a
281
+ }
282
+ }
283
+ x = (x + 1)
284
+ }
285
+ }
286
+ if (depth == 4) {
287
+ def x 0
288
+ def byteIdx 0
289
+ while (x < width) {
290
+ def packed:int (buffer_get indices ((y * rowBytes) + byteIdx))
291
+ def hi:int (bit_shr packed 4)
292
+ def lo:int (bit_and packed 15)
293
+ if (hi < paletteCount) {
294
+ def aHi:int (itemAt paletteA hi)
295
+ if (aHi > 0) {
296
+ def offHi:int (((y * imgW) + x) * 4)
297
+ buffer_set img.pixels offHi (itemAt paletteR hi)
298
+ buffer_set img.pixels (offHi + 1) (itemAt paletteG hi)
299
+ buffer_set img.pixels (offHi + 2) (itemAt paletteB hi)
300
+ buffer_set img.pixels (offHi + 3) aHi
301
+ }
302
+ }
303
+ def x2:int (x + 1)
304
+ if (x2 < width) {
305
+ if (lo < paletteCount) {
306
+ def aLo:int (itemAt paletteA lo)
307
+ if (aLo > 0) {
308
+ def offLo:int (((y * imgW) + x2) * 4)
309
+ buffer_set img.pixels offLo (itemAt paletteR lo)
310
+ buffer_set img.pixels (offLo + 1) (itemAt paletteG lo)
311
+ buffer_set img.pixels (offLo + 2) (itemAt paletteB lo)
312
+ buffer_set img.pixels (offLo + 3) aLo
313
+ }
314
+ }
315
+ }
316
+ x = (x + 2)
317
+ byteIdx = (byteIdx + 1)
318
+ }
319
+ }
320
+ y = (y + 1)
321
+ }
322
+ }
323
+
324
+ fn decodeRgbaPixels:void (img:ImageBuffer indices:buffer rowBytes:int) {
325
+ def imgW:int (img.width)
326
+ def y 0
327
+ while (y < height) {
328
+ def x 0
329
+ while (x < width) {
330
+ def off:int (((y * rowBytes) + (x * 4)))
331
+ def a:int (buffer_get indices (off + 3))
332
+ if (a > 0) {
333
+ def dstOff:int (((y * imgW) + x) * 4)
334
+ buffer_set img.pixels dstOff (buffer_get indices off)
335
+ buffer_set img.pixels (dstOff + 1) (buffer_get indices (off + 1))
336
+ buffer_set img.pixels (dstOff + 2) (buffer_get indices (off + 2))
337
+ buffer_set img.pixels (dstOff + 3) a
338
+ }
339
+ x = (x + 1)
340
+ }
341
+ y = (y + 1)
342
+ }
343
+ }
344
+
345
+ fn decodeRgbPixels:void (img:ImageBuffer indices:buffer rowBytes:int) {
346
+ def imgW:int (img.width)
347
+ def y 0
348
+ while (y < height) {
349
+ def x 0
350
+ while (x < width) {
351
+ def off:int (((y * rowBytes) + (x * 3)))
352
+ def dstOff:int (((y * imgW) + x) * 4)
353
+ buffer_set img.pixels dstOff (buffer_get indices off)
354
+ buffer_set img.pixels (dstOff + 1) (buffer_get indices (off + 1))
355
+ buffer_set img.pixels (dstOff + 2) (buffer_get indices (off + 2))
356
+ buffer_set img.pixels (dstOff + 3) 255
357
+ x = (x + 1)
358
+ }
359
+ y = (y + 1)
360
+ }
361
+ }
362
+
363
+ fn inflateZlib:buffer (zlibData:buffer) {
364
+ def zlen:int (buffer_length zlibData)
365
+ if (zlen < 6) {
366
+ return (buffer_alloc 0)
367
+ }
368
+ def deflateLen:int (zlen - 6)
369
+ def deflateBuf:buffer (this.sliceBuffer(zlibData 2 deflateLen))
370
+ def inflater:Inflate (new Inflate())
371
+ return (inflater.decompress(deflateBuf))
372
+ }
373
+
374
+ fn parseChunks:boolean () {
375
+ idatData = (new GrowableBuffer())
376
+ this.clearPalette()
377
+ pos = 8
378
+ while (pos < fileLen) {
379
+ def chunkLen:int (this.readU32BE())
380
+ def type0:int (this.readU8())
381
+ def type1:int (this.readU8())
382
+ def type2:int (this.readU8())
383
+ def type3:int (this.readU8())
384
+
385
+ if (type0 == 73) {
386
+ if (type1 == 72) {
387
+ if (type2 == 68) {
388
+ if (type3 == 82) {
389
+ this.parseIHDR(chunkLen)
390
+ this.skipBytes(4)
391
+ continue
392
+ }
393
+ }
394
+ }
395
+ }
396
+ if (type0 == 80) {
397
+ if (type1 == 76) {
398
+ if (type2 == 84) {
399
+ if (type3 == 69) {
400
+ this.parsePLTE(chunkLen)
401
+ this.skipBytes(4)
402
+ continue
403
+ }
404
+ }
405
+ }
406
+ }
407
+ if (type0 == 116) {
408
+ if (type1 == 82) {
409
+ if (type2 == 78) {
410
+ if (type3 == 83) {
411
+ this.parseTRNS(chunkLen)
412
+ this.skipBytes(4)
413
+ continue
414
+ }
415
+ }
416
+ }
417
+ }
418
+ if (type0 == 73) {
419
+ if (type1 == 68) {
420
+ if (type2 == 65) {
421
+ if (type3 == 84) {
422
+ this.appendIDAT(chunkLen)
423
+ this.skipBytes(4)
424
+ continue
425
+ }
426
+ }
427
+ }
428
+ }
429
+ if (type0 == 73) {
430
+ if (type1 == 69) {
431
+ if (type2 == 78) {
432
+ if (type3 == 68) {
433
+ return true
434
+ }
435
+ }
436
+ }
437
+ }
438
+ this.skipBytes((chunkLen + 4))
439
+ }
440
+ return false
441
+ }
442
+
443
+ fn decode:ImageBuffer (dir:string fileName:string) {
444
+ def fail:ImageBuffer (new ImageBuffer())
445
+ fail.init(1 1)
446
+
447
+ def bytes:buffer (buffer_read_file dir fileName)
448
+ if ((buffer_length bytes) < 24) {
449
+ print ("[png_decoder] file too small: " + dir + fileName)
450
+ return fail
451
+ }
452
+ return (this.decodeBytes(bytes))
453
+ }
454
+
455
+ ; decode a PNG already held in memory (e.g. a glTF embedded image slice).
456
+ fn decodeBytes:ImageBuffer (bytes:buffer) {
457
+ def fail:ImageBuffer (new ImageBuffer())
458
+ fail.init(1 1)
459
+
460
+ ; reset per-decode state so one instance can decode many buffers
461
+ pos = 0
462
+ idatData = (new GrowableBuffer())
463
+ this.clearPalette()
464
+ fileData = bytes
465
+ fileLen = (buffer_length fileData)
466
+ if (fileLen < 24) {
467
+ print "[png_decoder] buffer too small"
468
+ return fail
469
+ }
470
+
471
+ if ((this.parseChunks()) == false) {
472
+ print "[png_decoder] chunk parse failed"
473
+ return fail
474
+ }
475
+
476
+ if (colorType == 3) {
477
+ if ((bitDepth != 8) && (bitDepth != 4)) {
478
+ print ("[png_decoder] indexed depth unsupported: " + (to_string bitDepth))
479
+ return fail
480
+ }
481
+ if (paletteCount <= 0) {
482
+ print "[png_decoder] missing PLTE"
483
+ return fail
484
+ }
485
+ }
486
+ if (colorType == 6) {
487
+ if (bitDepth != 8) {
488
+ print "[png_decoder] RGBA requires 8-bit channels"
489
+ return fail
490
+ }
491
+ }
492
+ if (colorType == 2) {
493
+ if (bitDepth != 8) {
494
+ print "[png_decoder] RGB requires 8-bit channels"
495
+ return fail
496
+ }
497
+ }
498
+ if ((colorType != 3) && (colorType != 6) && (colorType != 2)) {
499
+ print ("[png_decoder] unsupported color type " + (to_string colorType))
500
+ return fail
501
+ }
502
+
503
+ def zlibBuf:buffer (idatData.toBuffer())
504
+ def inflated:buffer (this.inflateZlib(zlibBuf))
505
+ if ((buffer_length inflated) <= 0) {
506
+ print "[png_decoder] inflate failed"
507
+ return fail
508
+ }
509
+
510
+ def rowBytes:int (this.rowByteCount(width bitDepth colorType))
511
+ def bpp:int (this.filterBpp(colorType))
512
+ def indices:buffer (this.unfilter(inflated rowBytes height bpp))
513
+ def need:int (rowBytes * height)
514
+ if ((buffer_length indices) < need) {
515
+ print "[png_decoder] unfilter short"
516
+ return fail
517
+ }
518
+
519
+ def img:ImageBuffer (new ImageBuffer())
520
+ img.initClear(width height)
521
+ img.fillTransparent()
522
+ if (colorType == 3) {
523
+ this.decodeIndexedPixels(img indices rowBytes bitDepth)
524
+ }
525
+ if (colorType == 6) {
526
+ this.decodeRgbaPixels(img indices rowBytes)
527
+ }
528
+ if (colorType == 2) {
529
+ this.decodeRgbPixels(img indices rowBytes)
530
+ }
531
+ return img
532
+ }
533
+
534
+ fn decodeRelative:ImageBuffer (spritesheetsRoot:string relativePath:string) {
535
+ def slash:int (lastIndexOf relativePath "/")
536
+ def dir:string spritesheetsRoot
537
+ def file:string relativePath
538
+ if (slash >= 0) {
539
+ dir = (spritesheetsRoot + (substring relativePath 0 (slash + 1)))
540
+ file = (substring relativePath (slash + 1) (strlen relativePath))
541
+ }
542
+ return (this.decode(dir file))
543
+ }
544
+ }