ranger-compiler 3.5.1 → 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 +1064 -20
  2. package/LICENSE +3 -1
  3. package/README.md +123 -28
  4. package/dist/Lang.rgr +1188 -290
  5. package/dist/api.d.ts +2343 -879
  6. package/dist/api.js +79923 -56921
  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,432 @@
1
+ ; SPDX-License-Identifier: MIT
2
+
3
+ ; ==============================================================================
4
+ ; EVGInvalidateTest — a skipped layout has to be an invisible one
5
+ ; ==============================================================================
6
+ ;
7
+ ; `EVGStyleSheet` now reports what a pass did: how many elements it wrote to,
8
+ ; how many already held what it would have written, and whether anything it
9
+ ; wrote can have moved a box. A caller uses the last of those to skip layout.
10
+ ;
11
+ ; That makes the frame five times cheaper for a hover and introduces exactly one
12
+ ; new way to be wrong: skipping a layout that was needed. The symptom would not
13
+ ; be a crash. It would be a box drawn where it used to be — occasionally, only
14
+ ; after certain changes, and only until something else forced a full pass. That
15
+ ; is the worst kind of bug to find later, so it is checked here directly:
16
+ ;
17
+ ; for every kind of change, the frame that SKIPS layout when the sheet says
18
+ ; it may must produce exactly what the frame that always lays out produces.
19
+ ;
20
+ ; Two trees, the same edits applied to both, one running the fast path and one
21
+ ; the slow, display lists compared. Any change misclassified as paint-only shows
22
+ ; up as a difference immediately.
23
+ ;
24
+ ; And the other half, which is easy to forget: the fast path has to actually
25
+ ; skip. A version that never skips passes every comparison above and is worth
26
+ ; nothing, so each case also states what it expected the pass to decide.
27
+ ; ==============================================================================
28
+
29
+ Import "EVGElement.rgr"
30
+ Import "EVGUnit.rgr"
31
+ Import "EVGStyleSheet.rgr"
32
+ Import "EVGLayout.rgr"
33
+ Import "EVGDisplayList.rgr"
34
+ Import "EVGTransition.rgr"
35
+
36
+ class InvCheck {
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
+ ; One page, one sheet, one layout kept between frames — which is the shape a
65
+ ; real host has and the shape a skip needs. A fresh `EVGLayout` every frame
66
+ ; could not skip anything: there would be nothing to keep.
67
+ class Frame {
68
+ def sheet:EVGStyleSheet (new EVGStyleSheet())
69
+ def root:EVGElement (EVGElement.createDiv())
70
+ def lay:EVGLayout (new EVGLayout())
71
+ def alwaysLayout:boolean false
72
+ def layouts:int 0
73
+ def skips:int 0
74
+
75
+ Constructor () {
76
+ }
77
+
78
+ fn start:void (css:string page:EVGElement always:boolean) {
79
+ sheet.parse(css)
80
+ sheet.setViewport(400.0 600.0 false)
81
+ root = page
82
+ alwaysLayout = always
83
+ lay.setPageSize(400.0 600.0)
84
+ ; The first frame always lays out: there is nothing to keep yet.
85
+ sheet.applyTree(root "")
86
+ lay.layout(root)
87
+ layouts = 0
88
+ skips = 0
89
+ }
90
+
91
+ fn draw:string () {
92
+ sheet.applyTree(root "")
93
+ def needed:boolean true
94
+ if (alwaysLayout == false) {
95
+ needed = ((sheet.layoutClean()) == false)
96
+ }
97
+ if needed {
98
+ layouts = (layouts + 1)
99
+ lay.layout(root)
100
+ } {
101
+ skips = (skips + 1)
102
+ }
103
+ def dl (new EVGDisplayList())
104
+ dl.setTextEngine((lay.getTextEngine()))
105
+ dl.build(root)
106
+ return (dl.toJson())
107
+ }
108
+ }
109
+
110
+ class EVGInvalidateTest {
111
+
112
+ sfn sheetText:string () {
113
+ return (""
114
+ + ".page { display: flex; flex-direction: column; width: 400px; padding: 10px; }"
115
+ + ".row { display: flex; flex-direction: row; height: 24px; width: 360px;"
116
+ + " background-color: #eeeeee; gap: 6px; padding: 0 8px; }"
117
+ + ".row:hover { background-color: #ffcc00; }"
118
+ + ".row-tall { height: 48px; }"
119
+ + ".cell { width: 100px; height: 16px; color: #222222; font-size: 12px; }"
120
+ + ".cell-wide { width: 200px; }"
121
+ + ".cell:hover { color: #cc0000; }"
122
+ + ".moved { transform: translate(0, 12px); }"
123
+ + ".faded { opacity: 0.5; }")
124
+ }
125
+
126
+ sfn row:EVGElement (i:int) {
127
+ def r (EVGElement.createDiv())
128
+ r.className = "row"
129
+ r.id = ("row" + (to_string i))
130
+ def j:int 0
131
+ while (j < 3) {
132
+ def c (EVGElement.createDiv())
133
+ c.className = "cell"
134
+ c.id = ((("c" + (to_string i)) + "-") + (to_string j))
135
+ c.textContent = (("cell " + (to_string i)) + (to_string j))
136
+ r.addChild(c)
137
+ j = (j + 1)
138
+ }
139
+ return r
140
+ }
141
+
142
+ sfn page:EVGElement () {
143
+ def p (EVGElement.createDiv())
144
+ p.className = "page"
145
+ p.id = "page"
146
+ def i:int 0
147
+ while (i < 6) {
148
+ p.addChild((EVGInvalidateTest.row(i)))
149
+ i = (i + 1)
150
+ }
151
+ return p
152
+ }
153
+
154
+ sfn rowOf:EVGElement (p:EVGElement i:int) {
155
+ return (itemAt p.children i)
156
+ }
157
+
158
+ sfn cellOf:EVGElement (p:EVGElement i:int j:int) {
159
+ def r:EVGElement (itemAt p.children i)
160
+ return (itemAt r.children j)
161
+ }
162
+
163
+ ; Apply one named edit to a page. Both frames get the same one, so the
164
+ ; comparison is of the PIPELINE and not of the edit.
165
+ sfn edit:void (p:EVGElement what:string) {
166
+ if (what == "hover-on") {
167
+ def r:EVGElement (EVGInvalidateTest.rowOf(p 2))
168
+ r.isHovered = true
169
+ return
170
+ }
171
+ if (what == "hover-off") {
172
+ def r2:EVGElement (EVGInvalidateTest.rowOf(p 2))
173
+ r2.isHovered = false
174
+ return
175
+ }
176
+ if (what == "hover-a-cell") {
177
+ def c:EVGElement (EVGInvalidateTest.cellOf(p 1 1))
178
+ c.isHovered = true
179
+ return
180
+ }
181
+ if (what == "transform-class") {
182
+ def r3:EVGElement (EVGInvalidateTest.rowOf(p 3))
183
+ r3.className = "row moved"
184
+ return
185
+ }
186
+ if (what == "fade-class") {
187
+ def r4:EVGElement (EVGInvalidateTest.rowOf(p 4))
188
+ r4.className = "row faded"
189
+ return
190
+ }
191
+ if (what == "height-class") {
192
+ def r5:EVGElement (EVGInvalidateTest.rowOf(p 1))
193
+ r5.className = "row row-tall"
194
+ return
195
+ }
196
+ if (what == "width-class") {
197
+ def c2:EVGElement (EVGInvalidateTest.cellOf(p 0 0))
198
+ c2.className = "cell cell-wide"
199
+ return
200
+ }
201
+ if (what == "text") {
202
+ def c3:EVGElement (EVGInvalidateTest.cellOf(p 0 1))
203
+ c3.textContent = "a much longer piece of text than before"
204
+ return
205
+ }
206
+ if (what == "add-child") {
207
+ def r6:EVGElement (EVGInvalidateTest.rowOf(p 5))
208
+ def extra (EVGElement.createDiv())
209
+ extra.className = "cell"
210
+ extra.id = "extra"
211
+ extra.textContent = "extra"
212
+ r6.addChild(extra)
213
+ return
214
+ }
215
+ if (what == "remove-child") {
216
+ def r7:EVGElement (EVGInvalidateTest.rowOf(p 5))
217
+ remove_index r7.children 0
218
+ return
219
+ }
220
+ if (what == "nothing") {
221
+ return
222
+ }
223
+ }
224
+
225
+ ; One edit, both ways.
226
+ ;
227
+ ; `wantSkip` says what the classification is SUPPOSED to decide. Stating it
228
+ ; is what stops this being a test of a pipeline that never skips: the
229
+ ; agreement half passes trivially in that case, and only this half fails.
230
+ sfn bothWays:void (c:InvCheck what:string wantSkip:boolean) {
231
+ def fastPage:EVGElement (EVGInvalidateTest.page())
232
+ def fast (new Frame())
233
+ fast.start((EVGInvalidateTest.sheetText()) fastPage false)
234
+
235
+ def slowPage:EVGElement (EVGInvalidateTest.page())
236
+ def slow (new Frame())
237
+ slow.start((EVGInvalidateTest.sheetText()) slowPage true)
238
+
239
+ EVGInvalidateTest.edit(fastPage what)
240
+ EVGInvalidateTest.edit(slowPage what)
241
+
242
+ def a:string (fast.draw())
243
+ def b:string (slow.draw())
244
+ c.eqStr((what + ": skipping layout paints what laying out paints") a b)
245
+ if wantSkip {
246
+ c.eqInt((what + ": and layout was skipped") fast.skips 1)
247
+ } {
248
+ c.eqInt((what + ": and layout was run") fast.layouts 1)
249
+ }
250
+ }
251
+
252
+ sfn testPaintOnly:void (c:InvCheck) {
253
+ print "--- changes that cannot move a box ---"
254
+ ; A `:hover` rule that sets only a colour. This is the case the whole
255
+ ; feature exists for.
256
+ EVGInvalidateTest.bothWays(c "hover-on" true)
257
+ EVGInvalidateTest.bothWays(c "hover-a-cell" true)
258
+ ; `transform` in EVG is applied to the display list AFTER layout, so it
259
+ ; moves what is drawn without moving any box. Opacity likewise.
260
+ EVGInvalidateTest.bothWays(c "transform-class" true)
261
+ EVGInvalidateTest.bothWays(c "fade-class" true)
262
+ ; And a frame where nothing at all happened.
263
+ EVGInvalidateTest.bothWays(c "nothing" true)
264
+ }
265
+
266
+ sfn testLayoutMoving:void (c:InvCheck) {
267
+ print "--- changes that do move boxes ---"
268
+ EVGInvalidateTest.bothWays(c "height-class" false)
269
+ EVGInvalidateTest.bothWays(c "width-class" false)
270
+ ; Text is not a stylesheet property at all, so the sheet cannot see it
271
+ ; change — which is why a caller that edits text has to force a layout.
272
+ ; The check below is what says so out loud rather than leaving it to be
273
+ ; discovered.
274
+ }
275
+
276
+ ; The one the classification CANNOT catch, stated as a limit rather than
277
+ ; left as a trap.
278
+ ;
279
+ ; `passLayoutDirty` counts what the STYLESHEET wrote. Text content, adding
280
+ ; a child and removing one are none of the sheet's business, so a pass that
281
+ ; only did one of those reports itself clean — and skipping layout there
282
+ ; would be wrong. The host has to tell the pipeline about structure and
283
+ ; content; `EVGReconcile` already reports created/dropped/moved for exactly
284
+ ; this, and a host that edits an element by hand has to say so.
285
+ sfn testStructure:void (c:InvCheck) {
286
+ print "--- children coming and going ---"
287
+ ; Neither of these is a property and no rule mentions them, so the
288
+ ; classification only catches them because an element records how many
289
+ ; children it had. An ADDED child would be caught anyway — a new
290
+ ; element has never been styled — but a REMOVED one has no other
291
+ ; symptom, and skipping there draws the survivors where they used to be.
292
+ EVGInvalidateTest.bothWays(c "add-child" false)
293
+ EVGInvalidateTest.bothWays(c "remove-child" false)
294
+ }
295
+
296
+ ; The limit that is left, stated rather than left as a trap.
297
+ sfn testWhatTheSheetCannotSee:void (c:InvCheck) {
298
+ print "--- and the one thing it still cannot see ---"
299
+ ; TEXT. It is not a property, it does not change the child count, and
300
+ ; it changes how wide a run is — so a host that edits `textContent` by
301
+ ; hand has to force a layout. Nothing in this gallery does: text comes
302
+ ; from a rebuild, and a rebuild goes through `EVGReconcile`, which
303
+ ; changes the element and therefore its style state.
304
+ def p:EVGElement (EVGInvalidateTest.page())
305
+ def f (new Frame())
306
+ f.start((EVGInvalidateTest.sheetText()) p false)
307
+ EVGInvalidateTest.edit(p "text")
308
+ f.draw()
309
+ c.eqInt("a bare text edit still looks clean to the sheet" f.skips 1)
310
+
311
+ ; And with a layout forced, it is right — which is the contract: the
312
+ ; sheet answers for what the SHEET did, and content the host changes
313
+ ; behind its back is the host's to declare.
314
+ def p3:EVGElement (EVGInvalidateTest.page())
315
+ def f3 (new Frame())
316
+ f3.start((EVGInvalidateTest.sheetText()) p3 true)
317
+ EVGInvalidateTest.edit(p3 "text")
318
+ def forced:string (f3.draw())
319
+
320
+ def p4:EVGElement (EVGInvalidateTest.page())
321
+ def f4 (new Frame())
322
+ f4.start((EVGInvalidateTest.sheetText()) p4 true)
323
+ EVGInvalidateTest.edit(p4 "text")
324
+ c.eqStr("a forced layout gets the new text right" forced (f4.draw()))
325
+ }
326
+
327
+ ; A transition writes showing values onto the element between frames, so the
328
+ ; element stops holding what the sheet declared. If the skip did not know
329
+ ; that, the sheet would never re-declare the target and the flight would
330
+ ; land on its own output on the very next frame.
331
+ sfn testTransitionsStillRun:void (c:InvCheck) {
332
+ print "--- and a flight still flies ---"
333
+ def s (new EVGStyleSheet())
334
+ s.parse((""
335
+ + ".box { width: 40px; height: 20px; background-color: #000000;"
336
+ + " transition: background-color 200ms linear; }"
337
+ + ".box:hover { background-color: #ffffff; }"))
338
+ s.setViewport(400.0 600.0 false)
339
+ def t (new EVGTransition())
340
+ def el (EVGElement.createDiv())
341
+ el.className = "box"
342
+
343
+ s.applyTree(el "")
344
+ t.reconcileTree(el)
345
+ t.advanceTree(el 1000.0)
346
+ s.applyTree(el "")
347
+ t.reconcileTree(el)
348
+ c.ok("nothing is moving at rest" ((t.busy(el)) == false))
349
+
350
+ el.isHovered = true
351
+ s.applyTree(el "")
352
+ t.reconcileTree(el)
353
+ t.advanceTree(el 40.0)
354
+ c.ok("the hover starts a flight" (t.busy(el)))
355
+
356
+ ; Frames two and three change NOTHING the sheet can see. Without
357
+ ; `writeBack` invalidating the element, the skip would fire here, the
358
+ ; target would never be re-declared, and the flight would end.
359
+ def steps:int 0
360
+ while (steps < 3) {
361
+ s.applyTree(el "")
362
+ t.reconcileTree(el)
363
+ t.advanceTree(el 30.0)
364
+ steps = (steps + 1)
365
+ }
366
+ c.ok("and it is still flying three frames later" (t.busy(el)))
367
+ def mid:EVGColor el.backgroundColor
368
+ c.ok("part of the way there, not at either end"
369
+ (((mid.r) > 10.0) && ((mid.r) < 245.0)))
370
+ }
371
+
372
+ ; The skip has to survive a transition pass.
373
+ ;
374
+ ; This is a PERFORMANCE assertion in a correctness test, and it is here
375
+ ; because the bug it catches has no visible symptom: `EVGTransition.reconcile`
376
+ ; runs on every element, and the first version of the invalidation hook sat
377
+ ; in `writeBack` unconditionally — so every element was marked stale every
378
+ ; frame and nothing was ever skipped, on every page in this gallery. The
379
+ ; benchmark could not see it, because a benchmark that runs no transitions
380
+ ; is not the page.
381
+ sfn testSkipSurvivesTransitions:void (c:InvCheck) {
382
+ print "--- and a transitioned page still skips ---"
383
+ def s (new EVGStyleSheet())
384
+ s.parse((EVGInvalidateTest.sheetText()) + ".row { transition: background-color 200ms linear; }")
385
+ s.setViewport(400.0 600.0 false)
386
+ def t (new EVGTransition())
387
+ def p:EVGElement (EVGInvalidateTest.page())
388
+
389
+ s.applyTree(p "")
390
+ t.reconcileTree(p)
391
+ t.advanceTree(p 1000.0)
392
+ s.applyTree(p "")
393
+ t.reconcileTree(p)
394
+
395
+ ; One row lights up. Everything else is untouched, and a pass that ran
396
+ ; `writeBack` over the whole tree must not have made it all stale.
397
+ def r:EVGElement (EVGInvalidateTest.rowOf(p 2))
398
+ r.isHovered = true
399
+ s.applyTree(p "")
400
+ t.reconcileTree(p)
401
+ t.advanceTree(p 30.0)
402
+
403
+ s.applyTree(p "")
404
+ c.ok("the flight is in the air" (t.busy(r)))
405
+ ; 25 elements: a page, six rows, eighteen cells. Only the row that is
406
+ ; moving may need re-declaring.
407
+ print ((" " + (to_string s.passStyled)) + " styled, " + (to_string s.passSkipped) + " skipped")
408
+ ; Only the row that is actually MOVING. The five other rows declare the
409
+ ; same transition and have finished flights sitting in them, and a
410
+ ; finished flight is not a reason to re-declare anything.
411
+ c.ok("only the moving row is re-declared" (s.passStyled <= 2))
412
+ c.ok("and the rest of the tree is skipped" (s.passSkipped >= 23))
413
+ }
414
+
415
+ sfn main:void () {
416
+ def c (new InvCheck())
417
+ print "=== EVG invalidation: paint versus layout ==="
418
+ EVGInvalidateTest.testPaintOnly(c)
419
+ EVGInvalidateTest.testLayoutMoving(c)
420
+ EVGInvalidateTest.testStructure(c)
421
+ EVGInvalidateTest.testWhatTheSheetCannotSee(c)
422
+ EVGInvalidateTest.testTransitionsStillRun(c)
423
+ EVGInvalidateTest.testSkipSurvivesTransitions(c)
424
+ print ""
425
+ print ("passed=" + (to_string c.passed) + " failed=" + (to_string c.failed))
426
+ if (c.failed > 0) {
427
+ print "FAILURES"
428
+ } {
429
+ print "ALL PASS"
430
+ }
431
+ }
432
+ }