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.
- package/CHANGELOG.md +1064 -20
- package/LICENSE +3 -1
- package/README.md +123 -28
- package/dist/Lang.rgr +1188 -290
- package/dist/api.d.ts +2343 -879
- package/dist/api.js +79923 -56921
- package/dist/lib/JSON.rgr +102 -91
- package/dist/lib/Shell.rgr +4 -4
- package/dist/lib/apple/AppleToolchain.rgr +4 -4
- package/dist/lib/apple/README.md +5 -4
- package/dist/lib/apple/apple_test.rgr +1 -1
- package/dist/lib/core/README.md +1 -1
- package/dist/lib/evg/EVG.rgr +12 -0
- package/dist/lib/evg/EVGA11yFromTree.rgr +302 -0
- package/dist/lib/evg/EVGA11yTree.rgr +894 -0
- package/dist/lib/evg/EVGBox.rgr +267 -0
- package/dist/lib/evg/EVGBoxShorthandTest.rgr +220 -0
- package/dist/lib/evg/EVGCodepoint.rgr +316 -0
- package/dist/lib/evg/EVGColor.rgr +700 -0
- package/dist/lib/evg/EVGCommands.rgr +177 -0
- package/dist/lib/evg/EVGComponent.rgr +331 -0
- package/dist/lib/evg/EVGComponentTest.rgr +387 -0
- package/dist/lib/evg/EVGConnector.rgr +541 -0
- package/dist/lib/evg/EVGConnectorTest.rgr +306 -0
- package/dist/lib/evg/EVGDisplayList.rgr +4186 -0
- package/dist/lib/evg/EVGEasing.rgr +370 -0
- package/dist/lib/evg/EVGEffectTest.rgr +253 -0
- package/dist/lib/evg/EVGElement.rgr +4914 -0
- package/dist/lib/evg/EVGFixedTest.rgr +289 -0
- package/dist/lib/evg/EVGFlexRulesTest.rgr +317 -0
- package/dist/lib/evg/EVGFlexWrapTest.rgr +246 -0
- package/dist/lib/evg/EVGFling.rgr +244 -0
- package/dist/lib/evg/EVGFocus.rgr +400 -0
- package/dist/lib/evg/EVGFocusTest.rgr +399 -0
- package/dist/lib/evg/EVGGradient.rgr +322 -0
- package/dist/lib/evg/EVGGrapheme.rgr +190 -0
- package/dist/lib/evg/EVGGrid.rgr +975 -0
- package/dist/lib/evg/EVGHitTest.rgr +208 -0
- package/dist/lib/evg/EVGHoles.rgr +294 -0
- package/dist/lib/evg/EVGHostMeasurerTest.rgr +281 -0
- package/dist/lib/evg/EVGHostTextMeasurer.rgr +331 -0
- package/dist/lib/evg/EVGHostTree.rgr +834 -0
- package/dist/lib/evg/EVGHostTreeTest.rgr +447 -0
- package/dist/lib/evg/EVGImageDecode.rgr +117 -0
- package/dist/lib/evg/EVGImageMeasurer.rgr +86 -0
- package/dist/lib/evg/EVGInspect.rgr +883 -0
- package/dist/lib/evg/EVGInvalidateTest.rgr +432 -0
- package/dist/lib/evg/EVGJsonTest.rgr +535 -0
- package/dist/lib/evg/EVGLayout.rgr +4220 -0
- package/dist/lib/evg/EVGMeasure.rgr +1267 -0
- package/dist/lib/evg/EVGOverlayTest.rgr +626 -0
- package/dist/lib/evg/EVGPatch.rgr +1721 -0
- package/dist/lib/evg/EVGPatchTest.rgr +692 -0
- package/dist/lib/evg/EVGPopoverTest.rgr +395 -0
- package/dist/lib/evg/EVGReconcile.rgr +226 -0
- package/dist/lib/evg/EVGReconcileTest.rgr +421 -0
- package/dist/lib/evg/EVGReject.rgr +126 -0
- package/dist/lib/evg/EVGRelayoutTest.rgr +375 -0
- package/dist/lib/evg/EVGRtlLayoutTest.rgr +319 -0
- package/dist/lib/evg/EVGRuler.rgr +232 -0
- package/dist/lib/evg/EVGRulerTest.rgr +172 -0
- package/dist/lib/evg/EVGSelectChrome.rgr +178 -0
- package/dist/lib/evg/EVGStyleCacheTest.rgr +419 -0
- package/dist/lib/evg/EVGStyleSheet.rgr +2148 -0
- package/dist/lib/evg/EVGStyleStateTest.rgr +407 -0
- package/dist/lib/evg/EVGStyleVarTest.rgr +471 -0
- package/dist/lib/evg/EVGText.rgr +105 -0
- package/dist/lib/evg/EVGTextEngine.rgr +536 -0
- package/dist/lib/evg/EVGTextMeasurer.rgr +720 -0
- package/dist/lib/evg/EVGTimingTest.rgr +1417 -0
- package/dist/lib/evg/EVGToolbar.rgr +1369 -0
- package/dist/lib/evg/EVGTransition.rgr +728 -0
- package/dist/lib/evg/EVGTreeJson.rgr +721 -0
- package/dist/lib/evg/EVGUnit.rgr +554 -0
- package/dist/lib/evg/EVGViewportUnitTest.rgr +236 -0
- package/dist/lib/evg/EvgApp.rgr +189 -0
- package/dist/lib/evg/EvgBitmapTracer.rgr +4277 -0
- package/dist/lib/evg/EvgBitmapTracerTest.rgr +2119 -0
- package/dist/lib/evg/EvgHost.rgr +451 -0
- package/dist/lib/evg/EvgTest.rgr +91 -0
- package/dist/lib/evg/EvgTraceColor.rgr +236 -0
- package/dist/lib/evg/EvgTraceCurve.rgr +648 -0
- package/dist/lib/evg/EvgTraceFit.rgr +767 -0
- package/dist/lib/evg/EvgTracePath.rgr +435 -0
- package/dist/lib/evg/EvgTraceTypes.rgr +559 -0
- package/dist/lib/evg/EvgViewport.rgr +313 -0
- package/dist/lib/evg/FxDemoDoc.rgr +185 -0
- package/dist/lib/evg/HOSTS.md +227 -0
- package/dist/lib/evg/ISSUES.md +835 -0
- package/dist/lib/evg/PLAN_ACCESSIBILITY.md +650 -0
- package/dist/lib/evg/PLAN_CSS_LAYOUT_AND_FONTS.md +1124 -0
- package/dist/lib/evg/PLAN_EFFECTS.md +431 -0
- package/dist/lib/evg/PLAN_EVG.md +518 -0
- package/dist/lib/evg/PLAN_EVG_RENDERER.md +1674 -0
- package/dist/lib/evg/PLAN_INSPECTOR.md +788 -0
- package/dist/lib/evg/PLAN_LINKS_AND_FORMS.md +157 -0
- package/dist/lib/evg/PLAN_NATIVE_HOSTS.md +671 -0
- package/dist/lib/evg/PLAN_VECTOR_IR.md +664 -0
- package/dist/lib/evg/PLAN_VIEW_TRANSFORM.md +322 -0
- package/dist/lib/evg/PathBuilder.rgr +333 -0
- package/dist/lib/evg/README.md +1236 -0
- package/dist/lib/evg/SPEC.md +1252 -0
- package/dist/lib/evg/SVGPathParser.rgr +1199 -0
- package/dist/lib/evg/SvgParser.rgr +1736 -0
- package/dist/lib/evg/TODO_EVG_RENDERER.md +595 -0
- package/dist/lib/evg/VectorShapes.rgr +331 -0
- package/dist/lib/evg/VectorStroke.rgr +107 -0
- package/dist/lib/evg/VectorViewBox.rgr +380 -0
- package/dist/lib/evg/agent/README.md +290 -0
- package/dist/lib/evg/agent/evg_agent.rgr +899 -0
- package/dist/lib/evg/agent/fixtures/broken.evg.json +7 -0
- package/dist/lib/evg/agent/fixtures/card.evg.json +9 -0
- package/dist/lib/evg/agent/fixtures/connector.css +63 -0
- package/dist/lib/evg/agent/fixtures/connector.evg.json +14 -0
- package/dist/lib/evg/agent/fixtures/drawn.evg.json +129 -0
- package/dist/lib/evg/agent/fixtures/gradient.evg.json +4 -0
- package/dist/lib/evg/agent/fixtures/popover.css +99 -0
- package/dist/lib/evg/agent/fixtures/popover.evg.json +30 -0
- package/dist/lib/evg/agent/roundtrip.sh +74 -0
- package/dist/lib/evg/agent/smoke.sh +230 -0
- package/dist/lib/evg/android/README.md +97 -0
- package/dist/lib/evg/android/androidstubs/AndroidStubs.kt +175 -0
- package/dist/lib/evg/android/androidstubs/Annotation.kt +10 -0
- package/dist/lib/evg/android/androidstubs/App.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Content.kt +41 -0
- package/dist/lib/evg/android/androidstubs/ContentRes.kt +12 -0
- package/dist/lib/evg/android/androidstubs/InputMethod.kt +46 -0
- package/dist/lib/evg/android/androidstubs/Net.kt +6 -0
- package/dist/lib/evg/android/androidstubs/Os.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Util.kt +15 -0
- package/dist/lib/evg/android/androidstubs/View.kt +113 -0
- package/dist/lib/evg/android/androidstubs/Widget.kt +16 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidEvgSurface.kt +323 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidTextMeasurer.kt +56 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/RippleEffect.kt +262 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtEvgSurface.kt +238 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtTextMeasurer.kt +85 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgEngineThread.kt +115 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgPainter.kt +231 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgSurface.kt +117 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/RecordingSurface.kt +94 -0
- package/dist/lib/evg/apple/README.md +128 -0
- package/dist/lib/evg/apple/Sources/CoreGraphicsEvgSurface.swift +329 -0
- package/dist/lib/evg/apple/Sources/CoreTextMeasurer.swift +70 -0
- package/dist/lib/evg/apple/Sources/EvgEngineQueue.swift +105 -0
- package/dist/lib/evg/apple/Sources/EvgPainter.swift +225 -0
- package/dist/lib/evg/apple/Sources/EvgSurface.swift +163 -0
- package/dist/lib/evg/apple/Sources/RecordingSurface.swift +110 -0
- package/dist/lib/evg/bench/EvgLayoutBench.rgr +34 -0
- package/dist/lib/evg/bench/README.md +64 -0
- package/dist/lib/evg/bench/layout-bench.mjs +316 -0
- package/dist/lib/evg/bench/layout-cases.mjs +510 -0
- package/dist/lib/evg/bench/layout-conformance.mjs +254 -0
- package/dist/lib/evg/bin/.gitignore +17 -0
- package/dist/lib/evg/evg_test.rgr +313 -0
- package/dist/lib/evg/gl/README.md +198 -0
- package/dist/lib/evg/gl/a11y-paint-check.mjs +73 -0
- package/dist/lib/evg/gl/blur-check.mjs +399 -0
- package/dist/lib/evg/gl/boxmodel.json +1 -0
- package/dist/lib/evg/gl/demo.html +46 -0
- package/dist/lib/evg/gl/effect-presets.css +285 -0
- package/dist/lib/evg/gl/effect-presets.js +63 -0
- package/dist/lib/evg/gl/effect-shots.mjs +135 -0
- package/dist/lib/evg/gl/evg-a11y.js +566 -0
- package/dist/lib/evg/gl/evg-binary.js +160 -0
- package/dist/lib/evg/gl/evg-engine.js +296 -0
- package/dist/lib/evg/gl/evg-fx.js +237 -0
- package/dist/lib/evg/gl/evg-gestures.js +209 -0
- package/dist/lib/evg/gl/evg-list.js +167 -0
- package/dist/lib/evg/gl/evg-measure.js +186 -0
- package/dist/lib/evg/gl/evg-textinput.js +303 -0
- package/dist/lib/evg/gl/evg-view.js +144 -0
- package/dist/lib/evg/gl/evg-webgl.js +3942 -0
- package/dist/lib/evg/gl/fx-check.mjs +998 -0
- package/dist/lib/evg/gl/fx-demo.html +166 -0
- package/dist/lib/evg/gl/fx-demo.js +2 -0
- package/dist/lib/evg/gl/fx-serve.mjs +47 -0
- package/dist/lib/evg/gl/gestures-check.mjs +189 -0
- package/dist/lib/evg/gl/list-binary-check.mjs +152 -0
- package/dist/lib/evg/gl/measure-check.mjs +135 -0
- package/dist/lib/evg/gl/rotation-check.mjs +207 -0
- package/dist/lib/evg/gl/shift-check.mjs +113 -0
- package/dist/lib/evg/gl/stroke-check.mjs +168 -0
- package/dist/lib/evg/gl/text-snap-check.mjs +139 -0
- package/dist/lib/evg/gl/view-check.mjs +343 -0
- package/dist/lib/evg/gl/view-policy-check.mjs +184 -0
- package/dist/lib/evg/html/evg-dom.js +318 -0
- package/dist/lib/evg/html/evg-html.js +600 -0
- package/dist/lib/evg/inspect/README.md +415 -0
- package/dist/lib/evg/inspect/browser-smoke.mjs +115 -0
- package/dist/lib/evg/inspect/evg-inspect.js +947 -0
- package/dist/lib/evg/inspect/shots/css.png +0 -0
- package/dist/lib/evg/inspect/shots/dashboard.png +0 -0
- package/dist/lib/evg/inspect/shots/pptx-slide.png +0 -0
- package/dist/lib/evg/inspect/shots/state.png +0 -0
- package/dist/lib/evg/inspect/shots.mjs +226 -0
- package/dist/lib/evg/oracle/css-blur.json +576 -0
- package/dist/lib/evg/oracle/css-box.json +157 -0
- package/dist/lib/evg/oracle/css-timing.json +709 -0
- package/dist/lib/evg/oracle/css_blur_oracle.mjs +529 -0
- package/dist/lib/evg/oracle/css_box_oracle.mjs +106 -0
- package/dist/lib/evg/oracle/css_timing_oracle.mjs +389 -0
- package/dist/lib/evg/original/EVGColor.clj +310 -0
- package/dist/lib/evg/original/EVGColorContext.rgr +178 -0
- package/dist/lib/evg/original/SVGPath.rgr +627 -0
- package/dist/lib/evg/original/Vec2.crgr +103 -0
- package/dist/lib/evg/ranger.json +9 -0
- package/dist/lib/evg/showcase/README.md +246 -0
- package/dist/lib/evg/showcase/assets/emblem.svg +30 -0
- package/dist/lib/evg/showcase/assets/rosette.svg +22 -0
- package/dist/lib/evg/showcase/build.mjs +651 -0
- package/dist/lib/evg/showcase/pages/album.tsx +30 -0
- package/dist/lib/evg/showcase/pages/boxmodel.tsx +37 -0
- package/dist/lib/evg/showcase/pages/cards.tsx +41 -0
- package/dist/lib/evg/showcase/pages/chart_api.tsx +170 -0
- package/dist/lib/evg/showcase/pages/charts.tsx +219 -0
- package/dist/lib/evg/showcase/pages/drawing.tsx +160 -0
- package/dist/lib/evg/showcase/pages/emoji.tsx +91 -0
- package/dist/lib/evg/showcase/pages/flex.tsx +46 -0
- package/dist/lib/evg/showcase/pages/more.tsx +332 -0
- package/dist/lib/evg/showcase/pages/plots.tsx +262 -0
- package/dist/lib/evg/showcase/pages/svg.tsx +63 -0
- package/dist/lib/evg/showcase/pages/tables.tsx +209 -0
- package/dist/lib/evg/showcase/pages/typography.tsx +43 -0
- package/dist/lib/evg/showcase/pages/units.tsx +35 -0
- package/dist/lib/evg/showcase/pages/variants.tsx +233 -0
- package/dist/lib/evg/showcase/pages/vector.tsx +75 -0
- package/dist/lib/evg/showcase/pages/views.tsx +223 -0
- package/dist/lib/evg/showcase/tests/chart_api_smoke.mjs +339 -0
- package/dist/lib/evg/showcase/tests/gl_smoke.mjs +125 -0
- package/dist/lib/evg/showcase/themes/chart_api-default.css +15 -0
- package/dist/lib/evg/showcase/themes/charts-default.css +29 -0
- package/dist/lib/evg/showcase/themes/drawing-default.css +35 -0
- package/dist/lib/evg/showcase/themes/more-default.css +128 -0
- package/dist/lib/evg/showcase/themes/plots-default.css +18 -0
- package/dist/lib/evg/showcase/themes/showcase.css +508 -0
- package/dist/lib/evg/showcase/themes/tables-default.css +123 -0
- package/dist/lib/evg/showcase/themes/variants-default.css +15 -0
- package/dist/lib/evg/showcase/themes/views-default.css +15 -0
- package/dist/lib/evg/tools/bench_vs_potrace.mjs +290 -0
- package/dist/lib/evg/tools/evg_image_tool.rgr +488 -0
- package/dist/lib/evg/tools/evg_trace_bench.rgr +114 -0
- package/dist/lib/evg/tools/evg_trace_cli.rgr +662 -0
- package/dist/lib/evg/tools/evg_trace_cpp_bench.rgr +83 -0
- package/dist/lib/evg/tools/run_trace_bench.sh +74 -0
- package/dist/lib/evg/tools/run_trace_cli_smoke.sh +128 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveCheck.rgr +271 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveDemo.rgr +531 -0
- package/dist/lib/evg/web/responsive/README.md +97 -0
- package/dist/lib/evg/web/responsive/build.mjs +90 -0
- package/dist/lib/evg/web/responsive/dom-check.mjs +169 -0
- package/dist/lib/evg/web/responsive/index.html +177 -0
- package/dist/lib/evg/web/responsive/smoke.mjs +221 -0
- package/dist/lib/evg/web/tools/assets-client.mjs +95 -0
- package/dist/lib/evg/web/tools/boot-bench.mjs +189 -0
- package/dist/lib/evg/web/tools/inline-assets.mjs +119 -0
- package/dist/lib/evg/web/tools/minify.mjs +60 -0
- package/dist/lib/evg/web/tracer/build.mjs +87 -0
- package/dist/lib/evg/web/tracer/index.html +2805 -0
- package/dist/lib/evg/web/tracer/sample.png +0 -0
- package/dist/lib/evg/web/tracer/smoke.mjs +1162 -0
- package/dist/lib/evgr/Cargo.lock +21 -0
- package/dist/lib/evgr/Cargo.toml +19 -0
- package/dist/lib/evgr/README.md +140 -0
- package/dist/lib/evgr/bench/NativeBench.rgr +246 -0
- package/dist/lib/evgr/bench/compare.mjs +252 -0
- package/dist/lib/evgr/bench/speed.mjs +277 -0
- package/dist/lib/evgr/bin/.gitignore +3 -0
- package/dist/lib/evgr/src/bin/bench.rs +106 -0
- package/dist/lib/evgr/src/bin/smoke.rs +13 -0
- package/dist/lib/evgr/src/grid.rs +730 -0
- package/dist/lib/evgr/src/lib.rs +1003 -0
- package/dist/lib/evgr/src/style.rs +468 -0
- package/dist/lib/evgr/src/text.rs +83 -0
- package/dist/lib/image/BitReader.rgr +171 -0
- package/dist/lib/image/Buffer.rgr +173 -0
- package/dist/lib/image/DCT.rgr +283 -0
- package/dist/lib/image/Deflate.rgr +339 -0
- package/dist/lib/image/HuffmanDecoder.rgr +181 -0
- package/dist/lib/image/ImageBuffer.rgr +706 -0
- package/dist/lib/image/JPEGDecoder.rgr +808 -0
- package/dist/lib/image/PNGDecoder.rgr +544 -0
- package/dist/lib/image/PNGEncoder.rgr +388 -0
- package/dist/lib/image/PPMImage.rgr +224 -0
- package/dist/lib/image/ProgressiveJPEGDecoder.rgr +1154 -0
- package/dist/lib/image/README.md +33 -0
- package/dist/lib/image/RasterBuffer.rgr +294 -0
- package/dist/lib/image/VP8BoolDecoder.rgr +163 -0
- package/dist/lib/image/WebPDecoder.rgr +433 -0
- package/dist/lib/image/WebPLossless.rgr +1035 -0
- package/dist/lib/image/WebPLossy.rgr +1929 -0
- package/dist/lib/image/ranger.json +9 -0
- package/dist/lib/image/testdata/webp/anim_2f_24x16.webp +0 -0
- package/dist/lib/image/testdata/webp/fixtures.txt +33 -0
- package/dist/lib/image/testdata/webp/gen_fixtures.py +261 -0
- package/dist/lib/image/testdata/webp/ll_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_alpha_29x21.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_gradient_64x64.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_meta_32x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_noise_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal11_23x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal2_19x7.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal40_16x16.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal4_13x5.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_photo_40x30.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_predictors_64x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alpha_33x17.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_exif_15x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_i16_96x80.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_nofilter_24x20.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_odd_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_photo_48x40.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_q100_20x18.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_sharp_40x36.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_simple_filter_33x31.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_parts8_37x45.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_skip_96x80.webp +0 -0
- package/dist/lib/image/tests/WebPDecodeTool.rgr +81 -0
- package/dist/lib/image/tests/WebPDecoderTest.rgr +1162 -0
- package/dist/lib/image/tests/run_webp_tests.sh +39 -0
- package/dist/lib/rust/RsJson.rgr +468 -0
- package/dist/lib/rust/RsPrelude.rgr +1663 -0
- package/dist/lib/shell_test.rgr +7 -7
- package/dist/lib/stdlib.rgr +21 -5
- package/dist/lib/zip/ranger.json +6 -0
- package/dist/rgrc.js +87318 -67610
- package/package.json +1010 -1040
- package/dist/README.md +0 -117
- 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,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
|
+
}
|