ranger-compiler 3.5.1 → 3.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1064 -20
- package/LICENSE +3 -1
- package/README.md +123 -28
- package/dist/Lang.rgr +1188 -290
- package/dist/api.d.ts +2343 -879
- package/dist/api.js +79923 -56921
- package/dist/lib/JSON.rgr +102 -91
- package/dist/lib/Shell.rgr +4 -4
- package/dist/lib/apple/AppleToolchain.rgr +4 -4
- package/dist/lib/apple/README.md +5 -4
- package/dist/lib/apple/apple_test.rgr +1 -1
- package/dist/lib/core/README.md +1 -1
- package/dist/lib/evg/EVG.rgr +12 -0
- package/dist/lib/evg/EVGA11yFromTree.rgr +302 -0
- package/dist/lib/evg/EVGA11yTree.rgr +894 -0
- package/dist/lib/evg/EVGBox.rgr +267 -0
- package/dist/lib/evg/EVGBoxShorthandTest.rgr +220 -0
- package/dist/lib/evg/EVGCodepoint.rgr +316 -0
- package/dist/lib/evg/EVGColor.rgr +700 -0
- package/dist/lib/evg/EVGCommands.rgr +177 -0
- package/dist/lib/evg/EVGComponent.rgr +331 -0
- package/dist/lib/evg/EVGComponentTest.rgr +387 -0
- package/dist/lib/evg/EVGConnector.rgr +541 -0
- package/dist/lib/evg/EVGConnectorTest.rgr +306 -0
- package/dist/lib/evg/EVGDisplayList.rgr +4186 -0
- package/dist/lib/evg/EVGEasing.rgr +370 -0
- package/dist/lib/evg/EVGEffectTest.rgr +253 -0
- package/dist/lib/evg/EVGElement.rgr +4914 -0
- package/dist/lib/evg/EVGFixedTest.rgr +289 -0
- package/dist/lib/evg/EVGFlexRulesTest.rgr +317 -0
- package/dist/lib/evg/EVGFlexWrapTest.rgr +246 -0
- package/dist/lib/evg/EVGFling.rgr +244 -0
- package/dist/lib/evg/EVGFocus.rgr +400 -0
- package/dist/lib/evg/EVGFocusTest.rgr +399 -0
- package/dist/lib/evg/EVGGradient.rgr +322 -0
- package/dist/lib/evg/EVGGrapheme.rgr +190 -0
- package/dist/lib/evg/EVGGrid.rgr +975 -0
- package/dist/lib/evg/EVGHitTest.rgr +208 -0
- package/dist/lib/evg/EVGHoles.rgr +294 -0
- package/dist/lib/evg/EVGHostMeasurerTest.rgr +281 -0
- package/dist/lib/evg/EVGHostTextMeasurer.rgr +331 -0
- package/dist/lib/evg/EVGHostTree.rgr +834 -0
- package/dist/lib/evg/EVGHostTreeTest.rgr +447 -0
- package/dist/lib/evg/EVGImageDecode.rgr +117 -0
- package/dist/lib/evg/EVGImageMeasurer.rgr +86 -0
- package/dist/lib/evg/EVGInspect.rgr +883 -0
- package/dist/lib/evg/EVGInvalidateTest.rgr +432 -0
- package/dist/lib/evg/EVGJsonTest.rgr +535 -0
- package/dist/lib/evg/EVGLayout.rgr +4220 -0
- package/dist/lib/evg/EVGMeasure.rgr +1267 -0
- package/dist/lib/evg/EVGOverlayTest.rgr +626 -0
- package/dist/lib/evg/EVGPatch.rgr +1721 -0
- package/dist/lib/evg/EVGPatchTest.rgr +692 -0
- package/dist/lib/evg/EVGPopoverTest.rgr +395 -0
- package/dist/lib/evg/EVGReconcile.rgr +226 -0
- package/dist/lib/evg/EVGReconcileTest.rgr +421 -0
- package/dist/lib/evg/EVGReject.rgr +126 -0
- package/dist/lib/evg/EVGRelayoutTest.rgr +375 -0
- package/dist/lib/evg/EVGRtlLayoutTest.rgr +319 -0
- package/dist/lib/evg/EVGRuler.rgr +232 -0
- package/dist/lib/evg/EVGRulerTest.rgr +172 -0
- package/dist/lib/evg/EVGSelectChrome.rgr +178 -0
- package/dist/lib/evg/EVGStyleCacheTest.rgr +419 -0
- package/dist/lib/evg/EVGStyleSheet.rgr +2148 -0
- package/dist/lib/evg/EVGStyleStateTest.rgr +407 -0
- package/dist/lib/evg/EVGStyleVarTest.rgr +471 -0
- package/dist/lib/evg/EVGText.rgr +105 -0
- package/dist/lib/evg/EVGTextEngine.rgr +536 -0
- package/dist/lib/evg/EVGTextMeasurer.rgr +720 -0
- package/dist/lib/evg/EVGTimingTest.rgr +1417 -0
- package/dist/lib/evg/EVGToolbar.rgr +1369 -0
- package/dist/lib/evg/EVGTransition.rgr +728 -0
- package/dist/lib/evg/EVGTreeJson.rgr +721 -0
- package/dist/lib/evg/EVGUnit.rgr +554 -0
- package/dist/lib/evg/EVGViewportUnitTest.rgr +236 -0
- package/dist/lib/evg/EvgApp.rgr +189 -0
- package/dist/lib/evg/EvgBitmapTracer.rgr +4277 -0
- package/dist/lib/evg/EvgBitmapTracerTest.rgr +2119 -0
- package/dist/lib/evg/EvgHost.rgr +451 -0
- package/dist/lib/evg/EvgTest.rgr +91 -0
- package/dist/lib/evg/EvgTraceColor.rgr +236 -0
- package/dist/lib/evg/EvgTraceCurve.rgr +648 -0
- package/dist/lib/evg/EvgTraceFit.rgr +767 -0
- package/dist/lib/evg/EvgTracePath.rgr +435 -0
- package/dist/lib/evg/EvgTraceTypes.rgr +559 -0
- package/dist/lib/evg/EvgViewport.rgr +313 -0
- package/dist/lib/evg/FxDemoDoc.rgr +185 -0
- package/dist/lib/evg/HOSTS.md +227 -0
- package/dist/lib/evg/ISSUES.md +835 -0
- package/dist/lib/evg/PLAN_ACCESSIBILITY.md +650 -0
- package/dist/lib/evg/PLAN_CSS_LAYOUT_AND_FONTS.md +1124 -0
- package/dist/lib/evg/PLAN_EFFECTS.md +431 -0
- package/dist/lib/evg/PLAN_EVG.md +518 -0
- package/dist/lib/evg/PLAN_EVG_RENDERER.md +1674 -0
- package/dist/lib/evg/PLAN_INSPECTOR.md +788 -0
- package/dist/lib/evg/PLAN_LINKS_AND_FORMS.md +157 -0
- package/dist/lib/evg/PLAN_NATIVE_HOSTS.md +671 -0
- package/dist/lib/evg/PLAN_VECTOR_IR.md +664 -0
- package/dist/lib/evg/PLAN_VIEW_TRANSFORM.md +322 -0
- package/dist/lib/evg/PathBuilder.rgr +333 -0
- package/dist/lib/evg/README.md +1236 -0
- package/dist/lib/evg/SPEC.md +1252 -0
- package/dist/lib/evg/SVGPathParser.rgr +1199 -0
- package/dist/lib/evg/SvgParser.rgr +1736 -0
- package/dist/lib/evg/TODO_EVG_RENDERER.md +595 -0
- package/dist/lib/evg/VectorShapes.rgr +331 -0
- package/dist/lib/evg/VectorStroke.rgr +107 -0
- package/dist/lib/evg/VectorViewBox.rgr +380 -0
- package/dist/lib/evg/agent/README.md +290 -0
- package/dist/lib/evg/agent/evg_agent.rgr +899 -0
- package/dist/lib/evg/agent/fixtures/broken.evg.json +7 -0
- package/dist/lib/evg/agent/fixtures/card.evg.json +9 -0
- package/dist/lib/evg/agent/fixtures/connector.css +63 -0
- package/dist/lib/evg/agent/fixtures/connector.evg.json +14 -0
- package/dist/lib/evg/agent/fixtures/drawn.evg.json +129 -0
- package/dist/lib/evg/agent/fixtures/gradient.evg.json +4 -0
- package/dist/lib/evg/agent/fixtures/popover.css +99 -0
- package/dist/lib/evg/agent/fixtures/popover.evg.json +30 -0
- package/dist/lib/evg/agent/roundtrip.sh +74 -0
- package/dist/lib/evg/agent/smoke.sh +230 -0
- package/dist/lib/evg/android/README.md +97 -0
- package/dist/lib/evg/android/androidstubs/AndroidStubs.kt +175 -0
- package/dist/lib/evg/android/androidstubs/Annotation.kt +10 -0
- package/dist/lib/evg/android/androidstubs/App.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Content.kt +41 -0
- package/dist/lib/evg/android/androidstubs/ContentRes.kt +12 -0
- package/dist/lib/evg/android/androidstubs/InputMethod.kt +46 -0
- package/dist/lib/evg/android/androidstubs/Net.kt +6 -0
- package/dist/lib/evg/android/androidstubs/Os.kt +30 -0
- package/dist/lib/evg/android/androidstubs/Util.kt +15 -0
- package/dist/lib/evg/android/androidstubs/View.kt +113 -0
- package/dist/lib/evg/android/androidstubs/Widget.kt +16 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidEvgSurface.kt +323 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidTextMeasurer.kt +56 -0
- package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/RippleEffect.kt +262 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtEvgSurface.kt +238 -0
- package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtTextMeasurer.kt +85 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgEngineThread.kt +115 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgPainter.kt +231 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgSurface.kt +117 -0
- package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/RecordingSurface.kt +94 -0
- package/dist/lib/evg/apple/README.md +128 -0
- package/dist/lib/evg/apple/Sources/CoreGraphicsEvgSurface.swift +329 -0
- package/dist/lib/evg/apple/Sources/CoreTextMeasurer.swift +70 -0
- package/dist/lib/evg/apple/Sources/EvgEngineQueue.swift +105 -0
- package/dist/lib/evg/apple/Sources/EvgPainter.swift +225 -0
- package/dist/lib/evg/apple/Sources/EvgSurface.swift +163 -0
- package/dist/lib/evg/apple/Sources/RecordingSurface.swift +110 -0
- package/dist/lib/evg/bench/EvgLayoutBench.rgr +34 -0
- package/dist/lib/evg/bench/README.md +64 -0
- package/dist/lib/evg/bench/layout-bench.mjs +316 -0
- package/dist/lib/evg/bench/layout-cases.mjs +510 -0
- package/dist/lib/evg/bench/layout-conformance.mjs +254 -0
- package/dist/lib/evg/bin/.gitignore +17 -0
- package/dist/lib/evg/evg_test.rgr +313 -0
- package/dist/lib/evg/gl/README.md +198 -0
- package/dist/lib/evg/gl/a11y-paint-check.mjs +73 -0
- package/dist/lib/evg/gl/blur-check.mjs +399 -0
- package/dist/lib/evg/gl/boxmodel.json +1 -0
- package/dist/lib/evg/gl/demo.html +46 -0
- package/dist/lib/evg/gl/effect-presets.css +285 -0
- package/dist/lib/evg/gl/effect-presets.js +63 -0
- package/dist/lib/evg/gl/effect-shots.mjs +135 -0
- package/dist/lib/evg/gl/evg-a11y.js +566 -0
- package/dist/lib/evg/gl/evg-binary.js +160 -0
- package/dist/lib/evg/gl/evg-engine.js +296 -0
- package/dist/lib/evg/gl/evg-fx.js +237 -0
- package/dist/lib/evg/gl/evg-gestures.js +209 -0
- package/dist/lib/evg/gl/evg-list.js +167 -0
- package/dist/lib/evg/gl/evg-measure.js +186 -0
- package/dist/lib/evg/gl/evg-textinput.js +303 -0
- package/dist/lib/evg/gl/evg-view.js +144 -0
- package/dist/lib/evg/gl/evg-webgl.js +3942 -0
- package/dist/lib/evg/gl/fx-check.mjs +998 -0
- package/dist/lib/evg/gl/fx-demo.html +166 -0
- package/dist/lib/evg/gl/fx-demo.js +2 -0
- package/dist/lib/evg/gl/fx-serve.mjs +47 -0
- package/dist/lib/evg/gl/gestures-check.mjs +189 -0
- package/dist/lib/evg/gl/list-binary-check.mjs +152 -0
- package/dist/lib/evg/gl/measure-check.mjs +135 -0
- package/dist/lib/evg/gl/rotation-check.mjs +207 -0
- package/dist/lib/evg/gl/shift-check.mjs +113 -0
- package/dist/lib/evg/gl/stroke-check.mjs +168 -0
- package/dist/lib/evg/gl/text-snap-check.mjs +139 -0
- package/dist/lib/evg/gl/view-check.mjs +343 -0
- package/dist/lib/evg/gl/view-policy-check.mjs +184 -0
- package/dist/lib/evg/html/evg-dom.js +318 -0
- package/dist/lib/evg/html/evg-html.js +600 -0
- package/dist/lib/evg/inspect/README.md +415 -0
- package/dist/lib/evg/inspect/browser-smoke.mjs +115 -0
- package/dist/lib/evg/inspect/evg-inspect.js +947 -0
- package/dist/lib/evg/inspect/shots/css.png +0 -0
- package/dist/lib/evg/inspect/shots/dashboard.png +0 -0
- package/dist/lib/evg/inspect/shots/pptx-slide.png +0 -0
- package/dist/lib/evg/inspect/shots/state.png +0 -0
- package/dist/lib/evg/inspect/shots.mjs +226 -0
- package/dist/lib/evg/oracle/css-blur.json +576 -0
- package/dist/lib/evg/oracle/css-box.json +157 -0
- package/dist/lib/evg/oracle/css-timing.json +709 -0
- package/dist/lib/evg/oracle/css_blur_oracle.mjs +529 -0
- package/dist/lib/evg/oracle/css_box_oracle.mjs +106 -0
- package/dist/lib/evg/oracle/css_timing_oracle.mjs +389 -0
- package/dist/lib/evg/original/EVGColor.clj +310 -0
- package/dist/lib/evg/original/EVGColorContext.rgr +178 -0
- package/dist/lib/evg/original/SVGPath.rgr +627 -0
- package/dist/lib/evg/original/Vec2.crgr +103 -0
- package/dist/lib/evg/ranger.json +9 -0
- package/dist/lib/evg/showcase/README.md +246 -0
- package/dist/lib/evg/showcase/assets/emblem.svg +30 -0
- package/dist/lib/evg/showcase/assets/rosette.svg +22 -0
- package/dist/lib/evg/showcase/build.mjs +651 -0
- package/dist/lib/evg/showcase/pages/album.tsx +30 -0
- package/dist/lib/evg/showcase/pages/boxmodel.tsx +37 -0
- package/dist/lib/evg/showcase/pages/cards.tsx +41 -0
- package/dist/lib/evg/showcase/pages/chart_api.tsx +170 -0
- package/dist/lib/evg/showcase/pages/charts.tsx +219 -0
- package/dist/lib/evg/showcase/pages/drawing.tsx +160 -0
- package/dist/lib/evg/showcase/pages/emoji.tsx +91 -0
- package/dist/lib/evg/showcase/pages/flex.tsx +46 -0
- package/dist/lib/evg/showcase/pages/more.tsx +332 -0
- package/dist/lib/evg/showcase/pages/plots.tsx +262 -0
- package/dist/lib/evg/showcase/pages/svg.tsx +63 -0
- package/dist/lib/evg/showcase/pages/tables.tsx +209 -0
- package/dist/lib/evg/showcase/pages/typography.tsx +43 -0
- package/dist/lib/evg/showcase/pages/units.tsx +35 -0
- package/dist/lib/evg/showcase/pages/variants.tsx +233 -0
- package/dist/lib/evg/showcase/pages/vector.tsx +75 -0
- package/dist/lib/evg/showcase/pages/views.tsx +223 -0
- package/dist/lib/evg/showcase/tests/chart_api_smoke.mjs +339 -0
- package/dist/lib/evg/showcase/tests/gl_smoke.mjs +125 -0
- package/dist/lib/evg/showcase/themes/chart_api-default.css +15 -0
- package/dist/lib/evg/showcase/themes/charts-default.css +29 -0
- package/dist/lib/evg/showcase/themes/drawing-default.css +35 -0
- package/dist/lib/evg/showcase/themes/more-default.css +128 -0
- package/dist/lib/evg/showcase/themes/plots-default.css +18 -0
- package/dist/lib/evg/showcase/themes/showcase.css +508 -0
- package/dist/lib/evg/showcase/themes/tables-default.css +123 -0
- package/dist/lib/evg/showcase/themes/variants-default.css +15 -0
- package/dist/lib/evg/showcase/themes/views-default.css +15 -0
- package/dist/lib/evg/tools/bench_vs_potrace.mjs +290 -0
- package/dist/lib/evg/tools/evg_image_tool.rgr +488 -0
- package/dist/lib/evg/tools/evg_trace_bench.rgr +114 -0
- package/dist/lib/evg/tools/evg_trace_cli.rgr +662 -0
- package/dist/lib/evg/tools/evg_trace_cpp_bench.rgr +83 -0
- package/dist/lib/evg/tools/run_trace_bench.sh +74 -0
- package/dist/lib/evg/tools/run_trace_cli_smoke.sh +128 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveCheck.rgr +271 -0
- package/dist/lib/evg/web/responsive/EvgResponsiveDemo.rgr +531 -0
- package/dist/lib/evg/web/responsive/README.md +97 -0
- package/dist/lib/evg/web/responsive/build.mjs +90 -0
- package/dist/lib/evg/web/responsive/dom-check.mjs +169 -0
- package/dist/lib/evg/web/responsive/index.html +177 -0
- package/dist/lib/evg/web/responsive/smoke.mjs +221 -0
- package/dist/lib/evg/web/tools/assets-client.mjs +95 -0
- package/dist/lib/evg/web/tools/boot-bench.mjs +189 -0
- package/dist/lib/evg/web/tools/inline-assets.mjs +119 -0
- package/dist/lib/evg/web/tools/minify.mjs +60 -0
- package/dist/lib/evg/web/tracer/build.mjs +87 -0
- package/dist/lib/evg/web/tracer/index.html +2805 -0
- package/dist/lib/evg/web/tracer/sample.png +0 -0
- package/dist/lib/evg/web/tracer/smoke.mjs +1162 -0
- package/dist/lib/evgr/Cargo.lock +21 -0
- package/dist/lib/evgr/Cargo.toml +19 -0
- package/dist/lib/evgr/README.md +140 -0
- package/dist/lib/evgr/bench/NativeBench.rgr +246 -0
- package/dist/lib/evgr/bench/compare.mjs +252 -0
- package/dist/lib/evgr/bench/speed.mjs +277 -0
- package/dist/lib/evgr/bin/.gitignore +3 -0
- package/dist/lib/evgr/src/bin/bench.rs +106 -0
- package/dist/lib/evgr/src/bin/smoke.rs +13 -0
- package/dist/lib/evgr/src/grid.rs +730 -0
- package/dist/lib/evgr/src/lib.rs +1003 -0
- package/dist/lib/evgr/src/style.rs +468 -0
- package/dist/lib/evgr/src/text.rs +83 -0
- package/dist/lib/image/BitReader.rgr +171 -0
- package/dist/lib/image/Buffer.rgr +173 -0
- package/dist/lib/image/DCT.rgr +283 -0
- package/dist/lib/image/Deflate.rgr +339 -0
- package/dist/lib/image/HuffmanDecoder.rgr +181 -0
- package/dist/lib/image/ImageBuffer.rgr +706 -0
- package/dist/lib/image/JPEGDecoder.rgr +808 -0
- package/dist/lib/image/PNGDecoder.rgr +544 -0
- package/dist/lib/image/PNGEncoder.rgr +388 -0
- package/dist/lib/image/PPMImage.rgr +224 -0
- package/dist/lib/image/ProgressiveJPEGDecoder.rgr +1154 -0
- package/dist/lib/image/README.md +33 -0
- package/dist/lib/image/RasterBuffer.rgr +294 -0
- package/dist/lib/image/VP8BoolDecoder.rgr +163 -0
- package/dist/lib/image/WebPDecoder.rgr +433 -0
- package/dist/lib/image/WebPLossless.rgr +1035 -0
- package/dist/lib/image/WebPLossy.rgr +1929 -0
- package/dist/lib/image/ranger.json +9 -0
- package/dist/lib/image/testdata/webp/anim_2f_24x16.webp +0 -0
- package/dist/lib/image/testdata/webp/fixtures.txt +33 -0
- package/dist/lib/image/testdata/webp/gen_fixtures.py +261 -0
- package/dist/lib/image/testdata/webp/ll_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_alpha_29x21.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_gradient_64x64.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_meta_32x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_noise_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal11_23x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal2_19x7.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal40_16x16.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_pal4_13x5.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_photo_40x30.webp +0 -0
- package/dist/lib/image/testdata/webp/ll_predictors_64x32.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_1x1.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_raw_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f0_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f1_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f2_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alph_vp8l_f3_21x13.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_alpha_33x17.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_exif_15x11.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_i16_96x80.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_nofilter_24x20.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_odd_17x9.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_photo_48x40.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_q100_20x18.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_sharp_40x36.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_simple_filter_33x31.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_parts8_37x45.webp +0 -0
- package/dist/lib/image/testdata/webp/ly_vpx_skip_96x80.webp +0 -0
- package/dist/lib/image/tests/WebPDecodeTool.rgr +81 -0
- package/dist/lib/image/tests/WebPDecoderTest.rgr +1162 -0
- package/dist/lib/image/tests/run_webp_tests.sh +39 -0
- package/dist/lib/rust/RsJson.rgr +468 -0
- package/dist/lib/rust/RsPrelude.rgr +1663 -0
- package/dist/lib/shell_test.rgr +7 -7
- package/dist/lib/stdlib.rgr +21 -5
- package/dist/lib/zip/ranger.json +6 -0
- package/dist/rgrc.js +87318 -67610
- package/package.json +1010 -1040
- package/dist/README.md +0 -117
- package/dist/package.json +0 -47
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; ==============================================================================
|
|
4
|
+
; png_decoder — indexed-color PNG (type 3) → RGBA ImageBuffer.
|
|
5
|
+
; ==============================================================================
|
|
6
|
+
; Supports LPC walk sheets: 8-bit palette + tRNS alpha.
|
|
7
|
+
|
|
8
|
+
Import "Buffer.rgr"
|
|
9
|
+
Import "ImageBuffer.rgr"
|
|
10
|
+
Import "pkg:zip/Inflate.rgr"
|
|
11
|
+
|
|
12
|
+
class PNGDecoder {
|
|
13
|
+
def pos:int 0
|
|
14
|
+
def fileData:buffer (buffer_alloc 0)
|
|
15
|
+
def fileLen:int 0
|
|
16
|
+
|
|
17
|
+
def width:int 0
|
|
18
|
+
def height:int 0
|
|
19
|
+
def colorType:int 0
|
|
20
|
+
def bitDepth:int 0
|
|
21
|
+
|
|
22
|
+
def paletteR:[int]
|
|
23
|
+
def paletteG:[int]
|
|
24
|
+
def paletteB:[int]
|
|
25
|
+
def paletteA:[int]
|
|
26
|
+
def paletteCount:int 0
|
|
27
|
+
|
|
28
|
+
def idatData:GrowableBuffer (new GrowableBuffer())
|
|
29
|
+
|
|
30
|
+
fn clearPalette:void () {
|
|
31
|
+
def emptyR:[int]
|
|
32
|
+
def emptyG:[int]
|
|
33
|
+
def emptyB:[int]
|
|
34
|
+
def emptyA:[int]
|
|
35
|
+
paletteR = emptyR
|
|
36
|
+
paletteG = emptyG
|
|
37
|
+
paletteB = emptyB
|
|
38
|
+
paletteA = emptyA
|
|
39
|
+
paletteCount = 0
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fn readU8:int () {
|
|
43
|
+
if (pos >= fileLen) {
|
|
44
|
+
return 0
|
|
45
|
+
}
|
|
46
|
+
def v:int (buffer_get fileData pos)
|
|
47
|
+
pos = (pos + 1)
|
|
48
|
+
return v
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
fn readU32BE:int () {
|
|
52
|
+
def b0:int (this.readU8())
|
|
53
|
+
def b1:int (this.readU8())
|
|
54
|
+
def b2:int (this.readU8())
|
|
55
|
+
def b3:int (this.readU8())
|
|
56
|
+
return (((((b0 * 256) + b1) * 256) + b2) * 256) + b3
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
fn parseIHDR:void (chunkLen:int) {
|
|
60
|
+
width = (this.readU32BE())
|
|
61
|
+
height = (this.readU32BE())
|
|
62
|
+
bitDepth = (this.readU8())
|
|
63
|
+
colorType = (this.readU8())
|
|
64
|
+
this.readU8()
|
|
65
|
+
this.readU8()
|
|
66
|
+
this.readU8()
|
|
67
|
+
def remain:int (chunkLen - 13)
|
|
68
|
+
def skip 0
|
|
69
|
+
while (skip < remain) {
|
|
70
|
+
this.readU8()
|
|
71
|
+
skip = (skip + 1)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fn parsePLTE:void (chunkLen:int) {
|
|
76
|
+
this.clearPalette()
|
|
77
|
+
def count:int (to_int ((to_double chunkLen) / 3.0))
|
|
78
|
+
paletteCount = count
|
|
79
|
+
def i 0
|
|
80
|
+
while (i < count) {
|
|
81
|
+
push paletteR (this.readU8())
|
|
82
|
+
push paletteG (this.readU8())
|
|
83
|
+
push paletteB (this.readU8())
|
|
84
|
+
push paletteA 255
|
|
85
|
+
i = (i + 1)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
fn parseTRNS:void (chunkLen:int) {
|
|
90
|
+
def i 0
|
|
91
|
+
while (i < chunkLen) {
|
|
92
|
+
if (i < paletteCount) {
|
|
93
|
+
set paletteA i (this.readU8())
|
|
94
|
+
} {
|
|
95
|
+
this.readU8()
|
|
96
|
+
}
|
|
97
|
+
i = (i + 1)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
fn appendIDAT:void (chunkLen:int) {
|
|
102
|
+
def i 0
|
|
103
|
+
while (i < chunkLen) {
|
|
104
|
+
idatData.writeByte((this.readU8()))
|
|
105
|
+
i = (i + 1)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
fn skipBytes:void (n:int) {
|
|
110
|
+
def i 0
|
|
111
|
+
while (i < n) {
|
|
112
|
+
this.readU8()
|
|
113
|
+
i = (i + 1)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
fn sliceBuffer:buffer (src:buffer start:int count:int) {
|
|
118
|
+
if (count <= 0) {
|
|
119
|
+
return (buffer_alloc 0)
|
|
120
|
+
}
|
|
121
|
+
def out:buffer (buffer_alloc count)
|
|
122
|
+
def i 0
|
|
123
|
+
while (i < count) {
|
|
124
|
+
buffer_set out i (buffer_get src (start + i))
|
|
125
|
+
i = (i + 1)
|
|
126
|
+
}
|
|
127
|
+
return out
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
fn abs:int (n:int) {
|
|
131
|
+
if (n < 0) {
|
|
132
|
+
return (0 - n)
|
|
133
|
+
}
|
|
134
|
+
return n
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fn paeth:int (a:int b:int c:int) {
|
|
138
|
+
def p:int (a + b)
|
|
139
|
+
p = (p - c)
|
|
140
|
+
def pa:int (this.abs(p - a))
|
|
141
|
+
def pb:int (this.abs(p - b))
|
|
142
|
+
def pc:int (this.abs(p - c))
|
|
143
|
+
if ((pa <= pb) && (pa <= pc)) {
|
|
144
|
+
return a
|
|
145
|
+
}
|
|
146
|
+
if (pb <= pc) {
|
|
147
|
+
return b
|
|
148
|
+
}
|
|
149
|
+
return c
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
fn filterByte:int (n:int) {
|
|
153
|
+
; PNG scanline reconstruction wraps at 256 (not clamp to 0..255).
|
|
154
|
+
return (bit_and n 255)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
fn filterBpp:int (ctype:int) {
|
|
158
|
+
; PNG filter neighbors are prior *pixels* (same channel), not prior bytes.
|
|
159
|
+
if (ctype == 6) {
|
|
160
|
+
return 4
|
|
161
|
+
}
|
|
162
|
+
if (ctype == 2) {
|
|
163
|
+
return 3
|
|
164
|
+
}
|
|
165
|
+
return 1
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
fn unfilter:buffer (raw:buffer rowBytes:int imgHeight:int bpp:int) {
|
|
169
|
+
def out:buffer (buffer_alloc (rowBytes * imgHeight))
|
|
170
|
+
def rawLen:int (buffer_length raw)
|
|
171
|
+
def rawPos:int 0
|
|
172
|
+
def prevRow:[int]
|
|
173
|
+
def y 0
|
|
174
|
+
while (y < imgHeight) {
|
|
175
|
+
if (rawPos >= rawLen) {
|
|
176
|
+
return out
|
|
177
|
+
}
|
|
178
|
+
def filterType:int (buffer_get raw rawPos)
|
|
179
|
+
rawPos = (rawPos + 1)
|
|
180
|
+
|
|
181
|
+
def curRow:[int]
|
|
182
|
+
def x 0
|
|
183
|
+
while (x < rowBytes) {
|
|
184
|
+
push curRow 0
|
|
185
|
+
x = (x + 1)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
x = 0
|
|
189
|
+
while (x < rowBytes) {
|
|
190
|
+
if (rawPos >= rawLen) {
|
|
191
|
+
return out
|
|
192
|
+
}
|
|
193
|
+
def fv:int (buffer_get raw rawPos)
|
|
194
|
+
rawPos = (rawPos + 1)
|
|
195
|
+
def recon:int fv
|
|
196
|
+
|
|
197
|
+
if (filterType == 1) {
|
|
198
|
+
def left:int 0
|
|
199
|
+
if (x >= bpp) {
|
|
200
|
+
left = (itemAt curRow (x - bpp))
|
|
201
|
+
}
|
|
202
|
+
recon = (fv + left)
|
|
203
|
+
}
|
|
204
|
+
if (filterType == 2) {
|
|
205
|
+
def up:int 0
|
|
206
|
+
if (y > 0) {
|
|
207
|
+
up = (itemAt prevRow x)
|
|
208
|
+
}
|
|
209
|
+
recon = (fv + up)
|
|
210
|
+
}
|
|
211
|
+
if (filterType == 3) {
|
|
212
|
+
def left:int 0
|
|
213
|
+
def up:int 0
|
|
214
|
+
if (x >= bpp) {
|
|
215
|
+
left = (itemAt curRow (x - bpp))
|
|
216
|
+
}
|
|
217
|
+
if (y > 0) {
|
|
218
|
+
up = (itemAt prevRow x)
|
|
219
|
+
}
|
|
220
|
+
recon = (fv + (bit_shr (left + up) 1))
|
|
221
|
+
}
|
|
222
|
+
if (filterType == 4) {
|
|
223
|
+
def left:int 0
|
|
224
|
+
def up:int 0
|
|
225
|
+
def upLeft:int 0
|
|
226
|
+
if (x >= bpp) {
|
|
227
|
+
left = (itemAt curRow (x - bpp))
|
|
228
|
+
}
|
|
229
|
+
if (y > 0) {
|
|
230
|
+
up = (itemAt prevRow x)
|
|
231
|
+
}
|
|
232
|
+
if ((x >= bpp) && (y > 0)) {
|
|
233
|
+
upLeft = (itemAt prevRow (x - bpp))
|
|
234
|
+
}
|
|
235
|
+
recon = (fv + (this.paeth(left up upLeft)))
|
|
236
|
+
}
|
|
237
|
+
recon = (this.filterByte(recon))
|
|
238
|
+
set curRow x recon
|
|
239
|
+
x = (x + 1)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
x = 0
|
|
243
|
+
while (x < rowBytes) {
|
|
244
|
+
def o:int (((y * rowBytes) + x))
|
|
245
|
+
buffer_set out o (itemAt curRow x)
|
|
246
|
+
x = (x + 1)
|
|
247
|
+
}
|
|
248
|
+
prevRow = curRow
|
|
249
|
+
y = (y + 1)
|
|
250
|
+
}
|
|
251
|
+
return out
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
fn rowByteCount:int (w:int depth:int ctype:int) {
|
|
255
|
+
if (ctype == 6) {
|
|
256
|
+
return (w * 4)
|
|
257
|
+
}
|
|
258
|
+
if (ctype == 2) {
|
|
259
|
+
return (w * 3)
|
|
260
|
+
}
|
|
261
|
+
def bits:int (w * depth)
|
|
262
|
+
return (to_int ((to_double (bits + 7)) / 8.0))
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
fn decodeIndexedPixels:void (img:ImageBuffer indices:buffer rowBytes:int depth:int) {
|
|
266
|
+
def imgW:int (img.width)
|
|
267
|
+
def y 0
|
|
268
|
+
while (y < height) {
|
|
269
|
+
if (depth == 8) {
|
|
270
|
+
def x 0
|
|
271
|
+
while (x < width) {
|
|
272
|
+
def idx:int (buffer_get indices ((y * rowBytes) + x))
|
|
273
|
+
if (idx < paletteCount) {
|
|
274
|
+
def a:int (itemAt paletteA idx)
|
|
275
|
+
if (a > 0) {
|
|
276
|
+
def off:int (((y * imgW) + x) * 4)
|
|
277
|
+
buffer_set img.pixels off (itemAt paletteR idx)
|
|
278
|
+
buffer_set img.pixels (off + 1) (itemAt paletteG idx)
|
|
279
|
+
buffer_set img.pixels (off + 2) (itemAt paletteB idx)
|
|
280
|
+
buffer_set img.pixels (off + 3) a
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
x = (x + 1)
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (depth == 4) {
|
|
287
|
+
def x 0
|
|
288
|
+
def byteIdx 0
|
|
289
|
+
while (x < width) {
|
|
290
|
+
def packed:int (buffer_get indices ((y * rowBytes) + byteIdx))
|
|
291
|
+
def hi:int (bit_shr packed 4)
|
|
292
|
+
def lo:int (bit_and packed 15)
|
|
293
|
+
if (hi < paletteCount) {
|
|
294
|
+
def aHi:int (itemAt paletteA hi)
|
|
295
|
+
if (aHi > 0) {
|
|
296
|
+
def offHi:int (((y * imgW) + x) * 4)
|
|
297
|
+
buffer_set img.pixels offHi (itemAt paletteR hi)
|
|
298
|
+
buffer_set img.pixels (offHi + 1) (itemAt paletteG hi)
|
|
299
|
+
buffer_set img.pixels (offHi + 2) (itemAt paletteB hi)
|
|
300
|
+
buffer_set img.pixels (offHi + 3) aHi
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
def x2:int (x + 1)
|
|
304
|
+
if (x2 < width) {
|
|
305
|
+
if (lo < paletteCount) {
|
|
306
|
+
def aLo:int (itemAt paletteA lo)
|
|
307
|
+
if (aLo > 0) {
|
|
308
|
+
def offLo:int (((y * imgW) + x2) * 4)
|
|
309
|
+
buffer_set img.pixels offLo (itemAt paletteR lo)
|
|
310
|
+
buffer_set img.pixels (offLo + 1) (itemAt paletteG lo)
|
|
311
|
+
buffer_set img.pixels (offLo + 2) (itemAt paletteB lo)
|
|
312
|
+
buffer_set img.pixels (offLo + 3) aLo
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
x = (x + 2)
|
|
317
|
+
byteIdx = (byteIdx + 1)
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
y = (y + 1)
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
fn decodeRgbaPixels:void (img:ImageBuffer indices:buffer rowBytes:int) {
|
|
325
|
+
def imgW:int (img.width)
|
|
326
|
+
def y 0
|
|
327
|
+
while (y < height) {
|
|
328
|
+
def x 0
|
|
329
|
+
while (x < width) {
|
|
330
|
+
def off:int (((y * rowBytes) + (x * 4)))
|
|
331
|
+
def a:int (buffer_get indices (off + 3))
|
|
332
|
+
if (a > 0) {
|
|
333
|
+
def dstOff:int (((y * imgW) + x) * 4)
|
|
334
|
+
buffer_set img.pixels dstOff (buffer_get indices off)
|
|
335
|
+
buffer_set img.pixels (dstOff + 1) (buffer_get indices (off + 1))
|
|
336
|
+
buffer_set img.pixels (dstOff + 2) (buffer_get indices (off + 2))
|
|
337
|
+
buffer_set img.pixels (dstOff + 3) a
|
|
338
|
+
}
|
|
339
|
+
x = (x + 1)
|
|
340
|
+
}
|
|
341
|
+
y = (y + 1)
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
fn decodeRgbPixels:void (img:ImageBuffer indices:buffer rowBytes:int) {
|
|
346
|
+
def imgW:int (img.width)
|
|
347
|
+
def y 0
|
|
348
|
+
while (y < height) {
|
|
349
|
+
def x 0
|
|
350
|
+
while (x < width) {
|
|
351
|
+
def off:int (((y * rowBytes) + (x * 3)))
|
|
352
|
+
def dstOff:int (((y * imgW) + x) * 4)
|
|
353
|
+
buffer_set img.pixels dstOff (buffer_get indices off)
|
|
354
|
+
buffer_set img.pixels (dstOff + 1) (buffer_get indices (off + 1))
|
|
355
|
+
buffer_set img.pixels (dstOff + 2) (buffer_get indices (off + 2))
|
|
356
|
+
buffer_set img.pixels (dstOff + 3) 255
|
|
357
|
+
x = (x + 1)
|
|
358
|
+
}
|
|
359
|
+
y = (y + 1)
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
fn inflateZlib:buffer (zlibData:buffer) {
|
|
364
|
+
def zlen:int (buffer_length zlibData)
|
|
365
|
+
if (zlen < 6) {
|
|
366
|
+
return (buffer_alloc 0)
|
|
367
|
+
}
|
|
368
|
+
def deflateLen:int (zlen - 6)
|
|
369
|
+
def deflateBuf:buffer (this.sliceBuffer(zlibData 2 deflateLen))
|
|
370
|
+
def inflater:Inflate (new Inflate())
|
|
371
|
+
return (inflater.decompress(deflateBuf))
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
fn parseChunks:boolean () {
|
|
375
|
+
idatData = (new GrowableBuffer())
|
|
376
|
+
this.clearPalette()
|
|
377
|
+
pos = 8
|
|
378
|
+
while (pos < fileLen) {
|
|
379
|
+
def chunkLen:int (this.readU32BE())
|
|
380
|
+
def type0:int (this.readU8())
|
|
381
|
+
def type1:int (this.readU8())
|
|
382
|
+
def type2:int (this.readU8())
|
|
383
|
+
def type3:int (this.readU8())
|
|
384
|
+
|
|
385
|
+
if (type0 == 73) {
|
|
386
|
+
if (type1 == 72) {
|
|
387
|
+
if (type2 == 68) {
|
|
388
|
+
if (type3 == 82) {
|
|
389
|
+
this.parseIHDR(chunkLen)
|
|
390
|
+
this.skipBytes(4)
|
|
391
|
+
continue
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
if (type0 == 80) {
|
|
397
|
+
if (type1 == 76) {
|
|
398
|
+
if (type2 == 84) {
|
|
399
|
+
if (type3 == 69) {
|
|
400
|
+
this.parsePLTE(chunkLen)
|
|
401
|
+
this.skipBytes(4)
|
|
402
|
+
continue
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (type0 == 116) {
|
|
408
|
+
if (type1 == 82) {
|
|
409
|
+
if (type2 == 78) {
|
|
410
|
+
if (type3 == 83) {
|
|
411
|
+
this.parseTRNS(chunkLen)
|
|
412
|
+
this.skipBytes(4)
|
|
413
|
+
continue
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
if (type0 == 73) {
|
|
419
|
+
if (type1 == 68) {
|
|
420
|
+
if (type2 == 65) {
|
|
421
|
+
if (type3 == 84) {
|
|
422
|
+
this.appendIDAT(chunkLen)
|
|
423
|
+
this.skipBytes(4)
|
|
424
|
+
continue
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
if (type0 == 73) {
|
|
430
|
+
if (type1 == 69) {
|
|
431
|
+
if (type2 == 78) {
|
|
432
|
+
if (type3 == 68) {
|
|
433
|
+
return true
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
this.skipBytes((chunkLen + 4))
|
|
439
|
+
}
|
|
440
|
+
return false
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
fn decode:ImageBuffer (dir:string fileName:string) {
|
|
444
|
+
def fail:ImageBuffer (new ImageBuffer())
|
|
445
|
+
fail.init(1 1)
|
|
446
|
+
|
|
447
|
+
def bytes:buffer (buffer_read_file dir fileName)
|
|
448
|
+
if ((buffer_length bytes) < 24) {
|
|
449
|
+
print ("[png_decoder] file too small: " + dir + fileName)
|
|
450
|
+
return fail
|
|
451
|
+
}
|
|
452
|
+
return (this.decodeBytes(bytes))
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
; decode a PNG already held in memory (e.g. a glTF embedded image slice).
|
|
456
|
+
fn decodeBytes:ImageBuffer (bytes:buffer) {
|
|
457
|
+
def fail:ImageBuffer (new ImageBuffer())
|
|
458
|
+
fail.init(1 1)
|
|
459
|
+
|
|
460
|
+
; reset per-decode state so one instance can decode many buffers
|
|
461
|
+
pos = 0
|
|
462
|
+
idatData = (new GrowableBuffer())
|
|
463
|
+
this.clearPalette()
|
|
464
|
+
fileData = bytes
|
|
465
|
+
fileLen = (buffer_length fileData)
|
|
466
|
+
if (fileLen < 24) {
|
|
467
|
+
print "[png_decoder] buffer too small"
|
|
468
|
+
return fail
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
if ((this.parseChunks()) == false) {
|
|
472
|
+
print "[png_decoder] chunk parse failed"
|
|
473
|
+
return fail
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
if (colorType == 3) {
|
|
477
|
+
if ((bitDepth != 8) && (bitDepth != 4)) {
|
|
478
|
+
print ("[png_decoder] indexed depth unsupported: " + (to_string bitDepth))
|
|
479
|
+
return fail
|
|
480
|
+
}
|
|
481
|
+
if (paletteCount <= 0) {
|
|
482
|
+
print "[png_decoder] missing PLTE"
|
|
483
|
+
return fail
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
if (colorType == 6) {
|
|
487
|
+
if (bitDepth != 8) {
|
|
488
|
+
print "[png_decoder] RGBA requires 8-bit channels"
|
|
489
|
+
return fail
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
if (colorType == 2) {
|
|
493
|
+
if (bitDepth != 8) {
|
|
494
|
+
print "[png_decoder] RGB requires 8-bit channels"
|
|
495
|
+
return fail
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
if ((colorType != 3) && (colorType != 6) && (colorType != 2)) {
|
|
499
|
+
print ("[png_decoder] unsupported color type " + (to_string colorType))
|
|
500
|
+
return fail
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
def zlibBuf:buffer (idatData.toBuffer())
|
|
504
|
+
def inflated:buffer (this.inflateZlib(zlibBuf))
|
|
505
|
+
if ((buffer_length inflated) <= 0) {
|
|
506
|
+
print "[png_decoder] inflate failed"
|
|
507
|
+
return fail
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
def rowBytes:int (this.rowByteCount(width bitDepth colorType))
|
|
511
|
+
def bpp:int (this.filterBpp(colorType))
|
|
512
|
+
def indices:buffer (this.unfilter(inflated rowBytes height bpp))
|
|
513
|
+
def need:int (rowBytes * height)
|
|
514
|
+
if ((buffer_length indices) < need) {
|
|
515
|
+
print "[png_decoder] unfilter short"
|
|
516
|
+
return fail
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
def img:ImageBuffer (new ImageBuffer())
|
|
520
|
+
img.initClear(width height)
|
|
521
|
+
img.fillTransparent()
|
|
522
|
+
if (colorType == 3) {
|
|
523
|
+
this.decodeIndexedPixels(img indices rowBytes bitDepth)
|
|
524
|
+
}
|
|
525
|
+
if (colorType == 6) {
|
|
526
|
+
this.decodeRgbaPixels(img indices rowBytes)
|
|
527
|
+
}
|
|
528
|
+
if (colorType == 2) {
|
|
529
|
+
this.decodeRgbPixels(img indices rowBytes)
|
|
530
|
+
}
|
|
531
|
+
return img
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
fn decodeRelative:ImageBuffer (spritesheetsRoot:string relativePath:string) {
|
|
535
|
+
def slash:int (lastIndexOf relativePath "/")
|
|
536
|
+
def dir:string spritesheetsRoot
|
|
537
|
+
def file:string relativePath
|
|
538
|
+
if (slash >= 0) {
|
|
539
|
+
dir = (spritesheetsRoot + (substring relativePath 0 (slash + 1)))
|
|
540
|
+
file = (substring relativePath (slash + 1) (strlen relativePath))
|
|
541
|
+
}
|
|
542
|
+
return (this.decode(dir file))
|
|
543
|
+
}
|
|
544
|
+
}
|