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,595 @@
|
|
|
1
|
+
# EVG Rendering System - TODO List
|
|
2
|
+
|
|
3
|
+
Based on priorities from `PLAN_EVG.md`. Updated: December 23, 2025.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ✅ RECENTLY COMPLETED (December 2025)
|
|
8
|
+
|
|
9
|
+
### EVG Preview Server with Live Reload
|
|
10
|
+
- [x] Create `evg_preview_server.rgr` with HTTP server
|
|
11
|
+
- [x] Shell HTML endpoint (GET `/`) with SSE client JavaScript
|
|
12
|
+
- [x] Content endpoint (GET `/content`) for document rendering
|
|
13
|
+
- [x] Font CSS endpoint (GET `/fonts.css`) with server URLs
|
|
14
|
+
- [x] Asset serving endpoint (GET `/assets/`) for images and fonts
|
|
15
|
+
- [x] SSE events endpoint (GET `/events`) for live reload
|
|
16
|
+
- [x] File watching via `file_mtime` operator
|
|
17
|
+
- [x] ComponentEngine integration for TSX parsing
|
|
18
|
+
- [x] EVGLayout integration for proper page dimensions
|
|
19
|
+
- [x] Multi-page document support (16+ pages tested)
|
|
20
|
+
|
|
21
|
+
### Layer Element
|
|
22
|
+
- [x] Add `<Layer>` element type to parser
|
|
23
|
+
- [x] Implement as absolute-positioned container filling parent
|
|
24
|
+
- [x] Support `background` for gradient overlays
|
|
25
|
+
- [x] Render children in order (first = bottom, last = top)
|
|
26
|
+
- [x] Support `align` and `verticalAlign` for child positioning
|
|
27
|
+
|
|
28
|
+
### Image ViewBox (HTML)
|
|
29
|
+
- [x] Parse `imageViewBox` attribute: `"25% 25% 50% 50%"` (x y w h)
|
|
30
|
+
- [x] Implement HTML cropping with wrapper div and overflow:hidden
|
|
31
|
+
- [x] Add `objectFit` attribute: "cover", "contain", "fill"
|
|
32
|
+
|
|
33
|
+
### Alignment Attributes
|
|
34
|
+
- [x] Add `align` attribute for horizontal alignment: "left", "center", "right"
|
|
35
|
+
- [x] Add `verticalAlign` attribute for vertical alignment: "top", "center", "bottom"
|
|
36
|
+
- [x] Parse attributes in JSXToEVG with kebab-case conversion
|
|
37
|
+
|
|
38
|
+
### Documentation
|
|
39
|
+
- [x] Updated README.md with EVG Attributes Reference
|
|
40
|
+
- [x] Added examples for Layer, imageViewBox, and alignment
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 🎯 RECOMMENDED NEXT STEPS
|
|
45
|
+
|
|
46
|
+
Based on current progress, here are the most impactful next items:
|
|
47
|
+
|
|
48
|
+
### Quick Wins (< 1 day each)
|
|
49
|
+
1. **PDF: imageViewBox** - Add cropping to PDF renderer (parsing already done)
|
|
50
|
+
2. **PDF: overflow: hidden** - Clip children to View bounds
|
|
51
|
+
3. **PDF: opacity** - Simple ExtGState implementation
|
|
52
|
+
|
|
53
|
+
### Medium Impact (1-2 days)
|
|
54
|
+
4. **backgroundImage on View** - Views with background images (useful with Layer)
|
|
55
|
+
5. **PNG: Image rendering** - Complete the PNG raster renderer
|
|
56
|
+
|
|
57
|
+
### Nice to Have
|
|
58
|
+
6. **Unified evg_tool** - Merge all tools into one with better CLI (see PLAN_HTTP.md)
|
|
59
|
+
7. **Diff-based page updates** - Only reload changed pages in live preview
|
|
60
|
+
8. **Unit test framework** - Vitest integration for regression testing
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 🔴 HIGHEST PRIORITY
|
|
65
|
+
|
|
66
|
+
### 1. HTML Renderer
|
|
67
|
+
**Goal:** Enable unit testing, fast preview, and rapid development iteration.
|
|
68
|
+
|
|
69
|
+
- [x] **0.1** Basic HTML structure (View, Label) - *DONE*
|
|
70
|
+
- [x] **0.2** CSS generation (colors, dimensions, spacing) - *DONE*
|
|
71
|
+
- [x] **0.3** Flexbox layout mapping - *DONE (absolute positioning)*
|
|
72
|
+
- [x] **0.4** Image rendering with base64 embedding - *DONE*
|
|
73
|
+
- [x] **0.5** SVG Path embedding - *DONE*
|
|
74
|
+
- [x] **0.10** SVG file import (`<Svg src="…">`) - *DONE (SvgParser; resolved to path data rather than passed through, so the preview shows what will print)*
|
|
75
|
+
- [x] **0.6** Font embedding (TTF to base64) - *DONE*
|
|
76
|
+
- [x] **0.7** Gradients and shadows - *DONE (CSS native)*
|
|
77
|
+
- [ ] **0.8** Unit test framework (Vitest) - *TODO*
|
|
78
|
+
- [x] **0.9** Preview server with hot reload - *DONE*
|
|
79
|
+
|
|
80
|
+
### 2. PNG Raster Renderer
|
|
81
|
+
**Goal:** Pixel-accurate rendering for testing and preview images.
|
|
82
|
+
|
|
83
|
+
- [x] **PNG 0.1** Basic rasterization (rectangles, colors) - *DONE*
|
|
84
|
+
- [x] **PNG 0.2** Anti-aliased text with TrueType fonts - *DONE*
|
|
85
|
+
- [x] **PNG 0.3** Rounded rectangles - *DONE*
|
|
86
|
+
- [x] **PNG 0.4** Linear gradients (all angles) - *DONE*
|
|
87
|
+
- [x] **PNG 0.5** Radial gradients - *DONE*
|
|
88
|
+
- [x] **PNG 0.6** Box shadows with blur - *DONE*
|
|
89
|
+
- [x] **PNG 0.7** EVGGradient shared parsing - *DONE*
|
|
90
|
+
- [ ] **PNG 0.8** Image rendering - *TODO*
|
|
91
|
+
- [x] **PNG 0.9** SVG path rasterization - *DONE (shared VectorRasterizer; fill + approximated stroke)*
|
|
92
|
+
- [x] **PNG 0.10** SVG file import - *DONE (same VectorRasterizer, one item at a time)*
|
|
93
|
+
|
|
94
|
+
**New Files Created:**
|
|
95
|
+
```
|
|
96
|
+
gallery/pdf_writer/src/
|
|
97
|
+
├── raster/
|
|
98
|
+
│ ├── EVGRasterRenderer.rgr # Software rasterizer
|
|
99
|
+
│ ├── RasterText.rgr # TrueType glyph rasterizer (4x4 AA)
|
|
100
|
+
│ └── PNGEncoder.rgr # PNG file encoder
|
|
101
|
+
├── tools/
|
|
102
|
+
│ └── evg_png_tool.rgr # CLI tool: TSX → PNG
|
|
103
|
+
lib/evg/
|
|
104
|
+
├── EVGGradient.rgr # Shared gradient parsing (NEW)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Added to package.json:**
|
|
108
|
+
- `npm run evgpng:compile` - Compile PNG renderer
|
|
109
|
+
- `npm run evgpng:run` - Run TSX→PNG conversion
|
|
110
|
+
- `npm run evgpng` - Compile and run
|
|
111
|
+
|
|
112
|
+
**Completed Files:**
|
|
113
|
+
```
|
|
114
|
+
gallery/pdf_writer/src/
|
|
115
|
+
├── core/
|
|
116
|
+
│ ├── EVGPDFRenderer.rgr # Existing PDF renderer
|
|
117
|
+
│ └── EVGHTMLRenderer.rgr # ✅ HTML/CSS renderer (~970 lines)
|
|
118
|
+
├── raster/
|
|
119
|
+
│ ├── EVGRasterRenderer.rgr # ✅ Software rasterizer
|
|
120
|
+
│ ├── RasterText.rgr # ✅ TrueType glyph rasterizer
|
|
121
|
+
│ └── PNGEncoder.rgr # ✅ PNG file encoder
|
|
122
|
+
├── jsx/
|
|
123
|
+
│ └── JSXToEVG.rgr # ✅ Updated: Gradient parsing
|
|
124
|
+
├── tools/
|
|
125
|
+
│ ├── evg_html_tool.rgr # ✅ CLI tool for TSX→HTML
|
|
126
|
+
│ └── evg_png_tool.rgr # ✅ CLI tool for TSX→PNG
|
|
127
|
+
└── tests/
|
|
128
|
+
└── (TODO: Unit tests)
|
|
129
|
+
|
|
130
|
+
lib/evg/
|
|
131
|
+
├── EVGElement.rgr # ✅ Updated: gradient property
|
|
132
|
+
├── EVGGradient.rgr # ✅ NEW: Shared gradient parsing
|
|
133
|
+
└── EVGColor.rgr # Color with method accessors
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Added to package.json:**
|
|
137
|
+
- `npm run evghtml:compile` - Compile HTML renderer
|
|
138
|
+
- `npm run evghtml:run` - Run TSX→HTML conversion
|
|
139
|
+
- `npm run evghtml` - Compile and run
|
|
140
|
+
- `-embed` flag for base64 embedding of images and fonts
|
|
141
|
+
|
|
142
|
+
**Lang.rgr Updates:**
|
|
143
|
+
- Added `buffer_to_base64` operator for base64 encoding
|
|
144
|
+
|
|
145
|
+
**Note:** The HTML renderer lives alongside the PDF renderer in `gallery/pdf_writer/` because:
|
|
146
|
+
- Both renderers share the same EVG element tree
|
|
147
|
+
- Both use the same font metrics from `TrueTypeParser.rgr`
|
|
148
|
+
- The `evg` CLI tool will support both `--format=pdf` and `--format=html`
|
|
149
|
+
- Unit tests can verify HTML output before PDF generation
|
|
150
|
+
|
|
151
|
+
**Estimated remaining time:** ~4 days (gradients, shadows, unit tests, hot reload)
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 🟠 HIGH PRIORITY
|
|
156
|
+
|
|
157
|
+
### 2. PDF: overflow: hidden
|
|
158
|
+
**Goal:** Clip children to View bounds.
|
|
159
|
+
|
|
160
|
+
- [ ] Parse `overflow` attribute in `JSXToEVG.rgr`
|
|
161
|
+
- [ ] Implement PDF clipping rectangle in `EVGPDFRenderer.rgr`
|
|
162
|
+
- [ ] Use `q ... re W n ... Q` graphics state
|
|
163
|
+
|
|
164
|
+
**Complexity:** Low
|
|
165
|
+
**Estimated time:** 1 day
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
### 3. PDF: opacity
|
|
170
|
+
**Goal:** Support transparency for elements.
|
|
171
|
+
|
|
172
|
+
- [ ] Implement PDF ExtGState with `ca` (fill) and `CA` (stroke) operators
|
|
173
|
+
- [ ] Register ExtGState resources in PDF output
|
|
174
|
+
- [ ] Apply to elements with `opacity` attribute
|
|
175
|
+
|
|
176
|
+
**Complexity:** Low
|
|
177
|
+
**Estimated time:** 1 day
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
### 4. PDF: rotate & scale transforms
|
|
182
|
+
**Goal:** Rotate and scale elements.
|
|
183
|
+
|
|
184
|
+
- [ ] Parse `rotate` and `scale` attributes in `JSXToEVG.rgr`
|
|
185
|
+
- [ ] Implement PDF `cm` transformation matrix
|
|
186
|
+
- [ ] Calculate rotation center (element center by default)
|
|
187
|
+
- [ ] Save/restore graphics state around transforms
|
|
188
|
+
|
|
189
|
+
**Complexity:** Medium
|
|
190
|
+
**Estimated time:** 2 days
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### 5. PDF: linear-gradient
|
|
195
|
+
**Goal:** Gradient backgrounds on View elements.
|
|
196
|
+
|
|
197
|
+
- [x] Parse CSS-style gradient syntax: `linear-gradient(45deg, red, blue)` - *DONE (EVGGradient.rgr)*
|
|
198
|
+
- [ ] Implement PDF Shading Pattern Type 2 (Axial)
|
|
199
|
+
- [ ] Calculate gradient endpoints from angle and bounds
|
|
200
|
+
- [ ] Register shading pattern resources
|
|
201
|
+
|
|
202
|
+
**Note:** Gradient parsing is shared via `EVGGradient.rgr`. PDF rendering needs shading patterns.
|
|
203
|
+
|
|
204
|
+
**Complexity:** Medium
|
|
205
|
+
**Estimated time:** 2-3 days
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
### 6. Image viewBox (Crop/Zoom)
|
|
210
|
+
**Goal:** Crop/zoom into specific regions of images.
|
|
211
|
+
|
|
212
|
+
- [x] Parse `imageViewBox` attribute on Image elements: `imageViewBox="10% 10% 80% 80%"` - *DONE*
|
|
213
|
+
- [x] Calculate source rectangle from percentages - *DONE*
|
|
214
|
+
- [x] Implement HTML with CSS wrapper div and overflow:hidden - *DONE*
|
|
215
|
+
- [x] Add `objectFit` attribute for sizing mode: "cover", "contain", "fill", "none" - *DONE*
|
|
216
|
+
- [ ] Implement PDF image transformation matrix for cropping
|
|
217
|
+
|
|
218
|
+
**Complexity:** Low (PDF remaining)
|
|
219
|
+
**Estimated time:** 0.5 day (PDF remaining)
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
### 7. Layer Element ✅ COMPLETED
|
|
224
|
+
**Goal:** Enable stacking content with overlays.
|
|
225
|
+
|
|
226
|
+
- [x] Add `<Layer>` element type to parser - *DONE*
|
|
227
|
+
- [x] Implement as absolute-positioned container filling parent - *DONE*
|
|
228
|
+
- [x] Support `background` for gradient overlays - *DONE*
|
|
229
|
+
- [x] Render children in order (first = bottom, last = top) - *DONE*
|
|
230
|
+
- [x] Support `align` and `verticalAlign` for child positioning - *DONE*
|
|
231
|
+
|
|
232
|
+
**Status:** COMPLETED (December 2025)
|
|
233
|
+
|
|
234
|
+
**Test File:** `gallery/pdf_writer/examples/test_layer_viewbox.tsx`
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
### 8. backgroundImage on View
|
|
239
|
+
**Goal:** Views with background images.
|
|
240
|
+
|
|
241
|
+
- [ ] Parse `backgroundImage` attribute
|
|
242
|
+
- [ ] Parse `backgroundSize` (cover, contain, stretch)
|
|
243
|
+
- [ ] Parse `backgroundViewBox` for cropping
|
|
244
|
+
- [ ] Draw image before rendering children
|
|
245
|
+
- [ ] Apply clipping if `overflow: hidden`
|
|
246
|
+
|
|
247
|
+
**Complexity:** Medium
|
|
248
|
+
**Estimated time:** 2 days
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 🟡 MEDIUM PRIORITY
|
|
253
|
+
|
|
254
|
+
### 9. PDF: radial-gradient
|
|
255
|
+
**Goal:** Radial gradient backgrounds.
|
|
256
|
+
|
|
257
|
+
- [x] Parse CSS-style syntax: `radial-gradient(red, blue)` - *DONE (EVGGradient.rgr)*
|
|
258
|
+
- [ ] Implement PDF Shading Pattern Type 3 (Radial)
|
|
259
|
+
- [ ] Calculate center and radius from bounds
|
|
260
|
+
|
|
261
|
+
**Complexity:** Medium-High
|
|
262
|
+
**Estimated time:** 2 days
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
### 10. PDF: shadow effects (DEFERRED)
|
|
267
|
+
**Goal:** Box shadows on elements.
|
|
268
|
+
|
|
269
|
+
⚠️ **DEFERRED** - PDF does not natively support shadows. Complex simulation required.
|
|
270
|
+
|
|
271
|
+
- [ ] Parse `shadowRadius`, `shadowColor`, `shadowOffsetX`, `shadowOffsetY` - *Already parsed*
|
|
272
|
+
- [ ] Option A: Draw blurred offset shapes (complex, poor quality)
|
|
273
|
+
- [ ] Option B: Rasterize shadow as image (memory/quality tradeoff)
|
|
274
|
+
- [ ] Option C: Pre-render shadow to PNG, embed in PDF
|
|
275
|
+
|
|
276
|
+
**Note:** Shadows work in HTML (native CSS) and PNG (rasterized blur).
|
|
277
|
+
For PDF, consider using the PNG renderer to generate shadow images, then embed.
|
|
278
|
+
|
|
279
|
+
**Complexity:** High
|
|
280
|
+
**Estimated time:** 3-4 days (if implemented)
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
### 10b. Text/Path/Image Shadows (DEFERRED)
|
|
285
|
+
**Goal:** Drop shadows on text, paths, and images.
|
|
286
|
+
|
|
287
|
+
⚠️ **DEFERRED** - Requires rasterization for PDF. Native in HTML/CSS.
|
|
288
|
+
|
|
289
|
+
- Text shadow: CSS `text-shadow` (HTML), rasterize for PDF
|
|
290
|
+
- Path shadow: Duplicate path with offset and blur
|
|
291
|
+
- Image shadow: Add shadow behind image
|
|
292
|
+
|
|
293
|
+
**Note:** These work natively in HTML renderer. For PDF/PNG, use raster approach.
|
|
294
|
+
|
|
295
|
+
**Complexity:** High
|
|
296
|
+
**Estimated time:** 3-4 days (if implemented)
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
### 11. Incremental PDF Rendering
|
|
301
|
+
**Goal:** Fast preview with only changed pages re-rendered.
|
|
302
|
+
|
|
303
|
+
- [ ] Implement page content hashing
|
|
304
|
+
- [ ] Detect changed pages on file save
|
|
305
|
+
- [ ] Render single page to PNG: `evg example.tsx --page=2 --format=png`
|
|
306
|
+
- [ ] WebSocket push updates to preview
|
|
307
|
+
|
|
308
|
+
**Complexity:** Medium
|
|
309
|
+
**Estimated time:** 3 days
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
### 12. Live Preview Server
|
|
314
|
+
**Goal:** Hot-reload preview in browser.
|
|
315
|
+
|
|
316
|
+
- [ ] File watcher for TSX changes
|
|
317
|
+
- [ ] HTTP server for preview HTML
|
|
318
|
+
- [ ] WebSocket for live updates
|
|
319
|
+
- [ ] Font serving from assets
|
|
320
|
+
|
|
321
|
+
**Complexity:** Medium
|
|
322
|
+
**Estimated time:** 2 days
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## 🟢 LOW PRIORITY
|
|
327
|
+
|
|
328
|
+
### 13. Interactive elements (Web only)
|
|
329
|
+
- [ ] `<input>` text input element
|
|
330
|
+
- [ ] `<textarea>` multi-line input
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
### 14. VS Code Extension
|
|
335
|
+
- [ ] Preview panel in VS Code
|
|
336
|
+
- [ ] Side-by-side editing
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
### 15. Native macOS Preview App
|
|
341
|
+
- [ ] Swift wrapper around `evg` binary
|
|
342
|
+
- [ ] FSEvents file watching
|
|
343
|
+
- [ ] Per-page PNG cache
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## 📊 Progress Summary
|
|
348
|
+
|
|
349
|
+
| Priority | Tasks | Completed | Remaining |
|
|
350
|
+
|----------|-------|-----------|-----------|
|
|
351
|
+
| 🔴 HIGHEST (HTML) | 9 | 7 | 2 |
|
|
352
|
+
| � HIGHEST (PNG) | 9 | 7 | 2 |
|
|
353
|
+
| �🟠 HIGH | 7 | 0 | 7 |
|
|
354
|
+
| 🟡 MEDIUM | 4 | 0 | 4 (2 deferred) |
|
|
355
|
+
| 🟢 LOW | 3 | 0 | 3 |
|
|
356
|
+
| **TOTAL** | **32** | **14** | **18** |
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Quick Reference: Feature Status
|
|
361
|
+
|
|
362
|
+
### Currently Working ✅
|
|
363
|
+
- View, Label, Image, Path, Rect elements
|
|
364
|
+
- Flexbox layout (flex, justifyContent, alignItems, gap)
|
|
365
|
+
- Absolute positioning
|
|
366
|
+
- Margin, padding, border
|
|
367
|
+
- borderRadius, clipPath (circle, ellipse)
|
|
368
|
+
- TrueType fonts with Unicode
|
|
369
|
+
- JPEG with EXIF orientation
|
|
370
|
+
- Multi-page documents
|
|
371
|
+
- **HTML Renderer** (View, Label, Image, Path, gradients, shadows)
|
|
372
|
+
- **PNG Renderer** (View, Label, gradients, shadows, rounded corners)
|
|
373
|
+
- **Base64 embedding** (images, fonts)
|
|
374
|
+
- **Font mapping** (Google Fonts: Amatic SC, Gloria Hallelujah, Josefin Slab, etc.)
|
|
375
|
+
- **Gradient parsing** (shared EVGGradient.rgr for all renderers)
|
|
376
|
+
|
|
377
|
+
### Defined but Not Working ⚠️
|
|
378
|
+
- `opacity` - parsed, not rendered in PDF
|
|
379
|
+
- `rotate` - defined, not parsed
|
|
380
|
+
- `scale` - defined, not parsed
|
|
381
|
+
- `overflow` - defined, not parsed
|
|
382
|
+
- PDF linear-gradient - parsing done, PDF shading not implemented
|
|
383
|
+
- PDF radial-gradient - parsing done, PDF shading not implemented
|
|
384
|
+
|
|
385
|
+
### Deferred ⏸️
|
|
386
|
+
- PDF shadows (no native support, requires rasterization)
|
|
387
|
+
- Text shadows for PDF (use HTML/PNG instead)
|
|
388
|
+
- Path shadows for PDF (use HTML/PNG instead)
|
|
389
|
+
- Image shadows for PDF (use HTML/PNG instead)
|
|
390
|
+
|
|
391
|
+
### Not Implemented ❌
|
|
392
|
+
- Image viewBox (crop/zoom)
|
|
393
|
+
- backgroundImage on View
|
|
394
|
+
- Layer element
|
|
395
|
+
- Incremental rendering
|
|
396
|
+
- Unit test framework
|
|
397
|
+
- Hot reload preview server
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Next Actions
|
|
402
|
+
|
|
403
|
+
### ✅ COMPLETED: HTML Renderer Phase 0.1-0.7
|
|
404
|
+
- Created `EVGHTMLRenderer.rgr` (~970 lines)
|
|
405
|
+
- Created `evg_html_tool.rgr` CLI tool
|
|
406
|
+
- Added `buffer_to_base64` to Lang.rgr
|
|
407
|
+
- Font embedding (TTF to base64)
|
|
408
|
+
- Image embedding (JPEG to base64)
|
|
409
|
+
- Gradients and shadows (native CSS)
|
|
410
|
+
|
|
411
|
+
### ✅ COMPLETED: PNG Raster Renderer Phase 0.1-0.7
|
|
412
|
+
- Created `EVGRasterRenderer.rgr` - software rasterizer
|
|
413
|
+
- Created `RasterText.rgr` - TrueType glyph rasterizer with 4x4 AA
|
|
414
|
+
- Created `PNGEncoder.rgr` - PNG file output
|
|
415
|
+
- Created `evg_png_tool.rgr` - CLI tool for TSX→PNG
|
|
416
|
+
- Created `EVGGradient.rgr` - shared gradient parsing
|
|
417
|
+
- Linear gradients (all angles)
|
|
418
|
+
- Radial gradients
|
|
419
|
+
- Box shadows with blur
|
|
420
|
+
- Rounded rectangles
|
|
421
|
+
|
|
422
|
+
### 🔄 IN PROGRESS: HTML/PNG Renderer Phase 0.8-0.9
|
|
423
|
+
1. **Unit test framework** (0.8)
|
|
424
|
+
- Vitest for JavaScript testing
|
|
425
|
+
- Compare HTML output snapshots
|
|
426
|
+
- Compare PNG output (pixel diff)
|
|
427
|
+
|
|
428
|
+
2. **Preview server with hot reload** (0.9)
|
|
429
|
+
- File watcher for TSX changes
|
|
430
|
+
- WebSocket for live updates
|
|
431
|
+
|
|
432
|
+
### 📋 NEXT: PDF Improvements (in order)
|
|
433
|
+
1. **`overflow: hidden`** - Simple clipping rectangle (1 day)
|
|
434
|
+
2. **`opacity`** - PDF ExtGState transparency (1 day)
|
|
435
|
+
3. **`rotate` & `scale`** - PDF transformation matrix (2 days)
|
|
436
|
+
4. **`linear-gradient`** - PDF Type 2 shading (2-3 days)
|
|
437
|
+
5. **`radial-gradient`** - PDF Type 3 shading (2 days)
|
|
438
|
+
|
|
439
|
+
### 📋 NEXT: PNG Renderer Completion
|
|
440
|
+
1. **Image rendering** - Embed images in raster output
|
|
441
|
+
2. ~~**SVG path rasterization** - Bezier curve rendering~~ - *DONE, see lib/evg/PLAN_VECTOR_IR.md*
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
*This TODO list is derived from PLAN_EVG.md. See that document for detailed implementation notes and architecture diagrams.*
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## ⚠️ Implementation Guidelines
|
|
450
|
+
|
|
451
|
+
### Avoiding Circular References
|
|
452
|
+
|
|
453
|
+
When implementing EVG components, **avoid circular references** to ensure compatibility with languages like Rust that have strict ownership rules.
|
|
454
|
+
|
|
455
|
+
#### Problem: Parent-Child Circular References
|
|
456
|
+
|
|
457
|
+
```ranger
|
|
458
|
+
; BAD: Circular reference - child.parent = this
|
|
459
|
+
class EVGElement {
|
|
460
|
+
def parent@(optional):EVGElement ; Points to parent
|
|
461
|
+
def children:[EVGElement] ; Parent points to children
|
|
462
|
+
|
|
463
|
+
fn addChild:void (child:EVGElement) {
|
|
464
|
+
child.parent = this ; ❌ Creates circular reference!
|
|
465
|
+
push children child
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
**Issues in Rust:**
|
|
471
|
+
- Cannot have `Rc<RefCell<T>>` with parent pointing to child and child pointing to parent
|
|
472
|
+
- Causes memory leaks (reference count never reaches 0)
|
|
473
|
+
- Requires `Weak<RefCell<T>>` for parent references
|
|
474
|
+
|
|
475
|
+
#### Solution 1: Weak References for Parent
|
|
476
|
+
|
|
477
|
+
```ranger
|
|
478
|
+
; GOOD: Use weak reference annotation for parent
|
|
479
|
+
class EVGElement {
|
|
480
|
+
def parent@(optional weak):EVGElement ; Weak reference - won't prevent deallocation
|
|
481
|
+
def children:[EVGElement] ; Strong references to children
|
|
482
|
+
|
|
483
|
+
fn addChild:void (child:EVGElement) {
|
|
484
|
+
child.parent = this ; OK - parent is weak reference
|
|
485
|
+
push children child
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
**Rust translation:**
|
|
491
|
+
```rust
|
|
492
|
+
struct EVGElement {
|
|
493
|
+
parent: Option<Weak<RefCell<EVGElement>>>, // Weak reference
|
|
494
|
+
children: Vec<Rc<RefCell<EVGElement>>>, // Strong references
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
#### Solution 2: Index-Based Parent References
|
|
499
|
+
|
|
500
|
+
```ranger
|
|
501
|
+
; GOOD: Use index instead of direct reference
|
|
502
|
+
class EVGElement {
|
|
503
|
+
def parentIndex:int -1 ; Index in element array, -1 = no parent
|
|
504
|
+
def childIndices:[int] ; Indices of children
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
class EVGDocument {
|
|
508
|
+
def elements:[EVGElement] ; Flat array of all elements
|
|
509
|
+
|
|
510
|
+
fn getParent:EVGElement (el:EVGElement) {
|
|
511
|
+
if (el.parentIndex < 0) {
|
|
512
|
+
return null
|
|
513
|
+
}
|
|
514
|
+
return (itemAt elements el.parentIndex)
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
#### Solution 3: Visitor Pattern (No Parent Reference Needed)
|
|
520
|
+
|
|
521
|
+
```ranger
|
|
522
|
+
; GOOD: Pass parent as parameter during traversal
|
|
523
|
+
class EVGRenderer {
|
|
524
|
+
fn renderElement:void (el:EVGElement parent@(optional):EVGElement depth:int) {
|
|
525
|
+
; Parent available as parameter, not stored in element
|
|
526
|
+
|
|
527
|
+
; Render this element
|
|
528
|
+
this.drawElement(el)
|
|
529
|
+
|
|
530
|
+
; Recurse to children
|
|
531
|
+
def i:int 0
|
|
532
|
+
while (i < (array_length el.children)) {
|
|
533
|
+
def child:EVGElement (itemAt el.children i)
|
|
534
|
+
this.renderElement(child el (depth + 1)) ; Pass current as parent
|
|
535
|
+
i = i + 1
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
#### Solution 4: Separate Parent Map
|
|
542
|
+
|
|
543
|
+
```ranger
|
|
544
|
+
; GOOD: Store parent relationships in separate map
|
|
545
|
+
class EVGDocument {
|
|
546
|
+
def root:EVGElement
|
|
547
|
+
def parentMap:[string:EVGElement] ; childId -> parent mapping
|
|
548
|
+
|
|
549
|
+
fn setParent:void (child:EVGElement parent:EVGElement) {
|
|
550
|
+
set parentMap child.id parent
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
fn getParent:EVGElement (child:EVGElement) {
|
|
554
|
+
return (get parentMap child.id)
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### Guidelines for EVG Implementation
|
|
560
|
+
|
|
561
|
+
1. **Prefer Solution 1 (Weak References)** when parent access is frequently needed
|
|
562
|
+
2. **Prefer Solution 3 (Visitor Pattern)** for rendering/traversal operations
|
|
563
|
+
3. **Never store `this` in child** without weak reference annotation
|
|
564
|
+
4. **Document circular dependencies** in class comments
|
|
565
|
+
|
|
566
|
+
### Affected Files
|
|
567
|
+
|
|
568
|
+
When implementing new features, check these files for circular reference issues:
|
|
569
|
+
|
|
570
|
+
| File | Location | Current Issue | Recommended Fix |
|
|
571
|
+
|------|----------|---------------|-----------------|
|
|
572
|
+
| `EVGElement.rgr` | `lib/evg/` | `parent` is direct reference | Add `@(weak)` annotation |
|
|
573
|
+
| `EVGLayout.rgr` | `lib/evg/` | May store parent during layout | Use visitor pattern |
|
|
574
|
+
| `EVGPDFRenderer.rgr` | `gallery/pdf_writer/src/core/` | May store element refs | Use visitor pattern |
|
|
575
|
+
| `EVGHTMLRenderer.rgr` | `gallery/pdf_writer/src/core/` | NEW - avoid circular refs | Use visitor pattern |
|
|
576
|
+
| `JSXToEVG.rgr` | `gallery/pdf_writer/src/jsx/` | Builds element tree | Set parent with weak ref |
|
|
577
|
+
|
|
578
|
+
### Ranger Compiler Enhancement Needed
|
|
579
|
+
|
|
580
|
+
To fully support Rust output, the Ranger compiler should:
|
|
581
|
+
|
|
582
|
+
1. **Recognize `@(weak)` annotation** on reference types
|
|
583
|
+
2. **Generate `Weak<RefCell<T>>`** for weak references in Rust
|
|
584
|
+
3. **Generate `Rc<RefCell<T>>`** for strong references in Rust
|
|
585
|
+
4. **Warn about potential circular references** during compilation
|
|
586
|
+
|
|
587
|
+
```ranger
|
|
588
|
+
; Example of enhanced annotations
|
|
589
|
+
class Node {
|
|
590
|
+
def parent@(optional weak):Node ; -> Option<Weak<RefCell<Node>>>
|
|
591
|
+
def children:[Node] ; -> Vec<Rc<RefCell<Node>>>
|
|
592
|
+
def data:string ; -> String
|
|
593
|
+
}
|
|
594
|
+
```
|
|
595
|
+
|