ranger-compiler 3.5.0 → 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 +1160 -19
- package/LICENSE +3 -1
- package/README.md +124 -29
- package/dist/Lang.rgr +1188 -290
- package/dist/api.d.ts +2343 -879
- package/dist/api.js +79924 -56922
- 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,236 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; ==============================================================================
|
|
4
|
+
; EVGViewportUnitTest — `vh` is the page, not the parent
|
|
5
|
+
; ==============================================================================
|
|
6
|
+
;
|
|
7
|
+
; This file exists because of an Android emulator. `gallery/ui/demo`'s dashboard
|
|
8
|
+
; stated `height: 1420px` on its page, its sidebar and the hairline between
|
|
9
|
+
; them — the height the page was before it scrolled, kept because every window
|
|
10
|
+
; it had been shown in was shorter than that and a column taller than the
|
|
11
|
+
; window looks full. A tablet in portrait is 2137 page pixels tall, and the
|
|
12
|
+
; sidebar stopped two thirds of the way down.
|
|
13
|
+
;
|
|
14
|
+
; `height: 100%` does not fix that on its own: a percentage needs a parent with
|
|
15
|
+
; a definite height, and the page's own height is exactly the number nobody in
|
|
16
|
+
; the tree has. The layout has it — `EVGLayout.pageWidth` / `pageHeight`, which
|
|
17
|
+
; every host sets — so `vw` and `vh` are that number, spelled the way CSS
|
|
18
|
+
; spells it.
|
|
19
|
+
;
|
|
20
|
+
; TWO THINGS ARE WORTH CHECKING and only one of them is arithmetic.
|
|
21
|
+
;
|
|
22
|
+
; The first is that a viewport length ignores its parent. That is the whole
|
|
23
|
+
; difference from `%`, it is invisible on a root element (where the parent IS
|
|
24
|
+
; the page), and it is the thing a "just resolve it like a percentage"
|
|
25
|
+
; implementation gets wrong.
|
|
26
|
+
;
|
|
27
|
+
; The second is what `vh` means ON PAPER. CSS says viewport-percentage lengths
|
|
28
|
+
; are relative to the PAGE AREA in paged media — the sheet less its margins —
|
|
29
|
+
; and the print renderers already hand the layout exactly that as its page
|
|
30
|
+
; size: `EVGPDFRenderer` sets `layout.pageHeight` to the section height less
|
|
31
|
+
; two margins before laying a page out. So the rule needs no print-specific
|
|
32
|
+
; code at all, and the case below is here to say that it stays that way.
|
|
33
|
+
; ==============================================================================
|
|
34
|
+
|
|
35
|
+
Import "EVGElement.rgr"
|
|
36
|
+
Import "EVGUnit.rgr"
|
|
37
|
+
Import "EVGBox.rgr"
|
|
38
|
+
Import "EVGStyleSheet.rgr"
|
|
39
|
+
Import "EVGLayout.rgr"
|
|
40
|
+
|
|
41
|
+
class VpCheck {
|
|
42
|
+
def passed:int 0
|
|
43
|
+
def failed:int 0
|
|
44
|
+
|
|
45
|
+
fn ok:void (name:string cond:boolean) {
|
|
46
|
+
if cond {
|
|
47
|
+
passed = (passed + 1)
|
|
48
|
+
print (" PASS " + name)
|
|
49
|
+
} {
|
|
50
|
+
failed = (failed + 1)
|
|
51
|
+
print (" FAIL " + name)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
fn eqStr:void (name:string got:string want:string) {
|
|
56
|
+
def good:boolean (got == want)
|
|
57
|
+
if (good == false) {
|
|
58
|
+
print (" got '" + got + "' want '" + want + "'")
|
|
59
|
+
}
|
|
60
|
+
this.ok(name good)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
fn eqNum:void (name:string got:double want:double) {
|
|
64
|
+
def good:boolean (((got - want) < 0.01) && ((want - got) < 0.01))
|
|
65
|
+
if (good == false) {
|
|
66
|
+
print (" got " + (to_string got) + " want " + (to_string want))
|
|
67
|
+
}
|
|
68
|
+
this.ok(name good)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
class EVGViewportUnitTest {
|
|
73
|
+
|
|
74
|
+
; --- the parse ------------------------------------------------------------
|
|
75
|
+
|
|
76
|
+
sfn testParse:void (c:VpCheck) {
|
|
77
|
+
print "--- what the parser makes of them ---"
|
|
78
|
+
def vh:EVGUnit (EVGUnit.parse("100vh"))
|
|
79
|
+
c.ok("100vh is set" vh.isSet)
|
|
80
|
+
c.ok("and it is a viewport length" (vh.isViewport()))
|
|
81
|
+
c.eqNum("carrying its number" vh.value 100.0)
|
|
82
|
+
c.eqStr("and it prints as it was written" (vh.toString()) "100vh")
|
|
83
|
+
|
|
84
|
+
def vw:EVGUnit (EVGUnit.parse("50vw"))
|
|
85
|
+
c.ok("50vw too" (vw.isViewport()))
|
|
86
|
+
c.eqStr("and prints its own suffix" (vw.toString()) "50vw")
|
|
87
|
+
|
|
88
|
+
; A fraction, because a segmented control is a third of something.
|
|
89
|
+
def third:EVGUnit (EVGUnit.parse("33.5vh"))
|
|
90
|
+
c.eqNum("a fractional one keeps its fraction" third.value 33.5)
|
|
91
|
+
|
|
92
|
+
; The guard the file was written around: an unknown suffix must not
|
|
93
|
+
; fall through to the bare-number path. `vmin` is deliberately not
|
|
94
|
+
; supported, so it has to come out unset rather than 10 pixels.
|
|
95
|
+
def vmin:EVGUnit (EVGUnit.parse("10vmin"))
|
|
96
|
+
c.ok("an unsupported v-unit stays unset" (vmin.isSet == false))
|
|
97
|
+
c.eqNum("and is not quietly ten pixels" vmin.pixels 0.0)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
; --- the arithmetic -------------------------------------------------------
|
|
101
|
+
|
|
102
|
+
sfn testResolve:void (c:VpCheck) {
|
|
103
|
+
print "--- the numbers ---"
|
|
104
|
+
def h:EVGUnit (EVGUnit.parse("50vh"))
|
|
105
|
+
h.setContext(14.0 1000.0 600.0)
|
|
106
|
+
h.resolve(200.0 14.0)
|
|
107
|
+
c.eqNum("50vh of a 600-tall viewport is 300" h.pixels 300.0)
|
|
108
|
+
|
|
109
|
+
def w:EVGUnit (EVGUnit.parse("25vw"))
|
|
110
|
+
w.setContext(14.0 1000.0 600.0)
|
|
111
|
+
w.resolve(200.0 14.0)
|
|
112
|
+
c.eqNum("25vw of a 1000-wide one is 250" w.pixels 250.0)
|
|
113
|
+
|
|
114
|
+
; The parent is 200 in both calls above and neither answer is 100 or
|
|
115
|
+
; 50, which is the whole claim.
|
|
116
|
+
def pct:EVGUnit (EVGUnit.parse("50%"))
|
|
117
|
+
pct.resolve(200.0 14.0)
|
|
118
|
+
c.eqNum("where 50% of the same parent is 100" pct.pixels 100.0)
|
|
119
|
+
|
|
120
|
+
; Height resolution has its own entry point, and it delegates rather
|
|
121
|
+
; than reimplementing — this is the check that it kept delegating.
|
|
122
|
+
def hh:EVGUnit (EVGUnit.parse("100vh"))
|
|
123
|
+
hh.setContext(14.0 1000.0 600.0)
|
|
124
|
+
hh.resolveForHeight(200.0 320.0 14.0)
|
|
125
|
+
c.eqNum("and on the height property it is still the viewport" hh.pixels 600.0)
|
|
126
|
+
|
|
127
|
+
; No viewport handed over: zero, not the parent. A silent fallback is
|
|
128
|
+
; what makes `100vh` mean two different things in two places.
|
|
129
|
+
def orphan:EVGUnit (EVGUnit.parse("100vh"))
|
|
130
|
+
orphan.resolve(480.0 14.0)
|
|
131
|
+
c.eqNum("with no viewport it is zero rather than the parent" orphan.pixels 0.0)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
; --- through a layout -----------------------------------------------------
|
|
135
|
+
|
|
136
|
+
sfn sheet:EVGStyleSheet (css:string) {
|
|
137
|
+
def s (new EVGStyleSheet())
|
|
138
|
+
s.parse(css)
|
|
139
|
+
return s
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
sfn testLaidOut:void (c:VpCheck) {
|
|
143
|
+
print "--- through a real layout ---"
|
|
144
|
+
def css:string ".page { display: flex; flex-direction: column; }
|
|
145
|
+
.band { height: 50vh; width: 25vw; overflow: hidden; }
|
|
146
|
+
.inner { height: 100vh; }
|
|
147
|
+
.padded { padding: 5vh; height: 10vh; }"
|
|
148
|
+
def s:EVGStyleSheet (EVGViewportUnitTest.sheet(css))
|
|
149
|
+
|
|
150
|
+
def page:EVGElement (EVGElement.createDiv())
|
|
151
|
+
page.className = "page"
|
|
152
|
+
def band:EVGElement (EVGElement.createDiv())
|
|
153
|
+
band.className = "band"
|
|
154
|
+
; NESTED, and this is the case that separates a viewport length from a
|
|
155
|
+
; percentage: `inner` sits in a box 300 tall and asks for 100vh, which
|
|
156
|
+
; is the page's 600 and not its parent's 300.
|
|
157
|
+
def inner:EVGElement (EVGElement.createDiv())
|
|
158
|
+
inner.className = "inner"
|
|
159
|
+
def padded:EVGElement (EVGElement.createDiv())
|
|
160
|
+
padded.className = "padded"
|
|
161
|
+
band.addChild(inner)
|
|
162
|
+
page.addChild(band)
|
|
163
|
+
page.addChild(padded)
|
|
164
|
+
s.applyTree(page "")
|
|
165
|
+
|
|
166
|
+
def lay (new EVGLayout())
|
|
167
|
+
lay.setPageSize(800.0 600.0)
|
|
168
|
+
lay.layout(page)
|
|
169
|
+
|
|
170
|
+
c.eqNum("50vh is half the page's height" band.calculatedHeight 300.0)
|
|
171
|
+
c.eqNum("25vw is a quarter of its width" band.calculatedWidth 200.0)
|
|
172
|
+
; The unit first, because that is the claim: 100vh inside a 300-tall
|
|
173
|
+
; box is 600. What the layout then DOES with a child taller than its
|
|
174
|
+
; parent is a separate question with a separate answer — a flex item
|
|
175
|
+
; shrinks, a clip box keeps it — so the box is checked under
|
|
176
|
+
; `overflow: hidden`, which is the arrangement the ui gallery's scroll
|
|
177
|
+
; container is built on.
|
|
178
|
+
c.eqNum("a nested 100vh resolves to the PAGE, not the 300 it sits in"
|
|
179
|
+
inner.height.pixels 600.0)
|
|
180
|
+
c.eqNum("and inside a clip box it keeps that height"
|
|
181
|
+
inner.calculatedHeight 600.0)
|
|
182
|
+
; Box lengths take the same context — a `padding: 5vh` that resolved to
|
|
183
|
+
; zero would be the same bug one layer down.
|
|
184
|
+
c.eqNum("padding in vh resolves too" padded.box.paddingTopPx 30.0)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
; --- and on paper ---------------------------------------------------------
|
|
188
|
+
|
|
189
|
+
sfn testPageArea:void (c:VpCheck) {
|
|
190
|
+
print "--- on paper it is the page area ---"
|
|
191
|
+
; A4 at 72dpi with a 40pt margin all round, which is what the print
|
|
192
|
+
; renderers compute before they lay a page out: they set the layout's
|
|
193
|
+
; page size to the section less two margins and then lay the Page
|
|
194
|
+
; element out inside it. So this is not a special case in the unit, it
|
|
195
|
+
; is the same rule reading a different page size.
|
|
196
|
+
def paperW:double 595.0
|
|
197
|
+
def paperH:double 842.0
|
|
198
|
+
def margin:double 40.0
|
|
199
|
+
def areaW:double (paperW - (margin * 2.0))
|
|
200
|
+
def areaH:double (paperH - (margin * 2.0))
|
|
201
|
+
|
|
202
|
+
def s:EVGStyleSheet (EVGViewportUnitTest.sheet(".sheet { display: flex; flex-direction: column; }
|
|
203
|
+
.full { height: 100vh; width: 100vw; }"))
|
|
204
|
+
def sheetEl:EVGElement (EVGElement.createDiv())
|
|
205
|
+
sheetEl.className = "sheet"
|
|
206
|
+
def full:EVGElement (EVGElement.createDiv())
|
|
207
|
+
full.className = "full"
|
|
208
|
+
sheetEl.addChild(full)
|
|
209
|
+
s.applyTree(sheetEl "")
|
|
210
|
+
|
|
211
|
+
def lay (new EVGLayout())
|
|
212
|
+
lay.setPageSize(areaW areaH)
|
|
213
|
+
lay.layout(sheetEl)
|
|
214
|
+
|
|
215
|
+
c.eqNum("100vh is the text column, not the sheet" full.calculatedHeight areaH)
|
|
216
|
+
c.eqNum("and 100vw is its width" full.calculatedWidth areaW)
|
|
217
|
+
c.ok("which is the paper less two margins"
|
|
218
|
+
((areaH == (paperH - 80.0)) && (areaW == (paperW - 80.0))))
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
sfn main:void () {
|
|
222
|
+
def c (new VpCheck())
|
|
223
|
+
print "=== EVG viewport units: vw and vh ==="
|
|
224
|
+
EVGViewportUnitTest.testParse(c)
|
|
225
|
+
EVGViewportUnitTest.testResolve(c)
|
|
226
|
+
EVGViewportUnitTest.testLaidOut(c)
|
|
227
|
+
EVGViewportUnitTest.testPageArea(c)
|
|
228
|
+
print ""
|
|
229
|
+
print ("passed=" + (to_string c.passed) + " failed=" + (to_string c.failed))
|
|
230
|
+
if (c.failed > 0) {
|
|
231
|
+
print "FAILURES"
|
|
232
|
+
} {
|
|
233
|
+
print "ALL PASS"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
; ==============================================================================
|
|
3
|
+
; EvgApp.rgr — what a host may ask of any EVG application.
|
|
4
|
+
; ==============================================================================
|
|
5
|
+
;
|
|
6
|
+
; PLAN_WEB_LOADING.md S8. Every Ranger application that draws through EVG is
|
|
7
|
+
; driven the same way: it is given a page size and a pointer kind, it is asked
|
|
8
|
+
; what is under a coordinate, it is told about presses, hovers, scrolls, keys
|
|
9
|
+
; and the passing of time, and it hands back a display list. Four hosts —
|
|
10
|
+
; a browser page, a UIKit view, an Android View, and whatever comes next —
|
|
11
|
+
; have each written that conversation out against one concrete app class.
|
|
12
|
+
;
|
|
13
|
+
; This is the conversation, named. An app extends it, overrides what it
|
|
14
|
+
; answers, and is then drivable by a host that has never heard of it; a host
|
|
15
|
+
; holds an `EvgApp` and works for every app rather than for one.
|
|
16
|
+
;
|
|
17
|
+
; THE DEFAULTS ARE NOT PLACEHOLDERS. They are what an app that does not do a
|
|
18
|
+
; thing should do when asked: nothing happened, nothing is under the point,
|
|
19
|
+
; the list is empty. A host may call anything on any app without asking first
|
|
20
|
+
; whether it is the kind of app that answers.
|
|
21
|
+
;
|
|
22
|
+
; What is NOT here is anything an app is free to invent: how it is loaded,
|
|
23
|
+
; what data it takes, what its routes are called. `init` is deliberately
|
|
24
|
+
; absent for the same reason — one app takes a stylesheet and a document,
|
|
25
|
+
; another takes neither, and a base class that guessed would be a base class
|
|
26
|
+
; every app had to work around.
|
|
27
|
+
|
|
28
|
+
Import "EVGDisplayList.rgr"
|
|
29
|
+
|
|
30
|
+
class EvgApp {
|
|
31
|
+
|
|
32
|
+
; --- the frame ------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
; The display list as it stands. A host paints this and asks for nothing
|
|
35
|
+
; else; it is the whole of what is on the screen.
|
|
36
|
+
fn display:EVGDisplayList () {
|
|
37
|
+
def empty (new EVGDisplayList())
|
|
38
|
+
return empty
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
; Time passed. True means something moved and the host should paint —
|
|
42
|
+
; an animation, a fling, a transition — so a host that gets false may
|
|
43
|
+
; leave the last frame where it is.
|
|
44
|
+
fn tick:boolean (dtMs:double) {
|
|
45
|
+
return false
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
; Lay the page out again from the tree it has. A host calls this when
|
|
49
|
+
; something it owns changed under the app: a font arrived, a chunk landed.
|
|
50
|
+
fn rebuild:void () {
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
; --- the surface ----------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
fn setPageSize:void (w:double h:double) {
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
fn widthPx:double () {
|
|
59
|
+
return 0.0
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
fn heightPx:double () {
|
|
63
|
+
return 0.0
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
; A finger rather than a mouse, as the host reports it. A stylesheet's
|
|
67
|
+
; `(pointer: coarse)` block answers for the size of the targets.
|
|
68
|
+
fn setPointerCoarse:void (c:boolean) {
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
; --- the pointer ----------------------------------------------------------
|
|
72
|
+
|
|
73
|
+
; What is under a page point, as an element id, or "" for nothing. This is
|
|
74
|
+
; the app's own hit test: a host resolves a coordinate by asking, never by
|
|
75
|
+
; keeping a copy of the layout.
|
|
76
|
+
fn hitId:string (px:double py:double) {
|
|
77
|
+
return ""
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
fn press:boolean (id:string) {
|
|
81
|
+
return false
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
fn setHover:void (id:string) {
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
; What the app believes is hovered. A host needs it to tell a move that
|
|
88
|
+
; changed something from a move that did not, and it asks rather than
|
|
89
|
+
; reading a field: a field is a coupling to one app, a question is not.
|
|
90
|
+
fn hoveredId:string () {
|
|
91
|
+
return ""
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
fn setPressed:void (id:string) {
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
fn setFocus:void (id:string) {
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
; --- scrolling ------------------------------------------------------------
|
|
101
|
+
;
|
|
102
|
+
; The document's own scroll, and the scrollbar's thumb as a separate
|
|
103
|
+
; gesture. `dtMs` is what makes a throw the same throw on every platform:
|
|
104
|
+
; the velocity is measured from the host's real clock rather than from an
|
|
105
|
+
; assumed frame rate.
|
|
106
|
+
|
|
107
|
+
fn scrollDrag:boolean (dy:double dtMs:double) {
|
|
108
|
+
return false
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
fn scrollRelease:boolean () {
|
|
112
|
+
return false
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
fn scrollHalt:void () {
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
fn scrollbarGrab:boolean (px:double py:double) {
|
|
119
|
+
return false
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
fn scrollbarDrag:boolean (py:double) {
|
|
123
|
+
return false
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
fn scrollbarRelease:boolean () {
|
|
127
|
+
return false
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
fn scrollbarHover:boolean (px:double py:double) {
|
|
131
|
+
return false
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
fn overScrollbar:boolean () {
|
|
135
|
+
return false
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
; --- text -----------------------------------------------------------------
|
|
139
|
+
;
|
|
140
|
+
; A host owns the keyboard and the app owns the caret: what crosses is
|
|
141
|
+
; text and named keys, never a key code.
|
|
142
|
+
|
|
143
|
+
fn typeText:boolean (text:string) {
|
|
144
|
+
return false
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
fn keyWith:boolean (k:string shift:boolean ctrl:boolean) {
|
|
148
|
+
return false
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
fn hasField:boolean (tid:string) {
|
|
152
|
+
return false
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
; The focused field's text, selection and kind, as JSON — what a native
|
|
156
|
+
; text input needs to agree with the app about what is being edited.
|
|
157
|
+
fn fieldStateJson:string (tid:string) {
|
|
158
|
+
return ""
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
fn focusedField:string () {
|
|
162
|
+
return ""
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
; --- where the app is -----------------------------------------------------
|
|
166
|
+
|
|
167
|
+
fn openRoute:boolean (route:string) {
|
|
168
|
+
return false
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
; What the app calls the screen it is on. Hosts show it in a status line
|
|
172
|
+
; and checks assert on it.
|
|
173
|
+
fn sceneName:string () {
|
|
174
|
+
return ""
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
; --- what went wrong ------------------------------------------------------
|
|
178
|
+
;
|
|
179
|
+
; A stylesheet that did not parse is not a crash and must not be silent:
|
|
180
|
+
; the app keeps the complaints and a host decides whether to show them.
|
|
181
|
+
|
|
182
|
+
fn styleErrorCount:int () {
|
|
183
|
+
return 0
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
fn styleErrorAt:string (i:int) {
|
|
187
|
+
return ""
|
|
188
|
+
}
|
|
189
|
+
}
|