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,318 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
//
|
|
3
|
+
// evg-dom.js — the page as DOM nodes that SURVIVE a frame.
|
|
4
|
+
//
|
|
5
|
+
// `evg-html.js` paints the display list as `<svg>` and rebuilds every node
|
|
6
|
+
// every frame, because a draw command carries no identity; its header says
|
|
7
|
+
// that is a property of the seam. This file sits on the other seam —
|
|
8
|
+
// `EVGHostTree` (PLAN_NATIVE_HOSTS.md S2/S3): ops keyed by the inspector's
|
|
9
|
+
// path, saying what was CREATED, what changed on a node that exists and
|
|
10
|
+
// which of five things changed, what MOVED and what is gone. One DOM node
|
|
11
|
+
// per element, made once and patched, so a CSS transition, a focus ring, a
|
|
12
|
+
// caret or a real `<input>` has something to attach to, and a frame that
|
|
13
|
+
// changed one colour writes one style property.
|
|
14
|
+
//
|
|
15
|
+
// WHAT IS NATIVE HERE AND WHAT IS NOT. Geometry is EVG's: every node is
|
|
16
|
+
// `position: absolute` at the rectangle the layout computed, inside its
|
|
17
|
+
// parent, at scroll 0. Text is EVG's lines: one `<div>` per line with
|
|
18
|
+
// `white-space: pre`, so the browser breaks nothing itself and a PDF laid
|
|
19
|
+
// out from the same tree breaks in the same place. What the browser
|
|
20
|
+
// contributes is what a canvas cannot: identity, selectable text, the
|
|
21
|
+
// compositor — a scroll container's children live in a layer that moves by
|
|
22
|
+
// one `transform`, written from the SCROLL bit — and, later, the field
|
|
23
|
+
// itself where the page draws a field.
|
|
24
|
+
//
|
|
25
|
+
// Paths are `<path d>` inside an inline `<svg>`, verbatim: the host tree
|
|
26
|
+
// hands over the source rather than flattened rings, because this host has
|
|
27
|
+
// a path renderer.
|
|
28
|
+
|
|
29
|
+
const SVG_NS = "http://www.w3.org/2000/svg";
|
|
30
|
+
|
|
31
|
+
const rgba = (c) => `rgba(${c[0]},${c[1]},${c[2]},${c[3]})`;
|
|
32
|
+
const px = (v) => `${v}px`;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Make a painter over `target`.
|
|
36
|
+
*
|
|
37
|
+
* @param {HTMLElement} target the stage the page is built into
|
|
38
|
+
* @returns {{ apply: (doc: object) => object, count: () => number,
|
|
39
|
+
* nodes: () => object[], reset: () => void }}
|
|
40
|
+
*/
|
|
41
|
+
export function createDomPainter(target) {
|
|
42
|
+
// path -> { el, inner, index, parent, px, py, w, h, born }
|
|
43
|
+
const nodes = new Map();
|
|
44
|
+
let build = 0;
|
|
45
|
+
|
|
46
|
+
// The target is the containing block of every node. A host that placed it
|
|
47
|
+
// itself (`position: absolute` under a canvas, say) keeps its placement.
|
|
48
|
+
if (!target.style.position) target.style.position = "relative";
|
|
49
|
+
target.style.overflow = "hidden";
|
|
50
|
+
|
|
51
|
+
function reset() {
|
|
52
|
+
for (const n of nodes.values()) n.el.remove();
|
|
53
|
+
nodes.clear();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Where a child of `n` is appended: the scroll layer of a clipping box,
|
|
57
|
+
// the box itself otherwise.
|
|
58
|
+
const slotOf = (n) => n.inner || n.el;
|
|
59
|
+
|
|
60
|
+
function placeInParent(n, op) {
|
|
61
|
+
const parent = op.parent ? nodes.get(op.parent) : null;
|
|
62
|
+
const slot = parent ? slotOf(parent) : target;
|
|
63
|
+
n.parent = op.parent;
|
|
64
|
+
n.index = op.index;
|
|
65
|
+
// Siblings are ordered by the tree index the op carries; hidden
|
|
66
|
+
// elements leave gaps, so "the first sibling with a larger index" is
|
|
67
|
+
// the place, not "the child at that index".
|
|
68
|
+
let before = null;
|
|
69
|
+
for (const c of slot.children) {
|
|
70
|
+
const ci = c.__evgIndex;
|
|
71
|
+
if (ci !== undefined && ci > op.index) { before = c; break; }
|
|
72
|
+
}
|
|
73
|
+
n.el.__evgIndex = op.index;
|
|
74
|
+
if (before) slot.insertBefore(n.el, before); else slot.appendChild(n.el);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function makeNode(op) {
|
|
78
|
+
const el = document.createElement("div");
|
|
79
|
+
el.className = "evg-node";
|
|
80
|
+
el.style.position = "absolute";
|
|
81
|
+
el.style.boxSizing = "border-box";
|
|
82
|
+
el.style.margin = "0";
|
|
83
|
+
el.dataset.path = op.path;
|
|
84
|
+
if (op.id) el.dataset.id = op.id;
|
|
85
|
+
const n = { el, inner: null, index: op.index, parent: op.parent, x: 0, y: 0, w: 0, h: 0, sx: 0, sy: 0, born: build };
|
|
86
|
+
if (op.clip) {
|
|
87
|
+
// The layer the compositor moves. Children go in it; the box clips.
|
|
88
|
+
const inner = document.createElement("div");
|
|
89
|
+
inner.className = "evg-layer";
|
|
90
|
+
inner.style.position = "absolute";
|
|
91
|
+
inner.style.left = "0";
|
|
92
|
+
inner.style.top = "0";
|
|
93
|
+
inner.style.width = "100%";
|
|
94
|
+
inner.style.height = "100%";
|
|
95
|
+
inner.style.willChange = "transform";
|
|
96
|
+
el.appendChild(inner);
|
|
97
|
+
n.inner = inner;
|
|
98
|
+
el.style.overflow = "hidden";
|
|
99
|
+
}
|
|
100
|
+
return n;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function geometry(n, op) {
|
|
104
|
+
n.el.style.left = px(op.x);
|
|
105
|
+
n.el.style.top = px(op.y);
|
|
106
|
+
n.el.style.width = px(op.w);
|
|
107
|
+
n.el.style.height = px(op.h);
|
|
108
|
+
n.x = op.x; n.y = op.y; n.w = op.w; n.h = op.h;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function paint(n, op) {
|
|
112
|
+
const s = n.el.style;
|
|
113
|
+
// The element's own classes ride on the node, after this painter's, so
|
|
114
|
+
// a page's stylesheet can address what the tree named.
|
|
115
|
+
n.el.className = "evg-node" + (op.cls ? " " + op.cls : "");
|
|
116
|
+
if (op.gd !== undefined && op.bg2) {
|
|
117
|
+
// 1 = across, otherwise down — the display list's `gd`.
|
|
118
|
+
s.backgroundImage = `linear-gradient(${op.gd === 1 ? "to right" : "to bottom"}, ${rgba(op.bg)}, ${rgba(op.bg2)})`;
|
|
119
|
+
s.backgroundColor = "";
|
|
120
|
+
} else {
|
|
121
|
+
s.backgroundImage = "";
|
|
122
|
+
s.backgroundColor = op.bg ? rgba(op.bg) : "";
|
|
123
|
+
}
|
|
124
|
+
// A border is a band INSIDE the box, and it must not move the children:
|
|
125
|
+
// CSS places an absolute child inside the parent's PADDING box, so a real
|
|
126
|
+
// `border` would shift every child by its width. An inset box-shadow is
|
|
127
|
+
// the same band, follows the radius, and moves nothing. The drop shadow
|
|
128
|
+
// rides in the same list.
|
|
129
|
+
const shadows = [];
|
|
130
|
+
if (op.bw) shadows.push(`inset 0 0 0 ${op.bw}px ${rgba(op.bc)}`);
|
|
131
|
+
if (op.sh) shadows.push(`${op.sh.x}px ${op.sh.y}px ${op.sh.blur}px ${rgba(op.sh.c)}`);
|
|
132
|
+
s.boxShadow = shadows.join(", ");
|
|
133
|
+
s.borderRadius = op.rc ? `${op.rc[0]}px ${op.rc[1]}px ${op.rc[2]}px ${op.rc[3]}px` : "";
|
|
134
|
+
s.opacity = op.opacity !== undefined ? String(op.opacity) : "";
|
|
135
|
+
s.cursor = op.cursor || "";
|
|
136
|
+
s.backdropFilter = op.bb ? `blur(${op.bb}px)` : "";
|
|
137
|
+
// CSS applies the functions right to left: scale, then turn, then shift
|
|
138
|
+
// — the order the display list maps its points in, about the same
|
|
139
|
+
// origin.
|
|
140
|
+
const parts = [];
|
|
141
|
+
if (op.tx || op.ty) parts.push(`translate(${op.tx || 0}px, ${op.ty || 0}px)`);
|
|
142
|
+
if (op.rot) parts.push(`rotate(${op.rot}deg)`);
|
|
143
|
+
if (op.scale !== undefined && op.scale !== 1) parts.push(`scale(${op.scale})`);
|
|
144
|
+
s.transform = parts.join(" ");
|
|
145
|
+
s.transformOrigin = op.origin ? `${op.origin[0]}px ${op.origin[1]}px` : "";
|
|
146
|
+
n.transformed = parts.length > 0;
|
|
147
|
+
s.zIndex = op.overlay ? "10" : "";
|
|
148
|
+
if (op.src) {
|
|
149
|
+
let img = n.el.querySelector(":scope > img.evg-img");
|
|
150
|
+
if (!img) {
|
|
151
|
+
img = document.createElement("img");
|
|
152
|
+
img.className = "evg-img";
|
|
153
|
+
img.style.position = "absolute";
|
|
154
|
+
img.style.left = "0";
|
|
155
|
+
img.style.top = "0";
|
|
156
|
+
img.style.width = "100%";
|
|
157
|
+
img.style.height = "100%";
|
|
158
|
+
img.draggable = false;
|
|
159
|
+
n.el.appendChild(img);
|
|
160
|
+
}
|
|
161
|
+
if (img.getAttribute("src") !== op.src) img.setAttribute("src", op.src);
|
|
162
|
+
img.style.objectFit = op.fit || "cover";
|
|
163
|
+
}
|
|
164
|
+
if (op.shape) {
|
|
165
|
+
let svg = n.el.querySelector(":scope > svg.evg-path");
|
|
166
|
+
if (!svg) {
|
|
167
|
+
svg = document.createElementNS(SVG_NS, "svg");
|
|
168
|
+
svg.setAttribute("class", "evg-path");
|
|
169
|
+
svg.style.position = "absolute";
|
|
170
|
+
svg.style.left = "0";
|
|
171
|
+
svg.style.top = "0";
|
|
172
|
+
svg.style.overflow = "visible";
|
|
173
|
+
n.el.appendChild(svg);
|
|
174
|
+
}
|
|
175
|
+
svg.setAttribute("width", String(op.w));
|
|
176
|
+
svg.setAttribute("height", String(op.h));
|
|
177
|
+
if (op.shape.viewBox) svg.setAttribute("viewBox", op.shape.viewBox); else svg.removeAttribute("viewBox");
|
|
178
|
+
svg.setAttribute("preserveAspectRatio", "xMidYMid meet");
|
|
179
|
+
if (op.shape.svg && !op.shape.d) {
|
|
180
|
+
svg.innerHTML = op.shape.svg;
|
|
181
|
+
} else {
|
|
182
|
+
let p = svg.querySelector("path");
|
|
183
|
+
if (!p) {
|
|
184
|
+
p = document.createElementNS(SVG_NS, "path");
|
|
185
|
+
svg.appendChild(p);
|
|
186
|
+
}
|
|
187
|
+
p.setAttribute("d", op.shape.d || "");
|
|
188
|
+
p.setAttribute("fill", op.shape.fill ? rgba(op.shape.fill) : "none");
|
|
189
|
+
p.setAttribute("fill-rule", op.shape.rule || "nonzero");
|
|
190
|
+
if (op.shape.stroke) {
|
|
191
|
+
p.setAttribute("stroke", rgba(op.shape.stroke));
|
|
192
|
+
p.setAttribute("stroke-width", String(op.shape.sw || 1));
|
|
193
|
+
if (op.shape.dash) p.setAttribute("stroke-dasharray", op.shape.dash);
|
|
194
|
+
} else {
|
|
195
|
+
p.removeAttribute("stroke");
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function text(n, op) {
|
|
202
|
+
for (const old of n.el.querySelectorAll(":scope > .evg-line")) old.remove();
|
|
203
|
+
if (!op.text) return;
|
|
204
|
+
const t = op.text;
|
|
205
|
+
for (const [line, x, y] of t.lines) {
|
|
206
|
+
const d = document.createElement("div");
|
|
207
|
+
d.className = "evg-line";
|
|
208
|
+
d.style.position = "absolute";
|
|
209
|
+
d.style.left = px(x);
|
|
210
|
+
d.style.top = px(y);
|
|
211
|
+
d.style.whiteSpace = "pre";
|
|
212
|
+
d.style.lineHeight = px(t.lh);
|
|
213
|
+
d.style.height = px(t.lh);
|
|
214
|
+
d.style.font = `${t.weight ? t.weight + " " : ""}${t.size}px "${t.font.replace(/-Bold$/, "")}", sans-serif`;
|
|
215
|
+
d.style.color = rgba(t.c);
|
|
216
|
+
// The same bidi override the painters apply: EVG ordered the runs.
|
|
217
|
+
d.textContent = "\u202D" + line + "\u202C";
|
|
218
|
+
n.el.appendChild(d);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function a11y(n, op) {
|
|
223
|
+
if (op.role) n.el.setAttribute("role", op.role); else n.el.removeAttribute("role");
|
|
224
|
+
if (op.label) n.el.setAttribute("aria-label", op.label); else n.el.removeAttribute("aria-label");
|
|
225
|
+
const st = op.state || "";
|
|
226
|
+
n.el.setAttribute("aria-disabled", st.includes("d") ? "true" : "false");
|
|
227
|
+
if (st.includes("h")) n.el.setAttribute("aria-hidden", "true"); else n.el.removeAttribute("aria-hidden");
|
|
228
|
+
n.el.tabIndex = st.includes("f") ? 0 : -1;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function scroll(n, op) {
|
|
232
|
+
if (!n.inner || !op.scroll) return;
|
|
233
|
+
n.sx = op.scroll[0];
|
|
234
|
+
n.sy = op.scroll[1];
|
|
235
|
+
n.inner.style.transform = `translate(${-n.sx}px, ${-n.sy}px)`;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Apply one host document: `{ width, height, host: { ops, … } }`.
|
|
240
|
+
* Returns the tally the ops carried.
|
|
241
|
+
*/
|
|
242
|
+
function apply(doc) {
|
|
243
|
+
build += 1;
|
|
244
|
+
// The height is the document's; the WIDTH is the stage's own, because a
|
|
245
|
+
// responsive page is laid out to the width the stage has — a painter
|
|
246
|
+
// that fixed it would stop the page ever being resized.
|
|
247
|
+
target.style.height = px(doc.height);
|
|
248
|
+
const host = doc.host;
|
|
249
|
+
for (const op of host.ops) {
|
|
250
|
+
switch (op.op) {
|
|
251
|
+
case "create": {
|
|
252
|
+
const n = makeNode(op);
|
|
253
|
+
nodes.set(op.path, n);
|
|
254
|
+
geometry(n, op);
|
|
255
|
+
paint(n, op);
|
|
256
|
+
text(n, op);
|
|
257
|
+
a11y(n, op);
|
|
258
|
+
scroll(n, op);
|
|
259
|
+
placeInParent(n, op);
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
case "update": {
|
|
263
|
+
const n = nodes.get(op.path);
|
|
264
|
+
if (!n) break;
|
|
265
|
+
if (op.bits & 1) geometry(n, op);
|
|
266
|
+
if (op.bits & 2) paint(n, op);
|
|
267
|
+
if (op.bits & 4) text(n, op);
|
|
268
|
+
if (op.bits & 8) a11y(n, op);
|
|
269
|
+
if (op.bits & 16) scroll(n, op);
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
case "move": {
|
|
273
|
+
const n = nodes.get(op.path);
|
|
274
|
+
if (!n) break;
|
|
275
|
+
placeInParent(n, op);
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
case "remove": {
|
|
279
|
+
const n = nodes.get(op.path);
|
|
280
|
+
if (!n) break;
|
|
281
|
+
// The subtree goes with the node: a REMOVE of a parent is never
|
|
282
|
+
// followed by ops for the children it took, only, at times, by
|
|
283
|
+
// their own REMOVEs, which find nothing.
|
|
284
|
+
n.el.remove();
|
|
285
|
+
nodes.delete(op.path);
|
|
286
|
+
const under = op.path + "/";
|
|
287
|
+
for (const k of [...nodes.keys()]) if (k.startsWith(under)) nodes.delete(k);
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
default:
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return { build, created: host.created, updated: host.updated, moved: host.moved, removed: host.removed, count: host.count, nodes: nodes.size };
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return {
|
|
298
|
+
apply,
|
|
299
|
+
reset,
|
|
300
|
+
count: () => nodes.size,
|
|
301
|
+
/** Every node: its path, the page rectangle the engine's offsets add up
|
|
302
|
+
* to — walked up the parents, because a child whose parent moved got
|
|
303
|
+
* no op of its own — and the build it was made in. For a check that
|
|
304
|
+
* asks the DOM where it put them. */
|
|
305
|
+
nodes: () => [...nodes.entries()].map(([path, n]) => {
|
|
306
|
+
// `transformed` is the node or any ancestor: a child of a turned box
|
|
307
|
+
// is turned with it, and its bounding rect is the turned one.
|
|
308
|
+
let px = 0, py = 0, transformed = false;
|
|
309
|
+
for (let c = n; c; c = c.parent ? nodes.get(c.parent) : null) {
|
|
310
|
+
px += c.x; py += c.y;
|
|
311
|
+
if (c.transformed) transformed = true;
|
|
312
|
+
const p = c.parent ? nodes.get(c.parent) : null;
|
|
313
|
+
if (p) { px -= p.sx; py -= p.sy; }
|
|
314
|
+
}
|
|
315
|
+
return { path, el: n.el, px, py, w: n.w, h: n.h, born: n.born, transformed };
|
|
316
|
+
}),
|
|
317
|
+
};
|
|
318
|
+
}
|