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,648 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; ==============================================================================
|
|
4
|
+
; EvgTraceCurve.rgr — alphamax smooth + optiCurve (Potrace paper §2.3–2.4)
|
|
5
|
+
; ==============================================================================
|
|
6
|
+
;
|
|
7
|
+
; After EvgTraceFit produces an optimal polygon, this stage:
|
|
8
|
+
; 1. classifies each vertex as CORNER or CURVE via alphamax
|
|
9
|
+
; 2. optionally joins consecutive CURVE spans (optiCurve / -O)
|
|
10
|
+
; 3. emits PathCommands
|
|
11
|
+
;
|
|
12
|
+
; Corner-only rings (axis-aligned rects) emit the polygon vertices directly —
|
|
13
|
+
; the same compact form the Potrace CLI SVG backend produces for those shapes.
|
|
14
|
+
;
|
|
15
|
+
; Clean-room from the published algorithm description, not a GPL port.
|
|
16
|
+
; ==============================================================================
|
|
17
|
+
|
|
18
|
+
Import "EvgTraceTypes.rgr"
|
|
19
|
+
Import "VectorShapes.rgr"
|
|
20
|
+
|
|
21
|
+
; One candidate join produced by opti_penalty.
|
|
22
|
+
class EvgTraceOpti {
|
|
23
|
+
def pen:double 0.0
|
|
24
|
+
def c0:EvgTracePoint (EvgTracePoint.of(0.0 0.0))
|
|
25
|
+
def c1:EvgTracePoint (EvgTracePoint.of(0.0 0.0))
|
|
26
|
+
def t:double 0.0
|
|
27
|
+
def s:double 0.0
|
|
28
|
+
def alpha:double 0.0
|
|
29
|
+
def ok:boolean false
|
|
30
|
+
|
|
31
|
+
Constructor () {
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
class EvgTraceCurve {
|
|
36
|
+
def n:int 0
|
|
37
|
+
def tag:[string]
|
|
38
|
+
def vertex:[EvgTracePoint]
|
|
39
|
+
def c0:[EvgTracePoint]
|
|
40
|
+
def c1:[EvgTracePoint]
|
|
41
|
+
def c2:[EvgTracePoint]
|
|
42
|
+
def alpha:[double]
|
|
43
|
+
def alpha0:[double]
|
|
44
|
+
def beta:[double]
|
|
45
|
+
|
|
46
|
+
Constructor () {
|
|
47
|
+
def t:[string]
|
|
48
|
+
tag = t
|
|
49
|
+
def v:[EvgTracePoint]
|
|
50
|
+
vertex = v
|
|
51
|
+
def a:[EvgTracePoint]
|
|
52
|
+
c0 = a
|
|
53
|
+
def b:[EvgTracePoint]
|
|
54
|
+
c1 = b
|
|
55
|
+
def c:[EvgTracePoint]
|
|
56
|
+
c2 = c
|
|
57
|
+
def al:[double]
|
|
58
|
+
alpha = al
|
|
59
|
+
def a0:[double]
|
|
60
|
+
alpha0 = a0
|
|
61
|
+
def be:[double]
|
|
62
|
+
beta = be
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
sfn alloc:EvgTraceCurve (n:int) {
|
|
66
|
+
def curve (new EvgTraceCurve())
|
|
67
|
+
curve.n = n
|
|
68
|
+
def i:int 0
|
|
69
|
+
while (i < n) {
|
|
70
|
+
push curve.tag "CURVE"
|
|
71
|
+
push curve.vertex (EvgTracePoint.of(0.0 0.0))
|
|
72
|
+
push curve.c0 (EvgTracePoint.of(0.0 0.0))
|
|
73
|
+
push curve.c1 (EvgTracePoint.of(0.0 0.0))
|
|
74
|
+
push curve.c2 (EvgTracePoint.of(0.0 0.0))
|
|
75
|
+
push curve.alpha 0.0
|
|
76
|
+
push curve.alpha0 0.0
|
|
77
|
+
push curve.beta 0.5
|
|
78
|
+
i = (i + 1)
|
|
79
|
+
}
|
|
80
|
+
return curve
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
sfn modI:int (a:int n:int) {
|
|
84
|
+
if (n <= 0) {
|
|
85
|
+
return 0
|
|
86
|
+
}
|
|
87
|
+
def r:int (a - ((idiv a n) * n))
|
|
88
|
+
if (r < 0) {
|
|
89
|
+
r = (r + n)
|
|
90
|
+
}
|
|
91
|
+
return r
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
sfn absD:double (v:double) {
|
|
95
|
+
if (v < 0.0) {
|
|
96
|
+
return (0.0 - v)
|
|
97
|
+
}
|
|
98
|
+
return v
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
sfn signD:int (v:double) {
|
|
102
|
+
if (v > 0.0) {
|
|
103
|
+
return 1
|
|
104
|
+
}
|
|
105
|
+
if (v < 0.0) {
|
|
106
|
+
return (0 - 1)
|
|
107
|
+
}
|
|
108
|
+
return 0
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
sfn interval:EvgTracePoint (lambda:double a:EvgTracePoint b:EvgTracePoint) {
|
|
112
|
+
return (EvgTracePoint.of(((a.x * (1.0 - lambda)) + (b.x * lambda)) ((a.y * (1.0 - lambda)) + (b.y * lambda))))
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
sfn dpara:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint) {
|
|
116
|
+
def x1:double (p1.x - p0.x)
|
|
117
|
+
def y1:double (p1.y - p0.y)
|
|
118
|
+
def x2:double (p2.x - p0.x)
|
|
119
|
+
def y2:double (p2.y - p0.y)
|
|
120
|
+
return ((x1 * y2) - (y1 * x2))
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
sfn cprod:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint p3:EvgTracePoint) {
|
|
124
|
+
def x1:double (p1.x - p0.x)
|
|
125
|
+
def y1:double (p1.y - p0.y)
|
|
126
|
+
def x2:double (p3.x - p2.x)
|
|
127
|
+
def y2:double (p3.y - p2.y)
|
|
128
|
+
return ((x1 * y2) - (y1 * x2))
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
sfn iprod:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint) {
|
|
132
|
+
def x1:double (p1.x - p0.x)
|
|
133
|
+
def y1:double (p1.y - p0.y)
|
|
134
|
+
def x2:double (p2.x - p0.x)
|
|
135
|
+
def y2:double (p2.y - p0.y)
|
|
136
|
+
return ((x1 * x2) + (y1 * y2))
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
sfn iprod1:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint p3:EvgTracePoint) {
|
|
140
|
+
def x1:double (p1.x - p0.x)
|
|
141
|
+
def y1:double (p1.y - p0.y)
|
|
142
|
+
def x2:double (p3.x - p2.x)
|
|
143
|
+
def y2:double (p3.y - p2.y)
|
|
144
|
+
return ((x1 * x2) + (y1 * y2))
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
sfn ddist:double (p:EvgTracePoint q:EvgTracePoint) {
|
|
148
|
+
def dx:double (p.x - q.x)
|
|
149
|
+
def dy:double (p.y - q.y)
|
|
150
|
+
return (sqrt ((dx * dx) + (dy * dy)))
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
sfn ddenom:double (p0:EvgTracePoint p2:EvgTracePoint) {
|
|
154
|
+
def ax:double (EvgTraceCurve.absD((p0.x - p2.x)))
|
|
155
|
+
def ay:double (EvgTraceCurve.absD((p0.y - p2.y)))
|
|
156
|
+
return (ax + ay)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
sfn bezierAt:EvgTracePoint (t:double p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint p3:EvgTracePoint) {
|
|
160
|
+
def s:double (1.0 - t)
|
|
161
|
+
def s2:double (s * s)
|
|
162
|
+
def t2:double (t * t)
|
|
163
|
+
def x:double ((((s2 * s) * p0.x) + (((3.0 * s2) * t) * p1.x)) + ((((3.0 * t2) * s) * p2.x) + ((t2 * t) * p3.x)))
|
|
164
|
+
def y:double ((((s2 * s) * p0.y) + (((3.0 * s2) * t) * p1.y)) + ((((3.0 * t2) * s) * p2.y) + ((t2 * t) * p3.y)))
|
|
165
|
+
return (EvgTracePoint.of(x y))
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
; Parameter t in [0,1] where the cubic is tangent to line q0→q1, or -1.
|
|
169
|
+
sfn tangent:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint p3:EvgTracePoint q0:EvgTracePoint q1:EvgTracePoint) {
|
|
170
|
+
def A:double (EvgTraceCurve.cprod(p0 p1 q0 q1))
|
|
171
|
+
def B:double (EvgTraceCurve.cprod(p1 p2 q0 q1))
|
|
172
|
+
def C:double (EvgTraceCurve.cprod(p2 p3 q0 q1))
|
|
173
|
+
def a:double ((A - (2.0 * B)) + C)
|
|
174
|
+
def b:double ((0.0 - (2.0 * A)) + (2.0 * B))
|
|
175
|
+
def c:double A
|
|
176
|
+
def disc:double ((b * b) - ((4.0 * a) * c))
|
|
177
|
+
if (a == 0.0) {
|
|
178
|
+
return (0.0 - 1.0)
|
|
179
|
+
}
|
|
180
|
+
if (disc < 0.0) {
|
|
181
|
+
return (0.0 - 1.0)
|
|
182
|
+
}
|
|
183
|
+
def s:double (sqrt disc)
|
|
184
|
+
def r1:double (((0.0 - b) + s) / (2.0 * a))
|
|
185
|
+
def r2:double (((0.0 - b) - s) / (2.0 * a))
|
|
186
|
+
if ((r1 >= 0.0) && (r1 <= 1.0)) {
|
|
187
|
+
return r1
|
|
188
|
+
}
|
|
189
|
+
if ((r2 >= 0.0) && (r2 <= 1.0)) {
|
|
190
|
+
return r2
|
|
191
|
+
}
|
|
192
|
+
return (0.0 - 1.0)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
; ------------------------------------------------------------------
|
|
196
|
+
; Build a curve from an adjusted polygon (alphamax smooth).
|
|
197
|
+
; ------------------------------------------------------------------
|
|
198
|
+
sfn fromPolygon:EvgTraceCurve (poly:[EvgTracePoint] alphamax:double) {
|
|
199
|
+
def m:int (array_length poly)
|
|
200
|
+
def curve:EvgTraceCurve (EvgTraceCurve.alloc(m))
|
|
201
|
+
if (m < 3) {
|
|
202
|
+
return curve
|
|
203
|
+
}
|
|
204
|
+
def i:int 0
|
|
205
|
+
while (i < m) {
|
|
206
|
+
set curve.vertex i (itemAt poly i)
|
|
207
|
+
i = (i + 1)
|
|
208
|
+
}
|
|
209
|
+
i = 0
|
|
210
|
+
while (i < m) {
|
|
211
|
+
def j:int (EvgTraceCurve.modI((i + 1) m))
|
|
212
|
+
def k:int (EvgTraceCurve.modI((i + 2) m))
|
|
213
|
+
def vi:EvgTracePoint (itemAt curve.vertex i)
|
|
214
|
+
def vj:EvgTracePoint (itemAt curve.vertex j)
|
|
215
|
+
def vk:EvgTracePoint (itemAt curve.vertex k)
|
|
216
|
+
def p4:EvgTracePoint (EvgTraceCurve.interval(0.5 vk vj))
|
|
217
|
+
def denom:double (EvgTraceCurve.ddenom(vi vk))
|
|
218
|
+
def alpha:double (4.0 / 3.0)
|
|
219
|
+
if (denom != 0.0) {
|
|
220
|
+
def para:double (EvgTraceCurve.dpara(vi vj vk))
|
|
221
|
+
def ratio:double (para / denom)
|
|
222
|
+
def dd:double (EvgTraceCurve.absD(ratio))
|
|
223
|
+
if (dd > 1.0) {
|
|
224
|
+
alpha = (1.0 - (1.0 / dd))
|
|
225
|
+
} {
|
|
226
|
+
alpha = 0.0
|
|
227
|
+
}
|
|
228
|
+
alpha = (alpha / 0.75)
|
|
229
|
+
}
|
|
230
|
+
set curve.alpha0 j alpha
|
|
231
|
+
if (alpha >= alphamax) {
|
|
232
|
+
set curve.tag j "CORNER"
|
|
233
|
+
set curve.c1 j vj
|
|
234
|
+
set curve.c2 j p4
|
|
235
|
+
set curve.alpha j alpha
|
|
236
|
+
} {
|
|
237
|
+
def a2:double alpha
|
|
238
|
+
if (a2 < 0.55) {
|
|
239
|
+
a2 = 0.55
|
|
240
|
+
}
|
|
241
|
+
if (a2 > 1.0) {
|
|
242
|
+
a2 = 1.0
|
|
243
|
+
}
|
|
244
|
+
def p2:EvgTracePoint (EvgTraceCurve.interval((0.5 + (0.5 * a2)) vi vj))
|
|
245
|
+
def p3:EvgTracePoint (EvgTraceCurve.interval((0.5 + (0.5 * a2)) vk vj))
|
|
246
|
+
set curve.tag j "CURVE"
|
|
247
|
+
set curve.c0 j p2
|
|
248
|
+
set curve.c1 j p3
|
|
249
|
+
set curve.c2 j p4
|
|
250
|
+
set curve.alpha j a2
|
|
251
|
+
}
|
|
252
|
+
set curve.beta j 0.5
|
|
253
|
+
i = (i + 1)
|
|
254
|
+
}
|
|
255
|
+
return curve
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
fn curveCount:int () {
|
|
259
|
+
def nC:int 0
|
|
260
|
+
def i:int 0
|
|
261
|
+
while (i < n) {
|
|
262
|
+
if ((itemAt tag i) == "CURVE") {
|
|
263
|
+
nC = (nC + 1)
|
|
264
|
+
}
|
|
265
|
+
i = (i + 1)
|
|
266
|
+
}
|
|
267
|
+
return nC
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
fn cornerCount:int () {
|
|
271
|
+
def nC:int 0
|
|
272
|
+
def i:int 0
|
|
273
|
+
while (i < n) {
|
|
274
|
+
if ((itemAt tag i) == "CORNER") {
|
|
275
|
+
nC = (nC + 1)
|
|
276
|
+
}
|
|
277
|
+
i = (i + 1)
|
|
278
|
+
}
|
|
279
|
+
return nC
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
; ------------------------------------------------------------------
|
|
283
|
+
; optiCurve — join consecutive CURVE spans within opttolerance.
|
|
284
|
+
; ------------------------------------------------------------------
|
|
285
|
+
fn optimize:EvgTraceCurve (opttolerance:double) {
|
|
286
|
+
if (n < 3) {
|
|
287
|
+
return this
|
|
288
|
+
}
|
|
289
|
+
if ((this.curveCount()) < 2) {
|
|
290
|
+
return this
|
|
291
|
+
}
|
|
292
|
+
def convc:[int]
|
|
293
|
+
def areac:[double]
|
|
294
|
+
def i:int 0
|
|
295
|
+
while (i < n) {
|
|
296
|
+
push convc 0
|
|
297
|
+
i = (i + 1)
|
|
298
|
+
}
|
|
299
|
+
push areac 0.0
|
|
300
|
+
i = 0
|
|
301
|
+
while (i < n) {
|
|
302
|
+
if ((itemAt tag i) == "CURVE") {
|
|
303
|
+
def iPrev:int (EvgTraceCurve.modI((i - 1) n))
|
|
304
|
+
def iNext:int (EvgTraceCurve.modI((i + 1) n))
|
|
305
|
+
def para:double (EvgTraceCurve.dpara((itemAt vertex iPrev) (itemAt vertex i) (itemAt vertex iNext)))
|
|
306
|
+
set convc i (EvgTraceCurve.signD(para))
|
|
307
|
+
} {
|
|
308
|
+
set convc i 0
|
|
309
|
+
}
|
|
310
|
+
i = (i + 1)
|
|
311
|
+
}
|
|
312
|
+
def area:double 0.0
|
|
313
|
+
def p0:EvgTracePoint (itemAt vertex 0)
|
|
314
|
+
i = 0
|
|
315
|
+
while (i < n) {
|
|
316
|
+
def i1:int (EvgTraceCurve.modI((i + 1) n))
|
|
317
|
+
if ((itemAt tag i1) == "CURVE") {
|
|
318
|
+
def al:double (itemAt alpha i1)
|
|
319
|
+
def d1:double (EvgTraceCurve.dpara((itemAt c2 i) (itemAt vertex i1) (itemAt c2 i1)))
|
|
320
|
+
area = (area + (((0.3 * al) * (4.0 - al)) * (d1 / 2.0)))
|
|
321
|
+
def d2:double (EvgTraceCurve.dpara(p0 (itemAt c2 i) (itemAt c2 i1)))
|
|
322
|
+
area = (area + (d2 / 2.0))
|
|
323
|
+
}
|
|
324
|
+
push areac area
|
|
325
|
+
i = (i + 1)
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
def pt:[int]
|
|
329
|
+
def pen:[double]
|
|
330
|
+
def lenArr:[int]
|
|
331
|
+
def optPen:[double]
|
|
332
|
+
def optC0:[EvgTracePoint]
|
|
333
|
+
def optC1:[EvgTracePoint]
|
|
334
|
+
def optT:[double]
|
|
335
|
+
def optS:[double]
|
|
336
|
+
def optAlpha:[double]
|
|
337
|
+
def optValid:[int]
|
|
338
|
+
i = 0
|
|
339
|
+
while (i <= n) {
|
|
340
|
+
push pt (0 - 1)
|
|
341
|
+
push pen 0.0
|
|
342
|
+
push lenArr 0
|
|
343
|
+
push optPen 0.0
|
|
344
|
+
push optC0 (EvgTracePoint.of(0.0 0.0))
|
|
345
|
+
push optC1 (EvgTracePoint.of(0.0 0.0))
|
|
346
|
+
push optT 0.0
|
|
347
|
+
push optS 0.0
|
|
348
|
+
push optAlpha 0.0
|
|
349
|
+
push optValid 0
|
|
350
|
+
i = (i + 1)
|
|
351
|
+
}
|
|
352
|
+
set pt 0 (0 - 1)
|
|
353
|
+
set pen 0 0.0
|
|
354
|
+
set lenArr 0 0
|
|
355
|
+
|
|
356
|
+
def j:int 1
|
|
357
|
+
while (j <= n) {
|
|
358
|
+
set pt j (j - 1)
|
|
359
|
+
set pen j (itemAt pen (j - 1))
|
|
360
|
+
set lenArr j ((itemAt lenArr (j - 1)) + 1)
|
|
361
|
+
def iBack:int (j - 2)
|
|
362
|
+
while (iBack >= 0) {
|
|
363
|
+
def res:EvgTraceOpti (this.optiPenalty(iBack (EvgTraceCurve.modI(j n)) opttolerance convc areac))
|
|
364
|
+
if (res.ok == false) {
|
|
365
|
+
iBack = (0 - 1)
|
|
366
|
+
} {
|
|
367
|
+
def lenJ:int (itemAt lenArr j)
|
|
368
|
+
def lenI:int (itemAt lenArr iBack)
|
|
369
|
+
def penJ:double (itemAt pen j)
|
|
370
|
+
def penI:double (itemAt pen iBack)
|
|
371
|
+
def better:boolean false
|
|
372
|
+
if (lenJ > (lenI + 1)) {
|
|
373
|
+
better = true
|
|
374
|
+
}
|
|
375
|
+
if ((lenJ == (lenI + 1)) && (penJ > (penI + res.pen))) {
|
|
376
|
+
better = true
|
|
377
|
+
}
|
|
378
|
+
if better {
|
|
379
|
+
set pt j iBack
|
|
380
|
+
set pen j (penI + res.pen)
|
|
381
|
+
set lenArr j (lenI + 1)
|
|
382
|
+
set optPen j res.pen
|
|
383
|
+
def jc0:EvgTracePoint res.c0
|
|
384
|
+
def jc1:EvgTracePoint res.c1
|
|
385
|
+
set optC0 j jc0
|
|
386
|
+
set optC1 j jc1
|
|
387
|
+
set optT j res.t
|
|
388
|
+
set optS j res.s
|
|
389
|
+
set optAlpha j res.alpha
|
|
390
|
+
set optValid j 1
|
|
391
|
+
}
|
|
392
|
+
iBack = (iBack - 1)
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
j = (j + 1)
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
def om:int (itemAt lenArr n)
|
|
399
|
+
if (om >= n) {
|
|
400
|
+
; No joins found — keep the original curve.
|
|
401
|
+
return this
|
|
402
|
+
}
|
|
403
|
+
if (om < 3) {
|
|
404
|
+
return this
|
|
405
|
+
}
|
|
406
|
+
def ocurve:EvgTraceCurve (EvgTraceCurve.alloc(om))
|
|
407
|
+
def sArr:[double]
|
|
408
|
+
def tArr:[double]
|
|
409
|
+
i = 0
|
|
410
|
+
while (i < om) {
|
|
411
|
+
push sArr 1.0
|
|
412
|
+
push tArr 1.0
|
|
413
|
+
i = (i + 1)
|
|
414
|
+
}
|
|
415
|
+
j = n
|
|
416
|
+
i = (om - 1)
|
|
417
|
+
while (i >= 0) {
|
|
418
|
+
def prevJ:int (itemAt pt j)
|
|
419
|
+
if (prevJ == (j - 1)) {
|
|
420
|
+
def idx:int (EvgTraceCurve.modI(j n))
|
|
421
|
+
set ocurve.tag i (itemAt tag idx)
|
|
422
|
+
set ocurve.c0 i (itemAt c0 idx)
|
|
423
|
+
set ocurve.c1 i (itemAt c1 idx)
|
|
424
|
+
set ocurve.c2 i (itemAt c2 idx)
|
|
425
|
+
set ocurve.vertex i (itemAt vertex idx)
|
|
426
|
+
set ocurve.alpha i (itemAt alpha idx)
|
|
427
|
+
set ocurve.alpha0 i (itemAt alpha0 idx)
|
|
428
|
+
set ocurve.beta i (itemAt beta idx)
|
|
429
|
+
set sArr i 1.0
|
|
430
|
+
set tArr i 1.0
|
|
431
|
+
} {
|
|
432
|
+
def idx2:int (EvgTraceCurve.modI(j n))
|
|
433
|
+
set ocurve.tag i "CURVE"
|
|
434
|
+
set ocurve.c0 i (itemAt optC0 j)
|
|
435
|
+
set ocurve.c1 i (itemAt optC1 j)
|
|
436
|
+
set ocurve.c2 i (itemAt c2 idx2)
|
|
437
|
+
def sVal:double (itemAt optS j)
|
|
438
|
+
def newV:EvgTracePoint (EvgTraceCurve.interval(sVal (itemAt c2 idx2) (itemAt vertex idx2)))
|
|
439
|
+
set ocurve.vertex i newV
|
|
440
|
+
set ocurve.alpha i (itemAt optAlpha j)
|
|
441
|
+
set ocurve.alpha0 i (itemAt optAlpha j)
|
|
442
|
+
set sArr i (itemAt optS j)
|
|
443
|
+
set tArr i (itemAt optT j)
|
|
444
|
+
}
|
|
445
|
+
j = prevJ
|
|
446
|
+
i = (i - 1)
|
|
447
|
+
}
|
|
448
|
+
i = 0
|
|
449
|
+
while (i < om) {
|
|
450
|
+
def i1:int (EvgTraceCurve.modI((i + 1) om))
|
|
451
|
+
def s0:double (itemAt sArr i)
|
|
452
|
+
def t1:double (itemAt tArr i1)
|
|
453
|
+
def denom:double (s0 + t1)
|
|
454
|
+
if (denom == 0.0) {
|
|
455
|
+
set ocurve.beta i 0.5
|
|
456
|
+
} {
|
|
457
|
+
set ocurve.beta i (s0 / denom)
|
|
458
|
+
}
|
|
459
|
+
i = (i + 1)
|
|
460
|
+
}
|
|
461
|
+
return ocurve
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
; Returns res.ok=false when the span i..j cannot be joined.
|
|
465
|
+
fn optiPenalty:EvgTraceOpti (i:int j:int opttolerance:double convc:[int] areac:[double]) {
|
|
466
|
+
def res (new EvgTraceOpti())
|
|
467
|
+
res.ok = false
|
|
468
|
+
if (i == j) {
|
|
469
|
+
return res
|
|
470
|
+
}
|
|
471
|
+
def m:int n
|
|
472
|
+
def k:int i
|
|
473
|
+
def i1:int (EvgTraceCurve.modI((i + 1) m))
|
|
474
|
+
def k1:int (EvgTraceCurve.modI((k + 1) m))
|
|
475
|
+
def conv:int (itemAt convc k1)
|
|
476
|
+
if (conv == 0) {
|
|
477
|
+
return res
|
|
478
|
+
}
|
|
479
|
+
def d:double (EvgTraceCurve.ddist((itemAt vertex i) (itemAt vertex i1)))
|
|
480
|
+
k = k1
|
|
481
|
+
while (k != j) {
|
|
482
|
+
k1 = (EvgTraceCurve.modI((k + 1) m))
|
|
483
|
+
def k2:int (EvgTraceCurve.modI((k + 2) m))
|
|
484
|
+
if ((itemAt convc k1) != conv) {
|
|
485
|
+
return res
|
|
486
|
+
}
|
|
487
|
+
def cp:double (EvgTraceCurve.cprod((itemAt vertex i) (itemAt vertex i1) (itemAt vertex k1) (itemAt vertex k2)))
|
|
488
|
+
if ((EvgTraceCurve.signD(cp)) != conv) {
|
|
489
|
+
return res
|
|
490
|
+
}
|
|
491
|
+
def ip:double (EvgTraceCurve.iprod1((itemAt vertex i) (itemAt vertex i1) (itemAt vertex k1) (itemAt vertex k2)))
|
|
492
|
+
def d2:double (EvgTraceCurve.ddist((itemAt vertex k1) (itemAt vertex k2)))
|
|
493
|
+
if (ip < ((d * d2) * (0.0 - 0.999847695156))) {
|
|
494
|
+
return res
|
|
495
|
+
}
|
|
496
|
+
k = k1
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
def p0:EvgTracePoint (itemAt c2 (EvgTraceCurve.modI(i m)))
|
|
500
|
+
def p1:EvgTracePoint (itemAt vertex (EvgTraceCurve.modI((i + 1) m)))
|
|
501
|
+
def p2:EvgTracePoint (itemAt vertex (EvgTraceCurve.modI(j m)))
|
|
502
|
+
def p3:EvgTracePoint (itemAt c2 (EvgTraceCurve.modI(j m)))
|
|
503
|
+
|
|
504
|
+
def area:double ((itemAt areac j) - (itemAt areac i))
|
|
505
|
+
def areaAdj:double (EvgTraceCurve.dpara((itemAt vertex 0) (itemAt c2 i) (itemAt c2 j)))
|
|
506
|
+
area = (area - (areaAdj / 2.0))
|
|
507
|
+
if (i >= j) {
|
|
508
|
+
area = (area + (itemAt areac m))
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
def A1:double (EvgTraceCurve.dpara(p0 p1 p2))
|
|
512
|
+
def A2:double (EvgTraceCurve.dpara(p0 p1 p3))
|
|
513
|
+
def A3:double (EvgTraceCurve.dpara(p0 p2 p3))
|
|
514
|
+
def A4:double ((A1 + A3) - A2)
|
|
515
|
+
if (A2 == A1) {
|
|
516
|
+
return res
|
|
517
|
+
}
|
|
518
|
+
def t:double (A3 / (A3 - A4))
|
|
519
|
+
def s:double (A2 / (A2 - A1))
|
|
520
|
+
def A:double ((A2 * t) / 2.0)
|
|
521
|
+
if (A == 0.0) {
|
|
522
|
+
return res
|
|
523
|
+
}
|
|
524
|
+
def R:double (area / A)
|
|
525
|
+
def inner:double (4.0 - (R / 0.3))
|
|
526
|
+
if (inner < 0.0) {
|
|
527
|
+
return res
|
|
528
|
+
}
|
|
529
|
+
def joinAlpha:double (2.0 - (sqrt inner))
|
|
530
|
+
res.c0 = (EvgTraceCurve.interval((t * joinAlpha) p0 p1))
|
|
531
|
+
res.c1 = (EvgTraceCurve.interval((s * joinAlpha) p3 p2))
|
|
532
|
+
res.alpha = joinAlpha
|
|
533
|
+
res.t = t
|
|
534
|
+
res.s = s
|
|
535
|
+
res.pen = 0.0
|
|
536
|
+
|
|
537
|
+
def q0:EvgTracePoint p0
|
|
538
|
+
def q1:EvgTracePoint (EvgTracePoint.of(res.c0.x res.c0.y))
|
|
539
|
+
def q2:EvgTracePoint (EvgTracePoint.of(res.c1.x res.c1.y))
|
|
540
|
+
def q3:EvgTracePoint p3
|
|
541
|
+
|
|
542
|
+
k = (EvgTraceCurve.modI((i + 1) m))
|
|
543
|
+
while (k != j) {
|
|
544
|
+
k1 = (EvgTraceCurve.modI((k + 1) m))
|
|
545
|
+
def vk:EvgTracePoint (itemAt vertex k)
|
|
546
|
+
def vk1:EvgTracePoint (itemAt vertex k1)
|
|
547
|
+
def tv:double (EvgTraceCurve.tangent(q0 q1 q2 q3 vk vk1))
|
|
548
|
+
if (tv < (0.0 - 0.5)) {
|
|
549
|
+
return res
|
|
550
|
+
}
|
|
551
|
+
def bezPt:EvgTracePoint (EvgTraceCurve.bezierAt(tv q0 q1 q2 q3))
|
|
552
|
+
def dd:double (EvgTraceCurve.ddist(vk vk1))
|
|
553
|
+
if (dd == 0.0) {
|
|
554
|
+
return res
|
|
555
|
+
}
|
|
556
|
+
def d1:double (EvgTraceCurve.dpara(vk vk1 bezPt))
|
|
557
|
+
d1 = (d1 / dd)
|
|
558
|
+
if ((EvgTraceCurve.absD(d1)) > opttolerance) {
|
|
559
|
+
return res
|
|
560
|
+
}
|
|
561
|
+
if ((EvgTraceCurve.iprod(vk vk1 bezPt)) < 0.0) {
|
|
562
|
+
return res
|
|
563
|
+
}
|
|
564
|
+
if ((EvgTraceCurve.iprod(vk1 vk bezPt)) < 0.0) {
|
|
565
|
+
return res
|
|
566
|
+
}
|
|
567
|
+
res.pen = (res.pen + (d1 * d1))
|
|
568
|
+
k = k1
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
k = i
|
|
572
|
+
while (k != j) {
|
|
573
|
+
k1 = (EvgTraceCurve.modI((k + 1) m))
|
|
574
|
+
def ck:EvgTracePoint (itemAt c2 k)
|
|
575
|
+
def ck1:EvgTracePoint (itemAt c2 k1)
|
|
576
|
+
def tv2:double (EvgTraceCurve.tangent(q0 q1 q2 q3 ck ck1))
|
|
577
|
+
if (tv2 < (0.0 - 0.5)) {
|
|
578
|
+
return res
|
|
579
|
+
}
|
|
580
|
+
def bezPt2:EvgTracePoint (EvgTraceCurve.bezierAt(tv2 q0 q1 q2 q3))
|
|
581
|
+
def dd2:double (EvgTraceCurve.ddist(ck ck1))
|
|
582
|
+
if (dd2 == 0.0) {
|
|
583
|
+
return res
|
|
584
|
+
}
|
|
585
|
+
def d1b:double (EvgTraceCurve.dpara(ck ck1 bezPt2))
|
|
586
|
+
d1b = (d1b / dd2)
|
|
587
|
+
def vk1b:EvgTracePoint (itemAt vertex k1)
|
|
588
|
+
def d2b:double (EvgTraceCurve.dpara(ck ck1 vk1b))
|
|
589
|
+
d2b = (d2b / dd2)
|
|
590
|
+
def ak1:double (itemAt alpha k1)
|
|
591
|
+
d2b = (d2b * (0.75 * ak1))
|
|
592
|
+
if (d2b < 0.0) {
|
|
593
|
+
d1b = (0.0 - d1b)
|
|
594
|
+
d2b = (0.0 - d2b)
|
|
595
|
+
}
|
|
596
|
+
if (d1b < (d2b - opttolerance)) {
|
|
597
|
+
return res
|
|
598
|
+
}
|
|
599
|
+
if (d1b < d2b) {
|
|
600
|
+
def diff:double (d1b - d2b)
|
|
601
|
+
res.pen = (res.pen + (diff * diff))
|
|
602
|
+
}
|
|
603
|
+
k = k1
|
|
604
|
+
}
|
|
605
|
+
res.ok = true
|
|
606
|
+
return res
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
; ------------------------------------------------------------------
|
|
610
|
+
; Emit path commands.
|
|
611
|
+
; ------------------------------------------------------------------
|
|
612
|
+
fn emit:void (out:[PathCommand]) {
|
|
613
|
+
if (n < 3) {
|
|
614
|
+
return
|
|
615
|
+
}
|
|
616
|
+
; Corner-only ring → compact polygon through the vertices (CLI style).
|
|
617
|
+
if ((this.curveCount()) == 0) {
|
|
618
|
+
def v0:EvgTracePoint (itemAt vertex 0)
|
|
619
|
+
push out (VectorShapes.moveTo(v0.x v0.y))
|
|
620
|
+
def i:int 1
|
|
621
|
+
while (i < n) {
|
|
622
|
+
def v:EvgTracePoint (itemAt vertex i)
|
|
623
|
+
push out (VectorShapes.lineTo(v.x v.y))
|
|
624
|
+
i = (i + 1)
|
|
625
|
+
}
|
|
626
|
+
push out (VectorShapes.closePath())
|
|
627
|
+
return
|
|
628
|
+
}
|
|
629
|
+
def start:EvgTracePoint (itemAt c2 (n - 1))
|
|
630
|
+
push out (VectorShapes.moveTo(start.x start.y))
|
|
631
|
+
def i2:int 0
|
|
632
|
+
while (i2 < n) {
|
|
633
|
+
def tg:string (itemAt tag i2)
|
|
634
|
+
def endP:EvgTracePoint (itemAt c2 i2)
|
|
635
|
+
if (tg == "CORNER") {
|
|
636
|
+
def corner:EvgTracePoint (itemAt c1 i2)
|
|
637
|
+
push out (VectorShapes.lineTo(corner.x corner.y))
|
|
638
|
+
push out (VectorShapes.lineTo(endP.x endP.y))
|
|
639
|
+
} {
|
|
640
|
+
def a:EvgTracePoint (itemAt c0 i2)
|
|
641
|
+
def b:EvgTracePoint (itemAt c1 i2)
|
|
642
|
+
push out (VectorShapes.cubicTo(a.x a.y b.x b.y endP.x endP.y))
|
|
643
|
+
}
|
|
644
|
+
i2 = (i2 + 1)
|
|
645
|
+
}
|
|
646
|
+
push out (VectorShapes.closePath())
|
|
647
|
+
}
|
|
648
|
+
}
|