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,730 @@
|
|
|
1
|
+
//! Grid layout: `grid-template-columns` / `-rows` (px, %, fr, auto,
|
|
2
|
+
//! `minmax()`, `fit-content()`, `repeat(n, …)`, `repeat(auto-fit | auto-fill,
|
|
3
|
+
//! …)`), placement by line numbers, `span`, `grid-template-areas` and
|
|
4
|
+
//! `grid-area`, auto placement row by row (`dense` backfills), and the gaps.
|
|
5
|
+
|
|
6
|
+
use ranger::prelude::*;
|
|
7
|
+
|
|
8
|
+
use crate::style;
|
|
9
|
+
use crate::EvgrTree;
|
|
10
|
+
|
|
11
|
+
/// One track of a template.
|
|
12
|
+
#[derive(Clone, Copy)]
|
|
13
|
+
pub struct Track {
|
|
14
|
+
/// 0 px, 1 percent, 2 fr, 3 auto, 4 minmax(px, fr), 5 fit-content(px),
|
|
15
|
+
/// 6 minmax(px, px)
|
|
16
|
+
pub kind: int,
|
|
17
|
+
pub a: double,
|
|
18
|
+
pub b: double,
|
|
19
|
+
/// a track repeated by auto-fit, which collapses when nothing is in it
|
|
20
|
+
pub fit: bool,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/// The pieces of a track list at the top level: `repeat(3, 1fr) 100px` is
|
|
24
|
+
/// two, the commas and spaces inside the parentheses kept.
|
|
25
|
+
fn top_level(list: &str) -> Vec<String> {
|
|
26
|
+
let mut out: Vec<String> = Vec::new();
|
|
27
|
+
let mut cur = String::new();
|
|
28
|
+
let mut depth = 0;
|
|
29
|
+
for c in list.chars() {
|
|
30
|
+
if c == '(' {
|
|
31
|
+
depth += 1;
|
|
32
|
+
}
|
|
33
|
+
if c == ')' {
|
|
34
|
+
depth -= 1;
|
|
35
|
+
}
|
|
36
|
+
if (c == ' ' || c == '\t' || c == '\n') && depth == 0 {
|
|
37
|
+
if !cur.is_empty() {
|
|
38
|
+
out.push(cur.clone());
|
|
39
|
+
cur = String::new();
|
|
40
|
+
}
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
cur.push(c);
|
|
44
|
+
}
|
|
45
|
+
if !cur.is_empty() {
|
|
46
|
+
out.push(cur);
|
|
47
|
+
}
|
|
48
|
+
out
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// `name(args)` -> the args, or "" when `t` is not a call of `name`.
|
|
52
|
+
fn call_args(t: &str, name: &str) -> String {
|
|
53
|
+
let head = format!("{}(", name);
|
|
54
|
+
if t.starts_with(&head) && t.ends_with(")") {
|
|
55
|
+
let n = head.as_bytes().len();
|
|
56
|
+
return t[n..t.as_bytes().len() - 1].to_string();
|
|
57
|
+
}
|
|
58
|
+
String::new()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
fn one_track(t: &str) -> Track {
|
|
62
|
+
let mm = call_args(t, "minmax");
|
|
63
|
+
if !mm.is_empty() {
|
|
64
|
+
let parts: Vec<&str> = mm.split(',').collect();
|
|
65
|
+
let lo = parts[0].trim();
|
|
66
|
+
let hi = if parts.len() > 1 { parts[1].trim() } else { "auto" };
|
|
67
|
+
let lo_px = if lo == "auto" || lo.ends_with("content") { 0.0 } else { style::parse_len(lo).resolve(0.0).max(0.0) };
|
|
68
|
+
if hi.ends_with("fr") {
|
|
69
|
+
return Track { kind: 4, a: lo_px, b: style::number(&hi[..hi.as_bytes().len() - 2]), fit: false };
|
|
70
|
+
}
|
|
71
|
+
if hi == "auto" || hi.ends_with("content") {
|
|
72
|
+
return Track { kind: 3, a: lo_px, b: 0.0, fit: false };
|
|
73
|
+
}
|
|
74
|
+
return Track { kind: 6, a: lo_px, b: style::parse_len(hi).resolve(0.0), fit: false };
|
|
75
|
+
}
|
|
76
|
+
let fc = call_args(t, "fit-content");
|
|
77
|
+
if !fc.is_empty() {
|
|
78
|
+
return Track { kind: 5, a: style::parse_len(&fc).resolve(0.0), b: 0.0, fit: false };
|
|
79
|
+
}
|
|
80
|
+
if t.ends_with("fr") {
|
|
81
|
+
return Track { kind: 2, a: style::number(&t[..t.as_bytes().len() - 2]), b: 0.0, fit: false };
|
|
82
|
+
}
|
|
83
|
+
if t == "auto" || t.ends_with("content") {
|
|
84
|
+
return Track { kind: 3, a: 0.0, b: 0.0, fit: false };
|
|
85
|
+
}
|
|
86
|
+
if t.ends_with("%") {
|
|
87
|
+
return Track { kind: 1, a: style::number(&t[..t.as_bytes().len() - 1]), b: 0.0, fit: false };
|
|
88
|
+
}
|
|
89
|
+
Track { kind: 0, a: style::parse_len(t).resolve(0.0).max(0.0), b: 0.0, fit: false }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/// The smallest a track can be, for counting auto-fill repetitions.
|
|
93
|
+
fn track_min(t: &Track) -> double {
|
|
94
|
+
if t.kind == 0 || t.kind == 4 || t.kind == 6 {
|
|
95
|
+
return t.a;
|
|
96
|
+
}
|
|
97
|
+
0.0
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// A template, with `repeat()` expanded. `avail` is the container's inner
|
|
101
|
+
/// size (-1.0 unknown), which auto-fit / auto-fill need.
|
|
102
|
+
pub fn parse_tracks(list: &str, avail: double, gap: double) -> Vec<Track> {
|
|
103
|
+
let mut out: Vec<Track> = Vec::new();
|
|
104
|
+
if list.trim().is_empty() || list.trim() == "none" {
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
for piece in top_level(list) {
|
|
108
|
+
let rep = call_args(&piece, "repeat");
|
|
109
|
+
if rep.is_empty() {
|
|
110
|
+
out.push(one_track(&piece));
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
let comma = rep.find(',').unwrap_or(0);
|
|
114
|
+
let count_s = rep[..comma].trim().to_string();
|
|
115
|
+
let inner = rep[comma + 1..].trim().to_string();
|
|
116
|
+
let tracks = top_level(&inner);
|
|
117
|
+
let mut group: Vec<Track> = Vec::new();
|
|
118
|
+
for t in &tracks {
|
|
119
|
+
group.push(one_track(t));
|
|
120
|
+
}
|
|
121
|
+
let mut times = 1;
|
|
122
|
+
let auto_fit = count_s == "auto-fit";
|
|
123
|
+
if count_s == "auto-fit" || count_s == "auto-fill" {
|
|
124
|
+
let mut unit = 0.0;
|
|
125
|
+
for g in &group {
|
|
126
|
+
unit += track_min(g);
|
|
127
|
+
}
|
|
128
|
+
let per = unit + gap * (group.len() as double);
|
|
129
|
+
if avail > 0.0 && per > 0.0 {
|
|
130
|
+
times = (((avail + gap) / per).floor()) as int;
|
|
131
|
+
}
|
|
132
|
+
if times < 1 {
|
|
133
|
+
times = 1;
|
|
134
|
+
}
|
|
135
|
+
} else {
|
|
136
|
+
times = style::number(&count_s) as int;
|
|
137
|
+
}
|
|
138
|
+
let mut k = 0;
|
|
139
|
+
while k < times {
|
|
140
|
+
for g in &group {
|
|
141
|
+
let mut t = *g;
|
|
142
|
+
t.fit = auto_fit;
|
|
143
|
+
out.push(t);
|
|
144
|
+
}
|
|
145
|
+
k += 1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
out
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/// The named areas of `grid-template-areas`: for each name, its rows and
|
|
152
|
+
/// columns (0-based, end exclusive), in `names` order.
|
|
153
|
+
pub struct Areas {
|
|
154
|
+
pub names: Vec<String>,
|
|
155
|
+
pub r0: Vec<int>,
|
|
156
|
+
pub r1: Vec<int>,
|
|
157
|
+
pub c0: Vec<int>,
|
|
158
|
+
pub c1: Vec<int>,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
pub fn parse_areas(v: &str) -> Areas {
|
|
162
|
+
let mut a = Areas { names: Vec::new(), r0: Vec::new(), r1: Vec::new(), c0: Vec::new(), c1: Vec::new() };
|
|
163
|
+
let mut row = 0;
|
|
164
|
+
for chunk in v.split('"') {
|
|
165
|
+
let line = chunk.trim();
|
|
166
|
+
if line.is_empty() {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
let mut col = 0;
|
|
170
|
+
for name in line.split_whitespace() {
|
|
171
|
+
if name != "." {
|
|
172
|
+
let mut found = -1;
|
|
173
|
+
let mut i = 0;
|
|
174
|
+
while i < a.names.len() {
|
|
175
|
+
if a.names[i] == name {
|
|
176
|
+
found = i as int;
|
|
177
|
+
}
|
|
178
|
+
i += 1;
|
|
179
|
+
}
|
|
180
|
+
if found < 0 {
|
|
181
|
+
a.names.push(name.to_string());
|
|
182
|
+
a.r0.push(row);
|
|
183
|
+
a.r1.push(row + 1);
|
|
184
|
+
a.c0.push(col);
|
|
185
|
+
a.c1.push(col + 1);
|
|
186
|
+
} else {
|
|
187
|
+
let f = found as usize;
|
|
188
|
+
if row + 1 > a.r1[f] {
|
|
189
|
+
a.r1[f] = row + 1;
|
|
190
|
+
}
|
|
191
|
+
if col + 1 > a.c1[f] {
|
|
192
|
+
a.c1[f] = col + 1;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
col += 1;
|
|
197
|
+
}
|
|
198
|
+
row += 1;
|
|
199
|
+
}
|
|
200
|
+
a
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/// `grid-column` / `grid-row`: (start line 0-based or -1 auto, span).
|
|
204
|
+
fn parse_line(v: &str) -> (int, int) {
|
|
205
|
+
let t = v.trim();
|
|
206
|
+
if t.is_empty() || t == "auto" {
|
|
207
|
+
return (-1, 1);
|
|
208
|
+
}
|
|
209
|
+
let parts: Vec<&str> = t.split('/').collect();
|
|
210
|
+
let a = parts[0].trim();
|
|
211
|
+
let b = if parts.len() > 1 { parts[1].trim() } else { "" };
|
|
212
|
+
let mut start: int = -1;
|
|
213
|
+
let mut span: int = 1;
|
|
214
|
+
if a.starts_with("span") {
|
|
215
|
+
span = style::number(&a[4..]) as int;
|
|
216
|
+
} else if a != "auto" {
|
|
217
|
+
start = (style::number(a) as int) - 1;
|
|
218
|
+
}
|
|
219
|
+
if !b.is_empty() && b != "auto" {
|
|
220
|
+
if b.starts_with("span") {
|
|
221
|
+
span = style::number(&b[4..]) as int;
|
|
222
|
+
} else {
|
|
223
|
+
let end = (style::number(b) as int) - 1;
|
|
224
|
+
if start >= 0 && end > start {
|
|
225
|
+
span = end - start;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if span < 1 {
|
|
230
|
+
span = 1;
|
|
231
|
+
}
|
|
232
|
+
(start, span)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
impl EvgrTree {
|
|
236
|
+
/// Lays out the items of grid container `c` in its content box; answers
|
|
237
|
+
/// the content height.
|
|
238
|
+
pub fn layout_grid(&mut self, c: int, iw: double, ih: double) -> double {
|
|
239
|
+
let cu = c as usize;
|
|
240
|
+
let col_gap = self.nodes[cu].col_gap;
|
|
241
|
+
let row_gap = self.nodes[cu].row_gap;
|
|
242
|
+
let cols_spec = self.nodes[cu].grid_cols.clone();
|
|
243
|
+
let rows_spec = self.nodes[cu].grid_rows.clone();
|
|
244
|
+
let mut cols = parse_tracks(&cols_spec, iw, col_gap);
|
|
245
|
+
let mut rows = parse_tracks(&rows_spec, ih, row_gap);
|
|
246
|
+
let areas = parse_areas(&self.nodes[cu].grid_areas.clone());
|
|
247
|
+
if cols.is_empty() {
|
|
248
|
+
let mut na = 0;
|
|
249
|
+
for c1 in &areas.c1 {
|
|
250
|
+
if *c1 > na {
|
|
251
|
+
na = *c1;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
let mut k = 0;
|
|
255
|
+
while k < na.max(1) {
|
|
256
|
+
cols.push(Track { kind: 3, a: 0.0, b: 0.0, fit: false });
|
|
257
|
+
k += 1;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
let kids = self.nodes[cu].children.clone();
|
|
261
|
+
let mut items: Vec<int> = Vec::new();
|
|
262
|
+
for k in &kids {
|
|
263
|
+
self.nodes[*k as usize].resolve_pads(iw);
|
|
264
|
+
if self.in_flow(*k) {
|
|
265
|
+
items.push(*k);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// placement
|
|
269
|
+
let n = items.len();
|
|
270
|
+
let mut r0: Vec<int> = Vec::new();
|
|
271
|
+
let mut rs: Vec<int> = Vec::new();
|
|
272
|
+
let mut c0: Vec<int> = Vec::new();
|
|
273
|
+
let mut cs: Vec<int> = Vec::new();
|
|
274
|
+
let mut ncols = cols.len() as int;
|
|
275
|
+
for k in &items {
|
|
276
|
+
let ku = *k as usize;
|
|
277
|
+
let area = self.nodes[ku].grid_area.clone();
|
|
278
|
+
let mut placed = false;
|
|
279
|
+
if !area.is_empty() && !area.contains('/') {
|
|
280
|
+
let mut i = 0;
|
|
281
|
+
while i < areas.names.len() {
|
|
282
|
+
if areas.names[i] == area.trim() {
|
|
283
|
+
r0.push(areas.r0[i]);
|
|
284
|
+
rs.push(areas.r1[i] - areas.r0[i]);
|
|
285
|
+
c0.push(areas.c0[i]);
|
|
286
|
+
cs.push(areas.c1[i] - areas.c0[i]);
|
|
287
|
+
placed = true;
|
|
288
|
+
}
|
|
289
|
+
i += 1;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if !placed {
|
|
293
|
+
let mut col_v = self.nodes[ku].grid_column.clone();
|
|
294
|
+
let mut row_v = self.nodes[ku].grid_row.clone();
|
|
295
|
+
if area.contains('/') {
|
|
296
|
+
// row-start / column-start / row-end / column-end
|
|
297
|
+
let p: Vec<&str> = area.split('/').collect();
|
|
298
|
+
row_v = p[0].trim().to_string();
|
|
299
|
+
if p.len() > 2 {
|
|
300
|
+
row_v = format!("{} / {}", p[0].trim(), p[2].trim());
|
|
301
|
+
}
|
|
302
|
+
if p.len() > 1 {
|
|
303
|
+
col_v = p[1].trim().to_string();
|
|
304
|
+
}
|
|
305
|
+
if p.len() > 3 {
|
|
306
|
+
col_v = format!("{} / {}", p[1].trim(), p[3].trim());
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
let (cs0, csp) = parse_line(&col_v);
|
|
310
|
+
let (rs0, rsp) = parse_line(&row_v);
|
|
311
|
+
r0.push(rs0);
|
|
312
|
+
rs.push(rsp);
|
|
313
|
+
c0.push(cs0);
|
|
314
|
+
cs.push(csp);
|
|
315
|
+
}
|
|
316
|
+
let last = c0.len() - 1;
|
|
317
|
+
if c0[last] >= 0 && c0[last] + cs[last] > ncols {
|
|
318
|
+
ncols = c0[last] + cs[last];
|
|
319
|
+
}
|
|
320
|
+
if cs[last] > ncols {
|
|
321
|
+
ncols = cs[last];
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
while (cols.len() as int) < ncols {
|
|
325
|
+
cols.push(Track { kind: 3, a: 0.0, b: 0.0, fit: false });
|
|
326
|
+
}
|
|
327
|
+
// the occupied cells, row by row, growing as items land
|
|
328
|
+
let dense = self.nodes[cu].grid_dense;
|
|
329
|
+
let mut taken: Vec<bool> = Vec::new();
|
|
330
|
+
let mut nrows: int = 0;
|
|
331
|
+
// explicitly placed items first
|
|
332
|
+
let mut j = 0;
|
|
333
|
+
while j < n {
|
|
334
|
+
if r0[j] >= 0 && c0[j] >= 0 {
|
|
335
|
+
self.mark(&mut taken, &mut nrows, ncols, r0[j], c0[j], rs[j], cs[j]);
|
|
336
|
+
}
|
|
337
|
+
j += 1;
|
|
338
|
+
}
|
|
339
|
+
let mut cur_r: int = 0;
|
|
340
|
+
let mut cur_c: int = 0;
|
|
341
|
+
j = 0;
|
|
342
|
+
while j < n {
|
|
343
|
+
if r0[j] >= 0 && c0[j] >= 0 {
|
|
344
|
+
j += 1;
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
if dense {
|
|
348
|
+
cur_r = 0;
|
|
349
|
+
cur_c = 0;
|
|
350
|
+
}
|
|
351
|
+
if c0[j] >= 0 {
|
|
352
|
+
// a column given, a row found
|
|
353
|
+
let mut rr = if dense { 0 } else { cur_r };
|
|
354
|
+
while !self.fits(&taken, nrows, ncols, rr, c0[j], rs[j], cs[j]) {
|
|
355
|
+
rr += 1;
|
|
356
|
+
}
|
|
357
|
+
r0[j] = rr;
|
|
358
|
+
} else if r0[j] >= 0 {
|
|
359
|
+
let mut cc = 0;
|
|
360
|
+
while cc + cs[j] <= ncols && !self.fits(&taken, nrows, ncols, r0[j], cc, rs[j], cs[j]) {
|
|
361
|
+
cc += 1;
|
|
362
|
+
}
|
|
363
|
+
c0[j] = cc;
|
|
364
|
+
} else {
|
|
365
|
+
let mut rr2 = cur_r;
|
|
366
|
+
let mut cc2 = cur_c;
|
|
367
|
+
let mut searching = true;
|
|
368
|
+
while searching {
|
|
369
|
+
if cc2 + cs[j] > ncols {
|
|
370
|
+
cc2 = 0;
|
|
371
|
+
rr2 += 1;
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
if self.fits(&taken, nrows, ncols, rr2, cc2, rs[j], cs[j]) {
|
|
375
|
+
searching = false;
|
|
376
|
+
} else {
|
|
377
|
+
cc2 += 1;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
r0[j] = rr2;
|
|
381
|
+
c0[j] = cc2;
|
|
382
|
+
cur_r = rr2;
|
|
383
|
+
cur_c = cc2 + cs[j];
|
|
384
|
+
}
|
|
385
|
+
self.mark(&mut taken, &mut nrows, ncols, r0[j], c0[j], rs[j], cs[j]);
|
|
386
|
+
j += 1;
|
|
387
|
+
}
|
|
388
|
+
while (rows.len() as int) < nrows {
|
|
389
|
+
let auto_rows = self.nodes[cu].grid_auto_rows.clone();
|
|
390
|
+
if auto_rows.is_empty() {
|
|
391
|
+
rows.push(Track { kind: 3, a: 0.0, b: 0.0, fit: false });
|
|
392
|
+
} else {
|
|
393
|
+
rows.push(one_track(&auto_rows));
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// column sizes
|
|
397
|
+
let mut used_cols: Vec<bool> = Vec::new();
|
|
398
|
+
let mut k2 = 0;
|
|
399
|
+
while k2 < cols.len() {
|
|
400
|
+
used_cols.push(false);
|
|
401
|
+
k2 += 1;
|
|
402
|
+
}
|
|
403
|
+
j = 0;
|
|
404
|
+
while j < n {
|
|
405
|
+
let mut q = c0[j];
|
|
406
|
+
while q < c0[j] + cs[j] {
|
|
407
|
+
used_cols[q as usize] = true;
|
|
408
|
+
q += 1;
|
|
409
|
+
}
|
|
410
|
+
j += 1;
|
|
411
|
+
}
|
|
412
|
+
let mut col_content: Vec<double> = Vec::new();
|
|
413
|
+
let mut col_min: Vec<double> = Vec::new();
|
|
414
|
+
k2 = 0;
|
|
415
|
+
while k2 < cols.len() {
|
|
416
|
+
col_content.push(0.0);
|
|
417
|
+
col_min.push(0.0);
|
|
418
|
+
k2 += 1;
|
|
419
|
+
}
|
|
420
|
+
j = 0;
|
|
421
|
+
while j < n {
|
|
422
|
+
if cs[j] == 1 {
|
|
423
|
+
let t = cols[c0[j] as usize];
|
|
424
|
+
if t.kind == 3 || t.kind == 5 {
|
|
425
|
+
let k = items[j];
|
|
426
|
+
let mars = self.nodes[k as usize].mar_l + self.nodes[k as usize].mar_r;
|
|
427
|
+
let m = self.max_content_w(k) + mars;
|
|
428
|
+
if m > col_content[c0[j] as usize] {
|
|
429
|
+
col_content[c0[j] as usize] = m;
|
|
430
|
+
}
|
|
431
|
+
let mn = self.min_content_w(k) + mars;
|
|
432
|
+
if mn > col_min[c0[j] as usize] {
|
|
433
|
+
col_min[c0[j] as usize] = mn;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
j += 1;
|
|
438
|
+
}
|
|
439
|
+
let col_w = self.size_tracks(&cols, &used_cols, &col_content, &col_min, iw, col_gap);
|
|
440
|
+
// row sizes: an auto row is as tall as its tallest single-row item at
|
|
441
|
+
// its column width
|
|
442
|
+
let mut row_content: Vec<double> = Vec::new();
|
|
443
|
+
let mut used_rows: Vec<bool> = Vec::new();
|
|
444
|
+
k2 = 0;
|
|
445
|
+
while k2 < rows.len() {
|
|
446
|
+
row_content.push(0.0);
|
|
447
|
+
used_rows.push(true);
|
|
448
|
+
k2 += 1;
|
|
449
|
+
}
|
|
450
|
+
let mut cell_w: Vec<double> = Vec::new();
|
|
451
|
+
j = 0;
|
|
452
|
+
while j < n {
|
|
453
|
+
let w = self.span_size(&col_w, c0[j], cs[j], col_gap);
|
|
454
|
+
cell_w.push(w);
|
|
455
|
+
if rs[j] == 1 {
|
|
456
|
+
let t = rows[r0[j] as usize];
|
|
457
|
+
if t.kind == 3 || t.kind == 5 {
|
|
458
|
+
let k = items[j];
|
|
459
|
+
let spec = self.nodes[k as usize].width.resolve(w);
|
|
460
|
+
let iwk = if spec >= 0.0 { spec } else { w - self.nodes[k as usize].mar_l - self.nodes[k as usize].mar_r };
|
|
461
|
+
let hk = self.height_for(k, iwk.max(0.0)) + self.nodes[k as usize].mar_t + self.nodes[k as usize].mar_b;
|
|
462
|
+
if hk > row_content[r0[j] as usize] {
|
|
463
|
+
row_content[r0[j] as usize] = hk;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
j += 1;
|
|
468
|
+
}
|
|
469
|
+
// auto rows stretch into a container whose height is declared; the
|
|
470
|
+
// height a root takes from the viewport does not stretch them
|
|
471
|
+
let declared = !self.nodes[cu].height.is_auto();
|
|
472
|
+
let row_h = self.size_tracks_rows(&rows, &used_rows, &row_content, ih, row_gap, declared);
|
|
473
|
+
// place, from where each track starts
|
|
474
|
+
let col_at = self.starts(&col_w, col_gap);
|
|
475
|
+
let row_at = self.starts(&row_h, row_gap);
|
|
476
|
+
let x0 = self.nodes[cu].x + self.nodes[cu].pad_l;
|
|
477
|
+
let y0 = self.nodes[cu].y + self.nodes[cu].pad_t;
|
|
478
|
+
j = 0;
|
|
479
|
+
while j < n {
|
|
480
|
+
let k = items[j];
|
|
481
|
+
let ku = k as usize;
|
|
482
|
+
let cx = x0 + col_at[c0[j] as usize];
|
|
483
|
+
let cy = y0 + row_at[r0[j] as usize];
|
|
484
|
+
let cw = cell_w[j];
|
|
485
|
+
let ch = self.span_size(&row_h, r0[j], rs[j], row_gap);
|
|
486
|
+
let mut w = self.nodes[ku].width.resolve(cw);
|
|
487
|
+
if w < 0.0 {
|
|
488
|
+
w = cw - self.nodes[ku].mar_l - self.nodes[ku].mar_r;
|
|
489
|
+
}
|
|
490
|
+
w = self.clamp_w(k, w.max(0.0), cw);
|
|
491
|
+
let mut h = self.nodes[ku].height.resolve(ch);
|
|
492
|
+
if h < 0.0 {
|
|
493
|
+
let al = self.nodes[ku].align_self;
|
|
494
|
+
if al == style::UNSET || al == style::STRETCH {
|
|
495
|
+
h = ch - self.nodes[ku].mar_t - self.nodes[ku].mar_b;
|
|
496
|
+
} else {
|
|
497
|
+
h = self.height_for(k, w);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
h = self.clamp_h(k, h.max(0.0), ch);
|
|
501
|
+
self.place(k, cx + self.nodes[ku].mar_l, cy + self.nodes[ku].mar_t, w, h);
|
|
502
|
+
j += 1;
|
|
503
|
+
}
|
|
504
|
+
let mut total = 0.0;
|
|
505
|
+
let mut count = 0;
|
|
506
|
+
for r in &row_h {
|
|
507
|
+
total += *r;
|
|
508
|
+
count += 1;
|
|
509
|
+
}
|
|
510
|
+
if count > 1 {
|
|
511
|
+
total += row_gap * ((count - 1) as double);
|
|
512
|
+
}
|
|
513
|
+
total
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
fn fits(&self, taken: &Vec<bool>, nrows: int, ncols: int, r: int, c: int, rs: int, cs: int) -> bool {
|
|
517
|
+
if c + cs > ncols {
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
let mut rr = r;
|
|
521
|
+
while rr < r + rs {
|
|
522
|
+
let mut cc = c;
|
|
523
|
+
while cc < c + cs {
|
|
524
|
+
if rr < nrows && taken[(rr * ncols + cc) as usize] {
|
|
525
|
+
return false;
|
|
526
|
+
}
|
|
527
|
+
cc += 1;
|
|
528
|
+
}
|
|
529
|
+
rr += 1;
|
|
530
|
+
}
|
|
531
|
+
true
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
fn mark(&self, taken: &mut Vec<bool>, nrows: &mut int, ncols: int, r: int, c: int, rs: int, cs: int) {
|
|
535
|
+
while *nrows < r + rs {
|
|
536
|
+
let mut k = 0;
|
|
537
|
+
while k < ncols {
|
|
538
|
+
taken.push(false);
|
|
539
|
+
k += 1;
|
|
540
|
+
}
|
|
541
|
+
*nrows += 1;
|
|
542
|
+
}
|
|
543
|
+
let mut rr = r;
|
|
544
|
+
while rr < r + rs {
|
|
545
|
+
let mut cc = c;
|
|
546
|
+
while cc < c + cs && cc < ncols {
|
|
547
|
+
taken[(rr * ncols + cc) as usize] = true;
|
|
548
|
+
cc += 1;
|
|
549
|
+
}
|
|
550
|
+
rr += 1;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/// Where each track starts; a collapsed (empty auto-fit) track takes
|
|
555
|
+
/// no gap.
|
|
556
|
+
fn starts(&self, sizes: &Vec<double>, gap: double) -> Vec<double> {
|
|
557
|
+
let mut out: Vec<double> = Vec::new();
|
|
558
|
+
let mut x = 0.0;
|
|
559
|
+
for s in sizes {
|
|
560
|
+
out.push(x);
|
|
561
|
+
x += *s;
|
|
562
|
+
if *s > 0.0 || gap == 0.0 {
|
|
563
|
+
x += gap;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
out
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
fn span_size(&self, sizes: &Vec<double>, start: int, span: int, gap: double) -> double {
|
|
570
|
+
let mut w = 0.0;
|
|
571
|
+
let mut k = start;
|
|
572
|
+
while k < start + span {
|
|
573
|
+
w += sizes[k as usize];
|
|
574
|
+
if k > start {
|
|
575
|
+
w += gap;
|
|
576
|
+
}
|
|
577
|
+
k += 1;
|
|
578
|
+
}
|
|
579
|
+
w
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
fn size_tracks_rows(&self, tracks: &Vec<Track>, used: &Vec<bool>, content: &Vec<double>, avail: double, gap: double, declared: bool) -> Vec<double> {
|
|
583
|
+
if declared {
|
|
584
|
+
return self.size_tracks(tracks, used, content, content, avail, gap);
|
|
585
|
+
}
|
|
586
|
+
let mut any_fr = false;
|
|
587
|
+
for t in tracks {
|
|
588
|
+
if t.kind == 2 || t.kind == 4 || t.kind == 1 {
|
|
589
|
+
any_fr = true;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
// only fr and % rows need the height; auto rows are their content
|
|
593
|
+
let a = if any_fr { avail } else { -1.0 };
|
|
594
|
+
self.size_tracks(tracks, used, content, content, a, gap)
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/// Sizes of the tracks along one axis: fixed ones as given, auto ones
|
|
598
|
+
/// from their content, then the free space to the fr tracks (never
|
|
599
|
+
/// below a minmax minimum), or else shared by the auto tracks. An
|
|
600
|
+
/// empty auto-fit track collapses. `avail` is -1.0 when unknown.
|
|
601
|
+
fn size_tracks(&self, tracks: &Vec<Track>, used: &Vec<bool>, content: &Vec<double>, content_min: &Vec<double>, avail: double, gap: double) -> Vec<double> {
|
|
602
|
+
let n = tracks.len();
|
|
603
|
+
let mut size: Vec<double> = Vec::new();
|
|
604
|
+
let mut is_fr: Vec<bool> = Vec::new();
|
|
605
|
+
let mut fixed_sum = 0.0;
|
|
606
|
+
let mut live = 0;
|
|
607
|
+
let mut k = 0;
|
|
608
|
+
while k < n {
|
|
609
|
+
let t = tracks[k];
|
|
610
|
+
let collapsed = t.fit && !used[k];
|
|
611
|
+
let mut s = 0.0;
|
|
612
|
+
let mut fr = false;
|
|
613
|
+
if collapsed {
|
|
614
|
+
s = 0.0;
|
|
615
|
+
} else if t.kind == 0 {
|
|
616
|
+
s = t.a;
|
|
617
|
+
} else if t.kind == 1 {
|
|
618
|
+
s = if avail >= 0.0 { avail * t.a / 100.0 } else { 0.0 };
|
|
619
|
+
} else if t.kind == 2 || t.kind == 4 {
|
|
620
|
+
fr = true;
|
|
621
|
+
} else if t.kind == 3 {
|
|
622
|
+
s = content[k].max(t.a);
|
|
623
|
+
} else if t.kind == 5 {
|
|
624
|
+
// fit-content(x): the content, capped at x, but never under
|
|
625
|
+
// its min-content
|
|
626
|
+
s = content[k].min(t.a).max(content_min[k]);
|
|
627
|
+
} else if t.kind == 6 {
|
|
628
|
+
s = content[k].max(t.a).min(t.b);
|
|
629
|
+
}
|
|
630
|
+
if !collapsed {
|
|
631
|
+
live += 1;
|
|
632
|
+
}
|
|
633
|
+
size.push(s);
|
|
634
|
+
is_fr.push(fr);
|
|
635
|
+
if !fr {
|
|
636
|
+
fixed_sum += s;
|
|
637
|
+
}
|
|
638
|
+
k += 1;
|
|
639
|
+
}
|
|
640
|
+
let gaps = if live > 1 { gap * ((live - 1) as double) } else { 0.0 };
|
|
641
|
+
let mut frozen: Vec<bool> = Vec::new();
|
|
642
|
+
k = 0;
|
|
643
|
+
while k < n {
|
|
644
|
+
frozen.push(!is_fr[k] || (tracks[k].fit && !used[k]));
|
|
645
|
+
k += 1;
|
|
646
|
+
}
|
|
647
|
+
if avail >= 0.0 {
|
|
648
|
+
// fr: share what is left, freezing a track its minimum holds up
|
|
649
|
+
let mut rounds = 0;
|
|
650
|
+
while rounds <= n {
|
|
651
|
+
rounds += 1;
|
|
652
|
+
let mut free = avail - gaps;
|
|
653
|
+
let mut frs = 0.0;
|
|
654
|
+
k = 0;
|
|
655
|
+
while k < n {
|
|
656
|
+
if frozen[k] {
|
|
657
|
+
free -= size[k];
|
|
658
|
+
} else {
|
|
659
|
+
frs += if tracks[k].kind == 2 { tracks[k].a } else { tracks[k].b };
|
|
660
|
+
}
|
|
661
|
+
k += 1;
|
|
662
|
+
}
|
|
663
|
+
if frs <= 0.0 {
|
|
664
|
+
break;
|
|
665
|
+
}
|
|
666
|
+
// factors summing under 1 take only their share of the space
|
|
667
|
+
let unit = (free.max(0.0)) / frs.max(1.0);
|
|
668
|
+
let mut again = false;
|
|
669
|
+
k = 0;
|
|
670
|
+
while k < n {
|
|
671
|
+
if !frozen[k] {
|
|
672
|
+
let f = if tracks[k].kind == 2 { tracks[k].a } else { tracks[k].b };
|
|
673
|
+
let s = unit * f;
|
|
674
|
+
let lo = if tracks[k].kind == 4 { tracks[k].a } else { 0.0 };
|
|
675
|
+
if s < lo {
|
|
676
|
+
size[k] = lo;
|
|
677
|
+
frozen[k] = true;
|
|
678
|
+
again = true;
|
|
679
|
+
} else {
|
|
680
|
+
size[k] = s;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
k += 1;
|
|
684
|
+
}
|
|
685
|
+
if !again {
|
|
686
|
+
break;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
// no fr: auto tracks stretch into what is left
|
|
690
|
+
let mut any_fr = false;
|
|
691
|
+
k = 0;
|
|
692
|
+
while k < n {
|
|
693
|
+
if is_fr[k] {
|
|
694
|
+
any_fr = true;
|
|
695
|
+
}
|
|
696
|
+
k += 1;
|
|
697
|
+
}
|
|
698
|
+
if !any_fr {
|
|
699
|
+
let mut autos = 0;
|
|
700
|
+
k = 0;
|
|
701
|
+
while k < n {
|
|
702
|
+
if tracks[k].kind == 3 && !(tracks[k].fit && !used[k]) {
|
|
703
|
+
autos += 1;
|
|
704
|
+
}
|
|
705
|
+
k += 1;
|
|
706
|
+
}
|
|
707
|
+
let free2 = avail - gaps - fixed_sum;
|
|
708
|
+
if autos > 0 && free2 > 0.0 {
|
|
709
|
+
k = 0;
|
|
710
|
+
while k < n {
|
|
711
|
+
if tracks[k].kind == 3 && !(tracks[k].fit && !used[k]) {
|
|
712
|
+
size[k] += free2 / (autos as double);
|
|
713
|
+
}
|
|
714
|
+
k += 1;
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
} else {
|
|
719
|
+
// an unknown size: fr tracks as their minimum, or their content
|
|
720
|
+
k = 0;
|
|
721
|
+
while k < n {
|
|
722
|
+
if is_fr[k] {
|
|
723
|
+
size[k] = if tracks[k].kind == 4 { tracks[k].a.max(content[k]) } else { content[k] };
|
|
724
|
+
}
|
|
725
|
+
k += 1;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
size
|
|
729
|
+
}
|
|
730
|
+
}
|