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,316 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: MIT
3
+ //
4
+ // What a flex or grid layout costs at 1k, 10k and 100k boxes — in EVG, and in
5
+ // Chromium given the same tree.
6
+ //
7
+ // node --expose-gc lib/evg/bench/layout-bench.mjs [--sizes 1000,10000,100000] [--json] [--no-browser]
8
+ //
9
+ // THREE FIXTURES, because "layout" is not one cost:
10
+ //
11
+ // flex nested flex: a column of cards, each a row of a fixed rail and a
12
+ // growing body that is itself a column. Four levels. This is the
13
+ // shape an application UI actually has, and it is the one that makes
14
+ // an engine walk the tree more than once.
15
+ // grid one grid container with `repeat(4, 1fr)` and N cells, each cell a
16
+ // small flex column. Wide and shallow: the track-sizing pass at size.
17
+ // text the flex fixture with a text leaf in every card, so the number
18
+ // includes measuring and wrapping real strings.
19
+ //
20
+ // WHAT THE BROWSER NUMBER IS AND IS NOT. Chromium is timed with
21
+ // `performance.now()` around a forced reflow of the same tree, after the DOM
22
+ // exists and the styles are parsed. That is generous to it in one direction —
23
+ // no parsing, no style recalc if it can be avoided — and unfair to it in
24
+ // another, because a reflow in a browser also does line layout, paint
25
+ // invalidation and containing-block bookkeeping that EVG's pass does not.
26
+ // Read it as an order-of-magnitude reference for what a production C++ layout
27
+ // engine costs on the same boxes, not as a like-for-like race.
28
+ //
29
+ // MEMORY is the retained heap of the built tree: allocate, `global.gc()`,
30
+ // measure, subtract the baseline. It answers "what does a node cost to hold",
31
+ // which is the number that decides whether 100k boxes fit at all.
32
+
33
+ import path from "node:path";
34
+ import { createRequire } from "node:module";
35
+ import { fileURLToPath } from "node:url";
36
+ import fs from "node:fs";
37
+
38
+ const HERE = path.dirname(fileURLToPath(import.meta.url));
39
+ const ROOT = path.resolve(HERE, "..", "..", "..");
40
+ const require = createRequire(import.meta.url);
41
+ const M = require(path.join(ROOT, "lib/evg/bin/EvgLayoutBench.cjs"));
42
+
43
+ // `--ab` compiles the same fixtures through a SECOND copy of the engine built
44
+ // from the pre-change sources (`EvgLayoutBenchBase.cjs`) and interleaves the
45
+ // two, so a regression is not read off two runs taken minutes apart on a
46
+ // laptop that was doing something else in between. Alternating A/B/A/B inside
47
+ // one process is the only version of this measurement worth believing.
48
+ const BASE_PATH = path.join(ROOT, "lib/evg/bin/EvgLayoutBenchBase.cjs");
49
+ const AB = argvHas("--ab") && fs.existsSync(BASE_PATH);
50
+ const B = AB ? require(BASE_PATH) : null;
51
+ function argvHas(n) { return process.argv.slice(2).includes(n); }
52
+
53
+ const argv = process.argv.slice(2);
54
+ const arg = (n, d) => (argv.indexOf(n) >= 0 ? argv[argv.indexOf(n) + 1] : d);
55
+ const SIZES = arg("--sizes", "1000,10000,100000").split(",").map(Number);
56
+ const AS_JSON = argv.includes("--json");
57
+ const NO_BROWSER = argv.includes("--no-browser");
58
+
59
+ const WORDS = ["Ada Lovelace", "Grace Hopper", "Alan Turing", "Edsger Dijkstra", "Barbara McClintock"];
60
+
61
+ // --- the fixtures, as a spec both sides build from --------------------------
62
+
63
+ const S = {
64
+ page: "display:flex;flex-direction:column;flex-wrap:nowrap;width:1200px;gap:8px;align-items:stretch",
65
+ card: "display:flex;flex-direction:row;flex-wrap:nowrap;gap:12px;padding:8px;align-items:stretch",
66
+ rail: "width:48px;height:56px;background-color:#e4e4e7",
67
+ body: "display:flex;flex-direction:column;flex-wrap:nowrap;flex-grow:1;gap:4px;align-items:stretch",
68
+ line: "height:16px;background-color:#f4f4f5",
69
+ gridc: "display:grid;grid-template-columns:repeat(4, 1fr);gap:10px;width:1200px",
70
+ cell: "display:flex;flex-direction:column;flex-wrap:nowrap;gap:4px;padding:6px;align-items:stretch",
71
+ text: "font-size:14px",
72
+ };
73
+
74
+ // A card is 7 elements: card, rail, body, and four lines.
75
+ function flexSpec(n, withText) {
76
+ const cards = Math.max(1, Math.round(n / 7));
77
+ const kids = [];
78
+ for (let i = 0; i < cards; i++) {
79
+ const lines = [];
80
+ for (let j = 0; j < 4; j++) {
81
+ lines.push(
82
+ withText && j === 0
83
+ ? { s: S.text, kids: [], text: WORDS[i % WORDS.length] }
84
+ : { s: S.line, kids: [] }
85
+ );
86
+ }
87
+ kids.push({ s: S.card, kids: [{ s: S.rail, kids: [] }, { s: S.body, kids: lines }] });
88
+ }
89
+ return { s: S.page, kids };
90
+ }
91
+
92
+ // A cell is 5 elements: cell plus four lines.
93
+ function gridSpec(n) {
94
+ const cells = Math.max(1, Math.round(n / 5));
95
+ const kids = [];
96
+ for (let i = 0; i < cells; i++) {
97
+ const lines = [];
98
+ for (let j = 0; j < 4; j++) lines.push({ s: S.line, kids: [] });
99
+ kids.push({ s: S.cell, kids: lines });
100
+ }
101
+ return { s: S.gridc, kids };
102
+ }
103
+
104
+ const FIXTURES = {
105
+ flex: (n) => flexSpec(n, false),
106
+ grid: (n) => gridSpec(n),
107
+ text: (n) => flexSpec(n, true),
108
+ };
109
+
110
+ // --- EVG --------------------------------------------------------------------
111
+
112
+ function evgBuild(node, mod) {
113
+ const K = mod || M;
114
+ const el = new K.EVGElement();
115
+ for (const decl of node.s.split(";")) {
116
+ const t = decl.trim();
117
+ if (!t) continue;
118
+ const i = t.indexOf(":");
119
+ el.setAttribute(t.slice(0, i).trim(), t.slice(i + 1).trim());
120
+ }
121
+ if (node.text !== undefined) {
122
+ el.elementType = 1;
123
+ el.textContent = node.text;
124
+ }
125
+ for (const k of node.kids) el.addChild(evgBuild(k, K));
126
+ return el;
127
+ }
128
+
129
+ function median(xs) {
130
+ const s = [...xs].sort((a, b) => a - b);
131
+ return s[s.length >> 1];
132
+ }
133
+
134
+ // `--min` reports the FASTEST run instead of the median. For the A/B
135
+ // comparison that is the estimator to use: the question there is "how fast can
136
+ // this code run", and every millisecond above the floor is the machine's, not
137
+ // the engine's. The median is right for the standalone table, where the
138
+ // question is what a frame costs in practice.
139
+ const USE_MIN = process.argv.slice(2).includes("--min");
140
+
141
+ function time(fn, { warm = 1, runs = 5 } = {}) {
142
+ for (let i = 0; i < warm; i++) fn();
143
+ const t = [];
144
+ for (let i = 0; i < runs; i++) {
145
+ const a = process.hrtime.bigint();
146
+ fn();
147
+ t.push(Number(process.hrtime.bigint() - a) / 1e6);
148
+ }
149
+ if (USE_MIN) return Math.min(...t);
150
+ return median(t);
151
+ }
152
+
153
+ function heapNow() {
154
+ if (global.gc) { global.gc(); global.gc(); }
155
+ return process.memoryUsage().heapUsed;
156
+ }
157
+
158
+ function evgMeasure(spec, mod) {
159
+ const K = mod || M;
160
+ const before = heapNow();
161
+ let root = evgBuild(spec, K);
162
+ const held = heapNow();
163
+ const nodes = K.EvgLayoutBench.countElements(root);
164
+
165
+ const build = time(() => { evgBuild(spec, K); }, { warm: 0, runs: 3 });
166
+
167
+ const lay = new K.EVGLayout();
168
+ lay.setPageSize(1200, 900);
169
+ const layout = time(() => { lay.layout(root); }, { warm: 1, runs: 5 });
170
+
171
+ const dl = new K.EVGDisplayList();
172
+ dl.setTextEngine(lay.getTextEngine());
173
+ const list = time(() => { dl.build(root); }, { warm: 1, runs: 3 });
174
+ const cmds = dl.count();
175
+
176
+ root = null;
177
+ return { nodes, build, layout, list, cmds, bytes: held - before };
178
+ }
179
+
180
+ // --- Chromium ---------------------------------------------------------------
181
+
182
+ function htmlFor(spec) {
183
+ const render = (n) =>
184
+ `<div style="${n.s}">` +
185
+ (n.text !== undefined ? n.text : "") +
186
+ n.kids.map(render).join("") +
187
+ `</div>`;
188
+ return (
189
+ `<!doctype html><meta charset="utf-8"><style>` +
190
+ `*{box-sizing:border-box;margin:0;padding:0;border:0 solid #000}` +
191
+ `html,body{margin:0;padding:0;font:14px/1.2 monospace}` +
192
+ `</style><div id="host">${render(spec)}</div>`
193
+ );
194
+ }
195
+
196
+ function chromiumPath() {
197
+ const cache = path.join(process.env.HOME || "", "Library/Caches/ms-playwright");
198
+ if (!fs.existsSync(cache)) return null;
199
+ for (const dir of fs.readdirSync(cache).filter((d) => d.startsWith("chromium-")).sort().reverse()) {
200
+ for (const rel of [
201
+ "chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",
202
+ "chrome-mac/Chromium.app/Contents/MacOS/Chromium",
203
+ "chrome-linux/chrome",
204
+ ]) {
205
+ const p = path.join(cache, dir, rel);
206
+ if (fs.existsSync(p)) return p;
207
+ }
208
+ }
209
+ return null;
210
+ }
211
+
212
+ async function browserMeasure(page, spec) {
213
+ await page.setContent(htmlFor(spec));
214
+ return page.evaluate(() => {
215
+ const host = document.getElementById("host");
216
+ const root = host.firstElementChild;
217
+ // Force a reflow that cannot be cached: change a length the whole tree
218
+ // depends on, then read a geometry property back.
219
+ const t = [];
220
+ for (let i = 0; i < 6; i++) {
221
+ const w = 1200 - (i % 2);
222
+ const a = performance.now();
223
+ root.style.width = w + "px";
224
+ void host.offsetHeight;
225
+ t.push(performance.now() - a);
226
+ }
227
+ t.sort((a, b) => a - b);
228
+ return { relayout: t[t.length >> 1], nodes: host.querySelectorAll("div").length };
229
+ });
230
+ }
231
+
232
+ // --- run --------------------------------------------------------------------
233
+
234
+ const out = { evg: [], css: [] };
235
+
236
+ out.base = [];
237
+ for (const [name, mk] of Object.entries(FIXTURES)) {
238
+ for (const n of SIZES) {
239
+ const spec = mk(n);
240
+ if (AB) {
241
+ // A, B, A, B, … — several alternations, and the best of each side is
242
+ // kept, so neither is charged for the other's cold code or for whatever
243
+ // the laptop was doing during one particular pass.
244
+ let bb = null, aa = null;
245
+ for (let r = 0; r < 3; r++) {
246
+ const b1 = evgMeasure(spec, B);
247
+ const a1 = evgMeasure(spec, M);
248
+ if (!bb || b1.layout < bb.layout) bb = b1;
249
+ if (!aa || a1.layout < aa.layout) aa = a1;
250
+ }
251
+ out.base.push({ fixture: name, want: n, ...bb });
252
+ out.evg.push({ fixture: name, want: n, ...aa });
253
+ } else {
254
+ out.evg.push({ fixture: name, want: n, ...evgMeasure(spec, M) });
255
+ }
256
+ }
257
+ }
258
+
259
+ if (!NO_BROWSER) {
260
+ const { chromium } = require("playwright-core");
261
+ const exe = chromiumPath();
262
+ const browser = await chromium.launch(exe ? { executablePath: exe } : { channel: "chrome" });
263
+ const page = await browser.newPage({ viewport: { width: 1300, height: 900 } });
264
+ for (const [name, mk] of Object.entries(FIXTURES)) {
265
+ for (const n of SIZES) {
266
+ const r = await browserMeasure(page, mk(n));
267
+ out.css.push({ fixture: name, want: n, ...r });
268
+ }
269
+ }
270
+ await browser.close();
271
+ }
272
+
273
+ if (AS_JSON) {
274
+ console.log(JSON.stringify(out, null, 2));
275
+ process.exit(0);
276
+ }
277
+
278
+ const f = (v, d = 1) => (v === undefined || v === null ? "—" : v.toFixed(d));
279
+ const pad = (s, n) => String(s).padStart(n);
280
+
281
+ console.log("\nEVG layout, three fixtures, three sizes" + (global.gc ? "" : " (no --expose-gc: memory column omitted)"));
282
+ console.log("\n fixture nodes build layout list cmds B/node layout µs/node");
283
+ for (const r of out.evg) {
284
+ console.log(
285
+ ` ${r.fixture.padEnd(8)}${pad(r.nodes, 7)}${pad(f(r.build), 8)}${pad(f(r.layout), 10)}${pad(f(r.list), 8)}${pad(r.cmds, 8)}` +
286
+ `${pad(r.bytes > 0 ? Math.round(r.bytes / r.nodes) : "—", 11)}${pad(f((r.layout * 1000) / r.nodes, 2), 18)}`
287
+ );
288
+ }
289
+ console.log("\n ms, median of five. `layout` is a RE-layout of a tree that already exists — what a resize costs.\n");
290
+
291
+ if (AB) {
292
+ console.log(" Against the engine before these changes, alternated in one process\n");
293
+ console.log(" fixture nodes before after delta");
294
+ for (const a of out.evg) {
295
+ const b = out.base.find((x) => x.fixture === a.fixture && x.want === a.want);
296
+ const d = ((a.layout - b.layout) / b.layout) * 100;
297
+ console.log(
298
+ ` ${a.fixture.padEnd(8)}${pad(a.nodes, 7)}${pad(f(b.layout), 10)}${pad(f(a.layout), 10)}` +
299
+ `${pad((d >= 0 ? "+" : "") + f(d) + "%", 10)}`
300
+ );
301
+ }
302
+ console.log("");
303
+ }
304
+
305
+ if (out.css.length) {
306
+ console.log(" Chromium, the same tree, forced reflow (see the note at the top of this file)\n");
307
+ console.log(" fixture nodes reflow µs/node EVG / Chromium");
308
+ for (const c of out.css) {
309
+ const e = out.evg.find((x) => x.fixture === c.fixture && x.want === c.want);
310
+ console.log(
311
+ ` ${c.fixture.padEnd(8)}${pad(c.nodes, 7)}${pad(f(c.relayout), 9)}${pad(f((c.relayout * 1000) / c.nodes, 2), 11)}` +
312
+ `${pad(f(e.layout / c.relayout, 1) + "x", 18)}`
313
+ );
314
+ }
315
+ console.log("");
316
+ }