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,33 @@
|
|
|
1
|
+
# `image` — the codecs
|
|
2
|
+
|
|
3
|
+
The JPEG, PNG and WebP decoders, the PNG encoder, and the byte and pixel buffers
|
|
4
|
+
they read and write. EVG decodes `<img>` sources through them, the PDF
|
|
5
|
+
tools embed images through them, and the raster painters draw into
|
|
6
|
+
`RasterBuffer`.
|
|
7
|
+
|
|
8
|
+
| File | |
|
|
9
|
+
| --- | --- |
|
|
10
|
+
| `Buffer.rgr` | growable byte buffer with the readers the decoders need |
|
|
11
|
+
| `ImageBuffer.rgr` | RGBA pixels with width and height |
|
|
12
|
+
| `RasterBuffer.rgr` | the raster target the painters write, over `ImageBuffer` |
|
|
13
|
+
| `JPEGDecoder.rgr`, `ProgressiveJPEGDecoder.rgr` | baseline and progressive JPEG, with `BitReader`, `HuffmanDecoder`, `DCT` |
|
|
14
|
+
| `PNGDecoder.rgr` | PNG, over `pkg:zip/Inflate.rgr` |
|
|
15
|
+
| `WebPDecoder.rgr` | WebP: lossy (`VP8BoolDecoder`, `WebPLossy`), lossless (`WebPLossless`), alpha, first frame of an animation; a port of libwebp's decoder logic, tested against libwebp in `tests/` |
|
|
16
|
+
| `PNGEncoder.rgr`, `Deflate.rgr` | PNG out, with its own DEFLATE compressor |
|
|
17
|
+
| `PPMImage.rgr` | PPM, for the decoder tests |
|
|
18
|
+
|
|
19
|
+
Import from another package as `Import "pkg:image/JPEGDecoder.rgr"` with
|
|
20
|
+
`"image": { "path": "…/lib/image" }` in `ranger.json`; the `zip` package it
|
|
21
|
+
needs is a sibling path dependency and comes along.
|
|
22
|
+
|
|
23
|
+
`WebPDecoder` returns an RGBA `ImageBuffer` that matches libwebp byte for
|
|
24
|
+
byte and never throws on bad input: check `ok` (and `error`) after
|
|
25
|
+
`decodeBytes`. Its tests run on JavaScript and C++ with
|
|
26
|
+
`bash lib/image/tests/run_webp_tests.sh`; the fixtures and their expected
|
|
27
|
+
checksums are regenerated by `testdata/webp/gen_fixtures.py`.
|
|
28
|
+
|
|
29
|
+
**License: MIT.** These are published formats and generic utilities —
|
|
30
|
+
the same rule that put `lib/zip` on the MIT side. The WebP decoder follows
|
|
31
|
+
the decoding logic of libwebp (Copyright Google Inc., BSD-3-Clause), as its
|
|
32
|
+
file headers say. See
|
|
33
|
+
[LICENSING.md](../../LICENSING.md).
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; RasterBuffer - Core pixel buffer for EVG raster rendering
|
|
4
|
+
; Provides RGBA pixel storage with basic operations
|
|
5
|
+
; Compatible with ImageBuffer from JPEG encoder
|
|
6
|
+
|
|
7
|
+
Import "Buffer.rgr"
|
|
8
|
+
Import "ImageBuffer.rgr"
|
|
9
|
+
|
|
10
|
+
; A single RGBA pixel
|
|
11
|
+
class RasterPixel {
|
|
12
|
+
def r:int 0
|
|
13
|
+
def g:int 0
|
|
14
|
+
def b:int 0
|
|
15
|
+
def a:int 255
|
|
16
|
+
|
|
17
|
+
fn init:void (red:int green:int blue:int alpha:int) {
|
|
18
|
+
r = red
|
|
19
|
+
g = green
|
|
20
|
+
b = blue
|
|
21
|
+
a = alpha
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
fn initRGB:void (red:int green:int blue:int) {
|
|
25
|
+
r = red
|
|
26
|
+
g = green
|
|
27
|
+
b = blue
|
|
28
|
+
a = 255
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
fn clone:RasterPixel () {
|
|
32
|
+
def p:RasterPixel (new RasterPixel())
|
|
33
|
+
p.r = r
|
|
34
|
+
p.g = g
|
|
35
|
+
p.b = b
|
|
36
|
+
p.a = a
|
|
37
|
+
return p
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
; Main raster buffer class - uses native binary buffer for efficiency
|
|
42
|
+
; Compatible with ImageBuffer used by JPEGEncoder
|
|
43
|
+
class RasterBuffer {
|
|
44
|
+
def width:int 0
|
|
45
|
+
def height:int 0
|
|
46
|
+
def pixels:buffer (buffer_alloc 0)
|
|
47
|
+
|
|
48
|
+
; Create a new buffer with given dimensions
|
|
49
|
+
fn create:void (w:int h:int) {
|
|
50
|
+
width = w
|
|
51
|
+
height = h
|
|
52
|
+
def size:int (w * h * 4)
|
|
53
|
+
pixels = (buffer_alloc size)
|
|
54
|
+
buffer_fill pixels 0 0 size
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
; Create and fill with a color
|
|
58
|
+
fn createWithColor:void (w:int h:int r:int g:int b:int a:int) {
|
|
59
|
+
this.create(w h)
|
|
60
|
+
this.fill(r g b a)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
; Get pixel index in flat array
|
|
64
|
+
fn getIndex:int (x:int y:int) {
|
|
65
|
+
return ((y * width + x) * 4)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
; Check if coordinates are in bounds
|
|
69
|
+
fn inBounds:boolean (x:int y:int) {
|
|
70
|
+
if (x < 0) {
|
|
71
|
+
return false
|
|
72
|
+
}
|
|
73
|
+
if (y < 0) {
|
|
74
|
+
return false
|
|
75
|
+
}
|
|
76
|
+
if (x >= width) {
|
|
77
|
+
return false
|
|
78
|
+
}
|
|
79
|
+
if (y >= height) {
|
|
80
|
+
return false
|
|
81
|
+
}
|
|
82
|
+
return true
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
; Set pixel at x,y with RGBA values (0-255)
|
|
86
|
+
fn setPixel:void (x:int y:int r:int g:int b:int a:int) {
|
|
87
|
+
if ((this.inBounds(x y)) == false) {
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
def idx:int (this.getIndex(x y))
|
|
91
|
+
buffer_set pixels idx r
|
|
92
|
+
buffer_set pixels (idx + 1) g
|
|
93
|
+
buffer_set pixels (idx + 2) b
|
|
94
|
+
buffer_set pixels (idx + 3) a
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
; Set pixel from RasterPixel object
|
|
98
|
+
fn setPixelObj:void (x:int y:int p:RasterPixel) {
|
|
99
|
+
this.setPixel(x y p.r p.g p.b p.a)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
; Get pixel at x,y - returns RasterPixel
|
|
103
|
+
fn getPixel:RasterPixel (x:int y:int) {
|
|
104
|
+
def p:RasterPixel (new RasterPixel())
|
|
105
|
+
if ((this.inBounds(x y)) == false) {
|
|
106
|
+
return p
|
|
107
|
+
}
|
|
108
|
+
def idx:int (this.getIndex(x y))
|
|
109
|
+
p.r = (buffer_get pixels idx)
|
|
110
|
+
p.g = (buffer_get pixels (idx + 1))
|
|
111
|
+
p.b = (buffer_get pixels (idx + 2))
|
|
112
|
+
p.a = (buffer_get pixels (idx + 3))
|
|
113
|
+
return p
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
; Get individual color component
|
|
117
|
+
fn getR:int (x:int y:int) {
|
|
118
|
+
if ((this.inBounds(x y)) == false) {
|
|
119
|
+
return 0
|
|
120
|
+
}
|
|
121
|
+
def idx:int (this.getIndex(x y))
|
|
122
|
+
return (buffer_get pixels idx)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
fn getG:int (x:int y:int) {
|
|
126
|
+
if ((this.inBounds(x y)) == false) {
|
|
127
|
+
return 0
|
|
128
|
+
}
|
|
129
|
+
def idx:int (this.getIndex(x y))
|
|
130
|
+
return (buffer_get pixels (idx + 1))
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
fn getB:int (x:int y:int) {
|
|
134
|
+
if ((this.inBounds(x y)) == false) {
|
|
135
|
+
return 0
|
|
136
|
+
}
|
|
137
|
+
def idx:int (this.getIndex(x y))
|
|
138
|
+
return (buffer_get pixels (idx + 2))
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
fn getA:int (x:int y:int) {
|
|
142
|
+
if ((this.inBounds(x y)) == false) {
|
|
143
|
+
return 0
|
|
144
|
+
}
|
|
145
|
+
def idx:int (this.getIndex(x y))
|
|
146
|
+
return (buffer_get pixels (idx + 3))
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
; Fill entire buffer with a color
|
|
150
|
+
fn fill:void (r:int g:int b:int a:int) {
|
|
151
|
+
def size:int (width * height)
|
|
152
|
+
def i:int 0
|
|
153
|
+
while (i < size) {
|
|
154
|
+
def idx:int (i * 4)
|
|
155
|
+
buffer_set pixels idx r
|
|
156
|
+
buffer_set pixels (idx + 1) g
|
|
157
|
+
buffer_set pixels (idx + 2) b
|
|
158
|
+
buffer_set pixels (idx + 3) a
|
|
159
|
+
i = i + 1
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
; Clear buffer to transparent black
|
|
164
|
+
fn clear:void () {
|
|
165
|
+
this.fill(0 0 0 0)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
; Clear buffer to opaque white
|
|
169
|
+
fn clearWhite:void () {
|
|
170
|
+
this.fill(255 255 255 255)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
; Fill a rectangular region
|
|
174
|
+
fn fillRect:void (x:int y:int w:int h:int r:int g:int b:int a:int) {
|
|
175
|
+
def endX:int (x + w)
|
|
176
|
+
def endY:int (y + h)
|
|
177
|
+
|
|
178
|
+
; Clamp to bounds
|
|
179
|
+
if (x < 0) {
|
|
180
|
+
x = 0
|
|
181
|
+
}
|
|
182
|
+
if (y < 0) {
|
|
183
|
+
y = 0
|
|
184
|
+
}
|
|
185
|
+
if (endX > width) {
|
|
186
|
+
endX = width
|
|
187
|
+
}
|
|
188
|
+
if (endY > height) {
|
|
189
|
+
endY = height
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
def py:int y
|
|
193
|
+
while (py < endY) {
|
|
194
|
+
def px:int x
|
|
195
|
+
while (px < endX) {
|
|
196
|
+
this.setPixel(px py r g b a)
|
|
197
|
+
px = px + 1
|
|
198
|
+
}
|
|
199
|
+
py = py + 1
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
; Copy a region from another buffer
|
|
204
|
+
fn copyFrom:void (src:RasterBuffer srcX:int srcY:int dstX:int dstY:int w:int h:int) {
|
|
205
|
+
def sy:int 0
|
|
206
|
+
while (sy < h) {
|
|
207
|
+
def sx:int 0
|
|
208
|
+
while (sx < w) {
|
|
209
|
+
def p:RasterPixel (src.getPixel((srcX + sx) (srcY + sy)))
|
|
210
|
+
this.setPixel((dstX + sx) (dstY + sy) p.r p.g p.b p.a)
|
|
211
|
+
sx = sx + 1
|
|
212
|
+
}
|
|
213
|
+
sy = sy + 1
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
; Create a copy of this buffer
|
|
218
|
+
fn clone:RasterBuffer () {
|
|
219
|
+
def copy:RasterBuffer (new RasterBuffer())
|
|
220
|
+
copy.create(width height)
|
|
221
|
+
def size:int (width * height * 4)
|
|
222
|
+
buffer_copy copy.pixels 0 pixels 0 size
|
|
223
|
+
return copy
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
; Get total number of pixels
|
|
227
|
+
fn getPixelCount:int () {
|
|
228
|
+
return (width * height)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
; Get total size in bytes
|
|
232
|
+
fn getByteSize:int () {
|
|
233
|
+
return (width * height * 4)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
; ============================================================
|
|
237
|
+
; JPEG Encoder Compatibility - Convert to/from ImageBuffer
|
|
238
|
+
; ============================================================
|
|
239
|
+
|
|
240
|
+
; Convert to ImageBuffer for JPEG encoding
|
|
241
|
+
fn toImageBuffer:ImageBuffer () {
|
|
242
|
+
def img:ImageBuffer (new ImageBuffer())
|
|
243
|
+
img.init(width height)
|
|
244
|
+
|
|
245
|
+
def size:int (width * height * 4)
|
|
246
|
+
def i:int 0
|
|
247
|
+
while (i < size) {
|
|
248
|
+
def r:int (buffer_get pixels i)
|
|
249
|
+
def g:int (buffer_get pixels (i + 1))
|
|
250
|
+
def b:int (buffer_get pixels (i + 2))
|
|
251
|
+
def a:int (buffer_get pixels (i + 3))
|
|
252
|
+
|
|
253
|
+
; If pixel has alpha < 255, blend with white background
|
|
254
|
+
; (JPEG doesn't support alpha)
|
|
255
|
+
if (a < 255) {
|
|
256
|
+
def alpha:double ((to_double a) / 255.0)
|
|
257
|
+
def invAlpha:double (1.0 - alpha)
|
|
258
|
+
r = (to_int (((to_double r) * alpha) + (255.0 * invAlpha)))
|
|
259
|
+
g = (to_int (((to_double g) * alpha) + (255.0 * invAlpha)))
|
|
260
|
+
b = (to_int (((to_double b) * alpha) + (255.0 * invAlpha)))
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
buffer_set img.pixels i r
|
|
264
|
+
buffer_set img.pixels (i + 1) g
|
|
265
|
+
buffer_set img.pixels (i + 2) b
|
|
266
|
+
buffer_set img.pixels (i + 3) 255
|
|
267
|
+
|
|
268
|
+
i = i + 4
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return img
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
; Load from ImageBuffer (sets alpha to 255)
|
|
275
|
+
fn fromImageBuffer:void (img:ImageBuffer) {
|
|
276
|
+
this.create(img.width img.height)
|
|
277
|
+
|
|
278
|
+
def size:int (img.width * img.height * 4)
|
|
279
|
+
def i:int 0
|
|
280
|
+
while (i < size) {
|
|
281
|
+
buffer_set pixels i (buffer_get img.pixels i)
|
|
282
|
+
buffer_set pixels (i + 1) (buffer_get img.pixels (i + 1))
|
|
283
|
+
buffer_set pixels (i + 2) (buffer_get img.pixels (i + 2))
|
|
284
|
+
buffer_set pixels (i + 3) 255 ; ImageBuffer stores alpha but often unused
|
|
285
|
+
i = i + 4
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
; Direct access to raw pixel buffer (for advanced use)
|
|
290
|
+
fn getRawBuffer:buffer () {
|
|
291
|
+
return pixels
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
; SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
; VP8BoolDecoder.rgr - the boolean entropy decoder of VP8 (RFC 6386 section 7),
|
|
4
|
+
; used by the lossy half of the WebP decoder (WebPLossy.rgr).
|
|
5
|
+
;
|
|
6
|
+
; A port of the bit reader in libwebp (src/utils/bit_reader_*), by way of
|
|
7
|
+
; simplewebp: the same 24-bit refill, the same end-of-data behaviour and the
|
|
8
|
+
; same shortcut for sign bits, so a stream decodes to exactly the bits
|
|
9
|
+
; libwebp reads from it. libwebp is Copyright Google Inc., BSD-3-Clause;
|
|
10
|
+
; this port is MIT like the rest of lib/image.
|
|
11
|
+
;
|
|
12
|
+
; `range` holds range - 1, as in libwebp. `value` holds up to 31 bits, so the
|
|
13
|
+
; arithmetic stays inside a 32-bit int on every target: a valid stream never
|
|
14
|
+
; has more than 7 bits pending when the next bytes come in, and the masks on
|
|
15
|
+
; the refills only matter for corrupt data, where they keep the value in range
|
|
16
|
+
; instead of overflowing.
|
|
17
|
+
|
|
18
|
+
class VP8BoolDecoder {
|
|
19
|
+
def data:buffer (buffer_alloc 0)
|
|
20
|
+
def bufEnd:int 0
|
|
21
|
+
def bufMax:int 0
|
|
22
|
+
def pos:int 0
|
|
23
|
+
def value:int 0
|
|
24
|
+
def range:int 254
|
|
25
|
+
def bits:int -8
|
|
26
|
+
def eof:boolean false
|
|
27
|
+
def log2tab:int_buffer (int_buffer_alloc 256)
|
|
28
|
+
|
|
29
|
+
Constructor () {
|
|
30
|
+
; floor(log2(n)) for 1..255
|
|
31
|
+
def n:int 1
|
|
32
|
+
while (n < 256) {
|
|
33
|
+
def l:int 0
|
|
34
|
+
def v:int n
|
|
35
|
+
while (v > 1) {
|
|
36
|
+
v = (bit_shr v 1)
|
|
37
|
+
l = l + 1
|
|
38
|
+
}
|
|
39
|
+
int_buffer_set log2tab n l
|
|
40
|
+
n = n + 1
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
; Start reading `size` bytes of `src` at `start`. The bytes are copied, so
|
|
45
|
+
; the decoder does not depend on the caller's buffer afterwards. A range
|
|
46
|
+
; that runs past the end of `src` is clipped to it.
|
|
47
|
+
fn init:void (src:buffer start:int size:int) {
|
|
48
|
+
def srcLen:int (buffer_length src)
|
|
49
|
+
def s:int start
|
|
50
|
+
if (s < 0) {
|
|
51
|
+
s = 0
|
|
52
|
+
}
|
|
53
|
+
if (s > srcLen) {
|
|
54
|
+
s = srcLen
|
|
55
|
+
}
|
|
56
|
+
def e:int (s + size)
|
|
57
|
+
if (size < 0) {
|
|
58
|
+
e = s
|
|
59
|
+
}
|
|
60
|
+
if (e > srcLen) {
|
|
61
|
+
e = srcLen
|
|
62
|
+
}
|
|
63
|
+
data = (buffer_slice src s e)
|
|
64
|
+
bufEnd = (e - s)
|
|
65
|
+
bufMax = 0
|
|
66
|
+
if (bufEnd >= 4) {
|
|
67
|
+
bufMax = (bufEnd - 3)
|
|
68
|
+
}
|
|
69
|
+
pos = 0
|
|
70
|
+
value = 0
|
|
71
|
+
range = 254
|
|
72
|
+
bits = -8
|
|
73
|
+
eof = false
|
|
74
|
+
this.load()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
fn load:void () {
|
|
78
|
+
if (pos < bufMax) {
|
|
79
|
+
def b0:int (buffer_get data pos)
|
|
80
|
+
def b1:int (buffer_get data (pos + 1))
|
|
81
|
+
def b2:int (buffer_get data (pos + 2))
|
|
82
|
+
pos = pos + 3
|
|
83
|
+
value = (bit_or (bit_or (bit_or b2 (bit_shl b1 8)) (bit_shl b0 16)) (bit_shl (bit_and value 127) 24))
|
|
84
|
+
bits = bits + 24
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
if (pos < bufEnd) {
|
|
88
|
+
bits = bits + 8
|
|
89
|
+
value = (bit_or (buffer_get data pos) (bit_shl (bit_and value 8388607) 8))
|
|
90
|
+
pos = pos + 1
|
|
91
|
+
return
|
|
92
|
+
}
|
|
93
|
+
if (eof == false) {
|
|
94
|
+
value = (bit_shl (bit_and value 8388607) 8)
|
|
95
|
+
bits = bits + 8
|
|
96
|
+
eof = true
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
bits = 0
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
; One bit with probability prob/256 of being zero.
|
|
103
|
+
fn getBit:int (prob:int) {
|
|
104
|
+
def rng:int range
|
|
105
|
+
if (bits < 0) {
|
|
106
|
+
this.load()
|
|
107
|
+
}
|
|
108
|
+
def p:int bits
|
|
109
|
+
def split:int (bit_shr (rng * prob) 8)
|
|
110
|
+
def v:int (bit_and (bit_shr value p) 255)
|
|
111
|
+
def bit:int 0
|
|
112
|
+
if (v > split) {
|
|
113
|
+
rng = rng - split
|
|
114
|
+
value = value - (bit_shl (split + 1) p)
|
|
115
|
+
bit = 1
|
|
116
|
+
} {
|
|
117
|
+
rng = split + 1
|
|
118
|
+
}
|
|
119
|
+
def shift:int (7 - (int_buffer_get log2tab rng))
|
|
120
|
+
rng = (bit_shl rng shift)
|
|
121
|
+
bits = bits - shift
|
|
122
|
+
range = rng - 1
|
|
123
|
+
return bit
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
; An unsigned value of n bits, most significant bit first.
|
|
127
|
+
fn getValue:int (n:int) {
|
|
128
|
+
def v:int 0
|
|
129
|
+
def k:int n
|
|
130
|
+
while (k > 0) {
|
|
131
|
+
k = k - 1
|
|
132
|
+
v = (bit_or v (bit_shl (this.getBit(128)) k))
|
|
133
|
+
}
|
|
134
|
+
return v
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
; n bits of magnitude followed by a sign bit.
|
|
138
|
+
fn getSignedValue:int (n:int) {
|
|
139
|
+
def v:int (this.getValue(n))
|
|
140
|
+
if ((this.getValue(1)) == 1) {
|
|
141
|
+
return (0 - v)
|
|
142
|
+
}
|
|
143
|
+
return v
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
; v with a sign read at probability one half (libwebp VP8GetSigned).
|
|
147
|
+
fn getSigned:int (v:int) {
|
|
148
|
+
if (bits < 0) {
|
|
149
|
+
this.load()
|
|
150
|
+
}
|
|
151
|
+
def p:int bits
|
|
152
|
+
def split:int (bit_shr range 1)
|
|
153
|
+
def val:int (bit_shr value p)
|
|
154
|
+
bits = bits - 1
|
|
155
|
+
if (val > split) {
|
|
156
|
+
range = (bit_or (bit_and (range + 255) 255) 1)
|
|
157
|
+
value = value - (bit_shl (split + 1) p)
|
|
158
|
+
return (0 - v)
|
|
159
|
+
}
|
|
160
|
+
range = (bit_or range 1)
|
|
161
|
+
return v
|
|
162
|
+
}
|
|
163
|
+
}
|