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,277 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: MIT
3
+ //
4
+ // What layout costs in EVG (Ranger, compiled to JavaScript) and in EVGr (the
5
+ // strict Rust module, compiled to JavaScript by rgrc, and built natively by
6
+ // cargo), on the fixtures of lib/evg/bench/layout-bench.mjs: nested flex, a
7
+ // wide grid, and the flex fixture with text.
8
+ //
9
+ // npm run evgr:speed [-- --sizes 1000,10000,100000] [--no-native]
10
+ // [--targets cpp,go] [--json]
11
+ //
12
+ // --targets builds bench/NativeBench.rgr, one Ranger program that lays the
13
+ // fixtures out with both engines, for C++ (g++ -O2) and Go, and adds its
14
+ // timings: EVG and EVGr compiled by Ranger to a native target.
15
+ //
16
+ // `layout` is a RE-layout of a tree that exists, the median of five after a
17
+ // warm-up, as layout-bench.mjs measures it. Every engine's boxes are summed
18
+ // into a checksum (x + y + w + h over all boxes), so the table also says
19
+ // whether the engines laid the fixture out the same way.
20
+
21
+ import path from "node:path";
22
+ import { createRequire } from "node:module";
23
+ import { fileURLToPath } from "node:url";
24
+ import { execFileSync } from "node:child_process";
25
+ import fs from "node:fs";
26
+ import os from "node:os";
27
+
28
+ const HERE = path.dirname(fileURLToPath(import.meta.url));
29
+ const ROOT = path.resolve(HERE, "..", "..", "..");
30
+ const require = createRequire(import.meta.url);
31
+ const EVG = require(path.join(ROOT, "lib/evg/bin/EvgLayoutBench.cjs"));
32
+ const R = require(path.join(ROOT, "lib/evgr/bin/Evgr.cjs"));
33
+
34
+ const argv = process.argv.slice(2);
35
+ const arg = (n, d) => (argv.indexOf(n) >= 0 ? argv[argv.indexOf(n) + 1] : d);
36
+ const SIZES = arg("--sizes", "1000,10000,100000").split(",").map(Number);
37
+ const AS_JSON = argv.includes("--json");
38
+ const NATIVE = !argv.includes("--no-native");
39
+ const TARGETS = arg("--targets", "cpp,go").split(",").filter((t) => t);
40
+
41
+ // --- the fixtures: the specs of layout-bench.mjs ------------------------------
42
+
43
+ const WORDS = ["Ada Lovelace", "Grace Hopper", "Alan Turing", "Edsger Dijkstra", "Barbara McClintock"];
44
+ const S = {
45
+ page: "display:flex;flex-direction:column;flex-wrap:nowrap;width:1200px;gap:8px;align-items:stretch",
46
+ card: "display:flex;flex-direction:row;flex-wrap:nowrap;gap:12px;padding:8px;align-items:stretch",
47
+ rail: "width:48px;height:56px;background-color:#e4e4e7",
48
+ body: "display:flex;flex-direction:column;flex-wrap:nowrap;flex-grow:1;gap:4px;align-items:stretch",
49
+ line: "height:16px;background-color:#f4f4f5",
50
+ gridc: "display:grid;grid-template-columns:repeat(4, 1fr);gap:10px;width:1200px",
51
+ cell: "display:flex;flex-direction:column;flex-wrap:nowrap;gap:4px;padding:6px;align-items:stretch",
52
+ text: "font-size:14px",
53
+ };
54
+
55
+ function flexSpec(n, withText) {
56
+ const cards = Math.max(1, Math.round(n / 7));
57
+ const kids = [];
58
+ for (let i = 0; i < cards; i++) {
59
+ const lines = [];
60
+ for (let j = 0; j < 4; j++) {
61
+ lines.push(withText && j === 0 ? { s: S.text, kids: [], text: WORDS[i % WORDS.length] } : { s: S.line, kids: [] });
62
+ }
63
+ kids.push({ s: S.card, kids: [{ s: S.rail, kids: [] }, { s: S.body, kids: lines }] });
64
+ }
65
+ return { s: S.page, kids };
66
+ }
67
+
68
+ function gridSpec(n) {
69
+ const cells = Math.max(1, Math.round(n / 5));
70
+ const kids = [];
71
+ for (let i = 0; i < cells; i++) {
72
+ const lines = [];
73
+ for (let j = 0; j < 4; j++) lines.push({ s: S.line, kids: [] });
74
+ kids.push({ s: S.cell, kids: lines });
75
+ }
76
+ return { s: S.gridc, kids };
77
+ }
78
+
79
+ const FIXTURES = { flex: (n) => flexSpec(n, false), grid: gridSpec, text: (n) => flexSpec(n, true) };
80
+
81
+ // --- timing -------------------------------------------------------------------
82
+
83
+ function median(xs) {
84
+ const s = [...xs].sort((a, b) => a - b);
85
+ return s[s.length >> 1];
86
+ }
87
+
88
+ function time(fn, runs) {
89
+ const t = [];
90
+ for (let i = 0; i < runs; i++) {
91
+ const a = process.hrtime.bigint();
92
+ fn();
93
+ t.push(Number(process.hrtime.bigint() - a) / 1e6);
94
+ }
95
+ return median(t);
96
+ }
97
+
98
+ // --- EVG ----------------------------------------------------------------------
99
+
100
+ function evgBuild(node) {
101
+ const el = new EVG.EVGElement();
102
+ for (const decl of node.s.split(";")) {
103
+ const t = decl.trim();
104
+ if (!t) continue;
105
+ const i = t.indexOf(":");
106
+ el.setAttribute(t.slice(0, i).trim(), t.slice(i + 1).trim());
107
+ }
108
+ if (node.text !== undefined) {
109
+ el.elementType = 1;
110
+ el.textContent = node.text;
111
+ }
112
+ for (const k of node.kids) el.addChild(evgBuild(k));
113
+ return el;
114
+ }
115
+
116
+ function evgRun(spec) {
117
+ const build = time(() => evgBuild(spec), 3);
118
+ const root = evgBuild(spec);
119
+ const lay = new EVG.EVGLayout();
120
+ lay.setPageSize(1200, 900);
121
+ lay.layout(root);
122
+ const layout = time(() => lay.layout(root), 5);
123
+ let sum = 0;
124
+ let nodes = 0;
125
+ (function walk(el) {
126
+ sum += el.calculatedX + el.calculatedY + el.calculatedWidth + el.calculatedHeight;
127
+ nodes++;
128
+ for (const k of el.children) walk(k);
129
+ })(root);
130
+ return { nodes, build, layout, checksum: sum };
131
+ }
132
+
133
+ // --- EVGr (JavaScript) ----------------------------------------------------------
134
+
135
+ function evgrBuild(spec) {
136
+ const t = R.EvgrTree.new_();
137
+ (function add(node, parent) {
138
+ const i = node.text !== undefined ? t.add_text(parent, node.s, node.text) : t.add(parent, node.s);
139
+ for (const k of node.kids) add(k, i);
140
+ })(spec, -1);
141
+ return t;
142
+ }
143
+
144
+ function evgrRun(spec) {
145
+ const build = time(() => evgrBuild(spec), 3);
146
+ const t = evgrBuild(spec);
147
+ t.layout(1200, 900);
148
+ const layout = time(() => t.layout(1200, 900), 5);
149
+ let sum = 0;
150
+ for (let i = 0; i < t.count(); i++) sum += t.x(i) + t.y(i) + t.w(i) + t.h(i);
151
+ return { nodes: t.count(), build, layout, checksum: sum };
152
+ }
153
+
154
+ // --- EVGr (native) --------------------------------------------------------------
155
+
156
+ function nativeRuns() {
157
+ const out = {};
158
+ try {
159
+ const text = execFileSync(
160
+ "cargo",
161
+ ["run", "--release", "--offline", "--quiet", "--bin", "bench", "--manifest-path", path.join(ROOT, "lib/evgr/Cargo.toml"), "--", SIZES.join(",")],
162
+ { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], env: { ...process.env, CARGO_TARGET_DIR: path.join(ROOT, "lib/evgr/target") } }
163
+ );
164
+ for (const line of text.split("\n")) {
165
+ if (!line.trim()) continue;
166
+ const r = JSON.parse(line);
167
+ out[r.fixture + ":" + r.size] = r;
168
+ }
169
+ } catch (e) {
170
+ return null;
171
+ }
172
+ return out;
173
+ }
174
+
175
+ // --- EVG and EVGr through Ranger to C++ / Go (bench/NativeBench.rgr) ------------
176
+
177
+ function has(cmd, args) {
178
+ try {
179
+ execFileSync(cmd, args, { stdio: "ignore" });
180
+ return true;
181
+ } catch (e) {
182
+ return false;
183
+ }
184
+ }
185
+
186
+ function rangerTargetRuns(target) {
187
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "evgr-" + target + "-"));
188
+ const out = target === "cpp" ? "nb.cpp" : "nb.go";
189
+ try {
190
+ const log = execFileSync("node", [path.join(ROOT, "dist/rgrc.js"), "-l=" + target, path.join(ROOT, "lib/evgr/bench/NativeBench.rgr"), "-d=" + dir, "-o=" + out], {
191
+ encoding: "utf8",
192
+ cwd: ROOT,
193
+ });
194
+ if (log.includes("[FAIL]")) return null;
195
+ const bin = path.join(dir, "nb");
196
+ if (target === "cpp") execFileSync("g++", ["-std=c++17", "-O2", "-o", bin, path.join(dir, out)], { stdio: "ignore" });
197
+ else execFileSync("go", ["build", "-o", bin, out], { cwd: dir, stdio: "ignore" });
198
+ const text = execFileSync(bin, [], { encoding: "utf8", maxBuffer: 1 << 24 });
199
+ const res = {};
200
+ for (const line of text.split("\n")) {
201
+ const p = line.trim().split(/\s+/);
202
+ if (p.length < 6) continue;
203
+ res[p[0] + ":" + p[1] + ":" + p[2]] = { nodes: Number(p[3]), layout: Number(p[4]), checksum: Number(p[5]) * 100 };
204
+ }
205
+ return res;
206
+ } catch (e) {
207
+ return null;
208
+ }
209
+ }
210
+
211
+ // --- run ------------------------------------------------------------------------
212
+
213
+ const native = NATIVE ? nativeRuns() : null;
214
+ const ranger = {};
215
+ for (const t of TARGETS) {
216
+ const ok = t === "cpp" ? has("g++", ["--version"]) : t === "go" ? has("go", ["version"]) : false;
217
+ if (ok) ranger[t] = rangerTargetRuns(t);
218
+ }
219
+ const rows = [];
220
+ for (const name of Object.keys(FIXTURES)) {
221
+ for (const n of SIZES) {
222
+ const spec = FIXTURES[name](n);
223
+ const e = evgRun(spec);
224
+ const r = evgrRun(spec);
225
+ const nat = native ? native[name + ":" + n] : null;
226
+ const other = {};
227
+ for (const t of Object.keys(ranger)) {
228
+ if (!ranger[t]) continue;
229
+ other[t] = { evg: ranger[t][name + ":" + n + ":evg"], evgr: ranger[t][name + ":" + n + ":evgr"] };
230
+ }
231
+ rows.push({ fixture: name, size: n, evg: e, evgr: r, native: nat, other });
232
+ }
233
+ }
234
+
235
+ if (AS_JSON) {
236
+ process.stdout.write(JSON.stringify(rows, null, 2) + "\n");
237
+ } else {
238
+ const f = (v) => (v === undefined || v === null ? "-" : v < 10 ? v.toFixed(2) : v.toFixed(1));
239
+ const same = (a, b) => (b === undefined || b === null ? "-" : Math.abs(a - b) <= Math.max(1e-6 * Math.abs(a), 0.01) ? "=" : "≠");
240
+ const pad = (s, n) => String(s).padStart(n);
241
+ console.log("\nLayout (re-layout, median ms) — EVG vs EVGr\n");
242
+ console.log(` ${"fixture".padEnd(8)}${pad("nodes", 8)}${pad("EVG js", 10)}${pad("EVGr js", 10)}${pad("EVGr rs", 10)}${pad("js/js", 8)}${pad("EVG/rs", 8)} boxes EVG:EVGr:rs`);
243
+ for (const r of rows) {
244
+ const nl = r.native ? r.native.layout : null;
245
+ console.log(
246
+ ` ${r.fixture.padEnd(8)}${pad(r.evg.nodes, 8)}${pad(f(r.evg.layout), 10)}${pad(f(r.evgr.layout), 10)}${pad(f(nl), 10)}` +
247
+ `${pad((r.evg.layout / r.evgr.layout).toFixed(1) + "x", 8)}${pad(nl ? (r.evg.layout / nl).toFixed(1) + "x" : "-", 8)}` +
248
+ ` ${same(r.evg.checksum, r.evgr.checksum)} ${same(r.evgr.checksum, r.native ? r.native.checksum : null)}`
249
+ );
250
+ }
251
+ console.log("\n Building the tree (median ms)\n");
252
+ console.log(` ${"fixture".padEnd(8)}${pad("nodes", 8)}${pad("EVG js", 10)}${pad("EVGr js", 10)}${pad("EVGr rs", 10)}`);
253
+ for (const r of rows) {
254
+ console.log(` ${r.fixture.padEnd(8)}${pad(r.evg.nodes, 8)}${pad(f(r.evg.build), 10)}${pad(f(r.evgr.build), 10)}${pad(f(r.native ? r.native.build : null), 10)}`);
255
+ }
256
+ const targets = Object.keys(ranger).filter((t) => ranger[t]);
257
+ if (targets.length) {
258
+ console.log("\n Through Ranger to native targets (bench/NativeBench.rgr), re-layout median ms\n");
259
+ let head = ` ${"fixture".padEnd(8)}${pad("nodes", 8)}`;
260
+ for (const t of targets) head += `${pad("EVG " + t, 10)}${pad("EVGr " + t, 11)}${pad("ratio", 7)}`;
261
+ console.log(head + " boxes");
262
+ for (const r of rows) {
263
+ let line = ` ${r.fixture.padEnd(8)}${pad(r.evg.nodes, 8)}`;
264
+ let agree = true;
265
+ for (const t of targets) {
266
+ const o = r.other[t] || {};
267
+ const ev = o.evg, er = o.evgr;
268
+ line += `${pad(f(ev && ev.layout), 10)}${pad(f(er && er.layout), 11)}${pad(ev && er ? (ev.layout / er.layout).toFixed(1) + "x" : "-", 7)}`;
269
+ // checksums are printed in hundreds
270
+ if (!ev || !er || Math.abs(ev.checksum - er.checksum) > 100 || Math.abs(ev.checksum - r.evg.checksum) > 200) agree = false;
271
+ }
272
+ console.log(line + " " + (agree ? "=" : "≠"));
273
+ }
274
+ }
275
+ console.log("\n js/js: EVG time over EVGr time, both JavaScript. EVG/rs: EVG (js) over EVGr native.");
276
+ console.log(" boxes: = when the checksums of all boxes agree (EVG with EVGr js, EVGr js with native).\n");
277
+ }
@@ -0,0 +1,3 @@
1
+ # build output: npm run evgr:build
2
+ *
3
+ !.gitignore
@@ -0,0 +1,106 @@
1
+ // The fixtures of lib/evg/bench/layout-bench.mjs, laid out by EVGr built
2
+ // natively (cargo run --release --bin bench). Prints one JSON line per
3
+ // fixture and size: nodes, build and layout time in ms (median of runs),
4
+ // and a checksum of the boxes that bench/speed.mjs compares with the other
5
+ // engines' layout of the same tree.
6
+ //
7
+ // cargo run --release --bin bench -- [1000,10000,100000]
8
+
9
+ use evgr::EvgrTree;
10
+ use std::time::Instant;
11
+
12
+ const PAGE: &str = "display:flex;flex-direction:column;flex-wrap:nowrap;width:1200px;gap:8px;align-items:stretch";
13
+ const CARD: &str = "display:flex;flex-direction:row;flex-wrap:nowrap;gap:12px;padding:8px;align-items:stretch";
14
+ const RAIL: &str = "width:48px;height:56px;background-color:#e4e4e7";
15
+ const BODY: &str = "display:flex;flex-direction:column;flex-wrap:nowrap;flex-grow:1;gap:4px;align-items:stretch";
16
+ const LINE: &str = "height:16px;background-color:#f4f4f5";
17
+ const GRIDC: &str = "display:grid;grid-template-columns:repeat(4, 1fr);gap:10px;width:1200px";
18
+ const CELL: &str = "display:flex;flex-direction:column;flex-wrap:nowrap;gap:4px;padding:6px;align-items:stretch";
19
+ const TEXT: &str = "font-size:14px";
20
+ const WORDS: [&str; 5] = ["Ada Lovelace", "Grace Hopper", "Alan Turing", "Edsger Dijkstra", "Barbara McClintock"];
21
+
22
+ fn flex(n: usize, with_text: bool) -> EvgrTree {
23
+ let mut t = EvgrTree::new();
24
+ let page = t.add(-1, PAGE);
25
+ let cards = ((n as f64 / 7.0).round() as usize).max(1);
26
+ for i in 0..cards {
27
+ let card = t.add(page, CARD);
28
+ t.add(card, RAIL);
29
+ let body = t.add(card, BODY);
30
+ for j in 0..4 {
31
+ if with_text && j == 0 {
32
+ t.add_text(body, TEXT, WORDS[i % WORDS.len()]);
33
+ } else {
34
+ t.add(body, LINE);
35
+ }
36
+ }
37
+ }
38
+ t
39
+ }
40
+
41
+ fn grid(n: usize) -> EvgrTree {
42
+ let mut t = EvgrTree::new();
43
+ let g = t.add(-1, GRIDC);
44
+ let cells = ((n as f64 / 5.0).round() as usize).max(1);
45
+ for _ in 0..cells {
46
+ let cell = t.add(g, CELL);
47
+ for _ in 0..4 {
48
+ t.add(cell, LINE);
49
+ }
50
+ }
51
+ t
52
+ }
53
+
54
+ fn build(name: &str, n: usize) -> EvgrTree {
55
+ match name {
56
+ "flex" => flex(n, false),
57
+ "grid" => grid(n),
58
+ _ => flex(n, true),
59
+ }
60
+ }
61
+
62
+ fn median(mut v: Vec<f64>) -> f64 {
63
+ v.sort_by(|a, b| a.partial_cmp(b).unwrap());
64
+ v[v.len() / 2]
65
+ }
66
+
67
+ fn checksum(t: &EvgrTree) -> f64 {
68
+ let mut s = 0.0;
69
+ for i in 0..t.count() {
70
+ s += t.x(i) + t.y(i) + t.w(i) + t.h(i);
71
+ }
72
+ s
73
+ }
74
+
75
+ fn main() {
76
+ let arg = std::env::args().nth(1).unwrap_or(String::from("1000,10000,100000"));
77
+ let sizes: Vec<usize> = arg.split(',').map(|s| s.trim().parse().unwrap()).collect();
78
+ for name in ["flex", "grid", "text"] {
79
+ for &n in &sizes {
80
+ let mut builds = Vec::new();
81
+ for _ in 0..3 {
82
+ let a = Instant::now();
83
+ let t = build(name, n);
84
+ builds.push(a.elapsed().as_secs_f64() * 1000.0);
85
+ std::hint::black_box(&t);
86
+ }
87
+ let mut t = build(name, n);
88
+ t.layout(1200.0, 900.0);
89
+ let mut runs = Vec::new();
90
+ for _ in 0..5 {
91
+ let a = Instant::now();
92
+ t.layout(1200.0, 900.0);
93
+ runs.push(a.elapsed().as_secs_f64() * 1000.0);
94
+ }
95
+ println!(
96
+ "{{\"fixture\":\"{}\",\"size\":{},\"nodes\":{},\"build\":{:.3},\"layout\":{:.3},\"checksum\":{:.3}}}",
97
+ name,
98
+ n,
99
+ t.count(),
100
+ median(builds),
101
+ median(runs),
102
+ checksum(&t)
103
+ );
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,13 @@
1
+ use evgr::EvgrTree;
2
+
3
+ fn main() {
4
+ let mut t = EvgrTree::new();
5
+ let root = t.add(-1, "display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px;gap:20px");
6
+ t.add(root, "flex-grow:1;height:40px");
7
+ t.add(root, "flex-grow:2;height:40px");
8
+ t.add(root, "flex-grow:1;height:40px");
9
+ t.layout(1200.0, 900.0);
10
+ for i in 0..t.count() {
11
+ println!("n{} {} {} {} {}", i, t.x(i), t.y(i), t.w(i), t.h(i));
12
+ }
13
+ }