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,387 @@
1
+ ; SPDX-License-Identifier: MIT
2
+
3
+ ; ==============================================================================
4
+ ; EVGComponentTest — the instance comes back, and the one that left is told
5
+ ; ==============================================================================
6
+ ;
7
+ ; Two claims, and they are separate:
8
+ ;
9
+ ; 1. Asking for the same key twice returns the SAME instance, so a field on
10
+ ; it survives a rebuild. That is the whole feature; everything else is
11
+ ; bookkeeping around it.
12
+ ;
13
+ ; 2. An instance nobody asked for is unmounted and forgotten. This is the
14
+ ; half that has no equivalent in the reconciler — a dropped element takes
15
+ ; its subtree out of the tree and nothing is told, which is fine for a box
16
+ ; and wrong for anything holding a timer.
17
+ ;
18
+ ; Both are checked by watching what a component REMEMBERS rather than by
19
+ ; comparing references, because "is it the same object" is not a question this
20
+ ; language answers directly and a counter that carries across a rebuild is a
21
+ ; stronger claim anyway: it is the thing the feature is for.
22
+ ;
23
+ ; The last section runs the whole loop — build, reconcile, transition — because
24
+ ; the component host and `EVGReconcile` are two mechanisms keyed the same way
25
+ ; and "they agree" is a property of the pair, not of either one.
26
+ ; ==============================================================================
27
+
28
+ Import "EVGElement.rgr"
29
+ Import "EVGUnit.rgr"
30
+ Import "EVGStyleSheet.rgr"
31
+ Import "EVGLayout.rgr"
32
+ Import "EVGTransition.rgr"
33
+ Import "EVGComponent.rgr"
34
+ Import "EVGReconcile.rgr"
35
+
36
+ class CompCheck {
37
+ def passed:int 0
38
+ def failed:int 0
39
+
40
+ fn ok:void (name:string cond:boolean) {
41
+ if cond {
42
+ passed = (passed + 1)
43
+ print (" PASS " + name)
44
+ } {
45
+ failed = (failed + 1)
46
+ print (" FAIL " + name)
47
+ }
48
+ }
49
+
50
+ fn eqStr:void (name:string got:string want:string) {
51
+ def good:boolean (got == want)
52
+ if (good == false) {
53
+ print (" got " + got)
54
+ print (" want " + want)
55
+ }
56
+ this.ok(name good)
57
+ }
58
+
59
+ fn eqInt:void (name:string got:int want:int) {
60
+ this.eqStr(name (to_string got) (to_string want))
61
+ }
62
+ }
63
+
64
+ ; A row with three things on it that nothing above it owns: how many times it
65
+ ; has been mounted, how many times unmounted, and a counter standing in for
66
+ ; whatever a real row would want to remember. The counter is the point — it is
67
+ ; an ordinary field on an ordinary class, and it survives because the INSTANCE
68
+ ; survives, which is what makes `state` sugar rather than machinery later.
69
+ class CountingRow extends EVGComponent {
70
+ def label:string ""
71
+ def mounts:int 0
72
+ def disposals:int 0
73
+ def ticks:int 0
74
+
75
+ Constructor () {
76
+ }
77
+
78
+ fn onMount:void () {
79
+ mounts = (mounts + 1)
80
+ }
81
+
82
+ fn onDispose:void () {
83
+ disposals = (disposals + 1)
84
+ }
85
+
86
+ fn view:EVGElement () {
87
+ def el (EVGElement.createDiv())
88
+ ; A colour per row, so a row in the wrong place is visible in what is
89
+ ; PAINTED rather than only in a field. It also gives every row a
90
+ ; background from the first frame — a transition needs somewhere to
91
+ ; travel FROM, and an element that has never had a colour does not
92
+ ; start a flight when it gets one.
93
+ el.className = ("row row-" + label)
94
+ el.id = ("row-" + label)
95
+ el.textContent = label
96
+ return el
97
+ }
98
+ }
99
+
100
+ class EVGComponentTest {
101
+
102
+ ; `use` at the call site, with the fallback allocation the design asks for.
103
+ sfn row:CountingRow (host:EVGComponentHost key:string label:string) {
104
+ def got:EVGComponent (host.use(key (new CountingRow())))
105
+ def r:CountingRow (cast got to:CountingRow)
106
+ r.label = label
107
+ return r
108
+ }
109
+
110
+ ; --- 1: the instance comes back -----------------------------------------------
111
+
112
+ sfn testSurvives:void (c:CompCheck) {
113
+ print "--- the same key returns the same instance ---"
114
+ def host (new EVGComponentHost())
115
+
116
+ host.beginPass()
117
+ def first:CountingRow (EVGComponentTest.row(host "a" "A"))
118
+ first.ticks = 7
119
+ first.render()
120
+ host.endPass()
121
+ c.eqInt("the first pass mounts it" host.stats.mounted 1)
122
+ c.eqInt("and updates nothing" host.stats.updated 0)
123
+
124
+ host.beginPass()
125
+ def again:CountingRow (EVGComponentTest.row(host "a" "A"))
126
+ again.render()
127
+ host.endPass()
128
+
129
+ c.eqInt("the second pass mounts nothing" host.stats.mounted 0)
130
+ c.eqInt("and updates the one there was" host.stats.updated 1)
131
+ ; The claim, stated as the thing the feature is for: a field set before
132
+ ; the rebuild is still set after it.
133
+ c.eqInt("a field set on it survived the rebuild" again.ticks 7)
134
+ c.eqInt("and it knows it has rendered twice" again.renders 2)
135
+ c.eqInt("onMount ran once, not twice" again.mounts 1)
136
+ c.eqInt("and onDispose not at all" again.disposals 0)
137
+ }
138
+
139
+ ; --- 2: the one that left is told ---------------------------------------------
140
+
141
+ sfn testUnmount:void (c:CompCheck) {
142
+ print "--- a component nobody asked for is disposed ---"
143
+ def host (new EVGComponentHost())
144
+
145
+ host.beginPass()
146
+ def keep:CountingRow (EVGComponentTest.row(host "a" "A"))
147
+ def go:CountingRow (EVGComponentTest.row(host "b" "B"))
148
+ go.ticks = 3
149
+ keep.render()
150
+ go.render()
151
+ host.endPass()
152
+ c.eqInt("two are live" host.stats.live 2)
153
+
154
+ ; The second pass simply does not build "b". There is no remove call
155
+ ; and there should not be one: a thing leaves a view by not being
156
+ ; built.
157
+ host.beginPass()
158
+ def stillHere:CountingRow (EVGComponentTest.row(host "a" "A"))
159
+ stillHere.render()
160
+ host.endPass()
161
+
162
+ c.eqInt("the one that left was disposed" host.stats.disposed 1)
163
+ c.eqInt("it was told so" go.disposals 1)
164
+ c.eqInt("and one is left" host.stats.live 1)
165
+ c.eqInt("the one that stayed was not told anything" keep.disposals 0)
166
+
167
+ ; And the forget is REAL: asking for "b" again builds a new one, which
168
+ ; is the difference between unmounting and hiding.
169
+ host.beginPass()
170
+ def reborn:CountingRow (EVGComponentTest.row(host "b" "B"))
171
+ reborn.render()
172
+ host.endPass()
173
+ c.eqInt("asking again mounts a fresh one" host.stats.mounted 1)
174
+ c.eqInt("with none of the old one's memory" reborn.ticks 0)
175
+ c.eqInt("and one render, not three" reborn.renders 1)
176
+ }
177
+
178
+ ; --- 3: a key is scoped to where it is asked for -------------------------------
179
+
180
+ sfn testPaths:void (c:CompCheck) {
181
+ print "--- the same key under two parents is two components ---"
182
+ def host (new EVGComponentHost())
183
+
184
+ host.beginPass()
185
+ host.enter("left")
186
+ def a:CountingRow (EVGComponentTest.row(host "video" "left video"))
187
+ a.ticks = 1
188
+ a.render()
189
+ host.leave()
190
+ host.enter("right")
191
+ def b:CountingRow (EVGComponentTest.row(host "video" "right video"))
192
+ b.ticks = 2
193
+ b.render()
194
+ host.leave()
195
+ host.endPass()
196
+
197
+ c.eqInt("both exist" host.stats.live 2)
198
+ c.eqStr("and are named by where they are" a.path "left/video")
199
+ c.eqStr("each under its own parent" b.path "right/video")
200
+
201
+ host.beginPass()
202
+ host.enter("left")
203
+ def a2:CountingRow (EVGComponentTest.row(host "video" "left video"))
204
+ a2.render()
205
+ host.leave()
206
+ host.enter("right")
207
+ def b2:CountingRow (EVGComponentTest.row(host "video" "right video"))
208
+ b2.render()
209
+ host.leave()
210
+ host.endPass()
211
+ c.eqInt("the left one kept the left one's memory" a2.ticks 1)
212
+ c.eqInt("and the right one the right's" b2.ticks 2)
213
+ c.eqInt("nothing was mounted again" host.stats.mounted 0)
214
+ }
215
+
216
+ ; --- 4: the element and the component agree about identity ---------------------
217
+
218
+ sfn testElementAgrees:void (c:CompCheck) {
219
+ print "--- the element carries the component's path as its key ---"
220
+ def host (new EVGComponentHost())
221
+ host.beginPass()
222
+ host.enter("list")
223
+ def r:CountingRow (EVGComponentTest.row(host "a" "A"))
224
+ def el:EVGElement (r.render())
225
+ host.leave()
226
+ host.endPass()
227
+ ; Not decoration. `EVGReconcile` matches elements by key and the host
228
+ ; matches components by path; if these two ever disagree a component
229
+ ; keeps its state while its element is replaced, which is worse than
230
+ ; neither persisting.
231
+ c.eqStr("the key is the path" el.key "list/a")
232
+ }
233
+
234
+ ; --- 5: misuse says so ----------------------------------------------------------
235
+
236
+ sfn testLint:void (c:CompCheck) {
237
+ print "--- misuse is reported rather than absorbed ---"
238
+
239
+ def h1 (new EVGComponentHost())
240
+ EVGComponentTest.row(h1 "a" "A")
241
+ c.eqInt("use outside a pass is a problem" (array_length (h1.lint())) 1)
242
+
243
+ def h2 (new EVGComponentHost())
244
+ h2.beginPass()
245
+ h2.enter("x")
246
+ h2.endPass()
247
+ c.ok("an unclosed enter is a problem" ((array_length (h2.lint())) > 0))
248
+
249
+ def h3 (new EVGComponentHost())
250
+ h3.beginPass()
251
+ h3.leave()
252
+ h3.endPass()
253
+ c.ok("a leave with nothing entered is a problem" ((array_length (h3.lint())) > 0))
254
+
255
+ ; Identity should be parent + CALL SITE + key, and a library can only
256
+ ; see two of the three. Two sibling calls with one key therefore look
257
+ ; exactly like one component being rebuilt — so they would share an
258
+ ; instance, and its state. Reported, because the alternative is a page
259
+ ; where two rows mysteriously agree about everything.
260
+ def h5 (new EVGComponentHost())
261
+ h5.beginPass()
262
+ EVGComponentTest.row(h5 "same" "one")
263
+ EVGComponentTest.row(h5 "same" "two")
264
+ h5.endPass()
265
+ c.eqInt("two components on one key is a problem" (array_length (h5.lint())) 1)
266
+ c.eqInt("and only one of them exists" h5.stats.live 1)
267
+
268
+ def h4 (new EVGComponentHost())
269
+ h4.beginPass()
270
+ EVGComponentTest.row(h4 "a" "A")
271
+ h4.endPass()
272
+ c.eqInt("and correct use reports nothing" (array_length (h4.lint())) 0)
273
+ }
274
+
275
+ ; --- 6: the whole loop ---------------------------------------------------------
276
+ ;
277
+ ; Components build a list, the list is reordered, and BOTH mechanisms have
278
+ ; to hold: the component instances survive (their counters carry) and the
279
+ ; elements survive (a flight in the air stays in the air). Either alone
280
+ ; would pass its own test and still leave the pair broken.
281
+
282
+ sfn sheetText:string () {
283
+ return (""
284
+ + ".list { display: flex; flex-direction: column; width: 200px; }"
285
+ + ".row { height: 20px; width: 200px; transition: background-color 100ms linear; }"
286
+ + ".row-a { background-color: #ff0000; }"
287
+ + ".row-b { background-color: #00ff00; }"
288
+ + ".row-c { background-color: #0000ff; }"
289
+ + ".row-d { background-color: #ffff00; }")
290
+ }
291
+
292
+ sfn settle:void (root:EVGElement sheet:EVGStyleSheet t:EVGTransition) {
293
+ sheet.setViewport(300.0 300.0 false)
294
+ sheet.applyTree(root "")
295
+ t.reconcileTree(root)
296
+ def lay (new EVGLayout())
297
+ lay.setPageSize(300.0 300.0)
298
+ lay.layout(root)
299
+ }
300
+
301
+ ; The whole page, as components. `names` is one character per row.
302
+ sfn buildList:EVGElement (host:EVGComponentHost names:string) {
303
+ def list (EVGElement.createDiv())
304
+ list.className = "list"
305
+ list.id = "list"
306
+ list.key = "list"
307
+ host.enter("list")
308
+ def i:int 0
309
+ while (i < (strlen names)) {
310
+ def n:string (substring names i (i + 1))
311
+ def r:CountingRow (EVGComponentTest.row(host n n))
312
+ list.addChild((r.render()))
313
+ i = (i + 1)
314
+ }
315
+ host.leave()
316
+ return list
317
+ }
318
+
319
+ sfn testWholeLoop:void (c:CompCheck) {
320
+ print "--- components + reconciliation, together ---"
321
+ def host (new EVGComponentHost())
322
+ def sheet (new EVGStyleSheet())
323
+ sheet.parse((EVGComponentTest.sheetText()))
324
+ def t (new EVGTransition())
325
+ def rec (new EVGReconcile())
326
+
327
+ host.beginPass()
328
+ def live:EVGElement (EVGComponentTest.buildList(host "abc"))
329
+ host.endPass()
330
+ EVGComponentTest.settle(live sheet t)
331
+ t.advanceTree(live 500.0)
332
+ EVGComponentTest.settle(live sheet t)
333
+ c.ok("nothing is moving once the first frame has settled" ((t.busy(live)) == false))
334
+
335
+ ; Something each component remembers, and something the middle row is
336
+ ; in the middle of doing.
337
+ def hostA:EVGComponent (unwrap (host.find("list/a")))
338
+ def rowA:CountingRow (cast hostA to:CountingRow)
339
+ rowA.ticks = 42
340
+ def bEl:EVGElement (itemAt live.children 1)
341
+ bEl.className = "row row-d"
342
+ EVGComponentTest.settle(live sheet t)
343
+ t.advanceTree(live 30.0)
344
+ c.ok("the middle row is in flight" (t.busy(bEl)))
345
+
346
+ ; The rebuild: a different order, from the same components.
347
+ host.beginPass()
348
+ def next:EVGElement (EVGComponentTest.buildList(host "cab"))
349
+ host.endPass()
350
+ rec.resetStats()
351
+ rec.reconcile(live next)
352
+ EVGComponentTest.settle(live sheet t)
353
+
354
+ c.eqInt("no component was mounted again" host.stats.mounted 0)
355
+ c.eqInt("all three were updated" host.stats.updated 3)
356
+ c.eqInt("and none disposed" host.stats.disposed 0)
357
+ c.eqInt("no element was built either" rec.stats.created 0)
358
+ ; Three: the reconcile is called ON the list, so its CHILDREN are what
359
+ ; get matched. The list itself is `live` and was never a candidate.
360
+ c.eqInt("all three elements were kept" rec.stats.kept 3)
361
+
362
+ def again:CountingRow (cast (unwrap (host.find("list/a"))) to:CountingRow)
363
+ c.eqInt("the component's own memory carried" again.ticks 42)
364
+
365
+ def movedEl:EVGElement (itemAt live.children 2)
366
+ c.eqStr("and the row is where the new order puts it" movedEl.id "row-b")
367
+ c.ok("still in flight, because it is still the same element" (t.busy(movedEl)))
368
+ }
369
+
370
+ sfn main:void () {
371
+ def c (new CompCheck())
372
+ print "=== EVG component instances ==="
373
+ EVGComponentTest.testSurvives(c)
374
+ EVGComponentTest.testUnmount(c)
375
+ EVGComponentTest.testPaths(c)
376
+ EVGComponentTest.testElementAgrees(c)
377
+ EVGComponentTest.testLint(c)
378
+ EVGComponentTest.testWholeLoop(c)
379
+ print ""
380
+ print ("passed=" + (to_string c.passed) + " failed=" + (to_string c.failed))
381
+ if (c.failed > 0) {
382
+ print "FAILURES"
383
+ } {
384
+ print "ALL PASS"
385
+ }
386
+ }
387
+ }