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,339 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; ==============================================================================
|
|
4
|
+
; Deflate.rgr — DEFLATE, fixed Huffman, for the PNG writer.
|
|
5
|
+
; ==============================================================================
|
|
6
|
+
;
|
|
7
|
+
; Every PNG this repository has ever written was STORED — deflate block type 0,
|
|
8
|
+
; which is deflate's way of saying "here are the bytes again". A 900x560
|
|
9
|
+
; screenshot came out at 1.5 MB, and a chart copied to the clipboard carried a
|
|
10
|
+
; megabyte of base64 into whatever document it was pasted into. The files were
|
|
11
|
+
; correct and every decoder read them; they were just as large as the raw
|
|
12
|
+
; pixels.
|
|
13
|
+
;
|
|
14
|
+
; This is the smallest thing that fixes that honestly: LZ77 matching against a
|
|
15
|
+
; hash of the last three bytes, emitted with the FIXED Huffman code (block type
|
|
16
|
+
; 1). No dynamic code tables — those buy another 10-20% on top and need a
|
|
17
|
+
; second pass and a code-length tree, which is a lot of machinery for a
|
|
18
|
+
; screenshot. What this gets on flat, repetitive images — which charts and
|
|
19
|
+
; spreadsheets are — is roughly a tenth of the stored size.
|
|
20
|
+
;
|
|
21
|
+
; The output is ordinary deflate, so the check is not "does our decoder like
|
|
22
|
+
; it": `tools/check_png.py` hands every PNG we write to Python's zlib.
|
|
23
|
+
;
|
|
24
|
+
; Bit order, which is where a deflate implementation usually goes wrong:
|
|
25
|
+
; * Huffman codes are packed most-significant bit FIRST
|
|
26
|
+
; * everything else — headers, extra bits — is packed least-significant first
|
|
27
|
+
; ==============================================================================
|
|
28
|
+
|
|
29
|
+
Import "Buffer.rgr"
|
|
30
|
+
|
|
31
|
+
class DeflateWriter {
|
|
32
|
+
def out:GrowableBuffer (new GrowableBuffer)
|
|
33
|
+
def acc:int 0
|
|
34
|
+
def nbits:int 0
|
|
35
|
+
|
|
36
|
+
Constructor () {
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
fn putBit:void (b:int) {
|
|
40
|
+
if (b != 0) {
|
|
41
|
+
acc = (bit_or acc (bit_shl 1 nbits))
|
|
42
|
+
}
|
|
43
|
+
nbits = (nbits + 1)
|
|
44
|
+
if (nbits == 8) {
|
|
45
|
+
out.writeByte(acc)
|
|
46
|
+
acc = 0
|
|
47
|
+
nbits = 0
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
; Header fields and extra bits: least significant bit first.
|
|
52
|
+
fn bits:void (value:int count:int) {
|
|
53
|
+
def i:int 0
|
|
54
|
+
while (i < count) {
|
|
55
|
+
this.putBit((bit_and (bit_shr value i) 1))
|
|
56
|
+
i = (i + 1)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
; A Huffman code: most significant bit first.
|
|
61
|
+
fn huff:void (code:int count:int) {
|
|
62
|
+
def i:int (count - 1)
|
|
63
|
+
while (i >= 0) {
|
|
64
|
+
this.putBit((bit_and (bit_shr code i) 1))
|
|
65
|
+
i = (i - 1)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
fn align:void () {
|
|
70
|
+
while (nbits != 0) {
|
|
71
|
+
this.putBit(0)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
class Deflate {
|
|
77
|
+
; Length codes 257..285 and distance codes 0..29, as the RFC tabulates
|
|
78
|
+
; them. Built once per compressor rather than written out as literals in
|
|
79
|
+
; the emit loop, where a typo would be a corrupt stream nobody could read.
|
|
80
|
+
def lenBase:[int]
|
|
81
|
+
def lenExtra:[int]
|
|
82
|
+
def distBase:[int]
|
|
83
|
+
def distExtra:[int]
|
|
84
|
+
; Where the last occurrence of each three-byte sequence was seen. One slot
|
|
85
|
+
; per hash, no chains: the most recent match is the one a run of identical
|
|
86
|
+
; pixels wants anyway, and walking a chain to find a better one costs more
|
|
87
|
+
; than it saves on the images this writes.
|
|
88
|
+
def head:[int]
|
|
89
|
+
def hashBits:int 15
|
|
90
|
+
def hashSize:int 32768
|
|
91
|
+
|
|
92
|
+
Constructor () {
|
|
93
|
+
push lenBase 3
|
|
94
|
+
push lenBase 4
|
|
95
|
+
push lenBase 5
|
|
96
|
+
push lenBase 6
|
|
97
|
+
push lenBase 7
|
|
98
|
+
push lenBase 8
|
|
99
|
+
push lenBase 9
|
|
100
|
+
push lenBase 10
|
|
101
|
+
push lenBase 11
|
|
102
|
+
push lenBase 13
|
|
103
|
+
push lenBase 15
|
|
104
|
+
push lenBase 17
|
|
105
|
+
push lenBase 19
|
|
106
|
+
push lenBase 23
|
|
107
|
+
push lenBase 27
|
|
108
|
+
push lenBase 31
|
|
109
|
+
push lenBase 35
|
|
110
|
+
push lenBase 43
|
|
111
|
+
push lenBase 51
|
|
112
|
+
push lenBase 59
|
|
113
|
+
push lenBase 67
|
|
114
|
+
push lenBase 83
|
|
115
|
+
push lenBase 99
|
|
116
|
+
push lenBase 115
|
|
117
|
+
push lenBase 131
|
|
118
|
+
push lenBase 163
|
|
119
|
+
push lenBase 195
|
|
120
|
+
push lenBase 227
|
|
121
|
+
push lenBase 258
|
|
122
|
+
push lenExtra 0
|
|
123
|
+
push lenExtra 0
|
|
124
|
+
push lenExtra 0
|
|
125
|
+
push lenExtra 0
|
|
126
|
+
push lenExtra 0
|
|
127
|
+
push lenExtra 0
|
|
128
|
+
push lenExtra 0
|
|
129
|
+
push lenExtra 0
|
|
130
|
+
push lenExtra 1
|
|
131
|
+
push lenExtra 1
|
|
132
|
+
push lenExtra 1
|
|
133
|
+
push lenExtra 1
|
|
134
|
+
push lenExtra 2
|
|
135
|
+
push lenExtra 2
|
|
136
|
+
push lenExtra 2
|
|
137
|
+
push lenExtra 2
|
|
138
|
+
push lenExtra 3
|
|
139
|
+
push lenExtra 3
|
|
140
|
+
push lenExtra 3
|
|
141
|
+
push lenExtra 3
|
|
142
|
+
push lenExtra 4
|
|
143
|
+
push lenExtra 4
|
|
144
|
+
push lenExtra 4
|
|
145
|
+
push lenExtra 4
|
|
146
|
+
push lenExtra 5
|
|
147
|
+
push lenExtra 5
|
|
148
|
+
push lenExtra 5
|
|
149
|
+
push lenExtra 5
|
|
150
|
+
push lenExtra 0
|
|
151
|
+
push distBase 1
|
|
152
|
+
push distBase 2
|
|
153
|
+
push distBase 3
|
|
154
|
+
push distBase 4
|
|
155
|
+
push distBase 5
|
|
156
|
+
push distBase 7
|
|
157
|
+
push distBase 9
|
|
158
|
+
push distBase 13
|
|
159
|
+
push distBase 17
|
|
160
|
+
push distBase 25
|
|
161
|
+
push distBase 33
|
|
162
|
+
push distBase 49
|
|
163
|
+
push distBase 65
|
|
164
|
+
push distBase 97
|
|
165
|
+
push distBase 129
|
|
166
|
+
push distBase 193
|
|
167
|
+
push distBase 257
|
|
168
|
+
push distBase 385
|
|
169
|
+
push distBase 513
|
|
170
|
+
push distBase 769
|
|
171
|
+
push distBase 1025
|
|
172
|
+
push distBase 1537
|
|
173
|
+
push distBase 2049
|
|
174
|
+
push distBase 3073
|
|
175
|
+
push distBase 4097
|
|
176
|
+
push distBase 6145
|
|
177
|
+
push distBase 8193
|
|
178
|
+
push distBase 12289
|
|
179
|
+
push distBase 16385
|
|
180
|
+
push distBase 24577
|
|
181
|
+
push distExtra 0
|
|
182
|
+
push distExtra 0
|
|
183
|
+
push distExtra 0
|
|
184
|
+
push distExtra 0
|
|
185
|
+
push distExtra 1
|
|
186
|
+
push distExtra 1
|
|
187
|
+
push distExtra 2
|
|
188
|
+
push distExtra 2
|
|
189
|
+
push distExtra 3
|
|
190
|
+
push distExtra 3
|
|
191
|
+
push distExtra 4
|
|
192
|
+
push distExtra 4
|
|
193
|
+
push distExtra 5
|
|
194
|
+
push distExtra 5
|
|
195
|
+
push distExtra 6
|
|
196
|
+
push distExtra 6
|
|
197
|
+
push distExtra 7
|
|
198
|
+
push distExtra 7
|
|
199
|
+
push distExtra 8
|
|
200
|
+
push distExtra 8
|
|
201
|
+
push distExtra 9
|
|
202
|
+
push distExtra 9
|
|
203
|
+
push distExtra 10
|
|
204
|
+
push distExtra 10
|
|
205
|
+
push distExtra 11
|
|
206
|
+
push distExtra 11
|
|
207
|
+
push distExtra 12
|
|
208
|
+
push distExtra 12
|
|
209
|
+
push distExtra 13
|
|
210
|
+
push distExtra 13
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
; The fixed literal/length code for one symbol, written straight out.
|
|
214
|
+
fn literal:void (w:DeflateWriter sym:int) {
|
|
215
|
+
if (sym < 144) {
|
|
216
|
+
w.huff((48 + sym) 8)
|
|
217
|
+
return
|
|
218
|
+
}
|
|
219
|
+
if (sym < 256) {
|
|
220
|
+
w.huff((400 + (sym - 144)) 9)
|
|
221
|
+
return
|
|
222
|
+
}
|
|
223
|
+
if (sym < 280) {
|
|
224
|
+
w.huff((sym - 256) 7)
|
|
225
|
+
return
|
|
226
|
+
}
|
|
227
|
+
w.huff((192 + (sym - 280)) 8)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
fn lengthSlot:int (len:int) {
|
|
231
|
+
def i:int 28
|
|
232
|
+
while (i > 0) {
|
|
233
|
+
def base:int (itemAt lenBase i)
|
|
234
|
+
if (len >= base) {
|
|
235
|
+
return i
|
|
236
|
+
}
|
|
237
|
+
i = (i - 1)
|
|
238
|
+
}
|
|
239
|
+
return 0
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
fn distSlot:int (dist:int) {
|
|
243
|
+
def i:int 29
|
|
244
|
+
while (i > 0) {
|
|
245
|
+
def base:int (itemAt distBase i)
|
|
246
|
+
if (dist >= base) {
|
|
247
|
+
return i
|
|
248
|
+
}
|
|
249
|
+
i = (i - 1)
|
|
250
|
+
}
|
|
251
|
+
return 0
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
fn emitMatch:void (w:DeflateWriter len:int dist:int) {
|
|
255
|
+
def ls:int (this.lengthSlot(len))
|
|
256
|
+
this.literal(w (257 + ls))
|
|
257
|
+
def lx:int (itemAt lenExtra ls)
|
|
258
|
+
if (lx > 0) {
|
|
259
|
+
w.bits((len - (itemAt lenBase ls)) lx)
|
|
260
|
+
}
|
|
261
|
+
def ds:int (this.distSlot(dist))
|
|
262
|
+
; Distance codes are five bits, fixed width, most significant first.
|
|
263
|
+
w.huff(ds 5)
|
|
264
|
+
def dx:int (itemAt distExtra ds)
|
|
265
|
+
if (dx > 0) {
|
|
266
|
+
w.bits((dist - (itemAt distBase ds)) dx)
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
sfn hash3:int (a:int b:int c:int) {
|
|
271
|
+
def h:int (bit_and (((a * 7853) + (b * 271)) + c) 32767)
|
|
272
|
+
return h
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
; One fixed-Huffman block over the whole input. `w` is left byte-aligned.
|
|
276
|
+
fn compress:void (src:buffer n:int w:DeflateWriter) {
|
|
277
|
+
clear head
|
|
278
|
+
def i:int 0
|
|
279
|
+
while (i < hashSize) {
|
|
280
|
+
push head -1
|
|
281
|
+
i = (i + 1)
|
|
282
|
+
}
|
|
283
|
+
; BFINAL = 1, BTYPE = 01 (fixed Huffman)
|
|
284
|
+
w.bits(1 1)
|
|
285
|
+
w.bits(1 2)
|
|
286
|
+
|
|
287
|
+
def pos:int 0
|
|
288
|
+
while (pos < n) {
|
|
289
|
+
def bestLen:int 0
|
|
290
|
+
def bestDist:int 0
|
|
291
|
+
if ((pos + 3) <= n) {
|
|
292
|
+
def h:int (Deflate.hash3((buffer_get src pos) (buffer_get src (pos + 1)) (buffer_get src (pos + 2))))
|
|
293
|
+
def cand:int (itemAt head h)
|
|
294
|
+
set head h pos
|
|
295
|
+
if (cand >= 0) {
|
|
296
|
+
def dist:int (pos - cand)
|
|
297
|
+
if ((dist > 0) && (dist <= 32768)) {
|
|
298
|
+
def maxLen:int (n - pos)
|
|
299
|
+
if (maxLen > 258) {
|
|
300
|
+
maxLen = 258
|
|
301
|
+
}
|
|
302
|
+
def k:int 0
|
|
303
|
+
while (k < maxLen) {
|
|
304
|
+
if ((buffer_get src (cand + k)) != (buffer_get src (pos + k))) {
|
|
305
|
+
break
|
|
306
|
+
}
|
|
307
|
+
k = (k + 1)
|
|
308
|
+
}
|
|
309
|
+
if (k >= 3) {
|
|
310
|
+
bestLen = k
|
|
311
|
+
bestDist = dist
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (bestLen >= 3) {
|
|
317
|
+
this.emitMatch(w bestLen bestDist)
|
|
318
|
+
; Every position inside the match still wants to be findable
|
|
319
|
+
; later, or the next run starts from nothing.
|
|
320
|
+
def j:int 1
|
|
321
|
+
while (j < bestLen) {
|
|
322
|
+
def at:int (pos + j)
|
|
323
|
+
if ((at + 3) <= n) {
|
|
324
|
+
def h2:int (Deflate.hash3((buffer_get src at) (buffer_get src (at + 1)) (buffer_get src (at + 2))))
|
|
325
|
+
set head h2 at
|
|
326
|
+
}
|
|
327
|
+
j = (j + 1)
|
|
328
|
+
}
|
|
329
|
+
pos = (pos + bestLen)
|
|
330
|
+
} {
|
|
331
|
+
this.literal(w (buffer_get src pos))
|
|
332
|
+
pos = (pos + 1)
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
; End of block, then pad to a byte so the adler can follow.
|
|
336
|
+
this.literal(w 256)
|
|
337
|
+
w.align()
|
|
338
|
+
}
|
|
339
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; HuffmanDecoder.rgr - Huffman table building and decoding for JPEG
|
|
4
|
+
; Updated to use int_buffer for fixed-size arrays (always 16 elements for code lengths 1-16)
|
|
5
|
+
|
|
6
|
+
class HuffmanTable {
|
|
7
|
+
def bits:int_buffer (int_buffer_alloc 16) ; Count of codes at each length (index 0-15 = lengths 1-16)
|
|
8
|
+
def values:[int] ; Symbol values in order (variable size, up to 256)
|
|
9
|
+
def maxCode:int_buffer (int_buffer_alloc 16) ; Max code value for each length
|
|
10
|
+
def minCode:int_buffer (int_buffer_alloc 16) ; Min code value for each length
|
|
11
|
+
def valPtr:int_buffer (int_buffer_alloc 16) ; Index into values for each length
|
|
12
|
+
def tableClass:int 0 ; 0 = DC, 1 = AC
|
|
13
|
+
def tableId:int 0 ; Table ID (0-3)
|
|
14
|
+
|
|
15
|
+
Constructor () {
|
|
16
|
+
; Initialize arrays to default values
|
|
17
|
+
def i 0
|
|
18
|
+
while (i < 16) {
|
|
19
|
+
int_buffer_set bits i 0
|
|
20
|
+
int_buffer_set maxCode i -1
|
|
21
|
+
int_buffer_set minCode i 0
|
|
22
|
+
int_buffer_set valPtr i 0
|
|
23
|
+
i = i + 1
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
fn build:void () {
|
|
28
|
+
; Build decoding tables from bits and values arrays
|
|
29
|
+
; Generate maxCode, minCode, valPtr for fast decoding
|
|
30
|
+
|
|
31
|
+
def code:int 0
|
|
32
|
+
def valueIdx:int 0
|
|
33
|
+
|
|
34
|
+
def i 0
|
|
35
|
+
while (i < 16) {
|
|
36
|
+
def count:int (int_buffer_get bits i)
|
|
37
|
+
if (count > 0) {
|
|
38
|
+
int_buffer_set minCode i code
|
|
39
|
+
int_buffer_set valPtr i valueIdx
|
|
40
|
+
valueIdx = valueIdx + count
|
|
41
|
+
code = code + count
|
|
42
|
+
int_buffer_set maxCode i (code - 1)
|
|
43
|
+
} {
|
|
44
|
+
int_buffer_set maxCode i -1
|
|
45
|
+
int_buffer_set minCode i 0
|
|
46
|
+
int_buffer_set valPtr i valueIdx
|
|
47
|
+
}
|
|
48
|
+
code = (bit_shl code 1)
|
|
49
|
+
i = i + 1
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
fn decode:int (reader:BitReader) {
|
|
54
|
+
; Decode one symbol from bit stream
|
|
55
|
+
def code:int 0
|
|
56
|
+
def length:int 0
|
|
57
|
+
|
|
58
|
+
while (length < 16) {
|
|
59
|
+
def bit:int (reader.readBit())
|
|
60
|
+
code = (bit_or (bit_shl code 1) bit)
|
|
61
|
+
|
|
62
|
+
def maxC:int (int_buffer_get maxCode length)
|
|
63
|
+
if (maxC >= 0) {
|
|
64
|
+
if (code <= maxC) {
|
|
65
|
+
; Found valid code
|
|
66
|
+
def minC:int (int_buffer_get minCode length)
|
|
67
|
+
def ptr:int (int_buffer_get valPtr length)
|
|
68
|
+
def idx:int (ptr + (code - minC))
|
|
69
|
+
return (at values idx)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
length = length + 1
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
; Code not found - error
|
|
77
|
+
print "Huffman decode error: code not found"
|
|
78
|
+
return 0
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
fn resetArrays:void () {
|
|
82
|
+
; Reset fixed-size arrays (for reuse when parsing new DHT)
|
|
83
|
+
def i 0
|
|
84
|
+
while (i < 16) {
|
|
85
|
+
int_buffer_set bits i 0
|
|
86
|
+
int_buffer_set maxCode i -1
|
|
87
|
+
int_buffer_set minCode i 0
|
|
88
|
+
int_buffer_set valPtr i 0
|
|
89
|
+
i = i + 1
|
|
90
|
+
}
|
|
91
|
+
; Clear dynamic values array
|
|
92
|
+
clear values
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
class HuffmanDecoder {
|
|
97
|
+
; Say nothing while building tables. Set by whoever owns this decoder -
|
|
98
|
+
; see JPEGDecoder.quiet, which is the flag a caller actually reaches.
|
|
99
|
+
def quiet:boolean false
|
|
100
|
+
; DC tables (indexed by table ID)
|
|
101
|
+
def dcTable0:HuffmanTable (new HuffmanTable())
|
|
102
|
+
def dcTable1:HuffmanTable (new HuffmanTable())
|
|
103
|
+
; AC tables (indexed by table ID)
|
|
104
|
+
def acTable0:HuffmanTable (new HuffmanTable())
|
|
105
|
+
def acTable1:HuffmanTable (new HuffmanTable())
|
|
106
|
+
|
|
107
|
+
Constructor () {
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
fn getDCTable:HuffmanTable (id:int) {
|
|
111
|
+
if (id == 0) {
|
|
112
|
+
return dcTable0
|
|
113
|
+
}
|
|
114
|
+
return dcTable1
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
fn getACTable:HuffmanTable (id:int) {
|
|
118
|
+
if (id == 0) {
|
|
119
|
+
return acTable0
|
|
120
|
+
}
|
|
121
|
+
return acTable1
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
fn parseDHT:void (data:buffer pos:int length:int) {
|
|
125
|
+
; Parse Define Huffman Table marker
|
|
126
|
+
; Format: [tableInfo] [bits[16]] [values...]
|
|
127
|
+
; tableInfo: high nibble = class (0=DC, 1=AC), low nibble = table ID
|
|
128
|
+
|
|
129
|
+
def endPos:int (pos + length)
|
|
130
|
+
|
|
131
|
+
while (pos < endPos) {
|
|
132
|
+
def tableInfo:int (buffer_get data pos)
|
|
133
|
+
pos = pos + 1
|
|
134
|
+
|
|
135
|
+
def tableClass:int (bit_shr tableInfo 4)
|
|
136
|
+
def tableId:int (bit_and tableInfo 15)
|
|
137
|
+
|
|
138
|
+
; Select target table
|
|
139
|
+
def table:HuffmanTable (this.getDCTable(tableId))
|
|
140
|
+
if (tableClass == 1) {
|
|
141
|
+
table = (this.getACTable(tableId))
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
table.tableClass = tableClass
|
|
145
|
+
table.tableId = tableId
|
|
146
|
+
|
|
147
|
+
; Reset arrays for this table
|
|
148
|
+
table.resetArrays()
|
|
149
|
+
|
|
150
|
+
; Read bits array (counts for each code length)
|
|
151
|
+
def totalSymbols:int 0
|
|
152
|
+
def i 0
|
|
153
|
+
while (i < 16) {
|
|
154
|
+
def count:int (buffer_get data pos)
|
|
155
|
+
int_buffer_set table.bits i count
|
|
156
|
+
totalSymbols = totalSymbols + count
|
|
157
|
+
pos = pos + 1
|
|
158
|
+
i = i + 1
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
; Read symbol values (dynamic array, size varies per table)
|
|
162
|
+
i = 0
|
|
163
|
+
while (i < totalSymbols) {
|
|
164
|
+
push table.values (buffer_get data pos)
|
|
165
|
+
pos = pos + 1
|
|
166
|
+
i = i + 1
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
; Build decoding structures
|
|
170
|
+
table.build()
|
|
171
|
+
|
|
172
|
+
def classStr "DC"
|
|
173
|
+
if (tableClass == 1) {
|
|
174
|
+
classStr = "AC"
|
|
175
|
+
}
|
|
176
|
+
if (quiet == false) {
|
|
177
|
+
print (" Huffman table " + classStr + (to_string tableId) + ": " + (to_string totalSymbols) + " symbols")
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|