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,435 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; ==============================================================================
|
|
4
|
+
; EvgTracePath.rgr — compact `d` encoding for traced paths
|
|
5
|
+
; ==============================================================================
|
|
6
|
+
;
|
|
7
|
+
; A trace is thousands of curves, and how they are written down is worth as
|
|
8
|
+
; much as how they were fitted. VectorShapes.asPathData is the general writer
|
|
9
|
+
; for the vector stack: absolute commands, four decimals, a separator between
|
|
10
|
+
; every pair of numbers. That is the right default for hand-built art, where a
|
|
11
|
+
; path is a few dozen commands a human may read. For a traced picture it is
|
|
12
|
+
; roughly twice the bytes it needs to be, on geometry nobody will ever read.
|
|
13
|
+
;
|
|
14
|
+
; Nothing here moves a point beyond the rounding the caller asks for:
|
|
15
|
+
;
|
|
16
|
+
; 1. quantize — round every coordinate to `precision` decimals, once, in
|
|
17
|
+
; document space, BEFORE the cleanup below. Rounding at write
|
|
18
|
+
; time instead leaves the segments the rounding itself made
|
|
19
|
+
; degenerate in the file.
|
|
20
|
+
; 2. cleanup — drop the zero-length steps and the collinear middles that
|
|
21
|
+
; quantization just created.
|
|
22
|
+
; 3. encode — per segment the shorter of the absolute and the relative
|
|
23
|
+
; form, H/V for an axis-aligned line, S for a cubic whose
|
|
24
|
+
; first handle mirrors the last one, numbers with no leading
|
|
25
|
+
; zero or trailing zeros, and no separator where the grammar
|
|
26
|
+
; does not need one.
|
|
27
|
+
;
|
|
28
|
+
; The separator rule is the only subtle one. A number may be run straight onto
|
|
29
|
+
; the previous one when it cannot extend it: always before a minus sign, and
|
|
30
|
+
; before a leading "." only when the previous number already spent its own dot
|
|
31
|
+
; (so "5.25.5" is two numbers, while "5" then ".5" must stay apart or it reads
|
|
32
|
+
; as the single number 5.5).
|
|
33
|
+
; ==============================================================================
|
|
34
|
+
|
|
35
|
+
Import "SVGPathParser.rgr"
|
|
36
|
+
|
|
37
|
+
class EvgTracePath {
|
|
38
|
+
|
|
39
|
+
Constructor () {
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
sfn absD:double (v:double) {
|
|
43
|
+
if (v < 0.0) {
|
|
44
|
+
return (0.0 - v)
|
|
45
|
+
}
|
|
46
|
+
return v
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
; Round to `p` decimals and write it in the shortest form that reads back
|
|
50
|
+
; the same: no trailing zeros, no leading zero on a pure fraction.
|
|
51
|
+
sfn num:string (v:double p:int) {
|
|
52
|
+
def scale:double 1.0
|
|
53
|
+
def i:int 0
|
|
54
|
+
while (i < p) {
|
|
55
|
+
scale = (scale * 10.0)
|
|
56
|
+
i = (i + 1)
|
|
57
|
+
}
|
|
58
|
+
def neg:boolean false
|
|
59
|
+
def a:double v
|
|
60
|
+
if (a < 0.0) {
|
|
61
|
+
neg = true
|
|
62
|
+
a = (0.0 - a)
|
|
63
|
+
}
|
|
64
|
+
def scaled:int (to_int ((a * scale) + 0.5))
|
|
65
|
+
def unit:int (to_int scale)
|
|
66
|
+
def whole:int (idiv scaled unit)
|
|
67
|
+
def frac:int (scaled - (whole * unit))
|
|
68
|
+
def out:string ""
|
|
69
|
+
if (frac > 0) {
|
|
70
|
+
; Trim the trailing zeros as digits, not as text.
|
|
71
|
+
def digits:int p
|
|
72
|
+
while ((frac - ((idiv frac 10) * 10)) == 0) {
|
|
73
|
+
frac = (idiv frac 10)
|
|
74
|
+
digits = (digits - 1)
|
|
75
|
+
}
|
|
76
|
+
def fs:string (to_string frac)
|
|
77
|
+
; Left-pad back to the place the digits actually sit in.
|
|
78
|
+
def pad:int (digits - (strlen fs))
|
|
79
|
+
while (pad > 0) {
|
|
80
|
+
fs = ("0" + fs)
|
|
81
|
+
pad = (pad - 1)
|
|
82
|
+
}
|
|
83
|
+
if (whole == 0) {
|
|
84
|
+
out = ("." + fs)
|
|
85
|
+
} {
|
|
86
|
+
out = ((to_string whole) + "." + fs)
|
|
87
|
+
}
|
|
88
|
+
} {
|
|
89
|
+
out = (to_string whole)
|
|
90
|
+
}
|
|
91
|
+
if (neg) {
|
|
92
|
+
if (out == "0") {
|
|
93
|
+
return "0"
|
|
94
|
+
}
|
|
95
|
+
return ("-" + out)
|
|
96
|
+
}
|
|
97
|
+
return out
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
; Round every coordinate to `p` decimals, in place on a copy.
|
|
101
|
+
sfn quantize:[PathCommand] (cmds:[PathCommand] p:int) {
|
|
102
|
+
def out:[PathCommand]
|
|
103
|
+
def n:int (array_length cmds)
|
|
104
|
+
def i:int 0
|
|
105
|
+
while (i < n) {
|
|
106
|
+
def c:PathCommand (itemAt cmds i)
|
|
107
|
+
def q (new PathCommand())
|
|
108
|
+
q.type = c.type
|
|
109
|
+
q.x = (EvgTracePath.roundTo(c.x p))
|
|
110
|
+
q.y = (EvgTracePath.roundTo(c.y p))
|
|
111
|
+
q.x1 = (EvgTracePath.roundTo(c.x1 p))
|
|
112
|
+
q.y1 = (EvgTracePath.roundTo(c.y1 p))
|
|
113
|
+
q.x2 = (EvgTracePath.roundTo(c.x2 p))
|
|
114
|
+
q.y2 = (EvgTracePath.roundTo(c.y2 p))
|
|
115
|
+
push out q
|
|
116
|
+
i = (i + 1)
|
|
117
|
+
}
|
|
118
|
+
return out
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
sfn roundTo:double (v:double p:int) {
|
|
122
|
+
def scale:double 1.0
|
|
123
|
+
def i:int 0
|
|
124
|
+
while (i < p) {
|
|
125
|
+
scale = (scale * 10.0)
|
|
126
|
+
i = (i + 1)
|
|
127
|
+
}
|
|
128
|
+
def neg:boolean false
|
|
129
|
+
def a:double v
|
|
130
|
+
if (a < 0.0) {
|
|
131
|
+
neg = true
|
|
132
|
+
a = (0.0 - a)
|
|
133
|
+
}
|
|
134
|
+
def r:int (to_int ((a * scale) + 0.5))
|
|
135
|
+
def back:double ((to_double r) / scale)
|
|
136
|
+
if (neg) {
|
|
137
|
+
return (0.0 - back)
|
|
138
|
+
}
|
|
139
|
+
return back
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
; True when b sits on the segment a→c, within a tenth of the rounding grid.
|
|
143
|
+
sfn collinear:boolean (ax:double ay:double bx:double by:double cx:double cy:double) {
|
|
144
|
+
def cross:double (((bx - ax) * (cy - ay)) - ((by - ay) * (cx - ax)))
|
|
145
|
+
def dx:double (cx - ax)
|
|
146
|
+
def dy:double (cy - ay)
|
|
147
|
+
def base:double (sqrt ((dx * dx) + (dy * dy)))
|
|
148
|
+
if (base < 0.000001) {
|
|
149
|
+
return true
|
|
150
|
+
}
|
|
151
|
+
def d:double (EvgTracePath.absD(cross))
|
|
152
|
+
return ((d / base) < 0.0001)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
; Drop zero-length steps and collinear middles left by the rounding. Only
|
|
156
|
+
; straight runs are touched; a curve is never merged into its neighbour.
|
|
157
|
+
sfn cleanup:[PathCommand] (cmds:[PathCommand]) {
|
|
158
|
+
def out:[PathCommand]
|
|
159
|
+
def n:int (array_length cmds)
|
|
160
|
+
def lx:double 0.0
|
|
161
|
+
def ly:double 0.0
|
|
162
|
+
def px:double 0.0
|
|
163
|
+
def py:double 0.0
|
|
164
|
+
def i:int 0
|
|
165
|
+
while (i < n) {
|
|
166
|
+
def c:PathCommand (itemAt cmds i)
|
|
167
|
+
if (c.type == "M") {
|
|
168
|
+
push out c
|
|
169
|
+
lx = c.x
|
|
170
|
+
ly = c.y
|
|
171
|
+
px = c.x
|
|
172
|
+
py = c.y
|
|
173
|
+
}
|
|
174
|
+
if (c.type == "L") {
|
|
175
|
+
def skip:boolean false
|
|
176
|
+
if ((lx == c.x) && (ly == c.y)) {
|
|
177
|
+
skip = true
|
|
178
|
+
}
|
|
179
|
+
if (skip == false) {
|
|
180
|
+
def merged:boolean false
|
|
181
|
+
def m:int (array_length out)
|
|
182
|
+
if (m > 0) {
|
|
183
|
+
def prev:PathCommand (itemAt out (m - 1))
|
|
184
|
+
if (prev.type == "L") {
|
|
185
|
+
if (EvgTracePath.collinear(px py lx ly c.x c.y)) {
|
|
186
|
+
prev.x = c.x
|
|
187
|
+
prev.y = c.y
|
|
188
|
+
merged = true
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (merged == false) {
|
|
193
|
+
push out c
|
|
194
|
+
px = lx
|
|
195
|
+
py = ly
|
|
196
|
+
}
|
|
197
|
+
lx = c.x
|
|
198
|
+
ly = c.y
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (c.type == "C") {
|
|
202
|
+
push out c
|
|
203
|
+
px = lx
|
|
204
|
+
py = ly
|
|
205
|
+
lx = c.x
|
|
206
|
+
ly = c.y
|
|
207
|
+
}
|
|
208
|
+
if (c.type == "Q") {
|
|
209
|
+
push out c
|
|
210
|
+
px = lx
|
|
211
|
+
py = ly
|
|
212
|
+
lx = c.x
|
|
213
|
+
ly = c.y
|
|
214
|
+
}
|
|
215
|
+
if (c.type == "Z") {
|
|
216
|
+
push out c
|
|
217
|
+
}
|
|
218
|
+
i = (i + 1)
|
|
219
|
+
}
|
|
220
|
+
return out
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
; Append `tok` to `d`, with a separator only where the SVG number grammar
|
|
224
|
+
; needs one. `prev` is the number written just before it.
|
|
225
|
+
sfn joinNum:string (d:string prev:string tok:string) {
|
|
226
|
+
if ((strlen prev) == 0) {
|
|
227
|
+
return (d + tok)
|
|
228
|
+
}
|
|
229
|
+
def first:string (substring tok 0 1)
|
|
230
|
+
if (first == "-") {
|
|
231
|
+
return (d + tok)
|
|
232
|
+
}
|
|
233
|
+
if (first == ".") {
|
|
234
|
+
if ((indexOf prev ".") >= 0) {
|
|
235
|
+
return (d + tok)
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return ((d + " ") + tok)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
; Two numbers as one coordinate pair, appended to `d`.
|
|
242
|
+
sfn pair:string (d:string prev:string a:string b:string) {
|
|
243
|
+
def s1:string (EvgTracePath.joinNum(d prev a))
|
|
244
|
+
return (EvgTracePath.joinNum(s1 a b))
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
; The last number written in `s`, so the next one knows whether it may run
|
|
248
|
+
; on. Empty when `s` ends in a command letter.
|
|
249
|
+
;
|
|
250
|
+
; A minus sign STARTS a number, it does not continue one, so the scan stops
|
|
251
|
+
; at it and then takes it. Reading "-" as an interior character instead
|
|
252
|
+
; makes ".2-1" look like a single number that has already spent its dot,
|
|
253
|
+
; and the next ".44" is then written with no separator — ".2-1.44" — which
|
|
254
|
+
; is three numbers where four were meant, and the path breaks there.
|
|
255
|
+
sfn lastNum:string (s:string) {
|
|
256
|
+
def n:int (strlen s)
|
|
257
|
+
def i:int n
|
|
258
|
+
while (i > 0) {
|
|
259
|
+
def ch:string (substring s (i - 1) i)
|
|
260
|
+
if ((indexOf "0123456789." ch) < 0) {
|
|
261
|
+
if (ch == "-") {
|
|
262
|
+
return (substring s (i - 1) n)
|
|
263
|
+
}
|
|
264
|
+
return (substring s i n)
|
|
265
|
+
}
|
|
266
|
+
i = (i - 1)
|
|
267
|
+
}
|
|
268
|
+
return (substring s 0 n)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
; The whole `d` attribute. `precision` is decimal places; `compact` picks
|
|
272
|
+
; the shorthand encoding over plain absolute commands.
|
|
273
|
+
sfn encode:string (cmds:[PathCommand] precision:int compact:boolean) {
|
|
274
|
+
def q:[PathCommand] (EvgTracePath.quantize(cmds precision))
|
|
275
|
+
def work:[PathCommand] (EvgTracePath.cleanup(q))
|
|
276
|
+
if (compact == false) {
|
|
277
|
+
return (EvgTracePath.encodePlain(work precision))
|
|
278
|
+
}
|
|
279
|
+
return (EvgTracePath.encodeCompact(work precision))
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
sfn encodePlain:string (cmds:[PathCommand] precision:int) {
|
|
283
|
+
def d:string ""
|
|
284
|
+
def n:int (array_length cmds)
|
|
285
|
+
def i:int 0
|
|
286
|
+
while (i < n) {
|
|
287
|
+
def c:PathCommand (itemAt cmds i)
|
|
288
|
+
if (i > 0) {
|
|
289
|
+
d = (d + " ")
|
|
290
|
+
}
|
|
291
|
+
if (c.type == "M") {
|
|
292
|
+
d = (((d + "M") + (EvgTracePath.num(c.x precision)) + ",") + (EvgTracePath.num(c.y precision)))
|
|
293
|
+
}
|
|
294
|
+
if (c.type == "L") {
|
|
295
|
+
d = (((d + "L") + (EvgTracePath.num(c.x precision)) + ",") + (EvgTracePath.num(c.y precision)))
|
|
296
|
+
}
|
|
297
|
+
if (c.type == "C") {
|
|
298
|
+
d = (((d + "C") + (EvgTracePath.num(c.x1 precision)) + ",") + (EvgTracePath.num(c.y1 precision)))
|
|
299
|
+
d = (((d + " ") + (EvgTracePath.num(c.x2 precision)) + ",") + (EvgTracePath.num(c.y2 precision)))
|
|
300
|
+
d = (((d + " ") + (EvgTracePath.num(c.x precision)) + ",") + (EvgTracePath.num(c.y precision)))
|
|
301
|
+
}
|
|
302
|
+
if (c.type == "Q") {
|
|
303
|
+
d = (((d + "Q") + (EvgTracePath.num(c.x1 precision)) + ",") + (EvgTracePath.num(c.y1 precision)))
|
|
304
|
+
d = (((d + " ") + (EvgTracePath.num(c.x precision)) + ",") + (EvgTracePath.num(c.y precision)))
|
|
305
|
+
}
|
|
306
|
+
if (c.type == "Z") {
|
|
307
|
+
d = (d + "Z")
|
|
308
|
+
}
|
|
309
|
+
i = (i + 1)
|
|
310
|
+
}
|
|
311
|
+
return d
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
sfn encodeCompact:string (cmds:[PathCommand] precision:int) {
|
|
315
|
+
def d:string ""
|
|
316
|
+
def n:int (array_length cmds)
|
|
317
|
+
; Current point, the subpath start, and the previous cubic's second
|
|
318
|
+
; handle (for the S shorthand). `smooth` says whether that handle is
|
|
319
|
+
; real, i.e. whether the previous command was a cubic.
|
|
320
|
+
def cx:double 0.0
|
|
321
|
+
def cy:double 0.0
|
|
322
|
+
def sx:double 0.0
|
|
323
|
+
def sy:double 0.0
|
|
324
|
+
def hx:double 0.0
|
|
325
|
+
def hy:double 0.0
|
|
326
|
+
def smooth:boolean false
|
|
327
|
+
def i:int 0
|
|
328
|
+
while (i < n) {
|
|
329
|
+
def c:PathCommand (itemAt cmds i)
|
|
330
|
+
if (c.type == "M") {
|
|
331
|
+
def absTok:string (EvgTracePath.pair("M" "" (EvgTracePath.num(c.x precision)) (EvgTracePath.num(c.y precision))))
|
|
332
|
+
def relTok:string (EvgTracePath.pair("m" "" (EvgTracePath.num((c.x - cx) precision)) (EvgTracePath.num((c.y - cy) precision))))
|
|
333
|
+
if (i == 0) {
|
|
334
|
+
d = (d + absTok)
|
|
335
|
+
} {
|
|
336
|
+
if ((strlen relTok) < (strlen absTok)) {
|
|
337
|
+
d = (d + relTok)
|
|
338
|
+
} {
|
|
339
|
+
d = (d + absTok)
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
cx = c.x
|
|
343
|
+
cy = c.y
|
|
344
|
+
sx = c.x
|
|
345
|
+
sy = c.y
|
|
346
|
+
smooth = false
|
|
347
|
+
}
|
|
348
|
+
if (c.type == "L") {
|
|
349
|
+
def absTok2:string ""
|
|
350
|
+
def relTok2:string ""
|
|
351
|
+
if (c.y == cy) {
|
|
352
|
+
absTok2 = (EvgTracePath.joinNum("H" "" (EvgTracePath.num(c.x precision))))
|
|
353
|
+
relTok2 = (EvgTracePath.joinNum("h" "" (EvgTracePath.num((c.x - cx) precision))))
|
|
354
|
+
} {
|
|
355
|
+
if (c.x == cx) {
|
|
356
|
+
absTok2 = (EvgTracePath.joinNum("V" "" (EvgTracePath.num(c.y precision))))
|
|
357
|
+
relTok2 = (EvgTracePath.joinNum("v" "" (EvgTracePath.num((c.y - cy) precision))))
|
|
358
|
+
} {
|
|
359
|
+
absTok2 = (EvgTracePath.pair("L" "" (EvgTracePath.num(c.x precision)) (EvgTracePath.num(c.y precision))))
|
|
360
|
+
relTok2 = (EvgTracePath.pair("l" "" (EvgTracePath.num((c.x - cx) precision)) (EvgTracePath.num((c.y - cy) precision))))
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if ((strlen relTok2) < (strlen absTok2)) {
|
|
364
|
+
d = (d + relTok2)
|
|
365
|
+
} {
|
|
366
|
+
d = (d + absTok2)
|
|
367
|
+
}
|
|
368
|
+
cx = c.x
|
|
369
|
+
cy = c.y
|
|
370
|
+
smooth = false
|
|
371
|
+
}
|
|
372
|
+
if (c.type == "C") {
|
|
373
|
+
; S is available when the first handle is the reflection of the
|
|
374
|
+
; previous cubic's second handle through the current point.
|
|
375
|
+
def useS:boolean false
|
|
376
|
+
if (smooth) {
|
|
377
|
+
def rx:double ((2.0 * cx) - hx)
|
|
378
|
+
def ry:double ((2.0 * cy) - hy)
|
|
379
|
+
def ex:double (EvgTracePath.absD((rx - c.x1)))
|
|
380
|
+
def ey:double (EvgTracePath.absD((ry - c.y1)))
|
|
381
|
+
if ((ex < 0.0000001) && (ey < 0.0000001)) {
|
|
382
|
+
useS = true
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
def absTok3:string ""
|
|
386
|
+
def relTok3:string ""
|
|
387
|
+
if (useS) {
|
|
388
|
+
absTok3 = (EvgTracePath.pair("S" "" (EvgTracePath.num(c.x2 precision)) (EvgTracePath.num(c.y2 precision))))
|
|
389
|
+
absTok3 = (EvgTracePath.pair(absTok3 (EvgTracePath.lastNum(absTok3)) (EvgTracePath.num(c.x precision)) (EvgTracePath.num(c.y precision))))
|
|
390
|
+
relTok3 = (EvgTracePath.pair("s" "" (EvgTracePath.num((c.x2 - cx) precision)) (EvgTracePath.num((c.y2 - cy) precision))))
|
|
391
|
+
relTok3 = (EvgTracePath.pair(relTok3 (EvgTracePath.lastNum(relTok3)) (EvgTracePath.num((c.x - cx) precision)) (EvgTracePath.num((c.y - cy) precision))))
|
|
392
|
+
} {
|
|
393
|
+
absTok3 = (EvgTracePath.pair("C" "" (EvgTracePath.num(c.x1 precision)) (EvgTracePath.num(c.y1 precision))))
|
|
394
|
+
absTok3 = (EvgTracePath.pair(absTok3 (EvgTracePath.lastNum(absTok3)) (EvgTracePath.num(c.x2 precision)) (EvgTracePath.num(c.y2 precision))))
|
|
395
|
+
absTok3 = (EvgTracePath.pair(absTok3 (EvgTracePath.lastNum(absTok3)) (EvgTracePath.num(c.x precision)) (EvgTracePath.num(c.y precision))))
|
|
396
|
+
relTok3 = (EvgTracePath.pair("c" "" (EvgTracePath.num((c.x1 - cx) precision)) (EvgTracePath.num((c.y1 - cy) precision))))
|
|
397
|
+
relTok3 = (EvgTracePath.pair(relTok3 (EvgTracePath.lastNum(relTok3)) (EvgTracePath.num((c.x2 - cx) precision)) (EvgTracePath.num((c.y2 - cy) precision))))
|
|
398
|
+
relTok3 = (EvgTracePath.pair(relTok3 (EvgTracePath.lastNum(relTok3)) (EvgTracePath.num((c.x - cx) precision)) (EvgTracePath.num((c.y - cy) precision))))
|
|
399
|
+
}
|
|
400
|
+
if ((strlen relTok3) < (strlen absTok3)) {
|
|
401
|
+
d = (d + relTok3)
|
|
402
|
+
} {
|
|
403
|
+
d = (d + absTok3)
|
|
404
|
+
}
|
|
405
|
+
hx = c.x2
|
|
406
|
+
hy = c.y2
|
|
407
|
+
cx = c.x
|
|
408
|
+
cy = c.y
|
|
409
|
+
smooth = true
|
|
410
|
+
}
|
|
411
|
+
if (c.type == "Q") {
|
|
412
|
+
def absTok4:string (EvgTracePath.pair("Q" "" (EvgTracePath.num(c.x1 precision)) (EvgTracePath.num(c.y1 precision))))
|
|
413
|
+
absTok4 = (EvgTracePath.pair(absTok4 (EvgTracePath.lastNum(absTok4)) (EvgTracePath.num(c.x precision)) (EvgTracePath.num(c.y precision))))
|
|
414
|
+
def relTok4:string (EvgTracePath.pair("q" "" (EvgTracePath.num((c.x1 - cx) precision)) (EvgTracePath.num((c.y1 - cy) precision))))
|
|
415
|
+
relTok4 = (EvgTracePath.pair(relTok4 (EvgTracePath.lastNum(relTok4)) (EvgTracePath.num((c.x - cx) precision)) (EvgTracePath.num((c.y - cy) precision))))
|
|
416
|
+
if ((strlen relTok4) < (strlen absTok4)) {
|
|
417
|
+
d = (d + relTok4)
|
|
418
|
+
} {
|
|
419
|
+
d = (d + absTok4)
|
|
420
|
+
}
|
|
421
|
+
cx = c.x
|
|
422
|
+
cy = c.y
|
|
423
|
+
smooth = false
|
|
424
|
+
}
|
|
425
|
+
if (c.type == "Z") {
|
|
426
|
+
d = (d + "Z")
|
|
427
|
+
cx = sx
|
|
428
|
+
cy = sy
|
|
429
|
+
smooth = false
|
|
430
|
+
}
|
|
431
|
+
i = (i + 1)
|
|
432
|
+
}
|
|
433
|
+
return d
|
|
434
|
+
}
|
|
435
|
+
}
|