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.
Files changed (338) hide show
  1. package/CHANGELOG.md +1160 -19
  2. package/LICENSE +3 -1
  3. package/README.md +124 -29
  4. package/dist/Lang.rgr +1188 -290
  5. package/dist/api.d.ts +2343 -879
  6. package/dist/api.js +79924 -56922
  7. package/dist/lib/JSON.rgr +102 -91
  8. package/dist/lib/Shell.rgr +4 -4
  9. package/dist/lib/apple/AppleToolchain.rgr +4 -4
  10. package/dist/lib/apple/README.md +5 -4
  11. package/dist/lib/apple/apple_test.rgr +1 -1
  12. package/dist/lib/core/README.md +1 -1
  13. package/dist/lib/evg/EVG.rgr +12 -0
  14. package/dist/lib/evg/EVGA11yFromTree.rgr +302 -0
  15. package/dist/lib/evg/EVGA11yTree.rgr +894 -0
  16. package/dist/lib/evg/EVGBox.rgr +267 -0
  17. package/dist/lib/evg/EVGBoxShorthandTest.rgr +220 -0
  18. package/dist/lib/evg/EVGCodepoint.rgr +316 -0
  19. package/dist/lib/evg/EVGColor.rgr +700 -0
  20. package/dist/lib/evg/EVGCommands.rgr +177 -0
  21. package/dist/lib/evg/EVGComponent.rgr +331 -0
  22. package/dist/lib/evg/EVGComponentTest.rgr +387 -0
  23. package/dist/lib/evg/EVGConnector.rgr +541 -0
  24. package/dist/lib/evg/EVGConnectorTest.rgr +306 -0
  25. package/dist/lib/evg/EVGDisplayList.rgr +4186 -0
  26. package/dist/lib/evg/EVGEasing.rgr +370 -0
  27. package/dist/lib/evg/EVGEffectTest.rgr +253 -0
  28. package/dist/lib/evg/EVGElement.rgr +4914 -0
  29. package/dist/lib/evg/EVGFixedTest.rgr +289 -0
  30. package/dist/lib/evg/EVGFlexRulesTest.rgr +317 -0
  31. package/dist/lib/evg/EVGFlexWrapTest.rgr +246 -0
  32. package/dist/lib/evg/EVGFling.rgr +244 -0
  33. package/dist/lib/evg/EVGFocus.rgr +400 -0
  34. package/dist/lib/evg/EVGFocusTest.rgr +399 -0
  35. package/dist/lib/evg/EVGGradient.rgr +322 -0
  36. package/dist/lib/evg/EVGGrapheme.rgr +190 -0
  37. package/dist/lib/evg/EVGGrid.rgr +975 -0
  38. package/dist/lib/evg/EVGHitTest.rgr +208 -0
  39. package/dist/lib/evg/EVGHoles.rgr +294 -0
  40. package/dist/lib/evg/EVGHostMeasurerTest.rgr +281 -0
  41. package/dist/lib/evg/EVGHostTextMeasurer.rgr +331 -0
  42. package/dist/lib/evg/EVGHostTree.rgr +834 -0
  43. package/dist/lib/evg/EVGHostTreeTest.rgr +447 -0
  44. package/dist/lib/evg/EVGImageDecode.rgr +117 -0
  45. package/dist/lib/evg/EVGImageMeasurer.rgr +86 -0
  46. package/dist/lib/evg/EVGInspect.rgr +883 -0
  47. package/dist/lib/evg/EVGInvalidateTest.rgr +432 -0
  48. package/dist/lib/evg/EVGJsonTest.rgr +535 -0
  49. package/dist/lib/evg/EVGLayout.rgr +4220 -0
  50. package/dist/lib/evg/EVGMeasure.rgr +1267 -0
  51. package/dist/lib/evg/EVGOverlayTest.rgr +626 -0
  52. package/dist/lib/evg/EVGPatch.rgr +1721 -0
  53. package/dist/lib/evg/EVGPatchTest.rgr +692 -0
  54. package/dist/lib/evg/EVGPopoverTest.rgr +395 -0
  55. package/dist/lib/evg/EVGReconcile.rgr +226 -0
  56. package/dist/lib/evg/EVGReconcileTest.rgr +421 -0
  57. package/dist/lib/evg/EVGReject.rgr +126 -0
  58. package/dist/lib/evg/EVGRelayoutTest.rgr +375 -0
  59. package/dist/lib/evg/EVGRtlLayoutTest.rgr +319 -0
  60. package/dist/lib/evg/EVGRuler.rgr +232 -0
  61. package/dist/lib/evg/EVGRulerTest.rgr +172 -0
  62. package/dist/lib/evg/EVGSelectChrome.rgr +178 -0
  63. package/dist/lib/evg/EVGStyleCacheTest.rgr +419 -0
  64. package/dist/lib/evg/EVGStyleSheet.rgr +2148 -0
  65. package/dist/lib/evg/EVGStyleStateTest.rgr +407 -0
  66. package/dist/lib/evg/EVGStyleVarTest.rgr +471 -0
  67. package/dist/lib/evg/EVGText.rgr +105 -0
  68. package/dist/lib/evg/EVGTextEngine.rgr +536 -0
  69. package/dist/lib/evg/EVGTextMeasurer.rgr +720 -0
  70. package/dist/lib/evg/EVGTimingTest.rgr +1417 -0
  71. package/dist/lib/evg/EVGToolbar.rgr +1369 -0
  72. package/dist/lib/evg/EVGTransition.rgr +728 -0
  73. package/dist/lib/evg/EVGTreeJson.rgr +721 -0
  74. package/dist/lib/evg/EVGUnit.rgr +554 -0
  75. package/dist/lib/evg/EVGViewportUnitTest.rgr +236 -0
  76. package/dist/lib/evg/EvgApp.rgr +189 -0
  77. package/dist/lib/evg/EvgBitmapTracer.rgr +4277 -0
  78. package/dist/lib/evg/EvgBitmapTracerTest.rgr +2119 -0
  79. package/dist/lib/evg/EvgHost.rgr +451 -0
  80. package/dist/lib/evg/EvgTest.rgr +91 -0
  81. package/dist/lib/evg/EvgTraceColor.rgr +236 -0
  82. package/dist/lib/evg/EvgTraceCurve.rgr +648 -0
  83. package/dist/lib/evg/EvgTraceFit.rgr +767 -0
  84. package/dist/lib/evg/EvgTracePath.rgr +435 -0
  85. package/dist/lib/evg/EvgTraceTypes.rgr +559 -0
  86. package/dist/lib/evg/EvgViewport.rgr +313 -0
  87. package/dist/lib/evg/FxDemoDoc.rgr +185 -0
  88. package/dist/lib/evg/HOSTS.md +227 -0
  89. package/dist/lib/evg/ISSUES.md +835 -0
  90. package/dist/lib/evg/PLAN_ACCESSIBILITY.md +650 -0
  91. package/dist/lib/evg/PLAN_CSS_LAYOUT_AND_FONTS.md +1124 -0
  92. package/dist/lib/evg/PLAN_EFFECTS.md +431 -0
  93. package/dist/lib/evg/PLAN_EVG.md +518 -0
  94. package/dist/lib/evg/PLAN_EVG_RENDERER.md +1674 -0
  95. package/dist/lib/evg/PLAN_INSPECTOR.md +788 -0
  96. package/dist/lib/evg/PLAN_LINKS_AND_FORMS.md +157 -0
  97. package/dist/lib/evg/PLAN_NATIVE_HOSTS.md +671 -0
  98. package/dist/lib/evg/PLAN_VECTOR_IR.md +664 -0
  99. package/dist/lib/evg/PLAN_VIEW_TRANSFORM.md +322 -0
  100. package/dist/lib/evg/PathBuilder.rgr +333 -0
  101. package/dist/lib/evg/README.md +1236 -0
  102. package/dist/lib/evg/SPEC.md +1252 -0
  103. package/dist/lib/evg/SVGPathParser.rgr +1199 -0
  104. package/dist/lib/evg/SvgParser.rgr +1736 -0
  105. package/dist/lib/evg/TODO_EVG_RENDERER.md +595 -0
  106. package/dist/lib/evg/VectorShapes.rgr +331 -0
  107. package/dist/lib/evg/VectorStroke.rgr +107 -0
  108. package/dist/lib/evg/VectorViewBox.rgr +380 -0
  109. package/dist/lib/evg/agent/README.md +290 -0
  110. package/dist/lib/evg/agent/evg_agent.rgr +899 -0
  111. package/dist/lib/evg/agent/fixtures/broken.evg.json +7 -0
  112. package/dist/lib/evg/agent/fixtures/card.evg.json +9 -0
  113. package/dist/lib/evg/agent/fixtures/connector.css +63 -0
  114. package/dist/lib/evg/agent/fixtures/connector.evg.json +14 -0
  115. package/dist/lib/evg/agent/fixtures/drawn.evg.json +129 -0
  116. package/dist/lib/evg/agent/fixtures/gradient.evg.json +4 -0
  117. package/dist/lib/evg/agent/fixtures/popover.css +99 -0
  118. package/dist/lib/evg/agent/fixtures/popover.evg.json +30 -0
  119. package/dist/lib/evg/agent/roundtrip.sh +74 -0
  120. package/dist/lib/evg/agent/smoke.sh +230 -0
  121. package/dist/lib/evg/android/README.md +97 -0
  122. package/dist/lib/evg/android/androidstubs/AndroidStubs.kt +175 -0
  123. package/dist/lib/evg/android/androidstubs/Annotation.kt +10 -0
  124. package/dist/lib/evg/android/androidstubs/App.kt +30 -0
  125. package/dist/lib/evg/android/androidstubs/Content.kt +41 -0
  126. package/dist/lib/evg/android/androidstubs/ContentRes.kt +12 -0
  127. package/dist/lib/evg/android/androidstubs/InputMethod.kt +46 -0
  128. package/dist/lib/evg/android/androidstubs/Net.kt +6 -0
  129. package/dist/lib/evg/android/androidstubs/Os.kt +30 -0
  130. package/dist/lib/evg/android/androidstubs/Util.kt +15 -0
  131. package/dist/lib/evg/android/androidstubs/View.kt +113 -0
  132. package/dist/lib/evg/android/androidstubs/Widget.kt +16 -0
  133. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidEvgSurface.kt +323 -0
  134. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidTextMeasurer.kt +56 -0
  135. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/RippleEffect.kt +262 -0
  136. package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtEvgSurface.kt +238 -0
  137. package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtTextMeasurer.kt +85 -0
  138. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgEngineThread.kt +115 -0
  139. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgPainter.kt +231 -0
  140. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgSurface.kt +117 -0
  141. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/RecordingSurface.kt +94 -0
  142. package/dist/lib/evg/apple/README.md +128 -0
  143. package/dist/lib/evg/apple/Sources/CoreGraphicsEvgSurface.swift +329 -0
  144. package/dist/lib/evg/apple/Sources/CoreTextMeasurer.swift +70 -0
  145. package/dist/lib/evg/apple/Sources/EvgEngineQueue.swift +105 -0
  146. package/dist/lib/evg/apple/Sources/EvgPainter.swift +225 -0
  147. package/dist/lib/evg/apple/Sources/EvgSurface.swift +163 -0
  148. package/dist/lib/evg/apple/Sources/RecordingSurface.swift +110 -0
  149. package/dist/lib/evg/bench/EvgLayoutBench.rgr +34 -0
  150. package/dist/lib/evg/bench/README.md +64 -0
  151. package/dist/lib/evg/bench/layout-bench.mjs +316 -0
  152. package/dist/lib/evg/bench/layout-cases.mjs +510 -0
  153. package/dist/lib/evg/bench/layout-conformance.mjs +254 -0
  154. package/dist/lib/evg/bin/.gitignore +17 -0
  155. package/dist/lib/evg/evg_test.rgr +313 -0
  156. package/dist/lib/evg/gl/README.md +198 -0
  157. package/dist/lib/evg/gl/a11y-paint-check.mjs +73 -0
  158. package/dist/lib/evg/gl/blur-check.mjs +399 -0
  159. package/dist/lib/evg/gl/boxmodel.json +1 -0
  160. package/dist/lib/evg/gl/demo.html +46 -0
  161. package/dist/lib/evg/gl/effect-presets.css +285 -0
  162. package/dist/lib/evg/gl/effect-presets.js +63 -0
  163. package/dist/lib/evg/gl/effect-shots.mjs +135 -0
  164. package/dist/lib/evg/gl/evg-a11y.js +566 -0
  165. package/dist/lib/evg/gl/evg-binary.js +160 -0
  166. package/dist/lib/evg/gl/evg-engine.js +296 -0
  167. package/dist/lib/evg/gl/evg-fx.js +237 -0
  168. package/dist/lib/evg/gl/evg-gestures.js +209 -0
  169. package/dist/lib/evg/gl/evg-list.js +167 -0
  170. package/dist/lib/evg/gl/evg-measure.js +186 -0
  171. package/dist/lib/evg/gl/evg-textinput.js +303 -0
  172. package/dist/lib/evg/gl/evg-view.js +144 -0
  173. package/dist/lib/evg/gl/evg-webgl.js +3942 -0
  174. package/dist/lib/evg/gl/fx-check.mjs +998 -0
  175. package/dist/lib/evg/gl/fx-demo.html +166 -0
  176. package/dist/lib/evg/gl/fx-demo.js +2 -0
  177. package/dist/lib/evg/gl/fx-serve.mjs +47 -0
  178. package/dist/lib/evg/gl/gestures-check.mjs +189 -0
  179. package/dist/lib/evg/gl/list-binary-check.mjs +152 -0
  180. package/dist/lib/evg/gl/measure-check.mjs +135 -0
  181. package/dist/lib/evg/gl/rotation-check.mjs +207 -0
  182. package/dist/lib/evg/gl/shift-check.mjs +113 -0
  183. package/dist/lib/evg/gl/stroke-check.mjs +168 -0
  184. package/dist/lib/evg/gl/text-snap-check.mjs +139 -0
  185. package/dist/lib/evg/gl/view-check.mjs +343 -0
  186. package/dist/lib/evg/gl/view-policy-check.mjs +184 -0
  187. package/dist/lib/evg/html/evg-dom.js +318 -0
  188. package/dist/lib/evg/html/evg-html.js +600 -0
  189. package/dist/lib/evg/inspect/README.md +415 -0
  190. package/dist/lib/evg/inspect/browser-smoke.mjs +115 -0
  191. package/dist/lib/evg/inspect/evg-inspect.js +947 -0
  192. package/dist/lib/evg/inspect/shots/css.png +0 -0
  193. package/dist/lib/evg/inspect/shots/dashboard.png +0 -0
  194. package/dist/lib/evg/inspect/shots/pptx-slide.png +0 -0
  195. package/dist/lib/evg/inspect/shots/state.png +0 -0
  196. package/dist/lib/evg/inspect/shots.mjs +226 -0
  197. package/dist/lib/evg/oracle/css-blur.json +576 -0
  198. package/dist/lib/evg/oracle/css-box.json +157 -0
  199. package/dist/lib/evg/oracle/css-timing.json +709 -0
  200. package/dist/lib/evg/oracle/css_blur_oracle.mjs +529 -0
  201. package/dist/lib/evg/oracle/css_box_oracle.mjs +106 -0
  202. package/dist/lib/evg/oracle/css_timing_oracle.mjs +389 -0
  203. package/dist/lib/evg/original/EVGColor.clj +310 -0
  204. package/dist/lib/evg/original/EVGColorContext.rgr +178 -0
  205. package/dist/lib/evg/original/SVGPath.rgr +627 -0
  206. package/dist/lib/evg/original/Vec2.crgr +103 -0
  207. package/dist/lib/evg/ranger.json +9 -0
  208. package/dist/lib/evg/showcase/README.md +246 -0
  209. package/dist/lib/evg/showcase/assets/emblem.svg +30 -0
  210. package/dist/lib/evg/showcase/assets/rosette.svg +22 -0
  211. package/dist/lib/evg/showcase/build.mjs +651 -0
  212. package/dist/lib/evg/showcase/pages/album.tsx +30 -0
  213. package/dist/lib/evg/showcase/pages/boxmodel.tsx +37 -0
  214. package/dist/lib/evg/showcase/pages/cards.tsx +41 -0
  215. package/dist/lib/evg/showcase/pages/chart_api.tsx +170 -0
  216. package/dist/lib/evg/showcase/pages/charts.tsx +219 -0
  217. package/dist/lib/evg/showcase/pages/drawing.tsx +160 -0
  218. package/dist/lib/evg/showcase/pages/emoji.tsx +91 -0
  219. package/dist/lib/evg/showcase/pages/flex.tsx +46 -0
  220. package/dist/lib/evg/showcase/pages/more.tsx +332 -0
  221. package/dist/lib/evg/showcase/pages/plots.tsx +262 -0
  222. package/dist/lib/evg/showcase/pages/svg.tsx +63 -0
  223. package/dist/lib/evg/showcase/pages/tables.tsx +209 -0
  224. package/dist/lib/evg/showcase/pages/typography.tsx +43 -0
  225. package/dist/lib/evg/showcase/pages/units.tsx +35 -0
  226. package/dist/lib/evg/showcase/pages/variants.tsx +233 -0
  227. package/dist/lib/evg/showcase/pages/vector.tsx +75 -0
  228. package/dist/lib/evg/showcase/pages/views.tsx +223 -0
  229. package/dist/lib/evg/showcase/tests/chart_api_smoke.mjs +339 -0
  230. package/dist/lib/evg/showcase/tests/gl_smoke.mjs +125 -0
  231. package/dist/lib/evg/showcase/themes/chart_api-default.css +15 -0
  232. package/dist/lib/evg/showcase/themes/charts-default.css +29 -0
  233. package/dist/lib/evg/showcase/themes/drawing-default.css +35 -0
  234. package/dist/lib/evg/showcase/themes/more-default.css +128 -0
  235. package/dist/lib/evg/showcase/themes/plots-default.css +18 -0
  236. package/dist/lib/evg/showcase/themes/showcase.css +508 -0
  237. package/dist/lib/evg/showcase/themes/tables-default.css +123 -0
  238. package/dist/lib/evg/showcase/themes/variants-default.css +15 -0
  239. package/dist/lib/evg/showcase/themes/views-default.css +15 -0
  240. package/dist/lib/evg/tools/bench_vs_potrace.mjs +290 -0
  241. package/dist/lib/evg/tools/evg_image_tool.rgr +488 -0
  242. package/dist/lib/evg/tools/evg_trace_bench.rgr +114 -0
  243. package/dist/lib/evg/tools/evg_trace_cli.rgr +662 -0
  244. package/dist/lib/evg/tools/evg_trace_cpp_bench.rgr +83 -0
  245. package/dist/lib/evg/tools/run_trace_bench.sh +74 -0
  246. package/dist/lib/evg/tools/run_trace_cli_smoke.sh +128 -0
  247. package/dist/lib/evg/web/responsive/EvgResponsiveCheck.rgr +271 -0
  248. package/dist/lib/evg/web/responsive/EvgResponsiveDemo.rgr +531 -0
  249. package/dist/lib/evg/web/responsive/README.md +97 -0
  250. package/dist/lib/evg/web/responsive/build.mjs +90 -0
  251. package/dist/lib/evg/web/responsive/dom-check.mjs +169 -0
  252. package/dist/lib/evg/web/responsive/index.html +177 -0
  253. package/dist/lib/evg/web/responsive/smoke.mjs +221 -0
  254. package/dist/lib/evg/web/tools/assets-client.mjs +95 -0
  255. package/dist/lib/evg/web/tools/boot-bench.mjs +189 -0
  256. package/dist/lib/evg/web/tools/inline-assets.mjs +119 -0
  257. package/dist/lib/evg/web/tools/minify.mjs +60 -0
  258. package/dist/lib/evg/web/tracer/build.mjs +87 -0
  259. package/dist/lib/evg/web/tracer/index.html +2805 -0
  260. package/dist/lib/evg/web/tracer/sample.png +0 -0
  261. package/dist/lib/evg/web/tracer/smoke.mjs +1162 -0
  262. package/dist/lib/evgr/Cargo.lock +21 -0
  263. package/dist/lib/evgr/Cargo.toml +19 -0
  264. package/dist/lib/evgr/README.md +140 -0
  265. package/dist/lib/evgr/bench/NativeBench.rgr +246 -0
  266. package/dist/lib/evgr/bench/compare.mjs +252 -0
  267. package/dist/lib/evgr/bench/speed.mjs +277 -0
  268. package/dist/lib/evgr/bin/.gitignore +3 -0
  269. package/dist/lib/evgr/src/bin/bench.rs +106 -0
  270. package/dist/lib/evgr/src/bin/smoke.rs +13 -0
  271. package/dist/lib/evgr/src/grid.rs +730 -0
  272. package/dist/lib/evgr/src/lib.rs +1003 -0
  273. package/dist/lib/evgr/src/style.rs +468 -0
  274. package/dist/lib/evgr/src/text.rs +83 -0
  275. package/dist/lib/image/BitReader.rgr +171 -0
  276. package/dist/lib/image/Buffer.rgr +173 -0
  277. package/dist/lib/image/DCT.rgr +283 -0
  278. package/dist/lib/image/Deflate.rgr +339 -0
  279. package/dist/lib/image/HuffmanDecoder.rgr +181 -0
  280. package/dist/lib/image/ImageBuffer.rgr +706 -0
  281. package/dist/lib/image/JPEGDecoder.rgr +808 -0
  282. package/dist/lib/image/PNGDecoder.rgr +544 -0
  283. package/dist/lib/image/PNGEncoder.rgr +388 -0
  284. package/dist/lib/image/PPMImage.rgr +224 -0
  285. package/dist/lib/image/ProgressiveJPEGDecoder.rgr +1154 -0
  286. package/dist/lib/image/README.md +33 -0
  287. package/dist/lib/image/RasterBuffer.rgr +294 -0
  288. package/dist/lib/image/VP8BoolDecoder.rgr +163 -0
  289. package/dist/lib/image/WebPDecoder.rgr +433 -0
  290. package/dist/lib/image/WebPLossless.rgr +1035 -0
  291. package/dist/lib/image/WebPLossy.rgr +1929 -0
  292. package/dist/lib/image/ranger.json +9 -0
  293. package/dist/lib/image/testdata/webp/anim_2f_24x16.webp +0 -0
  294. package/dist/lib/image/testdata/webp/fixtures.txt +33 -0
  295. package/dist/lib/image/testdata/webp/gen_fixtures.py +261 -0
  296. package/dist/lib/image/testdata/webp/ll_1x1.webp +0 -0
  297. package/dist/lib/image/testdata/webp/ll_alpha_29x21.webp +0 -0
  298. package/dist/lib/image/testdata/webp/ll_gradient_64x64.webp +0 -0
  299. package/dist/lib/image/testdata/webp/ll_meta_32x32.webp +0 -0
  300. package/dist/lib/image/testdata/webp/ll_noise_17x9.webp +0 -0
  301. package/dist/lib/image/testdata/webp/ll_pal11_23x11.webp +0 -0
  302. package/dist/lib/image/testdata/webp/ll_pal2_19x7.webp +0 -0
  303. package/dist/lib/image/testdata/webp/ll_pal40_16x16.webp +0 -0
  304. package/dist/lib/image/testdata/webp/ll_pal4_13x5.webp +0 -0
  305. package/dist/lib/image/testdata/webp/ll_photo_40x30.webp +0 -0
  306. package/dist/lib/image/testdata/webp/ll_predictors_64x32.webp +0 -0
  307. package/dist/lib/image/testdata/webp/ly_1x1.webp +0 -0
  308. package/dist/lib/image/testdata/webp/ly_alph_raw_f0_21x13.webp +0 -0
  309. package/dist/lib/image/testdata/webp/ly_alph_raw_f1_21x13.webp +0 -0
  310. package/dist/lib/image/testdata/webp/ly_alph_raw_f2_21x13.webp +0 -0
  311. package/dist/lib/image/testdata/webp/ly_alph_raw_f3_21x13.webp +0 -0
  312. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f0_21x13.webp +0 -0
  313. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f1_21x13.webp +0 -0
  314. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f2_21x13.webp +0 -0
  315. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f3_21x13.webp +0 -0
  316. package/dist/lib/image/testdata/webp/ly_alpha_33x17.webp +0 -0
  317. package/dist/lib/image/testdata/webp/ly_exif_15x11.webp +0 -0
  318. package/dist/lib/image/testdata/webp/ly_i16_96x80.webp +0 -0
  319. package/dist/lib/image/testdata/webp/ly_nofilter_24x20.webp +0 -0
  320. package/dist/lib/image/testdata/webp/ly_odd_17x9.webp +0 -0
  321. package/dist/lib/image/testdata/webp/ly_photo_48x40.webp +0 -0
  322. package/dist/lib/image/testdata/webp/ly_q100_20x18.webp +0 -0
  323. package/dist/lib/image/testdata/webp/ly_sharp_40x36.webp +0 -0
  324. package/dist/lib/image/testdata/webp/ly_simple_filter_33x31.webp +0 -0
  325. package/dist/lib/image/testdata/webp/ly_vpx_parts8_37x45.webp +0 -0
  326. package/dist/lib/image/testdata/webp/ly_vpx_skip_96x80.webp +0 -0
  327. package/dist/lib/image/tests/WebPDecodeTool.rgr +81 -0
  328. package/dist/lib/image/tests/WebPDecoderTest.rgr +1162 -0
  329. package/dist/lib/image/tests/run_webp_tests.sh +39 -0
  330. package/dist/lib/rust/RsJson.rgr +468 -0
  331. package/dist/lib/rust/RsPrelude.rgr +1663 -0
  332. package/dist/lib/shell_test.rgr +7 -7
  333. package/dist/lib/stdlib.rgr +21 -5
  334. package/dist/lib/zip/ranger.json +6 -0
  335. package/dist/rgrc.js +87318 -67610
  336. package/package.json +1010 -1040
  337. package/dist/README.md +0 -117
  338. 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
+ }