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,767 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; ==============================================================================
|
|
4
|
+
; EvgTraceFit.rgr — optimal polygon + vertex adjust (Potrace paper §2.2)
|
|
5
|
+
; ==============================================================================
|
|
6
|
+
;
|
|
7
|
+
; Clean-room implementation of the polygon phase described in
|
|
8
|
+
; Peter Selinger, "Potrace: a polygon-based tracing algorithm" (2003):
|
|
9
|
+
;
|
|
10
|
+
; 1. prefix sums over the closed edge path
|
|
11
|
+
; 2. longest "straight" pivot from each vertex (lon[])
|
|
12
|
+
; 3. dynamic-programming optimal polygon (minimum segment count, then penalty)
|
|
13
|
+
; 4. least-squares vertex adjustment into the unit square around each pivot
|
|
14
|
+
;
|
|
15
|
+
; Curve smoothing / optiCurve live in EvgBitmapTracer (alphamax stage). This
|
|
16
|
+
; file is the hard part that RDP was standing in for — without it, axis-aligned
|
|
17
|
+
; rects do not collapse to four corners and the SVG stays noisy.
|
|
18
|
+
;
|
|
19
|
+
; Not a derivative of the GPL Potrace sources.
|
|
20
|
+
; ==============================================================================
|
|
21
|
+
|
|
22
|
+
Import "EvgTraceTypes.rgr"
|
|
23
|
+
|
|
24
|
+
class EvgTraceSum {
|
|
25
|
+
def x:double 0.0
|
|
26
|
+
def y:double 0.0
|
|
27
|
+
def xy:double 0.0
|
|
28
|
+
def x2:double 0.0
|
|
29
|
+
def y2:double 0.0
|
|
30
|
+
|
|
31
|
+
Constructor () {
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
sfn of:EvgTraceSum (x:double y:double xy:double x2:double y2:double) {
|
|
35
|
+
def s (new EvgTraceSum())
|
|
36
|
+
s.x = x
|
|
37
|
+
s.y = y
|
|
38
|
+
s.xy = xy
|
|
39
|
+
s.x2 = x2
|
|
40
|
+
s.y2 = y2
|
|
41
|
+
return s
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
class EvgTraceFit {
|
|
46
|
+
def pts:[EvgTracePoint]
|
|
47
|
+
def n:int 0
|
|
48
|
+
def x0:double 0.0
|
|
49
|
+
def y0:double 0.0
|
|
50
|
+
def sums:[EvgTraceSum]
|
|
51
|
+
def lon:[int]
|
|
52
|
+
def po:[int]
|
|
53
|
+
def m:int 0
|
|
54
|
+
def vertex:[EvgTracePoint]
|
|
55
|
+
|
|
56
|
+
Constructor () {
|
|
57
|
+
def p:[EvgTracePoint]
|
|
58
|
+
pts = p
|
|
59
|
+
def s:[EvgTraceSum]
|
|
60
|
+
sums = s
|
|
61
|
+
def l:[int]
|
|
62
|
+
lon = l
|
|
63
|
+
def o:[int]
|
|
64
|
+
po = o
|
|
65
|
+
def v:[EvgTracePoint]
|
|
66
|
+
vertex = v
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
sfn absD:double (v:double) {
|
|
70
|
+
if (v < 0.0) {
|
|
71
|
+
return (0.0 - v)
|
|
72
|
+
}
|
|
73
|
+
return v
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
sfn signI:int (v:int) {
|
|
77
|
+
if (v > 0) {
|
|
78
|
+
return 1
|
|
79
|
+
}
|
|
80
|
+
if (v < 0) {
|
|
81
|
+
return (0 - 1)
|
|
82
|
+
}
|
|
83
|
+
return 0
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
sfn modI:int (a:int n:int) {
|
|
87
|
+
if (n <= 0) {
|
|
88
|
+
return 0
|
|
89
|
+
}
|
|
90
|
+
def r:int (a - ((idiv a n) * n))
|
|
91
|
+
if (r < 0) {
|
|
92
|
+
r = (r + n)
|
|
93
|
+
}
|
|
94
|
+
return r
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
sfn cyclic:boolean (a:int b:int c:int) {
|
|
98
|
+
if (a <= c) {
|
|
99
|
+
return ((a <= b) && (b < c))
|
|
100
|
+
}
|
|
101
|
+
return ((a <= b) || (b < c))
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
sfn xprod:int (ax:int ay:int bx:int by:int) {
|
|
105
|
+
return ((ax * by) - (ay * bx))
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
; Fit one closed edge-walk to an adjusted polygon. Returns vertices in
|
|
109
|
+
; order around the ring (at least 3, or empty on failure).
|
|
110
|
+
sfn fitRing:[EvgTracePoint] (ring:EvgTraceRing) {
|
|
111
|
+
def fit (new EvgTraceFit())
|
|
112
|
+
return (fit.run(ring))
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
fn run:[EvgTracePoint] (ring:EvgTraceRing) {
|
|
116
|
+
def empty:[EvgTracePoint]
|
|
117
|
+
def src:[EvgTracePoint] ring.pts
|
|
118
|
+
def rawN:int (array_length src)
|
|
119
|
+
if (rawN < 3) {
|
|
120
|
+
return empty
|
|
121
|
+
}
|
|
122
|
+
; Dedup consecutive identical points; drop closing duplicate if present.
|
|
123
|
+
def cleaned:[EvgTracePoint]
|
|
124
|
+
def i:int 0
|
|
125
|
+
while (i < rawN) {
|
|
126
|
+
def p:EvgTracePoint (itemAt src i)
|
|
127
|
+
if ((array_length cleaned) == 0) {
|
|
128
|
+
push cleaned p
|
|
129
|
+
} {
|
|
130
|
+
def prev:EvgTracePoint (itemAt cleaned ((array_length cleaned) - 1))
|
|
131
|
+
if ((prev.x == p.x) && (prev.y == p.y)) {
|
|
132
|
+
} {
|
|
133
|
+
push cleaned p
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
i = (i + 1)
|
|
137
|
+
}
|
|
138
|
+
def cn:int (array_length cleaned)
|
|
139
|
+
if (cn >= 2) {
|
|
140
|
+
def first:EvgTracePoint (itemAt cleaned 0)
|
|
141
|
+
def last:EvgTracePoint (itemAt cleaned (cn - 1))
|
|
142
|
+
if ((first.x == last.x) && (first.y == last.y)) {
|
|
143
|
+
def trimmed:[EvgTracePoint]
|
|
144
|
+
def k:int 0
|
|
145
|
+
while (k < (cn - 1)) {
|
|
146
|
+
push trimmed (itemAt cleaned k)
|
|
147
|
+
k = (k + 1)
|
|
148
|
+
}
|
|
149
|
+
cleaned = trimmed
|
|
150
|
+
cn = (array_length cleaned)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (cn < 3) {
|
|
154
|
+
return empty
|
|
155
|
+
}
|
|
156
|
+
pts = cleaned
|
|
157
|
+
n = cn
|
|
158
|
+
def p0:EvgTracePoint (itemAt pts 0)
|
|
159
|
+
x0 = p0.x
|
|
160
|
+
y0 = p0.y
|
|
161
|
+
this.calcSums()
|
|
162
|
+
this.calcLon()
|
|
163
|
+
this.bestPolygon()
|
|
164
|
+
if (m < 3) {
|
|
165
|
+
return empty
|
|
166
|
+
}
|
|
167
|
+
this.adjustVertices()
|
|
168
|
+
return vertex
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
; ------------------------------------------------------------------
|
|
172
|
+
fn calcSums:void () {
|
|
173
|
+
def s:[EvgTraceSum]
|
|
174
|
+
push s (EvgTraceSum.of(0.0 0.0 0.0 0.0 0.0))
|
|
175
|
+
def i:int 0
|
|
176
|
+
while (i < n) {
|
|
177
|
+
def p:EvgTracePoint (itemAt pts i)
|
|
178
|
+
def x:double (p.x - x0)
|
|
179
|
+
def y:double (p.y - y0)
|
|
180
|
+
def prev:EvgTraceSum (itemAt s i)
|
|
181
|
+
push s (EvgTraceSum.of((prev.x + x) (prev.y + y) (prev.xy + (x * y)) (prev.x2 + (x * x)) (prev.y2 + (y * y))))
|
|
182
|
+
i = (i + 1)
|
|
183
|
+
}
|
|
184
|
+
sums = s
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
; Longest straight pivot from each vertex — paper §2.2.1–2.2.2.
|
|
188
|
+
; A segment is straight if every point lies in a 1/2-neighbourhood of some
|
|
189
|
+
; chord and the walk does not use all four compass directions.
|
|
190
|
+
fn calcLon:void () {
|
|
191
|
+
def pivk:[int]
|
|
192
|
+
def nc:[int]
|
|
193
|
+
def i:int 0
|
|
194
|
+
while (i < n) {
|
|
195
|
+
push pivk 0
|
|
196
|
+
push nc 0
|
|
197
|
+
i = (i + 1)
|
|
198
|
+
}
|
|
199
|
+
def k:int 0
|
|
200
|
+
i = (n - 1)
|
|
201
|
+
while (i >= 0) {
|
|
202
|
+
def pi:EvgTracePoint (itemAt pts i)
|
|
203
|
+
def pk:EvgTracePoint (itemAt pts k)
|
|
204
|
+
if ((pi.x != pk.x) && (pi.y != pk.y)) {
|
|
205
|
+
k = (i + 1)
|
|
206
|
+
}
|
|
207
|
+
set nc i k
|
|
208
|
+
i = (i - 1)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
i = (n - 1)
|
|
212
|
+
while (i >= 0) {
|
|
213
|
+
def ct0:int 0
|
|
214
|
+
def ct1:int 0
|
|
215
|
+
def ct2:int 0
|
|
216
|
+
def ct3:int 0
|
|
217
|
+
def pi2:EvgTracePoint (itemAt pts i)
|
|
218
|
+
def piNext:EvgTracePoint (itemAt pts (EvgTraceFit.modI((i + 1) n)))
|
|
219
|
+
def dx0:int (to_int (piNext.x - pi2.x))
|
|
220
|
+
def dy0:int (to_int (piNext.y - pi2.y))
|
|
221
|
+
def dirNum0:int (3 + ((3 * dx0) + dy0))
|
|
222
|
+
def dir0:int (idiv dirNum0 2)
|
|
223
|
+
if (dir0 == 0) { ct0 = (ct0 + 1) }
|
|
224
|
+
if (dir0 == 1) { ct1 = (ct1 + 1) }
|
|
225
|
+
if (dir0 == 2) { ct2 = (ct2 + 1) }
|
|
226
|
+
if (dir0 == 3) { ct3 = (ct3 + 1) }
|
|
227
|
+
|
|
228
|
+
def c0x:int 0
|
|
229
|
+
def c0y:int 0
|
|
230
|
+
def c1x:int 0
|
|
231
|
+
def c1y:int 0
|
|
232
|
+
def kk:int (itemAt nc i)
|
|
233
|
+
def k1:int i
|
|
234
|
+
def found:boolean false
|
|
235
|
+
def guard:int 0
|
|
236
|
+
while ((found == false) && (guard < (n + 2))) {
|
|
237
|
+
def pk1:EvgTracePoint (itemAt pts kk)
|
|
238
|
+
def pk0:EvgTracePoint (itemAt pts k1)
|
|
239
|
+
def sdx:int (EvgTraceFit.signI((to_int (pk1.x - pk0.x))))
|
|
240
|
+
def sdy:int (EvgTraceFit.signI((to_int (pk1.y - pk0.y))))
|
|
241
|
+
def dirNum:int (3 + ((3 * sdx) + sdy))
|
|
242
|
+
def dir:int (idiv dirNum 2)
|
|
243
|
+
if (dir == 0) { ct0 = (ct0 + 1) }
|
|
244
|
+
if (dir == 1) { ct1 = (ct1 + 1) }
|
|
245
|
+
if (dir == 2) { ct2 = (ct2 + 1) }
|
|
246
|
+
if (dir == 3) { ct3 = (ct3 + 1) }
|
|
247
|
+
if ((((ct0 > 0) && (ct1 > 0)) && (ct2 > 0)) && (ct3 > 0)) {
|
|
248
|
+
set pivk i k1
|
|
249
|
+
found = true
|
|
250
|
+
} {
|
|
251
|
+
def curx:int (to_int (pk1.x - pi2.x))
|
|
252
|
+
def cury:int (to_int (pk1.y - pi2.y))
|
|
253
|
+
if (((EvgTraceFit.xprod(c0x c0y curx cury)) < 0) || ((EvgTraceFit.xprod(c1x c1y curx cury)) > 0)) {
|
|
254
|
+
guard = (n + 2)
|
|
255
|
+
} {
|
|
256
|
+
def ax:int (EvgTraceFit.absI(curx))
|
|
257
|
+
def ay:int (EvgTraceFit.absI(cury))
|
|
258
|
+
if ((ax > 1) || (ay > 1)) {
|
|
259
|
+
def off0x:int curx
|
|
260
|
+
def off0y:int cury
|
|
261
|
+
if ((cury > 0) || ((cury == 0) && (curx < 0))) {
|
|
262
|
+
off0x = (curx + 1)
|
|
263
|
+
} {
|
|
264
|
+
off0x = (curx - 1)
|
|
265
|
+
}
|
|
266
|
+
if ((curx < 0) || ((curx == 0) && (cury < 0))) {
|
|
267
|
+
off0y = (cury + 1)
|
|
268
|
+
} {
|
|
269
|
+
off0y = (cury - 1)
|
|
270
|
+
}
|
|
271
|
+
; constraint[0] update when xprod >= 0
|
|
272
|
+
; Recompute off0 with paper rules:
|
|
273
|
+
off0x = curx
|
|
274
|
+
off0y = cury
|
|
275
|
+
if ((cury >= 0) && ((cury > 0) || (curx < 0))) {
|
|
276
|
+
off0x = (curx + 1)
|
|
277
|
+
} {
|
|
278
|
+
off0x = (curx - 1)
|
|
279
|
+
}
|
|
280
|
+
if ((curx <= 0) && ((curx < 0) || (cury < 0))) {
|
|
281
|
+
off0y = (cury + 1)
|
|
282
|
+
} {
|
|
283
|
+
off0y = (cury - 1)
|
|
284
|
+
}
|
|
285
|
+
if ((EvgTraceFit.xprod(c0x c0y off0x off0y)) >= 0) {
|
|
286
|
+
c0x = off0x
|
|
287
|
+
c0y = off0y
|
|
288
|
+
}
|
|
289
|
+
def off1x:int curx
|
|
290
|
+
def off1y:int cury
|
|
291
|
+
if ((cury <= 0) && ((cury < 0) || (curx < 0))) {
|
|
292
|
+
off1x = (curx + 1)
|
|
293
|
+
} {
|
|
294
|
+
off1x = (curx - 1)
|
|
295
|
+
}
|
|
296
|
+
if ((curx >= 0) && ((curx > 0) || (cury < 0))) {
|
|
297
|
+
off1y = (cury + 1)
|
|
298
|
+
} {
|
|
299
|
+
off1y = (cury - 1)
|
|
300
|
+
}
|
|
301
|
+
if ((EvgTraceFit.xprod(c1x c1y off1x off1y)) <= 0) {
|
|
302
|
+
c1x = off1x
|
|
303
|
+
c1y = off1y
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
k1 = kk
|
|
307
|
+
kk = (itemAt nc k1)
|
|
308
|
+
if ((EvgTraceFit.cyclic(kk i k1)) == false) {
|
|
309
|
+
guard = (n + 2)
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
guard = (guard + 1)
|
|
314
|
+
}
|
|
315
|
+
if (found == false) {
|
|
316
|
+
def pkA:EvgTracePoint (itemAt pts kk)
|
|
317
|
+
def pkB:EvgTracePoint (itemAt pts k1)
|
|
318
|
+
def dkx:int (EvgTraceFit.signI((to_int (pkA.x - pkB.x))))
|
|
319
|
+
def dky:int (EvgTraceFit.signI((to_int (pkA.y - pkB.y))))
|
|
320
|
+
def cur2x:int (to_int (pkB.x - pi2.x))
|
|
321
|
+
def cur2y:int (to_int (pkB.y - pi2.y))
|
|
322
|
+
def a:int (EvgTraceFit.xprod(c0x c0y cur2x cur2y))
|
|
323
|
+
def b:int (EvgTraceFit.xprod(c0x c0y dkx dky))
|
|
324
|
+
def c:int (EvgTraceFit.xprod(c1x c1y cur2x cur2y))
|
|
325
|
+
def d:int (EvgTraceFit.xprod(c1x c1y dkx dky))
|
|
326
|
+
def j:int 10000000
|
|
327
|
+
if (b < 0) {
|
|
328
|
+
j = (idiv a (0 - b))
|
|
329
|
+
}
|
|
330
|
+
if (d > 0) {
|
|
331
|
+
def j2:int (idiv (0 - c) d)
|
|
332
|
+
if (j2 < j) {
|
|
333
|
+
j = j2
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
set pivk i (EvgTraceFit.modI((k1 + j) n))
|
|
337
|
+
}
|
|
338
|
+
i = (i - 1)
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
def lonOut:[int]
|
|
342
|
+
i = 0
|
|
343
|
+
while (i < n) {
|
|
344
|
+
push lonOut 0
|
|
345
|
+
i = (i + 1)
|
|
346
|
+
}
|
|
347
|
+
def jLon:int (itemAt pivk (n - 1))
|
|
348
|
+
set lonOut (n - 1) jLon
|
|
349
|
+
i = (n - 2)
|
|
350
|
+
while (i >= 0) {
|
|
351
|
+
if (EvgTraceFit.cyclic((i + 1) (itemAt pivk i) jLon)) {
|
|
352
|
+
jLon = (itemAt pivk i)
|
|
353
|
+
}
|
|
354
|
+
set lonOut i jLon
|
|
355
|
+
i = (i - 1)
|
|
356
|
+
}
|
|
357
|
+
i = (n - 1)
|
|
358
|
+
while (i >= 0) {
|
|
359
|
+
if (EvgTraceFit.cyclic((EvgTraceFit.modI((i + 1) n)) jLon (itemAt lonOut i))) {
|
|
360
|
+
set lonOut i jLon
|
|
361
|
+
i = (i - 1)
|
|
362
|
+
} {
|
|
363
|
+
i = (0 - 1)
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
lon = lonOut
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
sfn absI:int (v:int) {
|
|
370
|
+
if (v < 0) {
|
|
371
|
+
return (0 - v)
|
|
372
|
+
}
|
|
373
|
+
return v
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
; Penalty for a candidate segment i→j (paper §2.2.3).
|
|
377
|
+
fn penalty3:double (i:int jIn:int) {
|
|
378
|
+
def j:int jIn
|
|
379
|
+
def r:int 0
|
|
380
|
+
if (j >= n) {
|
|
381
|
+
j = (j - n)
|
|
382
|
+
r = 1
|
|
383
|
+
}
|
|
384
|
+
def si:EvgTraceSum (itemAt sums i)
|
|
385
|
+
def sj:EvgTraceSum (itemAt sums (j + 1))
|
|
386
|
+
def sn:EvgTraceSum (itemAt sums n)
|
|
387
|
+
def x:double (sj.x - si.x)
|
|
388
|
+
def y:double (sj.y - si.y)
|
|
389
|
+
def x2:double (sj.x2 - si.x2)
|
|
390
|
+
def xy:double (sj.xy - si.xy)
|
|
391
|
+
def y2:double (sj.y2 - si.y2)
|
|
392
|
+
def k:double (to_double ((j + 1) - i))
|
|
393
|
+
if (r != 0) {
|
|
394
|
+
x = (x + sn.x)
|
|
395
|
+
y = (y + sn.y)
|
|
396
|
+
x2 = (x2 + sn.x2)
|
|
397
|
+
xy = (xy + sn.xy)
|
|
398
|
+
y2 = (y2 + sn.y2)
|
|
399
|
+
k = (k + (to_double n))
|
|
400
|
+
}
|
|
401
|
+
def pi:EvgTracePoint (itemAt pts i)
|
|
402
|
+
def pj:EvgTracePoint (itemAt pts j)
|
|
403
|
+
def pOrig:EvgTracePoint (itemAt pts 0)
|
|
404
|
+
def px:double ((((pi.x + pj.x) / 2.0) - pOrig.x))
|
|
405
|
+
def py:double ((((pi.y + pj.y) / 2.0) - pOrig.y))
|
|
406
|
+
def ey:double (pj.x - pi.x)
|
|
407
|
+
def ex:double (0.0 - (pj.y - pi.y))
|
|
408
|
+
def a:double ((((x2 - ((2.0 * x) * px)) / k) + (px * px)))
|
|
409
|
+
def b:double (((((xy - (x * py)) - (y * px)) / k) + (px * py)))
|
|
410
|
+
def c:double ((((y2 - ((2.0 * y) * py)) / k) + (py * py)))
|
|
411
|
+
def s:double ((((ex * ex) * a) + (((2.0 * ex) * ey) * b)) + ((ey * ey) * c))
|
|
412
|
+
if (s < 0.0) {
|
|
413
|
+
s = 0.0
|
|
414
|
+
}
|
|
415
|
+
return (sqrt s)
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
fn bestPolygon:void () {
|
|
419
|
+
def clip0:[int]
|
|
420
|
+
def clip1:[int]
|
|
421
|
+
def seg0:[int]
|
|
422
|
+
def seg1:[int]
|
|
423
|
+
def pen:[double]
|
|
424
|
+
def prev:[int]
|
|
425
|
+
def i:int 0
|
|
426
|
+
while (i < n) {
|
|
427
|
+
push clip0 0
|
|
428
|
+
i = (i + 1)
|
|
429
|
+
}
|
|
430
|
+
i = 0
|
|
431
|
+
while (i <= n) {
|
|
432
|
+
push clip1 0
|
|
433
|
+
push seg0 0
|
|
434
|
+
push seg1 0
|
|
435
|
+
push pen (0.0 - 1.0)
|
|
436
|
+
push prev 0
|
|
437
|
+
i = (i + 1)
|
|
438
|
+
}
|
|
439
|
+
set pen 0 0.0
|
|
440
|
+
|
|
441
|
+
i = 0
|
|
442
|
+
while (i < n) {
|
|
443
|
+
def c:int (EvgTraceFit.modI(((itemAt lon (EvgTraceFit.modI((i - 1) n))) - 1) n))
|
|
444
|
+
if (c == i) {
|
|
445
|
+
c = (EvgTraceFit.modI((i + 1) n))
|
|
446
|
+
}
|
|
447
|
+
if (c < i) {
|
|
448
|
+
set clip0 i n
|
|
449
|
+
} {
|
|
450
|
+
set clip0 i c
|
|
451
|
+
}
|
|
452
|
+
i = (i + 1)
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
def j:int 1
|
|
456
|
+
i = 0
|
|
457
|
+
while (i < n) {
|
|
458
|
+
while (j <= (itemAt clip0 i)) {
|
|
459
|
+
set clip1 j i
|
|
460
|
+
j = (j + 1)
|
|
461
|
+
}
|
|
462
|
+
i = (i + 1)
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
i = 0
|
|
466
|
+
j = 0
|
|
467
|
+
while (i < n) {
|
|
468
|
+
set seg0 j i
|
|
469
|
+
i = (itemAt clip0 i)
|
|
470
|
+
j = (j + 1)
|
|
471
|
+
}
|
|
472
|
+
set seg0 j n
|
|
473
|
+
m = j
|
|
474
|
+
|
|
475
|
+
i = n
|
|
476
|
+
j = m
|
|
477
|
+
while (j > 0) {
|
|
478
|
+
set seg1 j i
|
|
479
|
+
i = (itemAt clip1 i)
|
|
480
|
+
j = (j - 1)
|
|
481
|
+
}
|
|
482
|
+
set seg1 0 0
|
|
483
|
+
|
|
484
|
+
j = 1
|
|
485
|
+
while (j <= m) {
|
|
486
|
+
i = (itemAt seg1 j)
|
|
487
|
+
while (i <= (itemAt seg0 j)) {
|
|
488
|
+
def best:double (0.0 - 1.0)
|
|
489
|
+
def bestK:int 0
|
|
490
|
+
def k:int (itemAt seg0 (j - 1))
|
|
491
|
+
while (k >= (itemAt clip1 i)) {
|
|
492
|
+
def thispen:double (this.penalty3(k i))
|
|
493
|
+
def prevPen:double (itemAt pen k)
|
|
494
|
+
def total:double (thispen + prevPen)
|
|
495
|
+
if ((best < 0.0) || (total < best)) {
|
|
496
|
+
best = total
|
|
497
|
+
bestK = k
|
|
498
|
+
}
|
|
499
|
+
k = (k - 1)
|
|
500
|
+
}
|
|
501
|
+
set pen i best
|
|
502
|
+
set prev i bestK
|
|
503
|
+
i = (i + 1)
|
|
504
|
+
}
|
|
505
|
+
j = (j + 1)
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
def poOut:[int]
|
|
509
|
+
i = 0
|
|
510
|
+
while (i < m) {
|
|
511
|
+
push poOut 0
|
|
512
|
+
i = (i + 1)
|
|
513
|
+
}
|
|
514
|
+
i = n
|
|
515
|
+
j = (m - 1)
|
|
516
|
+
while (i > 0) {
|
|
517
|
+
i = (itemAt prev i)
|
|
518
|
+
set poOut j i
|
|
519
|
+
j = (j - 1)
|
|
520
|
+
}
|
|
521
|
+
po = poOut
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
; Least-squares vertex placement inside the unit square of each pivot
|
|
525
|
+
; (Potrace paper §2.2.4 / adjustVertices). For each polygon edge, fit a
|
|
526
|
+
; line (centroid + direction) to the underlying path points; at each
|
|
527
|
+
; vertex minimise the sum of squared distances to the two adjacent lines,
|
|
528
|
+
; clamped to the 1×1 pixel square around the integer pivot.
|
|
529
|
+
fn adjustVertices:void () {
|
|
530
|
+
def ctr:[EvgTracePoint]
|
|
531
|
+
def dir:[EvgTracePoint]
|
|
532
|
+
def i:int 0
|
|
533
|
+
while (i < m) {
|
|
534
|
+
push ctr (EvgTracePoint.of(0.0 0.0))
|
|
535
|
+
push dir (EvgTracePoint.of(0.0 0.0))
|
|
536
|
+
i = (i + 1)
|
|
537
|
+
}
|
|
538
|
+
i = 0
|
|
539
|
+
while (i < m) {
|
|
540
|
+
def j:int (itemAt po (EvgTraceFit.modI((i + 1) m)))
|
|
541
|
+
def jj:int ((EvgTraceFit.modI((j - (itemAt po i)) n)) + (itemAt po i))
|
|
542
|
+
def c:EvgTracePoint (EvgTracePoint.of(0.0 0.0))
|
|
543
|
+
def d:EvgTracePoint (EvgTracePoint.of(0.0 0.0))
|
|
544
|
+
this.pointslope((itemAt po i) jj c d)
|
|
545
|
+
set ctr i c
|
|
546
|
+
set dir i d
|
|
547
|
+
i = (i + 1)
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
; Quadratic forms Q[i]: v^T Q v = squared distance to line i.
|
|
551
|
+
; Stored as 9 doubles per edge: row-major 3×3.
|
|
552
|
+
def qdata:[double]
|
|
553
|
+
i = 0
|
|
554
|
+
while (i < (m * 9)) {
|
|
555
|
+
push qdata 0.0
|
|
556
|
+
i = (i + 1)
|
|
557
|
+
}
|
|
558
|
+
i = 0
|
|
559
|
+
while (i < m) {
|
|
560
|
+
def di:EvgTracePoint (itemAt dir i)
|
|
561
|
+
def ci:EvgTracePoint (itemAt ctr i)
|
|
562
|
+
def d2:double ((di.x * di.x) + (di.y * di.y))
|
|
563
|
+
def base:int (i * 9)
|
|
564
|
+
if (d2 == 0.0) {
|
|
565
|
+
; zero form already
|
|
566
|
+
} {
|
|
567
|
+
def v0:double di.y
|
|
568
|
+
def v1:double (0.0 - di.x)
|
|
569
|
+
def v2:double ((0.0 - (v1 * ci.y)) - (v0 * ci.x))
|
|
570
|
+
def l:int 0
|
|
571
|
+
while (l < 3) {
|
|
572
|
+
def k:int 0
|
|
573
|
+
while (k < 3) {
|
|
574
|
+
def vl:double v0
|
|
575
|
+
if (l == 1) { vl = v1 }
|
|
576
|
+
if (l == 2) { vl = v2 }
|
|
577
|
+
def vk:double v0
|
|
578
|
+
if (k == 1) { vk = v1 }
|
|
579
|
+
if (k == 2) { vk = v2 }
|
|
580
|
+
set qdata ((base + (l * 3)) + k) ((vl * vk) / d2)
|
|
581
|
+
k = (k + 1)
|
|
582
|
+
}
|
|
583
|
+
l = (l + 1)
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
i = (i + 1)
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
def out:[EvgTracePoint]
|
|
590
|
+
i = 0
|
|
591
|
+
while (i < m) {
|
|
592
|
+
def iPrev:int (EvgTraceFit.modI((i - 1) m))
|
|
593
|
+
def Q:[double]
|
|
594
|
+
def t:int 0
|
|
595
|
+
while (t < 9) {
|
|
596
|
+
push Q 0.0
|
|
597
|
+
t = (t + 1)
|
|
598
|
+
}
|
|
599
|
+
t = 0
|
|
600
|
+
while (t < 9) {
|
|
601
|
+
def a:double (itemAt qdata ((iPrev * 9) + t))
|
|
602
|
+
def b:double (itemAt qdata ((i * 9) + t))
|
|
603
|
+
set Q t (a + b)
|
|
604
|
+
t = (t + 1)
|
|
605
|
+
}
|
|
606
|
+
def pCur:EvgTracePoint (itemAt pts (itemAt po i))
|
|
607
|
+
def sx:double (pCur.x - x0)
|
|
608
|
+
def sy:double (pCur.y - y0)
|
|
609
|
+
def wx:double sx
|
|
610
|
+
def wy:double sy
|
|
611
|
+
|
|
612
|
+
; Try to solve the 2×2 system from ∂Q/∂x = ∂Q/∂y = 0.
|
|
613
|
+
def q00:double (itemAt Q 0)
|
|
614
|
+
def q01:double (itemAt Q 1)
|
|
615
|
+
def q02:double (itemAt Q 2)
|
|
616
|
+
def q10:double (itemAt Q 3)
|
|
617
|
+
def q11:double (itemAt Q 4)
|
|
618
|
+
def q12:double (itemAt Q 5)
|
|
619
|
+
def det:double ((q00 * q11) - (q01 * q10))
|
|
620
|
+
def solved:boolean false
|
|
621
|
+
if (det != 0.0) {
|
|
622
|
+
wx = ((((0.0 - q02) * q11) + (q12 * q01)) / det)
|
|
623
|
+
wy = (((q02 * q10) - (q12 * q00)) / det)
|
|
624
|
+
solved = true
|
|
625
|
+
}
|
|
626
|
+
def dx:double (EvgTraceFit.absD((wx - sx)))
|
|
627
|
+
def dy:double (EvgTraceFit.absD((wy - sy)))
|
|
628
|
+
if ((solved == false) || (dx > 0.5) || (dy > 0.5)) {
|
|
629
|
+
; Fall back: pick the minimum of Q over the unit square corners
|
|
630
|
+
; and edge midpoints around the pivot.
|
|
631
|
+
def best:double (this.quadform(Q sx sy))
|
|
632
|
+
def bx:double sx
|
|
633
|
+
def by:double sy
|
|
634
|
+
def cand:[double]
|
|
635
|
+
; edges
|
|
636
|
+
push cand (sx - 0.5)
|
|
637
|
+
push cand sy
|
|
638
|
+
push cand (sx + 0.5)
|
|
639
|
+
push cand sy
|
|
640
|
+
push cand sx
|
|
641
|
+
push cand (sy - 0.5)
|
|
642
|
+
push cand sx
|
|
643
|
+
push cand (sy + 0.5)
|
|
644
|
+
; corners
|
|
645
|
+
push cand (sx - 0.5)
|
|
646
|
+
push cand (sy - 0.5)
|
|
647
|
+
push cand (sx + 0.5)
|
|
648
|
+
push cand (sy - 0.5)
|
|
649
|
+
push cand (sx - 0.5)
|
|
650
|
+
push cand (sy + 0.5)
|
|
651
|
+
push cand (sx + 0.5)
|
|
652
|
+
push cand (sy + 0.5)
|
|
653
|
+
def ci:int 0
|
|
654
|
+
while (ci < (array_length cand)) {
|
|
655
|
+
def cx:double (itemAt cand ci)
|
|
656
|
+
def cy:double (itemAt cand (ci + 1))
|
|
657
|
+
def val:double (this.quadform(Q cx cy))
|
|
658
|
+
if (val < best) {
|
|
659
|
+
best = val
|
|
660
|
+
bx = cx
|
|
661
|
+
by = cy
|
|
662
|
+
}
|
|
663
|
+
ci = (ci + 2)
|
|
664
|
+
}
|
|
665
|
+
wx = bx
|
|
666
|
+
wy = by
|
|
667
|
+
}
|
|
668
|
+
if (wx < (sx - 0.5)) { wx = (sx - 0.5) }
|
|
669
|
+
if (wx > (sx + 0.5)) { wx = (sx + 0.5) }
|
|
670
|
+
if (wy < (sy - 0.5)) { wy = (sy - 0.5) }
|
|
671
|
+
if (wy > (sy + 0.5)) { wy = (sy + 0.5) }
|
|
672
|
+
push out (EvgTracePoint.of((wx + x0) (wy + y0)))
|
|
673
|
+
i = (i + 1)
|
|
674
|
+
}
|
|
675
|
+
vertex = out
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
fn quadform:double (Q:[double] x:double y:double) {
|
|
679
|
+
def v0:double x
|
|
680
|
+
def v1:double y
|
|
681
|
+
def v2:double 1.0
|
|
682
|
+
def sum:double 0.0
|
|
683
|
+
def i:int 0
|
|
684
|
+
while (i < 3) {
|
|
685
|
+
def vi:double v0
|
|
686
|
+
if (i == 1) { vi = v1 }
|
|
687
|
+
if (i == 2) { vi = v2 }
|
|
688
|
+
def j:int 0
|
|
689
|
+
while (j < 3) {
|
|
690
|
+
def vj:double v0
|
|
691
|
+
if (j == 1) { vj = v1 }
|
|
692
|
+
if (j == 2) { vj = v2 }
|
|
693
|
+
def qij:double (itemAt Q ((i * 3) + j))
|
|
694
|
+
sum = (sum + ((vi * qij) * vj))
|
|
695
|
+
j = (j + 1)
|
|
696
|
+
}
|
|
697
|
+
i = (i + 1)
|
|
698
|
+
}
|
|
699
|
+
return sum
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
; Fit centroid + unit direction of the path from i to j (inclusive wrap).
|
|
703
|
+
fn pointslope:void (iIn:int jIn:int ctr:EvgTracePoint dir:EvgTracePoint) {
|
|
704
|
+
def i:int iIn
|
|
705
|
+
def j:int jIn
|
|
706
|
+
def r:int 0
|
|
707
|
+
while (j >= n) {
|
|
708
|
+
j = (j - n)
|
|
709
|
+
r = (r + 1)
|
|
710
|
+
}
|
|
711
|
+
while (i >= n) {
|
|
712
|
+
i = (i - n)
|
|
713
|
+
r = (r - 1)
|
|
714
|
+
}
|
|
715
|
+
while (j < 0) {
|
|
716
|
+
j = (j + n)
|
|
717
|
+
r = (r - 1)
|
|
718
|
+
}
|
|
719
|
+
while (i < 0) {
|
|
720
|
+
i = (i + n)
|
|
721
|
+
r = (r + 1)
|
|
722
|
+
}
|
|
723
|
+
def si:EvgTraceSum (itemAt sums i)
|
|
724
|
+
def sj:EvgTraceSum (itemAt sums (j + 1))
|
|
725
|
+
def sn:EvgTraceSum (itemAt sums n)
|
|
726
|
+
def x:double ((sj.x - si.x) + ((to_double r) * sn.x))
|
|
727
|
+
def y:double ((sj.y - si.y) + ((to_double r) * sn.y))
|
|
728
|
+
def x2:double ((sj.x2 - si.x2) + ((to_double r) * sn.x2))
|
|
729
|
+
def xy:double ((sj.xy - si.xy) + ((to_double r) * sn.xy))
|
|
730
|
+
def y2:double ((sj.y2 - si.y2) + ((to_double r) * sn.y2))
|
|
731
|
+
def k:double (to_double (((j + 1) - i) + (r * n)))
|
|
732
|
+
if (k == 0.0) {
|
|
733
|
+
ctr.x = 0.0
|
|
734
|
+
ctr.y = 0.0
|
|
735
|
+
dir.x = 0.0
|
|
736
|
+
dir.y = 0.0
|
|
737
|
+
return
|
|
738
|
+
}
|
|
739
|
+
ctr.x = (x / k)
|
|
740
|
+
ctr.y = (y / k)
|
|
741
|
+
def a:double (((x2 - ((x * x) / k)) / k))
|
|
742
|
+
def b:double (((xy - ((x * y) / k)) / k))
|
|
743
|
+
def c:double (((y2 - ((y * y) / k)) / k))
|
|
744
|
+
def disc:double (((a - c) * (a - c)) + ((4.0 * b) * b))
|
|
745
|
+
def lambda2:double (((a + c) + (sqrt disc)) / 2.0)
|
|
746
|
+
a = (a - lambda2)
|
|
747
|
+
c = (c - lambda2)
|
|
748
|
+
def l:double 0.0
|
|
749
|
+
if ((EvgTraceFit.absD(a)) >= (EvgTraceFit.absD(c))) {
|
|
750
|
+
l = (sqrt ((a * a) + (b * b)))
|
|
751
|
+
if (l != 0.0) {
|
|
752
|
+
dir.x = ((0.0 - b) / l)
|
|
753
|
+
dir.y = (a / l)
|
|
754
|
+
}
|
|
755
|
+
} {
|
|
756
|
+
l = (sqrt ((c * c) + (b * b)))
|
|
757
|
+
if (l != 0.0) {
|
|
758
|
+
dir.x = ((0.0 - c) / l)
|
|
759
|
+
dir.y = (b / l)
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
if (l == 0.0) {
|
|
763
|
+
dir.x = 0.0
|
|
764
|
+
dir.y = 0.0
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|