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,1929 @@
1
+ ; SPDX-License-Identifier: MIT
2
+
3
+ ; WebPLossy.rgr - the VP8 key frame decoder behind lossy WebP (RFC 6386,
4
+ ; RFC 9649 section 2.5): frame header, segmentation, token probabilities,
5
+ ; coefficients and dequantization, intra prediction (16x16, the ten 4x4
6
+ ; modes, chroma), inverse DCT / WHT, the simple and the normal loop filter,
7
+ ; and YUV 4:2:0 to RGBA with the "fancy" upsampler libwebp uses by default.
8
+ ;
9
+ ; The decoding logic follows libwebp (src/dec/vp8_dec.c, tree_dec.c,
10
+ ; frame_dec.c, src/dsp/dec.c, upsampling.c, yuv.h), Copyright Google Inc.,
11
+ ; BSD-3-Clause, as condensed by simplewebp; the output matches libwebp byte
12
+ ; for byte. The constant tables are the ones printed in RFC 6386. This port
13
+ ; is MIT like the rest of lib/image.
14
+ ;
15
+ ; The reconstruction keeps libwebp's scratch layout: one 32-byte-stride block
16
+ ; (yuvB) holding the macroblock being predicted with its top and left
17
+ ; neighbours, so the edge cases (127 above the image, 129 left of it, the
18
+ ; top-right samples of 4x4 prediction) come out exactly as libwebp's.
19
+
20
+ Import "VP8BoolDecoder.rgr"
21
+ Import "ImageBuffer.rgr"
22
+
23
+ class VP8Decoder {
24
+ def error:string ""
25
+ def width:int 0
26
+ def height:int 0
27
+ def mbW:int 0
28
+ def mbH:int 0
29
+ def maxPixels:int 100000000
30
+
31
+ def br:VP8BoolDecoder (new VP8BoolDecoder())
32
+ def parts:[VP8BoolDecoder]
33
+ def numParts:int 1
34
+
35
+ ; segment header
36
+ def useSegment:boolean false
37
+ def updateMap:boolean false
38
+ def absoluteDelta:boolean true
39
+ def segQuant:int_buffer (int_buffer_alloc 4)
40
+ def segFilter:int_buffer (int_buffer_alloc 4)
41
+ def segProba:int_buffer (int_buffer_alloc 3)
42
+
43
+ ; filter header
44
+ def filterSimple:int 0
45
+ def filterLevel:int 0
46
+ def sharpness:int 0
47
+ def useLfDelta:int 0
48
+ def refLfDelta:int_buffer (int_buffer_alloc 4)
49
+ def modeLfDelta:int_buffer (int_buffer_alloc 4)
50
+ def filterType:int 0
51
+ ; per segment and 4x4-ness: limit, ilevel, inner, hev threshold
52
+ def fstr:int_buffer (int_buffer_alloc 32)
53
+
54
+ ; dequantization, per segment: y1 dc, y1 ac, y2 dc, y2 ac, uv dc, uv ac
55
+ def dqm:int_buffer (int_buffer_alloc 24)
56
+ ; coefficient probabilities [type 4][band 8][context 3][11]
57
+ def proba:int_buffer (int_buffer_alloc 1056)
58
+ def useSkipProba:int 0
59
+ def skipProba:int 0
60
+
61
+ ; constant tables
62
+ def bands:int_buffer (int_buffer_alloc 17)
63
+ def zigzag:int_buffer (int_buffer_alloc 16)
64
+ def modesProbaT:int_buffer (int_buffer_alloc 900)
65
+ def dcTab:int_buffer (int_buffer_alloc 128)
66
+ def acTab:int_buffer (int_buffer_alloc 128)
67
+
68
+ ; per macroblock row
69
+ def intraT:int_buffer (int_buffer_alloc 0)
70
+ def intraL:int_buffer (int_buffer_alloc 4)
71
+ def mbSegment:int_buffer (int_buffer_alloc 0)
72
+ def mbSkip:int_buffer (int_buffer_alloc 0)
73
+ def mbIsI4:int_buffer (int_buffer_alloc 0)
74
+ def mbUvMode:int_buffer (int_buffer_alloc 0)
75
+ def mbModes:int_buffer (int_buffer_alloc 0)
76
+ def topNz:int_buffer (int_buffer_alloc 0)
77
+ def topNzDc:int_buffer (int_buffer_alloc 0)
78
+ def leftNz:int 0
79
+ def leftNzDc:int 0
80
+ def fLimit:int_buffer (int_buffer_alloc 0)
81
+ def fILevel:int_buffer (int_buffer_alloc 0)
82
+ def fInner:int_buffer (int_buffer_alloc 0)
83
+ def fHev:int_buffer (int_buffer_alloc 0)
84
+
85
+ ; the macroblock being decoded
86
+ def coeffs:int_buffer (int_buffer_alloc 384)
87
+ def nzCode:int_buffer (int_buffer_alloc 24)
88
+ def dcBuf:int_buffer (int_buffer_alloc 16)
89
+ def tmp:int_buffer (int_buffer_alloc 16)
90
+
91
+ ; reconstruction scratch (stride 32) and saved top samples
92
+ def yuvB:buffer (buffer_alloc 832)
93
+ def yuvT:buffer (buffer_alloc 0)
94
+
95
+ ; the decoded planes, padded to whole macroblocks
96
+ def yPlane:buffer (buffer_alloc 0)
97
+ def uPlane:buffer (buffer_alloc 0)
98
+ def vPlane:buffer (buffer_alloc 0)
99
+ def yStride:int 0
100
+ def uvStride:int 0
101
+
102
+ ; what the last frame used (read by the tests)
103
+ def statI4Modes:int 0
104
+ def statI16Modes:int 0
105
+ def statUvModes:int 0
106
+ def statSkipped:int 0
107
+ def statSegments:int 0
108
+
109
+ Constructor () {
110
+ this.fillTable(bands ([] _:int (0 1 2 3 6 4 5 6 6 6 6 6 6 6 6 7 0)))
111
+ this.fillTable(zigzag ([] _:int (0 1 4 8 5 2 3 6 9 12 13 10 7 11 14 15)))
112
+ this.fillTable(modesProbaT (VP8Decoder.modesProba()))
113
+ this.fillTable(dcTab (VP8Decoder.dcTable()))
114
+ this.fillTable(acTab (VP8Decoder.acTable()))
115
+ }
116
+
117
+ fn fillTable:void (dst:int_buffer values:[int]) {
118
+ def i:int 0
119
+ def n:int (array_length values)
120
+ while (i < n) {
121
+ int_buffer_set dst i (itemAt values i)
122
+ i = i + 1
123
+ }
124
+ }
125
+
126
+ fn fail:boolean (msg:string) {
127
+ if ((strlen error) == 0) {
128
+ error = msg
129
+ }
130
+ return false
131
+ }
132
+
133
+ sfn clip:int (v:int m:int) {
134
+ if (v < 0) {
135
+ return 0
136
+ }
137
+ if (v > m) {
138
+ return m
139
+ }
140
+ return v
141
+ }
142
+
143
+ ; int16 storage of the reference decoder
144
+ sfn wrap16:int (v:int) {
145
+ return ((bit_and (v + 32768) 65535) - 32768)
146
+ }
147
+
148
+ ; ======================================================================
149
+ ; Frame header
150
+ ; ======================================================================
151
+
152
+ ; Parses the VP8 frame header of a 'VP8 ' chunk payload. On success the
153
+ ; picture size is known and decodeFrame() can run.
154
+ fn decodeHeader:boolean (src:buffer start:int size:int maxDim:int) {
155
+ error = ""
156
+ if ((size < 10) || ((start + size) > (buffer_length src))) {
157
+ return (this.fail("VP8 chunk too small"))
158
+ }
159
+ def b0:int (buffer_get src start)
160
+ def b1:int (buffer_get src (start + 1))
161
+ def b2:int (buffer_get src (start + 2))
162
+ def tag:int (bit_or (bit_or b0 (bit_shl b1 8)) (bit_shl b2 16))
163
+ if ((bit_and tag 1) != 0) {
164
+ return (this.fail("not a key frame"))
165
+ }
166
+ if ((bit_and (bit_shr tag 1) 7) > 3) {
167
+ return (this.fail("unknown VP8 profile"))
168
+ }
169
+ if ((bit_and (bit_shr tag 4) 1) == 0) {
170
+ return (this.fail("frame not displayable"))
171
+ }
172
+ def partLen:int (bit_shr tag 5)
173
+ if (((buffer_get src (start + 3)) != 157) || ((buffer_get src (start + 4)) != 1) || ((buffer_get src (start + 5)) != 42)) {
174
+ return (this.fail("bad VP8 start code"))
175
+ }
176
+ width = (bit_and (bit_or (buffer_get src (start + 6)) (bit_shl (buffer_get src (start + 7)) 8)) 16383)
177
+ height = (bit_and (bit_or (buffer_get src (start + 8)) (bit_shl (buffer_get src (start + 9)) 8)) 16383)
178
+ if ((width == 0) || (height == 0)) {
179
+ return (this.fail("zero image size"))
180
+ }
181
+ if ((width > maxDim) || (height > maxDim) || (((to_double width) * (to_double height)) > (to_double maxPixels))) {
182
+ return (this.fail("image too large"))
183
+ }
184
+ if (partLen > (size - 10)) {
185
+ return (this.fail("bad partition length"))
186
+ }
187
+ mbW = (bit_shr (width + 15) 4)
188
+ mbH = (bit_shr (height + 15) 4)
189
+
190
+ br.init(src (start + 10) partLen)
191
+ br.getValue(1)
192
+ br.getValue(1)
193
+
194
+ ; segment header
195
+ useSegment = false
196
+ updateMap = false
197
+ absoluteDelta = true
198
+ int_buffer_fill segQuant 0 0 4
199
+ int_buffer_fill segFilter 0 0 4
200
+ int_buffer_fill segProba 255 0 3
201
+ if ((br.getValue(1)) == 1) {
202
+ useSegment = true
203
+ updateMap = ((br.getValue(1)) == 1)
204
+ if ((br.getValue(1)) == 1) {
205
+ absoluteDelta = ((br.getValue(1)) == 1)
206
+ def s:int 0
207
+ while (s < 4) {
208
+ def qv:int 0
209
+ if ((br.getValue(1)) == 1) {
210
+ qv = (br.getSignedValue(7))
211
+ }
212
+ int_buffer_set segQuant s qv
213
+ s = s + 1
214
+ }
215
+ s = 0
216
+ while (s < 4) {
217
+ def fv:int 0
218
+ if ((br.getValue(1)) == 1) {
219
+ fv = (br.getSignedValue(6))
220
+ }
221
+ int_buffer_set segFilter s fv
222
+ s = s + 1
223
+ }
224
+ }
225
+ if updateMap {
226
+ def s:int 0
227
+ while (s < 3) {
228
+ def pv:int 255
229
+ if ((br.getValue(1)) == 1) {
230
+ pv = (br.getValue(8))
231
+ }
232
+ int_buffer_set segProba s pv
233
+ s = s + 1
234
+ }
235
+ }
236
+ }
237
+ if br.eof {
238
+ return (this.fail("cannot parse segment header"))
239
+ }
240
+
241
+ ; filter header
242
+ filterSimple = (br.getValue(1))
243
+ filterLevel = (br.getValue(6))
244
+ sharpness = (br.getValue(3))
245
+ useLfDelta = (br.getValue(1))
246
+ int_buffer_fill refLfDelta 0 0 4
247
+ int_buffer_fill modeLfDelta 0 0 4
248
+ if (useLfDelta == 1) {
249
+ if ((br.getValue(1)) == 1) {
250
+ def i:int 0
251
+ while (i < 4) {
252
+ if ((br.getValue(1)) == 1) {
253
+ int_buffer_set refLfDelta i (br.getSignedValue(6))
254
+ }
255
+ i = i + 1
256
+ }
257
+ i = 0
258
+ while (i < 4) {
259
+ if ((br.getValue(1)) == 1) {
260
+ int_buffer_set modeLfDelta i (br.getSignedValue(6))
261
+ }
262
+ i = i + 1
263
+ }
264
+ }
265
+ }
266
+ filterType = 0
267
+ if (filterLevel != 0) {
268
+ filterType = 2
269
+ if (filterSimple == 1) {
270
+ filterType = 1
271
+ }
272
+ }
273
+ if br.eof {
274
+ return (this.fail("cannot parse filter header"))
275
+ }
276
+
277
+ ; token partitions
278
+ def pstart:int ((start + 10) + partLen)
279
+ def psize:int ((size - 10) - partLen)
280
+ def lastPart:int ((bit_shl 1 (br.getValue(2))) - 1)
281
+ numParts = lastPart + 1
282
+ if ((3 * lastPart) > psize) {
283
+ return (this.fail("cannot parse partitions"))
284
+ }
285
+ def emptyParts:[VP8BoolDecoder]
286
+ parts = emptyParts
287
+ def partStart:int (pstart + (lastPart * 3))
288
+ def sizeLeft:int (psize - (lastPart * 3))
289
+ def p:int 0
290
+ while (p < lastPart) {
291
+ def sz:int (pstart + (p * 3))
292
+ def plen:int (bit_or (bit_or (buffer_get src sz) (bit_shl (buffer_get src (sz + 1)) 8)) (bit_shl (buffer_get src (sz + 2)) 16))
293
+ if (plen > sizeLeft) {
294
+ plen = sizeLeft
295
+ }
296
+ def pd:VP8BoolDecoder (new VP8BoolDecoder())
297
+ pd.init(src partStart plen)
298
+ push parts pd
299
+ partStart = partStart + plen
300
+ sizeLeft = sizeLeft - plen
301
+ p = p + 1
302
+ }
303
+ def lastDec:VP8BoolDecoder (new VP8BoolDecoder())
304
+ lastDec.init(src partStart sizeLeft)
305
+ push parts lastDec
306
+ if (partStart >= (pstart + psize)) {
307
+ return (this.fail("cannot parse partitions"))
308
+ }
309
+
310
+ ; quantizers
311
+ def baseQ:int (br.getValue(7))
312
+ def dqy1dc:int (this.readDelta())
313
+ def dqy2dc:int (this.readDelta())
314
+ def dqy2ac:int (this.readDelta())
315
+ def dquvdc:int (this.readDelta())
316
+ def dquvac:int (this.readDelta())
317
+ def s:int 0
318
+ while (s < 4) {
319
+ def q:int baseQ
320
+ if useSegment {
321
+ q = (int_buffer_get segQuant s)
322
+ if (absoluteDelta == false) {
323
+ q = q + baseQ
324
+ }
325
+ }
326
+ def m:int (s * 6)
327
+ int_buffer_set dqm m (int_buffer_get dcTab (VP8Decoder.clip((q + dqy1dc) 127)))
328
+ int_buffer_set dqm (m + 1) (int_buffer_get acTab (VP8Decoder.clip(q 127)))
329
+ int_buffer_set dqm (m + 2) ((int_buffer_get dcTab (VP8Decoder.clip((q + dqy2dc) 127))) * 2)
330
+ def y2ac:int (bit_shr ((int_buffer_get acTab (VP8Decoder.clip((q + dqy2ac) 127))) * 101581) 16)
331
+ if (y2ac < 8) {
332
+ y2ac = 8
333
+ }
334
+ int_buffer_set dqm (m + 3) y2ac
335
+ int_buffer_set dqm (m + 4) (int_buffer_get dcTab (VP8Decoder.clip((q + dquvdc) 117)))
336
+ int_buffer_set dqm (m + 5) (int_buffer_get acTab (VP8Decoder.clip((q + dquvac) 127)))
337
+ s = s + 1
338
+ }
339
+
340
+ ; refresh_entropy_probs is ignored, then the token probabilities
341
+ br.getValue(1)
342
+ def upd:[int] (VP8Decoder.coeffUpdateProba())
343
+ def def0:[int] (VP8Decoder.coeffProba0())
344
+ def i:int 0
345
+ while (i < 1056) {
346
+ def v:int (itemAt def0 i)
347
+ if ((br.getBit((itemAt upd i))) == 1) {
348
+ v = (br.getValue(8))
349
+ }
350
+ int_buffer_set proba i v
351
+ i = i + 1
352
+ }
353
+ useSkipProba = (br.getValue(1))
354
+ skipProba = 0
355
+ if (useSkipProba == 1) {
356
+ skipProba = (br.getValue(8))
357
+ }
358
+ return true
359
+ }
360
+
361
+ fn readDelta:int () {
362
+ if ((br.getValue(1)) == 1) {
363
+ return (br.getSignedValue(4))
364
+ }
365
+ return 0
366
+ }
367
+
368
+ ; loop filter strengths per segment and per 4x4-ness (libwebp PrecomputeFilterStrengths)
369
+ fn computeFilterStrengths:void () {
370
+ int_buffer_fill fstr 0 0 32
371
+ if (filterType == 0) {
372
+ return
373
+ }
374
+ def s:int 0
375
+ while (s < 4) {
376
+ def baseLevel:int filterLevel
377
+ if useSegment {
378
+ baseLevel = (int_buffer_get segFilter s)
379
+ if (absoluteDelta == false) {
380
+ baseLevel = baseLevel + filterLevel
381
+ }
382
+ }
383
+ def i4:int 0
384
+ while (i4 <= 1) {
385
+ def o:int (((s * 2) + i4) * 4)
386
+ def level:int baseLevel
387
+ if (useLfDelta == 1) {
388
+ level = level + (int_buffer_get refLfDelta 0)
389
+ if (i4 == 1) {
390
+ level = level + (int_buffer_get modeLfDelta 0)
391
+ }
392
+ }
393
+ level = (VP8Decoder.clip(level 63))
394
+ if (level > 0) {
395
+ def ilevel:int level
396
+ if (sharpness > 0) {
397
+ if (sharpness > 4) {
398
+ ilevel = (bit_shr ilevel 2)
399
+ } {
400
+ ilevel = (bit_shr ilevel 1)
401
+ }
402
+ if (ilevel > (9 - sharpness)) {
403
+ ilevel = 9 - sharpness
404
+ }
405
+ }
406
+ if (ilevel < 1) {
407
+ ilevel = 1
408
+ }
409
+ int_buffer_set fstr o ((2 * level) + ilevel)
410
+ int_buffer_set fstr (o + 1) ilevel
411
+ def hev:int 0
412
+ if (level >= 15) {
413
+ hev = 1
414
+ }
415
+ if (level >= 40) {
416
+ hev = 2
417
+ }
418
+ int_buffer_set fstr (o + 3) hev
419
+ } {
420
+ int_buffer_set fstr o 0
421
+ }
422
+ int_buffer_set fstr (o + 2) i4
423
+ i4 = i4 + 1
424
+ }
425
+ s = s + 1
426
+ }
427
+ }
428
+
429
+ ; ======================================================================
430
+ ; Modes and residuals
431
+ ; ======================================================================
432
+
433
+ fn parseIntraMode:void (mbX:int) {
434
+ def seg:int 0
435
+ if updateMap {
436
+ if ((br.getBit((int_buffer_get segProba 0))) == 0) {
437
+ seg = (br.getBit((int_buffer_get segProba 1)))
438
+ } {
439
+ seg = (br.getBit((int_buffer_get segProba 2))) + 2
440
+ }
441
+ }
442
+ int_buffer_set mbSegment mbX seg
443
+ statSegments = (bit_or statSegments (bit_shl 1 seg))
444
+ def skip:int 0
445
+ if (useSkipProba == 1) {
446
+ skip = (br.getBit(skipProba))
447
+ }
448
+ int_buffer_set mbSkip mbX skip
449
+ def isI4:int 0
450
+ if ((br.getBit(145)) == 0) {
451
+ isI4 = 1
452
+ }
453
+ int_buffer_set mbIsI4 mbX isI4
454
+ def top:int (4 * mbX)
455
+ def mo:int (16 * mbX)
456
+ if (isI4 == 0) {
457
+ def ymode:int 0
458
+ if ((br.getBit(156)) == 1) {
459
+ if ((br.getBit(128)) == 1) {
460
+ ymode = 1
461
+ } {
462
+ ymode = 3
463
+ }
464
+ } {
465
+ if ((br.getBit(163)) == 1) {
466
+ ymode = 2
467
+ }
468
+ }
469
+ statI16Modes = (bit_or statI16Modes (bit_shl 1 ymode))
470
+ int_buffer_set mbModes mo ymode
471
+ int_buffer_fill intraT ymode top (top + 4)
472
+ int_buffer_fill intraL ymode 0 4
473
+ } {
474
+ def y:int 0
475
+ while (y < 4) {
476
+ def ymode:int (int_buffer_get intraL y)
477
+ def x:int 0
478
+ while (x < 4) {
479
+ def pb:int ((((int_buffer_get intraT (top + x)) * 10) + ymode) * 9)
480
+ ymode = (this.readI4Mode(pb))
481
+ statI4Modes = (bit_or statI4Modes (bit_shl 1 ymode))
482
+ int_buffer_set intraT (top + x) ymode
483
+ int_buffer_set mbModes ((mo + (y * 4)) + x) ymode
484
+ x = x + 1
485
+ }
486
+ int_buffer_set intraL y ymode
487
+ y = y + 1
488
+ }
489
+ }
490
+ def uv:int 0
491
+ if ((br.getBit(142)) == 1) {
492
+ if ((br.getBit(114)) == 0) {
493
+ uv = 2
494
+ } {
495
+ if ((br.getBit(183)) == 1) {
496
+ uv = 1
497
+ } {
498
+ uv = 3
499
+ }
500
+ }
501
+ }
502
+ statUvModes = (bit_or statUvModes (bit_shl 1 uv))
503
+ int_buffer_set mbUvMode mbX uv
504
+ }
505
+
506
+ ; the 4x4 mode tree of RFC 6386 section 11.2
507
+ fn readI4Mode:int (pb:int) {
508
+ if ((br.getBit((int_buffer_get modesProbaT pb))) == 0) {
509
+ return 0
510
+ }
511
+ if ((br.getBit((int_buffer_get modesProbaT (pb + 1)))) == 0) {
512
+ return 1
513
+ }
514
+ if ((br.getBit((int_buffer_get modesProbaT (pb + 2)))) == 0) {
515
+ return 2
516
+ }
517
+ if ((br.getBit((int_buffer_get modesProbaT (pb + 3)))) == 0) {
518
+ if ((br.getBit((int_buffer_get modesProbaT (pb + 4)))) == 0) {
519
+ return 3
520
+ }
521
+ if ((br.getBit((int_buffer_get modesProbaT (pb + 5)))) == 0) {
522
+ return 4
523
+ }
524
+ return 5
525
+ }
526
+ if ((br.getBit((int_buffer_get modesProbaT (pb + 6)))) == 0) {
527
+ return 6
528
+ }
529
+ if ((br.getBit((int_buffer_get modesProbaT (pb + 7)))) == 0) {
530
+ return 7
531
+ }
532
+ if ((br.getBit((int_buffer_get modesProbaT (pb + 8)))) == 0) {
533
+ return 8
534
+ }
535
+ return 9
536
+ }
537
+
538
+ ; offset of the 11 probabilities for coefficient type t at position n, context ctx
539
+ fn probaAt:int (t:int n:int ctx:int) {
540
+ return (((((t * 8) + (int_buffer_get bands n)) * 3) + ctx) * 11)
541
+ }
542
+
543
+ fn getLargeValue:int (tb:VP8BoolDecoder p:int) {
544
+ def v:int 0
545
+ if ((tb.getBit((int_buffer_get proba (p + 3)))) == 0) {
546
+ if ((tb.getBit((int_buffer_get proba (p + 4)))) == 0) {
547
+ return 2
548
+ }
549
+ return (3 + (tb.getBit((int_buffer_get proba (p + 5)))))
550
+ }
551
+ if ((tb.getBit((int_buffer_get proba (p + 6)))) == 0) {
552
+ if ((tb.getBit((int_buffer_get proba (p + 7)))) == 0) {
553
+ return (5 + (tb.getBit(159)))
554
+ }
555
+ v = 7 + (2 * (tb.getBit(165)))
556
+ v = v + (tb.getBit(145))
557
+ return v
558
+ }
559
+ def bit1:int (tb.getBit((int_buffer_get proba (p + 8))))
560
+ def bit0:int (tb.getBit((int_buffer_get proba ((p + 9) + bit1))))
561
+ def cat:int ((2 * bit1) + bit0)
562
+ v = 0
563
+ if (cat == 0) {
564
+ v = v + v + (tb.getBit(173))
565
+ v = v + v + (tb.getBit(148))
566
+ v = v + v + (tb.getBit(140))
567
+ }
568
+ if (cat == 1) {
569
+ v = v + v + (tb.getBit(176))
570
+ v = v + v + (tb.getBit(155))
571
+ v = v + v + (tb.getBit(140))
572
+ v = v + v + (tb.getBit(135))
573
+ }
574
+ if (cat == 2) {
575
+ v = v + v + (tb.getBit(180))
576
+ v = v + v + (tb.getBit(157))
577
+ v = v + v + (tb.getBit(141))
578
+ v = v + v + (tb.getBit(134))
579
+ v = v + v + (tb.getBit(130))
580
+ }
581
+ if (cat == 3) {
582
+ v = v + v + (tb.getBit(254))
583
+ v = v + v + (tb.getBit(254))
584
+ v = v + v + (tb.getBit(243))
585
+ v = v + v + (tb.getBit(230))
586
+ v = v + v + (tb.getBit(196))
587
+ v = v + v + (tb.getBit(177))
588
+ v = v + v + (tb.getBit(153))
589
+ v = v + v + (tb.getBit(140))
590
+ v = v + v + (tb.getBit(133))
591
+ v = v + v + (tb.getBit(130))
592
+ v = v + v + (tb.getBit(129))
593
+ }
594
+ return (v + 3 + (bit_shl 8 cat))
595
+ }
596
+
597
+ ; Decodes the tokens of one 4x4 block from position n; returns the index
598
+ ; after the last non-zero coefficient (16 when a run of zeros ends it).
599
+ fn getCoeffs:int (tb:VP8BoolDecoder t:int ctx:int dq0:int dq1:int n0:int out:int_buffer off:int) {
600
+ def n:int n0
601
+ def p:int (this.probaAt(t n ctx))
602
+ while (n < 16) {
603
+ if ((tb.getBit((int_buffer_get proba p))) == 0) {
604
+ return n
605
+ }
606
+ while ((tb.getBit((int_buffer_get proba (p + 1)))) == 0) {
607
+ n = n + 1
608
+ if (n == 16) {
609
+ return 16
610
+ }
611
+ p = (this.probaAt(t n 0))
612
+ }
613
+ def v:int 1
614
+ def next:int 0
615
+ if ((tb.getBit((int_buffer_get proba (p + 2)))) == 0) {
616
+ next = (this.probaAt(t (n + 1) 1))
617
+ } {
618
+ v = (this.getLargeValue(tb p))
619
+ next = (this.probaAt(t (n + 1) 2))
620
+ }
621
+ def dq:int dq1
622
+ if (n == 0) {
623
+ dq = dq0
624
+ }
625
+ int_buffer_set out (off + (int_buffer_get zigzag n)) (VP8Decoder.wrap16(((tb.getSigned(v)) * dq)))
626
+ p = next
627
+ n = n + 1
628
+ }
629
+ return 16
630
+ }
631
+
632
+ sfn nzCodeOf:int (nz:int dcNonZero:int) {
633
+ if (nz > 3) {
634
+ return 3
635
+ }
636
+ if (nz > 1) {
637
+ return 2
638
+ }
639
+ return dcNonZero
640
+ }
641
+
642
+ ; inverse Walsh-Hadamard transform of the 16 luma DC values
643
+ fn transformWHT:void () {
644
+ def i:int 0
645
+ while (i < 4) {
646
+ def a0:int ((int_buffer_get dcBuf i) + (int_buffer_get dcBuf (i + 12)))
647
+ def a1:int ((int_buffer_get dcBuf (i + 4)) + (int_buffer_get dcBuf (i + 8)))
648
+ def a2:int ((int_buffer_get dcBuf (i + 4)) - (int_buffer_get dcBuf (i + 8)))
649
+ def a3:int ((int_buffer_get dcBuf i) - (int_buffer_get dcBuf (i + 12)))
650
+ int_buffer_set tmp i (a0 + a1)
651
+ int_buffer_set tmp (i + 8) (a0 - a1)
652
+ int_buffer_set tmp (i + 4) (a3 + a2)
653
+ int_buffer_set tmp (i + 12) (a3 - a2)
654
+ i = i + 1
655
+ }
656
+ i = 0
657
+ while (i < 4) {
658
+ def dc:int ((int_buffer_get tmp (i * 4)) + 3)
659
+ def a0:int (dc + (int_buffer_get tmp ((i * 4) + 3)))
660
+ def a1:int ((int_buffer_get tmp ((i * 4) + 1)) + (int_buffer_get tmp ((i * 4) + 2)))
661
+ def a2:int ((int_buffer_get tmp ((i * 4) + 1)) - (int_buffer_get tmp ((i * 4) + 2)))
662
+ def a3:int (dc - (int_buffer_get tmp ((i * 4) + 3)))
663
+ int_buffer_set coeffs (i * 64) (VP8Decoder.wrap16((bit_shr (a0 + a1) 3)))
664
+ int_buffer_set coeffs ((i * 64) + 16) (VP8Decoder.wrap16((bit_shr (a3 + a2) 3)))
665
+ int_buffer_set coeffs ((i * 64) + 32) (VP8Decoder.wrap16((bit_shr (a0 - a1) 3)))
666
+ int_buffer_set coeffs ((i * 64) + 48) (VP8Decoder.wrap16((bit_shr (a3 - a2) 3)))
667
+ i = i + 1
668
+ }
669
+ }
670
+
671
+ ; Returns 1 when the macroblock has no non-zero coefficient.
672
+ fn parseResiduals:int (tb:VP8BoolDecoder mbX:int seg:int isI4:int) {
673
+ def q:int (seg * 6)
674
+ int_buffer_fill coeffs 0 0 384
675
+ def first:int 0
676
+ def acType:int 3
677
+ if (isI4 == 0) {
678
+ int_buffer_fill dcBuf 0 0 16
679
+ def ctx:int ((int_buffer_get topNzDc mbX) + leftNzDc)
680
+ def nz:int (this.getCoeffs(tb 1 ctx (int_buffer_get dqm (q + 2)) (int_buffer_get dqm (q + 3)) 0 dcBuf 0))
681
+ def hasDc:int 0
682
+ if (nz > 0) {
683
+ hasDc = 1
684
+ }
685
+ int_buffer_set topNzDc mbX hasDc
686
+ leftNzDc = hasDc
687
+ if (nz > 1) {
688
+ this.transformWHT()
689
+ } {
690
+ def dc0:int (VP8Decoder.wrap16((bit_shr ((int_buffer_get dcBuf 0) + 3) 3)))
691
+ def k:int 0
692
+ while (k < 16) {
693
+ int_buffer_set coeffs (k * 16) dc0
694
+ k = k + 1
695
+ }
696
+ }
697
+ first = 1
698
+ acType = 0
699
+ }
700
+ def dq0:int (int_buffer_get dqm q)
701
+ def dq1:int (int_buffer_get dqm (q + 1))
702
+ def origTop:int (int_buffer_get topNz mbX)
703
+ def tnz:int (bit_and origTop 15)
704
+ def lnz:int (bit_and leftNz 15)
705
+ def dst:int 0
706
+ def allZero:int 1
707
+ def y:int 0
708
+ while (y < 4) {
709
+ def l:int (bit_and lnz 1)
710
+ def x:int 0
711
+ while (x < 4) {
712
+ def ctx:int (l + (bit_and tnz 1))
713
+ def nz:int (this.getCoeffs(tb acType ctx dq0 dq1 first coeffs dst))
714
+ l = 0
715
+ if (nz > first) {
716
+ l = 1
717
+ }
718
+ tnz = (bit_or (bit_shr tnz 1) (bit_shl l 7))
719
+ def dcnz:int 0
720
+ if ((int_buffer_get coeffs dst) != 0) {
721
+ dcnz = 1
722
+ }
723
+ def code:int (VP8Decoder.nzCodeOf(nz dcnz))
724
+ int_buffer_set nzCode ((y * 4) + x) code
725
+ if (code != 0) {
726
+ allZero = 0
727
+ }
728
+ dst = dst + 16
729
+ x = x + 1
730
+ }
731
+ tnz = (bit_shr tnz 4)
732
+ lnz = (bit_or (bit_shr lnz 1) (bit_shl l 7))
733
+ y = y + 1
734
+ }
735
+ def outT:int tnz
736
+ def outL:int (bit_shr lnz 4)
737
+ def uq0:int (int_buffer_get dqm (q + 4))
738
+ def uq1:int (int_buffer_get dqm (q + 5))
739
+ def ch:int 0
740
+ while (ch < 4) {
741
+ tnz = (bit_shr origTop (4 + ch))
742
+ lnz = (bit_shr leftNz (4 + ch))
743
+ def cy:int 0
744
+ while (cy < 2) {
745
+ def l:int (bit_and lnz 1)
746
+ def cx:int 0
747
+ while (cx < 2) {
748
+ def ctx:int (l + (bit_and tnz 1))
749
+ def nz:int (this.getCoeffs(tb 2 ctx uq0 uq1 0 coeffs dst))
750
+ l = 0
751
+ if (nz > 0) {
752
+ l = 1
753
+ }
754
+ tnz = (bit_or (bit_shr tnz 1) (bit_shl l 3))
755
+ def dcnz:int 0
756
+ if ((int_buffer_get coeffs dst) != 0) {
757
+ dcnz = 1
758
+ }
759
+ def code:int (VP8Decoder.nzCodeOf(nz dcnz))
760
+ int_buffer_set nzCode (((16 + (ch * 2)) + (cy * 2)) + cx) code
761
+ if (code != 0) {
762
+ allZero = 0
763
+ }
764
+ dst = dst + 16
765
+ cx = cx + 1
766
+ }
767
+ tnz = (bit_shr tnz 2)
768
+ lnz = (bit_or (bit_shr lnz 1) (bit_shl l 5))
769
+ cy = cy + 1
770
+ }
771
+ outT = (bit_or outT (bit_shl (bit_shl tnz 4) ch))
772
+ outL = (bit_or outL (bit_shl (bit_and lnz 240) ch))
773
+ ch = ch + 2
774
+ }
775
+ int_buffer_set topNz mbX outT
776
+ leftNz = outL
777
+ return allZero
778
+ }
779
+
780
+ fn decodeMB:boolean (tb:VP8BoolDecoder mbX:int) {
781
+ def seg:int (int_buffer_get mbSegment mbX)
782
+ def isI4:int (int_buffer_get mbIsI4 mbX)
783
+ def skip:int 0
784
+ if (useSkipProba == 1) {
785
+ skip = (int_buffer_get mbSkip mbX)
786
+ }
787
+ if (skip == 0) {
788
+ skip = (this.parseResiduals(tb mbX seg isI4))
789
+ } {
790
+ statSkipped = statSkipped + 1
791
+ leftNz = 0
792
+ int_buffer_set topNz mbX 0
793
+ if (isI4 == 0) {
794
+ leftNzDc = 0
795
+ int_buffer_set topNzDc mbX 0
796
+ }
797
+ int_buffer_fill nzCode 0 0 24
798
+ }
799
+ if (filterType > 0) {
800
+ def o:int (((seg * 2) + isI4) * 4)
801
+ int_buffer_set fLimit mbX (int_buffer_get fstr o)
802
+ int_buffer_set fILevel mbX (int_buffer_get fstr (o + 1))
803
+ def inner:int (int_buffer_get fstr (o + 2))
804
+ if (skip == 0) {
805
+ inner = 1
806
+ }
807
+ int_buffer_set fInner mbX inner
808
+ int_buffer_set fHev mbX (int_buffer_get fstr (o + 3))
809
+ }
810
+ return (tb.eof == false)
811
+ }
812
+
813
+ ; ======================================================================
814
+ ; Intra prediction on the scratch block (stride 32)
815
+ ; ======================================================================
816
+
817
+ fn px:int (i:int) {
818
+ return (buffer_get yuvB i)
819
+ }
820
+
821
+ fn put:void (i:int v:int) {
822
+ buffer_set yuvB i v
823
+ }
824
+
825
+ sfn avg3:int (a:int b:int c:int) {
826
+ return (bit_shr ((a + (2 * b)) + (c + 2)) 2)
827
+ }
828
+
829
+ sfn avg2:int (a:int b:int) {
830
+ return (bit_shr ((a + b) + 1) 1)
831
+ }
832
+
833
+ fn fillBlock:void (dst:int size:int v:int) {
834
+ def j:int 0
835
+ while (j < size) {
836
+ buffer_fill yuvB v (dst + (j * 32)) ((dst + (j * 32)) + size)
837
+ j = j + 1
838
+ }
839
+ }
840
+
841
+ fn trueMotion:void (dst:int size:int) {
842
+ def top:int (dst - 32)
843
+ def tl:int (this.px((top - 1)))
844
+ def y:int 0
845
+ while (y < size) {
846
+ def row:int (dst + (y * 32))
847
+ def l:int (this.px((row - 1)))
848
+ def x:int 0
849
+ while (x < size) {
850
+ this.put((row + x) (VP8Decoder.clip((((this.px((top + x))) + l) - tl) 255)))
851
+ x = x + 1
852
+ }
853
+ y = y + 1
854
+ }
855
+ }
856
+
857
+ fn predLuma4:void (mode:int d:int) {
858
+ def t:int (d - 32)
859
+ if (mode == 0) {
860
+ def dc:int 4
861
+ def i:int 0
862
+ while (i < 4) {
863
+ dc = dc + (this.px((t + i))) + (this.px(((d - 1) + (i * 32))))
864
+ i = i + 1
865
+ }
866
+ this.fillBlock(d 4 (bit_shr dc 3))
867
+ return
868
+ }
869
+ if (mode == 1) {
870
+ this.trueMotion(d 4)
871
+ return
872
+ }
873
+ if (mode == 2) {
874
+ def v0:int (VP8Decoder.avg3((this.px((t - 1))) (this.px(t)) (this.px((t + 1)))))
875
+ def v1:int (VP8Decoder.avg3((this.px(t)) (this.px((t + 1))) (this.px((t + 2)))))
876
+ def v2:int (VP8Decoder.avg3((this.px((t + 1))) (this.px((t + 2))) (this.px((t + 3)))))
877
+ def v3:int (VP8Decoder.avg3((this.px((t + 2))) (this.px((t + 3))) (this.px((t + 4)))))
878
+ def j:int 0
879
+ while (j < 4) {
880
+ def r:int (d + (j * 32))
881
+ this.put(r v0)
882
+ this.put((r + 1) v1)
883
+ this.put((r + 2) v2)
884
+ this.put((r + 3) v3)
885
+ j = j + 1
886
+ }
887
+ return
888
+ }
889
+ ; left column I J K L, corner X, top A B C D E F G H
890
+ def ci:int (this.px((d - 1)))
891
+ def cj:int (this.px((d + 31)))
892
+ def ck:int (this.px((d + 63)))
893
+ def cl:int (this.px((d + 95)))
894
+ def cx:int (this.px((t - 1)))
895
+ def ca:int (this.px(t))
896
+ def cb:int (this.px((t + 1)))
897
+ def cc:int (this.px((t + 2)))
898
+ def cd:int (this.px((t + 3)))
899
+ if (mode == 3) {
900
+ buffer_fill yuvB (VP8Decoder.avg3(cx ci cj)) d (d + 4)
901
+ buffer_fill yuvB (VP8Decoder.avg3(ci cj ck)) (d + 32) (d + 36)
902
+ buffer_fill yuvB (VP8Decoder.avg3(cj ck cl)) (d + 64) (d + 68)
903
+ buffer_fill yuvB (VP8Decoder.avg3(ck cl cl)) (d + 96) (d + 100)
904
+ return
905
+ }
906
+ if (mode == 4) {
907
+ this.put((d + 96) (VP8Decoder.avg3(cj ck cl)))
908
+ def e1:int (VP8Decoder.avg3(ci cj ck))
909
+ this.put((d + 97) e1)
910
+ this.put((d + 64) e1)
911
+ def e2:int (VP8Decoder.avg3(cx ci cj))
912
+ this.put((d + 98) e2)
913
+ this.put((d + 65) e2)
914
+ this.put((d + 32) e2)
915
+ def e3:int (VP8Decoder.avg3(ca cx ci))
916
+ this.put((d + 99) e3)
917
+ this.put((d + 66) e3)
918
+ this.put((d + 33) e3)
919
+ this.put(d e3)
920
+ def e4:int (VP8Decoder.avg3(cb ca cx))
921
+ this.put((d + 67) e4)
922
+ this.put((d + 34) e4)
923
+ this.put((d + 1) e4)
924
+ def e5:int (VP8Decoder.avg3(cc cb ca))
925
+ this.put((d + 35) e5)
926
+ this.put((d + 2) e5)
927
+ this.put((d + 3) (VP8Decoder.avg3(cd cc cb)))
928
+ return
929
+ }
930
+ if (mode == 5) {
931
+ def f1:int (VP8Decoder.avg2(cx ca))
932
+ this.put(d f1)
933
+ this.put((d + 65) f1)
934
+ def f2:int (VP8Decoder.avg2(ca cb))
935
+ this.put((d + 1) f2)
936
+ this.put((d + 66) f2)
937
+ def f3:int (VP8Decoder.avg2(cb cc))
938
+ this.put((d + 2) f3)
939
+ this.put((d + 67) f3)
940
+ this.put((d + 3) (VP8Decoder.avg2(cc cd)))
941
+ this.put((d + 96) (VP8Decoder.avg3(ck cj ci)))
942
+ this.put((d + 64) (VP8Decoder.avg3(cj ci cx)))
943
+ def f4:int (VP8Decoder.avg3(ci cx ca))
944
+ this.put((d + 32) f4)
945
+ this.put((d + 97) f4)
946
+ def f5:int (VP8Decoder.avg3(cx ca cb))
947
+ this.put((d + 33) f5)
948
+ this.put((d + 98) f5)
949
+ def f6:int (VP8Decoder.avg3(ca cb cc))
950
+ this.put((d + 34) f6)
951
+ this.put((d + 99) f6)
952
+ this.put((d + 35) (VP8Decoder.avg3(cb cc cd)))
953
+ return
954
+ }
955
+ def ce:int (this.px((t + 4)))
956
+ def cf:int (this.px((t + 5)))
957
+ def cg:int (this.px((t + 6)))
958
+ def ch:int (this.px((t + 7)))
959
+ if (mode == 6) {
960
+ this.put(d (VP8Decoder.avg3(ca cb cc)))
961
+ def g1:int (VP8Decoder.avg3(cb cc cd))
962
+ this.put((d + 1) g1)
963
+ this.put((d + 32) g1)
964
+ def g2:int (VP8Decoder.avg3(cc cd ce))
965
+ this.put((d + 2) g2)
966
+ this.put((d + 33) g2)
967
+ this.put((d + 64) g2)
968
+ def g3:int (VP8Decoder.avg3(cd ce cf))
969
+ this.put((d + 3) g3)
970
+ this.put((d + 34) g3)
971
+ this.put((d + 65) g3)
972
+ this.put((d + 96) g3)
973
+ def g4:int (VP8Decoder.avg3(ce cf cg))
974
+ this.put((d + 35) g4)
975
+ this.put((d + 66) g4)
976
+ this.put((d + 97) g4)
977
+ def g5:int (VP8Decoder.avg3(cf cg ch))
978
+ this.put((d + 67) g5)
979
+ this.put((d + 98) g5)
980
+ this.put((d + 99) (VP8Decoder.avg3(cg ch ch)))
981
+ return
982
+ }
983
+ if (mode == 7) {
984
+ this.put(d (VP8Decoder.avg2(ca cb)))
985
+ def h1:int (VP8Decoder.avg2(cb cc))
986
+ this.put((d + 1) h1)
987
+ this.put((d + 64) h1)
988
+ def h2:int (VP8Decoder.avg2(cc cd))
989
+ this.put((d + 2) h2)
990
+ this.put((d + 65) h2)
991
+ def h3:int (VP8Decoder.avg2(cd ce))
992
+ this.put((d + 3) h3)
993
+ this.put((d + 66) h3)
994
+ this.put((d + 32) (VP8Decoder.avg3(ca cb cc)))
995
+ def h4:int (VP8Decoder.avg3(cb cc cd))
996
+ this.put((d + 33) h4)
997
+ this.put((d + 96) h4)
998
+ def h5:int (VP8Decoder.avg3(cc cd ce))
999
+ this.put((d + 34) h5)
1000
+ this.put((d + 97) h5)
1001
+ def h6:int (VP8Decoder.avg3(cd ce cf))
1002
+ this.put((d + 35) h6)
1003
+ this.put((d + 98) h6)
1004
+ this.put((d + 67) (VP8Decoder.avg3(ce cf cg)))
1005
+ this.put((d + 99) (VP8Decoder.avg3(cf cg ch)))
1006
+ return
1007
+ }
1008
+ if (mode == 8) {
1009
+ def k1:int (VP8Decoder.avg2(ci cx))
1010
+ this.put(d k1)
1011
+ this.put((d + 34) k1)
1012
+ def k2:int (VP8Decoder.avg2(cj ci))
1013
+ this.put((d + 32) k2)
1014
+ this.put((d + 66) k2)
1015
+ def k3:int (VP8Decoder.avg2(ck cj))
1016
+ this.put((d + 64) k3)
1017
+ this.put((d + 98) k3)
1018
+ this.put((d + 96) (VP8Decoder.avg2(cl ck)))
1019
+ this.put((d + 3) (VP8Decoder.avg3(ca cb cc)))
1020
+ this.put((d + 2) (VP8Decoder.avg3(cx ca cb)))
1021
+ def k4:int (VP8Decoder.avg3(ci cx ca))
1022
+ this.put((d + 1) k4)
1023
+ this.put((d + 35) k4)
1024
+ def k5:int (VP8Decoder.avg3(cj ci cx))
1025
+ this.put((d + 33) k5)
1026
+ this.put((d + 67) k5)
1027
+ def k6:int (VP8Decoder.avg3(ck cj ci))
1028
+ this.put((d + 65) k6)
1029
+ this.put((d + 99) k6)
1030
+ this.put((d + 97) (VP8Decoder.avg3(cl ck cj)))
1031
+ return
1032
+ }
1033
+ ; mode 9, horizontal-up
1034
+ this.put(d (VP8Decoder.avg2(ci cj)))
1035
+ def m1:int (VP8Decoder.avg2(cj ck))
1036
+ this.put((d + 2) m1)
1037
+ this.put((d + 32) m1)
1038
+ def m2:int (VP8Decoder.avg2(ck cl))
1039
+ this.put((d + 34) m2)
1040
+ this.put((d + 64) m2)
1041
+ this.put((d + 1) (VP8Decoder.avg3(ci cj ck)))
1042
+ def m3:int (VP8Decoder.avg3(cj ck cl))
1043
+ this.put((d + 3) m3)
1044
+ this.put((d + 33) m3)
1045
+ def m4:int (VP8Decoder.avg3(ck cl cl))
1046
+ this.put((d + 35) m4)
1047
+ this.put((d + 65) m4)
1048
+ this.put((d + 66) cl)
1049
+ this.put((d + 67) cl)
1050
+ buffer_fill yuvB cl (d + 96) (d + 100)
1051
+ }
1052
+
1053
+ ; 16x16 luma (size 16) and 8x8 chroma (size 8) prediction; modes 4..6 are
1054
+ ; the DC variants without top, without left, and without either.
1055
+ fn predBlock:void (mode:int d:int size:int) {
1056
+ def shift:int 4
1057
+ if (size == 8) {
1058
+ shift = 3
1059
+ }
1060
+ if (mode == 0) {
1061
+ def dc:int size
1062
+ def j:int 0
1063
+ while (j < size) {
1064
+ dc = dc + (this.px(((d - 1) + (j * 32)))) + (this.px(((d - 32) + j)))
1065
+ j = j + 1
1066
+ }
1067
+ this.fillBlock(d size (bit_shr dc (shift + 1)))
1068
+ return
1069
+ }
1070
+ if (mode == 1) {
1071
+ this.trueMotion(d size)
1072
+ return
1073
+ }
1074
+ if (mode == 2) {
1075
+ def j:int 0
1076
+ while (j < size) {
1077
+ buffer_copy yuvB (d + (j * 32)) yuvB (d - 32) size
1078
+ j = j + 1
1079
+ }
1080
+ return
1081
+ }
1082
+ if (mode == 3) {
1083
+ def j:int 0
1084
+ while (j < size) {
1085
+ def r:int (d + (j * 32))
1086
+ buffer_fill yuvB (this.px((r - 1))) r (r + size)
1087
+ j = j + 1
1088
+ }
1089
+ return
1090
+ }
1091
+ if (mode == 4) {
1092
+ def dc:int (bit_shr size 1)
1093
+ def j:int 0
1094
+ while (j < size) {
1095
+ dc = dc + (this.px(((d - 1) + (j * 32))))
1096
+ j = j + 1
1097
+ }
1098
+ this.fillBlock(d size (bit_shr dc shift))
1099
+ return
1100
+ }
1101
+ if (mode == 5) {
1102
+ def dc:int (bit_shr size 1)
1103
+ def j:int 0
1104
+ while (j < size) {
1105
+ dc = dc + (this.px(((d - 32) + j)))
1106
+ j = j + 1
1107
+ }
1108
+ this.fillBlock(d size (bit_shr dc shift))
1109
+ return
1110
+ }
1111
+ this.fillBlock(d size 128)
1112
+ }
1113
+
1114
+ sfn checkMode:int (mbX:int mbY:int mode:int) {
1115
+ if (mode == 0) {
1116
+ if (mbX == 0) {
1117
+ if (mbY == 0) {
1118
+ return 6
1119
+ }
1120
+ return 5
1121
+ }
1122
+ if (mbY == 0) {
1123
+ return 4
1124
+ }
1125
+ }
1126
+ return mode
1127
+ }
1128
+
1129
+ ; ======================================================================
1130
+ ; Inverse transforms, added to the prediction in the scratch block
1131
+ ; ======================================================================
1132
+
1133
+ sfn mul1:int (a:int) {
1134
+ return ((bit_shr (a * 20091) 16) + a)
1135
+ }
1136
+
1137
+ sfn mul2:int (a:int) {
1138
+ return (bit_shr (a * 35468) 16)
1139
+ }
1140
+
1141
+ fn store:void (d:int v:int) {
1142
+ this.put(d (VP8Decoder.clip(((this.px(d)) + (bit_shr v 3)) 255)))
1143
+ }
1144
+
1145
+ fn transformOne:void (src:int d:int) {
1146
+ def i:int 0
1147
+ while (i < 4) {
1148
+ def in0:int (int_buffer_get coeffs (src + i))
1149
+ def in4:int (int_buffer_get coeffs ((src + 4) + i))
1150
+ def in8:int (int_buffer_get coeffs ((src + 8) + i))
1151
+ def in12:int (int_buffer_get coeffs ((src + 12) + i))
1152
+ def a:int (in0 + in8)
1153
+ def b:int (in0 - in8)
1154
+ def c:int ((VP8Decoder.mul2(in4)) - (VP8Decoder.mul1(in12)))
1155
+ def e:int ((VP8Decoder.mul1(in4)) + (VP8Decoder.mul2(in12)))
1156
+ int_buffer_set tmp (i * 4) (a + e)
1157
+ int_buffer_set tmp ((i * 4) + 1) (b + c)
1158
+ int_buffer_set tmp ((i * 4) + 2) (b - c)
1159
+ int_buffer_set tmp ((i * 4) + 3) (a - e)
1160
+ i = i + 1
1161
+ }
1162
+ i = 0
1163
+ while (i < 4) {
1164
+ def dc:int ((int_buffer_get tmp i) + 4)
1165
+ def t4:int (int_buffer_get tmp (i + 4))
1166
+ def t8:int (int_buffer_get tmp (i + 8))
1167
+ def t12:int (int_buffer_get tmp (i + 12))
1168
+ def a:int (dc + t8)
1169
+ def b:int (dc - t8)
1170
+ def c:int ((VP8Decoder.mul2(t4)) - (VP8Decoder.mul1(t12)))
1171
+ def e:int ((VP8Decoder.mul1(t4)) + (VP8Decoder.mul2(t12)))
1172
+ def r:int (d + (i * 32))
1173
+ this.store(r (a + e))
1174
+ this.store((r + 1) (b + c))
1175
+ this.store((r + 2) (b - c))
1176
+ this.store((r + 3) (a - e))
1177
+ i = i + 1
1178
+ }
1179
+ }
1180
+
1181
+ fn transformDC:void (src:int d:int) {
1182
+ def dc:int ((int_buffer_get coeffs src) + 4)
1183
+ def j:int 0
1184
+ while (j < 4) {
1185
+ def r:int (d + (j * 32))
1186
+ this.store(r dc)
1187
+ this.store((r + 1) dc)
1188
+ this.store((r + 2) dc)
1189
+ this.store((r + 3) dc)
1190
+ j = j + 1
1191
+ }
1192
+ }
1193
+
1194
+ fn store2:void (r:int dc:int e:int c:int) {
1195
+ this.store(r (dc + e))
1196
+ this.store((r + 1) (dc + c))
1197
+ this.store((r + 2) (dc - c))
1198
+ this.store((r + 3) (dc - e))
1199
+ }
1200
+
1201
+ fn transformAC3:void (src:int d:int) {
1202
+ def a:int ((int_buffer_get coeffs src) + 4)
1203
+ def in4:int (int_buffer_get coeffs (src + 4))
1204
+ def in1:int (int_buffer_get coeffs (src + 1))
1205
+ def c4:int (VP8Decoder.mul2(in4))
1206
+ def d4:int (VP8Decoder.mul1(in4))
1207
+ def c1:int (VP8Decoder.mul2(in1))
1208
+ def d1:int (VP8Decoder.mul1(in1))
1209
+ this.store2(d (a + d4) d1 c1)
1210
+ this.store2((d + 32) (a + c4) d1 c1)
1211
+ this.store2((d + 64) (a - c4) d1 c1)
1212
+ this.store2((d + 96) (a - d4) d1 c1)
1213
+ }
1214
+
1215
+ ; by the 2-bit code of the block: 3 full, 2 first row and column, 1 DC
1216
+ fn doTransform:void (code:int src:int d:int) {
1217
+ if (code == 3) {
1218
+ this.transformOne(src d)
1219
+ return
1220
+ }
1221
+ if (code == 2) {
1222
+ this.transformAC3(src d)
1223
+ return
1224
+ }
1225
+ if (code == 1) {
1226
+ this.transformDC(src d)
1227
+ }
1228
+ }
1229
+
1230
+ ; the four 4x4 blocks of a chroma plane; first is the index of their codes
1231
+ fn doTransformUV:void (first:int src:int d:int) {
1232
+ def any:boolean false
1233
+ def ac:boolean false
1234
+ def k:int 0
1235
+ while (k < 4) {
1236
+ def c:int (int_buffer_get nzCode (first + k))
1237
+ if (c != 0) {
1238
+ any = true
1239
+ }
1240
+ if (c >= 2) {
1241
+ ac = true
1242
+ }
1243
+ k = k + 1
1244
+ }
1245
+ if (any == false) {
1246
+ return
1247
+ }
1248
+ if ac {
1249
+ this.transformOne(src d)
1250
+ this.transformOne((src + 16) (d + 4))
1251
+ this.transformOne((src + 32) (d + 128))
1252
+ this.transformOne((src + 48) (d + 132))
1253
+ return
1254
+ }
1255
+ if ((int_buffer_get coeffs src) != 0) {
1256
+ this.transformDC(src d)
1257
+ }
1258
+ if ((int_buffer_get coeffs (src + 16)) != 0) {
1259
+ this.transformDC((src + 16) (d + 4))
1260
+ }
1261
+ if ((int_buffer_get coeffs (src + 32)) != 0) {
1262
+ this.transformDC((src + 32) (d + 128))
1263
+ }
1264
+ if ((int_buffer_get coeffs (src + 48)) != 0) {
1265
+ this.transformDC((src + 48) (d + 132))
1266
+ }
1267
+ }
1268
+
1269
+ ; ======================================================================
1270
+ ; Macroblock reconstruction
1271
+ ; ======================================================================
1272
+
1273
+ fn reconstruct:void (mbX:int mbY:int) {
1274
+ def yd:int 40
1275
+ def ud:int 584
1276
+ def vd:int 600
1277
+ if (mbX == 0) {
1278
+ def j:int 0
1279
+ while (j < 16) {
1280
+ this.put(((yd + (j * 32)) - 1) 129)
1281
+ j = j + 1
1282
+ }
1283
+ j = 0
1284
+ while (j < 8) {
1285
+ this.put(((ud + (j * 32)) - 1) 129)
1286
+ this.put(((vd + (j * 32)) - 1) 129)
1287
+ j = j + 1
1288
+ }
1289
+ if (mbY > 0) {
1290
+ this.put((yd - 33) 129)
1291
+ this.put((ud - 33) 129)
1292
+ this.put((vd - 33) 129)
1293
+ } {
1294
+ buffer_fill yuvB 127 (yd - 33) ((yd - 33) + 21)
1295
+ buffer_fill yuvB 127 (ud - 33) ((ud - 33) + 9)
1296
+ buffer_fill yuvB 127 (vd - 33) ((vd - 33) + 9)
1297
+ }
1298
+ } {
1299
+ def j:int -1
1300
+ while (j < 16) {
1301
+ buffer_copy yuvB ((yd + (j * 32)) - 4) yuvB ((yd + (j * 32)) + 12) 4
1302
+ j = j + 1
1303
+ }
1304
+ j = -1
1305
+ while (j < 8) {
1306
+ buffer_copy yuvB ((ud + (j * 32)) - 4) yuvB ((ud + (j * 32)) + 4) 4
1307
+ buffer_copy yuvB ((vd + (j * 32)) - 4) yuvB ((vd + (j * 32)) + 4) 4
1308
+ j = j + 1
1309
+ }
1310
+ }
1311
+ def topOff:int (mbX * 32)
1312
+ if (mbY > 0) {
1313
+ buffer_copy yuvB (yd - 32) yuvT topOff 16
1314
+ buffer_copy yuvB (ud - 32) yuvT (topOff + 16) 8
1315
+ buffer_copy yuvB (vd - 32) yuvT (topOff + 24) 8
1316
+ }
1317
+ def mo:int (mbX * 16)
1318
+ if ((int_buffer_get mbIsI4 mbX) == 1) {
1319
+ def tr:int ((yd - 32) + 16)
1320
+ if (mbY > 0) {
1321
+ if (mbX >= (mbW - 1)) {
1322
+ buffer_fill yuvB (buffer_get yuvT (topOff + 15)) tr (tr + 4)
1323
+ } {
1324
+ buffer_copy yuvB tr yuvT (topOff + 32) 4
1325
+ }
1326
+ }
1327
+ buffer_copy yuvB (tr + 128) yuvB tr 4
1328
+ buffer_copy yuvB (tr + 256) yuvB tr 4
1329
+ buffer_copy yuvB (tr + 384) yuvB tr 4
1330
+ def n:int 0
1331
+ while (n < 16) {
1332
+ def d:int ((yd + ((bit_and n 3) * 4)) + ((bit_shr n 2) * 128))
1333
+ this.predLuma4((int_buffer_get mbModes (mo + n)) d)
1334
+ this.doTransform((int_buffer_get nzCode n) (n * 16) d)
1335
+ n = n + 1
1336
+ }
1337
+ } {
1338
+ this.predBlock((VP8Decoder.checkMode(mbX mbY (int_buffer_get mbModes mo))) yd 16)
1339
+ def n:int 0
1340
+ while (n < 16) {
1341
+ def code:int (int_buffer_get nzCode n)
1342
+ if (code != 0) {
1343
+ this.doTransform(code (n * 16) ((yd + ((bit_and n 3) * 4)) + ((bit_shr n 2) * 128)))
1344
+ }
1345
+ n = n + 1
1346
+ }
1347
+ }
1348
+ def uvMode:int (VP8Decoder.checkMode(mbX mbY (int_buffer_get mbUvMode mbX)))
1349
+ this.predBlock(uvMode ud 8)
1350
+ this.predBlock(uvMode vd 8)
1351
+ this.doTransformUV(16 256 ud)
1352
+ this.doTransformUV(20 320 vd)
1353
+ if (mbY < (mbH - 1)) {
1354
+ buffer_copy yuvT topOff yuvB (yd + 480) 16
1355
+ buffer_copy yuvT (topOff + 16) yuvB (ud + 224) 8
1356
+ buffer_copy yuvT (topOff + 24) yuvB (vd + 224) 8
1357
+ }
1358
+ ; into the frame
1359
+ def j:int 0
1360
+ def yo:int (((mbY * 16) * yStride) + (mbX * 16))
1361
+ while (j < 16) {
1362
+ buffer_copy yPlane (yo + (j * yStride)) yuvB (yd + (j * 32)) 16
1363
+ j = j + 1
1364
+ }
1365
+ def uo:int (((mbY * 8) * uvStride) + (mbX * 8))
1366
+ j = 0
1367
+ while (j < 8) {
1368
+ buffer_copy uPlane (uo + (j * uvStride)) yuvB (ud + (j * 32)) 8
1369
+ buffer_copy vPlane (uo + (j * uvStride)) yuvB (vd + (j * 32)) 8
1370
+ j = j + 1
1371
+ }
1372
+ }
1373
+
1374
+ ; ======================================================================
1375
+ ; Loop filter (on the frame planes)
1376
+ ; ======================================================================
1377
+
1378
+ sfn sclip1:int (v:int) {
1379
+ if (v < -128) {
1380
+ return -128
1381
+ }
1382
+ if (v > 127) {
1383
+ return 127
1384
+ }
1385
+ return v
1386
+ }
1387
+
1388
+ sfn sclip2:int (v:int) {
1389
+ if (v < -16) {
1390
+ return -16
1391
+ }
1392
+ if (v > 15) {
1393
+ return 15
1394
+ }
1395
+ return v
1396
+ }
1397
+
1398
+ sfn clip1:int (v:int) {
1399
+ if (v < 0) {
1400
+ return 0
1401
+ }
1402
+ if (v > 255) {
1403
+ return 255
1404
+ }
1405
+ return v
1406
+ }
1407
+
1408
+ sfn abs0:int (v:int) {
1409
+ if (v < 0) {
1410
+ return (0 - v)
1411
+ }
1412
+ return v
1413
+ }
1414
+
1415
+ ; 4 * |p0 - q0| + |p1 - q1| <= t
1416
+ fn needsFilter:boolean (b:buffer p:int step:int t:int) {
1417
+ def p1:int (buffer_get b (p - (2 * step)))
1418
+ def p0:int (buffer_get b (p - step))
1419
+ def q0:int (buffer_get b p)
1420
+ def q1:int (buffer_get b (p + step))
1421
+ return (((4 * (VP8Decoder.abs0((p0 - q0)))) + (VP8Decoder.abs0((p1 - q1)))) <= t)
1422
+ }
1423
+
1424
+ fn needsFilter2:boolean (b:buffer p:int step:int t:int it:int) {
1425
+ def p3:int (buffer_get b (p - (4 * step)))
1426
+ def p2:int (buffer_get b (p - (3 * step)))
1427
+ def p1:int (buffer_get b (p - (2 * step)))
1428
+ def p0:int (buffer_get b (p - step))
1429
+ def q0:int (buffer_get b p)
1430
+ def q1:int (buffer_get b (p + step))
1431
+ def q2:int (buffer_get b (p + (2 * step)))
1432
+ def q3:int (buffer_get b (p + (3 * step)))
1433
+ if (((4 * (VP8Decoder.abs0((p0 - q0)))) + (VP8Decoder.abs0((p1 - q1)))) > t) {
1434
+ return false
1435
+ }
1436
+ if ((VP8Decoder.abs0((p3 - p2))) > it) {
1437
+ return false
1438
+ }
1439
+ if ((VP8Decoder.abs0((p2 - p1))) > it) {
1440
+ return false
1441
+ }
1442
+ if ((VP8Decoder.abs0((p1 - p0))) > it) {
1443
+ return false
1444
+ }
1445
+ if ((VP8Decoder.abs0((q3 - q2))) > it) {
1446
+ return false
1447
+ }
1448
+ if ((VP8Decoder.abs0((q2 - q1))) > it) {
1449
+ return false
1450
+ }
1451
+ return ((VP8Decoder.abs0((q1 - q0))) <= it)
1452
+ }
1453
+
1454
+ fn hev:boolean (b:buffer p:int step:int thresh:int) {
1455
+ def p1:int (buffer_get b (p - (2 * step)))
1456
+ def p0:int (buffer_get b (p - step))
1457
+ def q0:int (buffer_get b p)
1458
+ def q1:int (buffer_get b (p + step))
1459
+ return (((VP8Decoder.abs0((p1 - p0))) > thresh) || ((VP8Decoder.abs0((q1 - q0))) > thresh))
1460
+ }
1461
+
1462
+ fn doFilter2:void (b:buffer p:int step:int) {
1463
+ def p1:int (buffer_get b (p - (2 * step)))
1464
+ def p0:int (buffer_get b (p - step))
1465
+ def q0:int (buffer_get b p)
1466
+ def q1:int (buffer_get b (p + step))
1467
+ def a:int ((3 * (q0 - p0)) + (VP8Decoder.sclip1((p1 - q1))))
1468
+ def a1:int (VP8Decoder.sclip2((bit_shr (a + 4) 3)))
1469
+ def a2:int (VP8Decoder.sclip2((bit_shr (a + 3) 3)))
1470
+ buffer_set b (p - step) (VP8Decoder.clip1((p0 + a2)))
1471
+ buffer_set b p (VP8Decoder.clip1((q0 - a1)))
1472
+ }
1473
+
1474
+ fn doFilter4:void (b:buffer p:int step:int) {
1475
+ def p1:int (buffer_get b (p - (2 * step)))
1476
+ def p0:int (buffer_get b (p - step))
1477
+ def q0:int (buffer_get b p)
1478
+ def q1:int (buffer_get b (p + step))
1479
+ def a:int (3 * (q0 - p0))
1480
+ def a1:int (VP8Decoder.sclip2((bit_shr (a + 4) 3)))
1481
+ def a2:int (VP8Decoder.sclip2((bit_shr (a + 3) 3)))
1482
+ def a3:int (bit_shr (a1 + 1) 1)
1483
+ buffer_set b (p - (2 * step)) (VP8Decoder.clip1((p1 + a3)))
1484
+ buffer_set b (p - step) (VP8Decoder.clip1((p0 + a2)))
1485
+ buffer_set b p (VP8Decoder.clip1((q0 - a1)))
1486
+ buffer_set b (p + step) (VP8Decoder.clip1((q1 - a3)))
1487
+ }
1488
+
1489
+ fn doFilter6:void (b:buffer p:int step:int) {
1490
+ def p2:int (buffer_get b (p - (3 * step)))
1491
+ def p1:int (buffer_get b (p - (2 * step)))
1492
+ def p0:int (buffer_get b (p - step))
1493
+ def q0:int (buffer_get b p)
1494
+ def q1:int (buffer_get b (p + step))
1495
+ def q2:int (buffer_get b (p + (2 * step)))
1496
+ def a:int (VP8Decoder.sclip1(((3 * (q0 - p0)) + (VP8Decoder.sclip1((p1 - q1))))))
1497
+ def a1:int (bit_shr ((27 * a) + 63) 7)
1498
+ def a2:int (bit_shr ((18 * a) + 63) 7)
1499
+ def a3:int (bit_shr ((9 * a) + 63) 7)
1500
+ buffer_set b (p - (3 * step)) (VP8Decoder.clip1((p2 + a3)))
1501
+ buffer_set b (p - (2 * step)) (VP8Decoder.clip1((p1 + a2)))
1502
+ buffer_set b (p - step) (VP8Decoder.clip1((p0 + a1)))
1503
+ buffer_set b p (VP8Decoder.clip1((q0 - a1)))
1504
+ buffer_set b (p + step) (VP8Decoder.clip1((q1 - a2)))
1505
+ buffer_set b (p + (2 * step)) (VP8Decoder.clip1((q2 - a3)))
1506
+ }
1507
+
1508
+ ; the simple filter across one edge of 16 pixels
1509
+ fn simpleFilter16:void (b:buffer p:int step:int along:int thresh:int) {
1510
+ def t2:int ((2 * thresh) + 1)
1511
+ def i:int 0
1512
+ while (i < 16) {
1513
+ def q:int (p + (i * along))
1514
+ if (this.needsFilter(b q step t2)) {
1515
+ this.doFilter2(b q step)
1516
+ }
1517
+ i = i + 1
1518
+ }
1519
+ }
1520
+
1521
+ ; the normal filter across one edge: 6-tap on macroblock edges, 4-tap inside
1522
+ fn filterLoop:void (b:buffer p:int hstride:int vstride:int size:int thresh:int ithresh:int hevThresh:int mbEdge:boolean) {
1523
+ def t2:int ((2 * thresh) + 1)
1524
+ def i:int 0
1525
+ while (i < size) {
1526
+ def q:int (p + (i * vstride))
1527
+ if (this.needsFilter2(b q hstride t2 ithresh)) {
1528
+ if (this.hev(b q hstride hevThresh)) {
1529
+ this.doFilter2(b q hstride)
1530
+ } {
1531
+ if mbEdge {
1532
+ this.doFilter6(b q hstride)
1533
+ } {
1534
+ this.doFilter4(b q hstride)
1535
+ }
1536
+ }
1537
+ }
1538
+ i = i + 1
1539
+ }
1540
+ }
1541
+
1542
+ fn filterMB:void (mbX:int mbY:int) {
1543
+ def limit:int (int_buffer_get fLimit mbX)
1544
+ if (limit == 0) {
1545
+ return
1546
+ }
1547
+ def ilevel:int (int_buffer_get fILevel mbX)
1548
+ def inner:boolean ((int_buffer_get fInner mbX) == 1)
1549
+ def hevT:int (int_buffer_get fHev mbX)
1550
+ def ys:int yStride
1551
+ def yo:int (((mbY * 16) * ys) + (mbX * 16))
1552
+ if (filterType == 1) {
1553
+ if (mbX > 0) {
1554
+ this.simpleFilter16(yPlane yo 1 ys (limit + 4))
1555
+ }
1556
+ if inner {
1557
+ this.simpleFilter16(yPlane (yo + 4) 1 ys limit)
1558
+ this.simpleFilter16(yPlane (yo + 8) 1 ys limit)
1559
+ this.simpleFilter16(yPlane (yo + 12) 1 ys limit)
1560
+ }
1561
+ if (mbY > 0) {
1562
+ this.simpleFilter16(yPlane yo ys 1 (limit + 4))
1563
+ }
1564
+ if inner {
1565
+ this.simpleFilter16(yPlane (yo + (4 * ys)) ys 1 limit)
1566
+ this.simpleFilter16(yPlane (yo + (8 * ys)) ys 1 limit)
1567
+ this.simpleFilter16(yPlane (yo + (12 * ys)) ys 1 limit)
1568
+ }
1569
+ return
1570
+ }
1571
+ def us:int uvStride
1572
+ def uo:int (((mbY * 8) * us) + (mbX * 8))
1573
+ if (mbX > 0) {
1574
+ this.filterLoop(yPlane yo 1 ys 16 (limit + 4) ilevel hevT true)
1575
+ this.filterLoop(uPlane uo 1 us 8 (limit + 4) ilevel hevT true)
1576
+ this.filterLoop(vPlane uo 1 us 8 (limit + 4) ilevel hevT true)
1577
+ }
1578
+ if inner {
1579
+ this.filterLoop(yPlane (yo + 4) 1 ys 16 limit ilevel hevT false)
1580
+ this.filterLoop(yPlane (yo + 8) 1 ys 16 limit ilevel hevT false)
1581
+ this.filterLoop(yPlane (yo + 12) 1 ys 16 limit ilevel hevT false)
1582
+ this.filterLoop(uPlane (uo + 4) 1 us 8 limit ilevel hevT false)
1583
+ this.filterLoop(vPlane (uo + 4) 1 us 8 limit ilevel hevT false)
1584
+ }
1585
+ if (mbY > 0) {
1586
+ this.filterLoop(yPlane yo ys 1 16 (limit + 4) ilevel hevT true)
1587
+ this.filterLoop(uPlane uo us 1 8 (limit + 4) ilevel hevT true)
1588
+ this.filterLoop(vPlane uo us 1 8 (limit + 4) ilevel hevT true)
1589
+ }
1590
+ if inner {
1591
+ this.filterLoop(yPlane (yo + (4 * ys)) ys 1 16 limit ilevel hevT false)
1592
+ this.filterLoop(yPlane (yo + (8 * ys)) ys 1 16 limit ilevel hevT false)
1593
+ this.filterLoop(yPlane (yo + (12 * ys)) ys 1 16 limit ilevel hevT false)
1594
+ this.filterLoop(uPlane (uo + (4 * us)) us 1 8 limit ilevel hevT false)
1595
+ this.filterLoop(vPlane (uo + (4 * us)) us 1 8 limit ilevel hevT false)
1596
+ }
1597
+ }
1598
+
1599
+ ; ======================================================================
1600
+ ; Frame
1601
+ ; ======================================================================
1602
+
1603
+ ; Decodes the frame whose header decodeHeader() read into yPlane, uPlane
1604
+ ; and vPlane.
1605
+ fn decodeFrame:boolean () {
1606
+ yStride = mbW * 16
1607
+ uvStride = mbW * 8
1608
+ yPlane = (buffer_alloc (yStride * (mbH * 16)))
1609
+ uPlane = (buffer_alloc (uvStride * (mbH * 8)))
1610
+ vPlane = (buffer_alloc (uvStride * (mbH * 8)))
1611
+ yuvT = (buffer_alloc (mbW * 32))
1612
+ intraT = (int_buffer_alloc (mbW * 4))
1613
+ mbSegment = (int_buffer_alloc mbW)
1614
+ mbSkip = (int_buffer_alloc mbW)
1615
+ mbIsI4 = (int_buffer_alloc mbW)
1616
+ mbUvMode = (int_buffer_alloc mbW)
1617
+ mbModes = (int_buffer_alloc (mbW * 16))
1618
+ topNz = (int_buffer_alloc mbW)
1619
+ topNzDc = (int_buffer_alloc mbW)
1620
+ fLimit = (int_buffer_alloc mbW)
1621
+ fILevel = (int_buffer_alloc mbW)
1622
+ fInner = (int_buffer_alloc mbW)
1623
+ fHev = (int_buffer_alloc mbW)
1624
+ buffer_fill yuvB 0 0 832
1625
+ statI4Modes = 0
1626
+ statI16Modes = 0
1627
+ statUvModes = 0
1628
+ statSkipped = 0
1629
+ statSegments = 0
1630
+ this.computeFilterStrengths()
1631
+ def mbY:int 0
1632
+ while (mbY < mbH) {
1633
+ def tb:VP8BoolDecoder (itemAt parts (bit_and mbY (numParts - 1)))
1634
+ int_buffer_fill intraL 0 0 4
1635
+ def mbX:int 0
1636
+ while (mbX < mbW) {
1637
+ this.parseIntraMode(mbX)
1638
+ mbX = mbX + 1
1639
+ }
1640
+ if br.eof {
1641
+ return (this.fail("premature end of partition 0"))
1642
+ }
1643
+ leftNz = 0
1644
+ leftNzDc = 0
1645
+ mbX = 0
1646
+ while (mbX < mbW) {
1647
+ if ((this.decodeMB(tb mbX)) == false) {
1648
+ return (this.fail("premature end of token partition"))
1649
+ }
1650
+ this.reconstruct(mbX mbY)
1651
+ mbX = mbX + 1
1652
+ }
1653
+ if (filterType > 0) {
1654
+ mbX = 0
1655
+ while (mbX < mbW) {
1656
+ this.filterMB(mbX mbY)
1657
+ mbX = mbX + 1
1658
+ }
1659
+ }
1660
+ mbY = mbY + 1
1661
+ }
1662
+ return true
1663
+ }
1664
+
1665
+ ; ======================================================================
1666
+ ; YUV 4:2:0 -> RGBA
1667
+ ; ======================================================================
1668
+
1669
+ sfn yuvClip8:int (v:int) {
1670
+ if ((bit_and v -16384) == 0) {
1671
+ return (bit_shr v 6)
1672
+ }
1673
+ if (v < 0) {
1674
+ return 0
1675
+ }
1676
+ return 255
1677
+ }
1678
+
1679
+ ; One output row with libwebp's fancy upsampler: the chroma of each pixel
1680
+ ; is (9 * nearest + 3 * two neighbours + farthest + 8) / 16 of the four
1681
+ ; closest chroma samples. `near` is the chroma row closest to the pixel
1682
+ ; row, `far` the other one of the pair.
1683
+ fn emitRow:void (img:ImageBuffer alpha:buffer hasAlpha:boolean row:int near:int far:int) {
1684
+ def w:int width
1685
+ def yo:int (row * yStride)
1686
+ def no:int (near * uvStride)
1687
+ def fo:int (far * uvStride)
1688
+ def out:int ((row * w) * 4)
1689
+ def ao:int (row * w)
1690
+ def x:int 0
1691
+ while (x < w) {
1692
+ def u:int 0
1693
+ def v:int 0
1694
+ def cx:int (bit_shr x 1)
1695
+ if ((x == 0) || (((bit_and w 1) == 0) && (x == (w - 1)))) {
1696
+ ; first pixel, and the last one of an even width
1697
+ u = (bit_shr (((3 * (buffer_get uPlane (no + cx))) + (buffer_get uPlane (fo + cx))) + 2) 2)
1698
+ v = (bit_shr (((3 * (buffer_get vPlane (no + cx))) + (buffer_get vPlane (fo + cx))) + 2) 2)
1699
+ } {
1700
+ ; pixels 2k - 1 and 2k fall between chroma columns k - 1 and k
1701
+ def k:int (bit_shr (x + 1) 1)
1702
+ def na:int (buffer_get uPlane ((no + k) - 1))
1703
+ def nb:int (buffer_get uPlane (no + k))
1704
+ def fa:int (buffer_get uPlane ((fo + k) - 1))
1705
+ def fb:int (buffer_get uPlane (fo + k))
1706
+ def avg:int ((((na + nb) + fa) + fb) + 8)
1707
+ if ((bit_and x 1) == 1) {
1708
+ u = (bit_shr ((bit_shr (avg + (2 * (nb + fa))) 3) + na) 1)
1709
+ } {
1710
+ u = (bit_shr ((bit_shr (avg + (2 * (na + fb))) 3) + nb) 1)
1711
+ }
1712
+ na = (buffer_get vPlane ((no + k) - 1))
1713
+ nb = (buffer_get vPlane (no + k))
1714
+ fa = (buffer_get vPlane ((fo + k) - 1))
1715
+ fb = (buffer_get vPlane (fo + k))
1716
+ avg = ((((na + nb) + fa) + fb) + 8)
1717
+ if ((bit_and x 1) == 1) {
1718
+ v = (bit_shr ((bit_shr (avg + (2 * (nb + fa))) 3) + na) 1)
1719
+ } {
1720
+ v = (bit_shr ((bit_shr (avg + (2 * (na + fb))) 3) + nb) 1)
1721
+ }
1722
+ }
1723
+ def yy:int (bit_shr ((buffer_get yPlane (yo + x)) * 19077) 8)
1724
+ def o:int (out + (x * 4))
1725
+ buffer_set img.pixels o (VP8Decoder.yuvClip8(((yy + (bit_shr (v * 26149) 8)) - 14234)))
1726
+ buffer_set img.pixels (o + 1) (VP8Decoder.yuvClip8((((yy - (bit_shr (u * 6419) 8)) - (bit_shr (v * 13320) 8)) + 8708)))
1727
+ buffer_set img.pixels (o + 2) (VP8Decoder.yuvClip8(((yy + (bit_shr (u * 33050) 8)) - 17685)))
1728
+ if hasAlpha {
1729
+ buffer_set img.pixels (o + 3) (buffer_get alpha (ao + x))
1730
+ } {
1731
+ buffer_set img.pixels (o + 3) 255
1732
+ }
1733
+ x = x + 1
1734
+ }
1735
+ }
1736
+
1737
+ ; The decoded frame as RGBA; alpha holds width * height bytes when hasAlpha.
1738
+ fn toRGBA:void (img:ImageBuffer alpha:buffer hasAlpha:boolean) {
1739
+ img.initClear(width height)
1740
+ def lastUV:int (bit_shr (height - 1) 1)
1741
+ def row:int 0
1742
+ while (row < height) {
1743
+ def near:int 0
1744
+ def far:int 0
1745
+ if (row > 0) {
1746
+ if ((bit_and row 1) == 1) {
1747
+ near = (bit_shr (row - 1) 1)
1748
+ far = (bit_shr (row + 1) 1)
1749
+ if (far > lastUV) {
1750
+ far = lastUV
1751
+ }
1752
+ } {
1753
+ near = (bit_shr row 1)
1754
+ far = near - 1
1755
+ }
1756
+ }
1757
+ this.emitRow(img alpha hasAlpha row near far)
1758
+ row = row + 1
1759
+ }
1760
+ }
1761
+
1762
+ ; ======================================================================
1763
+ ; Constant tables (RFC 6386)
1764
+ ; ======================================================================
1765
+
1766
+ sfn dcTable:[int] () {
1767
+ return ([] _:int (
1768
+ 4 5 6 7 8 9 10 10 11 12 13 14 15 16 17 17 18 19 20 20 21 21 22 22
1769
+ 23 23 24 25 25 26 27 28 29 30 31 32 33 34 35 36 37 37 38 39 40 41 42 43
1770
+ 44 45 46 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
1771
+ 67 68 69 70 71 72 73 74 75 76 76 77 78 79 80 81 82 83 84 85 86 87 88 89
1772
+ 91 93 95 96 98 100 101 102 104 106 108 110 112 114 116 118 122 124 126 128 130 132 134 136
1773
+ 138 140 143 145 148 151 154 157
1774
+ ))
1775
+ }
1776
+
1777
+ sfn acTable:[int] () {
1778
+ return ([] _:int (
1779
+ 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
1780
+ 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
1781
+ 52 53 54 55 56 57 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92
1782
+ 94 96 98 100 102 104 106 108 110 112 114 116 119 122 125 128 131 134 137 140 143 146 149 152
1783
+ 155 158 161 164 167 170 173 177 181 185 189 193 197 201 205 209 213 217 221 225 229 234 239 245
1784
+ 249 254 259 264 269 274 279 284
1785
+ ))
1786
+ }
1787
+
1788
+ sfn coeffUpdateProba:[int] () {
1789
+ return ([] _:int (
1790
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1791
+ 255 255 255 255 255 255 255 255 255 176 246 255 255 255 255 255 255 255 255 255 223 241 252 255
1792
+ 255 255 255 255 255 255 255 249 253 253 255 255 255 255 255 255 255 255 255 244 252 255 255 255
1793
+ 255 255 255 255 255 234 254 254 255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255
1794
+ 255 255 255 255 246 254 255 255 255 255 255 255 255 255 239 253 254 255 255 255 255 255 255 255
1795
+ 255 254 255 254 255 255 255 255 255 255 255 255 255 248 254 255 255 255 255 255 255 255 255 251
1796
+ 255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 254
1797
+ 255 255 255 255 255 255 255 255 251 254 254 255 255 255 255 255 255 255 255 254 255 254 255 255
1798
+ 255 255 255 255 255 255 255 254 253 255 254 255 255 255 255 255 255 250 255 254 255 254 255 255
1799
+ 255 255 255 255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1800
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1801
+ 217 255 255 255 255 255 255 255 255 255 255 225 252 241 253 255 255 254 255 255 255 255 234 250
1802
+ 241 250 253 255 253 254 255 255 255 255 254 255 255 255 255 255 255 255 255 255 223 254 254 255
1803
+ 255 255 255 255 255 255 255 238 253 254 254 255 255 255 255 255 255 255 255 248 254 255 255 255
1804
+ 255 255 255 255 255 249 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1805
+ 255 255 255 255 253 255 255 255 255 255 255 255 255 255 247 254 255 255 255 255 255 255 255 255
1806
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 253 254 255 255 255 255 255 255 255 255 252
1807
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254
1808
+ 255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1809
+ 255 255 255 255 255 255 255 254 253 255 255 255 255 255 255 255 255 250 255 255 255 255 255 255
1810
+ 255 255 255 255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1811
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1812
+ 186 251 250 255 255 255 255 255 255 255 255 234 251 244 254 255 255 255 255 255 255 255 251 251
1813
+ 243 253 254 255 254 255 255 255 255 255 253 254 255 255 255 255 255 255 255 255 236 253 254 255
1814
+ 255 255 255 255 255 255 255 251 253 253 254 254 255 255 255 255 255 255 255 254 254 255 255 255
1815
+ 255 255 255 255 255 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1816
+ 255 255 255 255 254 255 255 255 255 255 255 255 255 255 254 254 255 255 255 255 255 255 255 255
1817
+ 255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254
1818
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1819
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1820
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1821
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1822
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1823
+ 248 255 255 255 255 255 255 255 255 255 255 250 254 252 254 255 255 255 255 255 255 255 248 254
1824
+ 249 253 255 255 255 255 255 255 255 255 253 253 255 255 255 255 255 255 255 255 246 253 253 255
1825
+ 255 255 255 255 255 255 255 252 254 251 254 254 255 255 255 255 255 255 255 254 252 255 255 255
1826
+ 255 255 255 255 255 248 254 253 255 255 255 255 255 255 255 255 253 255 254 254 255 255 255 255
1827
+ 255 255 255 255 251 254 255 255 255 255 255 255 255 255 245 251 254 255 255 255 255 255 255 255
1828
+ 255 253 253 254 255 255 255 255 255 255 255 255 255 251 253 255 255 255 255 255 255 255 255 252
1829
+ 253 254 255 255 255 255 255 255 255 255 255 254 255 255 255 255 255 255 255 255 255 255 252 255
1830
+ 255 255 255 255 255 255 255 255 249 255 254 255 255 255 255 255 255 255 255 255 255 254 255 255
1831
+ 255 255 255 255 255 255 255 255 253 255 255 255 255 255 255 255 255 250 255 255 255 255 255 255
1832
+ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1833
+ 255 255 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
1834
+ ))
1835
+ }
1836
+
1837
+ sfn coeffProba0:[int] () {
1838
+ return ([] _:int (
1839
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128
1840
+ 128 128 128 128 128 128 128 128 128 253 136 254 255 228 219 128 128 128 128 128 189 129 242 255
1841
+ 227 213 255 219 128 128 128 106 126 227 252 214 209 255 255 128 128 128 1 98 248 255 236 226
1842
+ 255 255 128 128 128 181 133 238 254 221 234 255 154 128 128 128 78 134 202 247 198 180 255 219
1843
+ 128 128 128 1 185 249 255 243 255 128 128 128 128 128 184 150 247 255 236 224 128 128 128 128
1844
+ 128 77 110 216 255 236 230 128 128 128 128 128 1 101 251 255 241 255 128 128 128 128 128 170
1845
+ 139 241 252 236 209 255 255 128 128 128 37 116 196 243 228 255 255 255 128 128 128 1 204 254
1846
+ 255 245 255 128 128 128 128 128 207 160 250 255 238 128 128 128 128 128 128 102 103 231 255 211
1847
+ 171 128 128 128 128 128 1 152 252 255 240 255 128 128 128 128 128 177 135 243 255 234 225 128
1848
+ 128 128 128 128 80 129 211 255 194 224 128 128 128 128 128 1 1 255 128 128 128 128 128 128
1849
+ 128 128 246 1 255 128 128 128 128 128 128 128 128 255 128 128 128 128 128 128 128 128 128 128
1850
+ 198 35 237 223 193 187 162 160 145 155 62 131 45 198 221 172 176 220 157 252 221 1 68 47
1851
+ 146 208 149 167 221 162 255 223 128 1 149 241 255 221 224 255 255 128 128 128 184 141 234 253
1852
+ 222 220 255 199 128 128 128 81 99 181 242 176 190 249 202 255 255 128 1 129 232 253 214 197
1853
+ 242 196 255 255 128 99 121 210 250 201 198 255 202 128 128 128 23 91 163 242 170 187 247 210
1854
+ 255 255 128 1 200 246 255 234 255 128 128 128 128 128 109 178 241 255 231 245 255 255 128 128
1855
+ 128 44 130 201 253 205 192 255 255 128 128 128 1 132 239 251 219 209 255 165 128 128 128 94
1856
+ 136 225 251 218 190 255 255 128 128 128 22 100 174 245 186 161 255 199 128 128 128 1 182 249
1857
+ 255 232 235 128 128 128 128 128 124 143 241 255 227 234 128 128 128 128 128 35 77 181 251 193
1858
+ 211 255 205 128 128 128 1 157 247 255 236 231 255 255 128 128 128 121 141 235 255 225 227 255
1859
+ 255 128 128 128 45 99 188 251 195 217 255 224 128 128 128 1 1 251 255 213 255 128 128 128
1860
+ 128 128 203 1 248 255 255 128 128 128 128 128 128 137 1 177 255 224 255 128 128 128 128 128
1861
+ 253 9 248 251 207 208 255 192 128 128 128 175 13 224 243 193 185 249 198 255 255 128 73 17
1862
+ 171 221 161 179 236 167 255 234 128 1 95 247 253 212 183 255 255 128 128 128 239 90 244 250
1863
+ 211 209 255 255 128 128 128 155 77 195 248 188 195 255 255 128 128 128 1 24 239 251 218 219
1864
+ 255 205 128 128 128 201 51 219 255 196 186 128 128 128 128 128 69 46 190 239 201 218 255 228
1865
+ 128 128 128 1 191 251 255 255 128 128 128 128 128 128 223 165 249 255 213 255 128 128 128 128
1866
+ 128 141 124 248 255 255 128 128 128 128 128 128 1 16 248 255 255 128 128 128 128 128 128 190
1867
+ 36 230 255 236 255 128 128 128 128 128 149 1 255 128 128 128 128 128 128 128 128 1 226 255
1868
+ 128 128 128 128 128 128 128 128 247 192 255 128 128 128 128 128 128 128 128 240 128 255 128 128
1869
+ 128 128 128 128 128 128 1 134 252 255 255 128 128 128 128 128 128 213 62 250 255 255 128 128
1870
+ 128 128 128 128 55 93 255 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128
1871
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128
1872
+ 202 24 213 235 186 191 220 160 240 175 255 126 38 182 232 169 184 228 174 255 187 128 61 46
1873
+ 138 219 151 178 240 170 255 216 128 1 112 230 250 199 191 247 159 255 255 128 166 109 228 252
1874
+ 211 215 255 174 128 128 128 39 77 162 232 172 180 245 178 255 255 128 1 52 220 246 198 199
1875
+ 249 220 255 255 128 124 74 191 243 183 193 250 221 255 255 128 24 71 130 219 154 170 243 182
1876
+ 255 255 128 1 182 225 249 219 240 255 224 128 128 128 149 150 226 252 216 205 255 171 128 128
1877
+ 128 28 108 170 242 183 194 254 223 255 255 128 1 81 230 252 204 203 255 192 128 128 128 123
1878
+ 102 209 247 188 196 255 233 128 128 128 20 95 153 243 164 173 255 203 128 128 128 1 222 248
1879
+ 255 216 213 128 128 128 128 128 168 175 246 252 235 205 255 255 128 128 128 47 116 215 255 211
1880
+ 212 255 255 128 128 128 1 121 236 253 212 214 255 255 128 128 128 141 84 213 252 201 202 255
1881
+ 219 128 128 128 42 80 160 240 162 185 255 205 128 128 128 1 1 255 128 128 128 128 128 128
1882
+ 128 128 244 1 255 128 128 128 128 128 128 128 128 238 1 255 128 128 128 128 128 128 128 128
1883
+ ))
1884
+ }
1885
+
1886
+ sfn modesProba:[int] () {
1887
+ return ([] _:int (
1888
+ 231 120 48 89 115 113 120 152 112 152 179 64 126 170 118 46 70 95 175 69 143 80 85 82
1889
+ 72 155 103 56 58 10 171 218 189 17 13 152 114 26 17 163 44 195 21 10 173 121 24 80
1890
+ 195 26 62 44 64 85 144 71 10 38 171 213 144 34 26 170 46 55 19 136 160 33 206 71
1891
+ 63 20 8 114 114 208 12 9 226 81 40 11 96 182 84 29 16 36 134 183 89 137 98 101
1892
+ 106 165 148 72 187 100 130 157 111 32 75 80 66 102 167 99 74 62 40 234 128 41 53 9
1893
+ 178 241 141 26 8 107 74 43 26 146 73 166 49 23 157 65 38 105 160 51 52 31 115 128
1894
+ 104 79 12 27 217 255 87 17 7 87 68 71 44 114 51 15 186 23 47 41 14 110 182 183
1895
+ 21 17 194 66 45 25 102 197 189 23 18 22 88 88 147 150 42 46 45 196 205 43 97 183
1896
+ 117 85 38 35 179 61 39 53 200 87 26 21 43 232 171 56 34 51 104 114 102 29 93 77
1897
+ 39 28 85 171 58 165 90 98 64 34 22 116 206 23 34 43 166 73 107 54 32 26 51 1
1898
+ 81 43 31 68 25 106 22 64 171 36 225 114 34 19 21 102 132 188 16 76 124 62 18 78
1899
+ 95 85 57 50 48 51 193 101 35 159 215 111 89 46 111 60 148 31 172 219 228 21 18 111
1900
+ 112 113 77 85 179 255 38 120 114 40 42 1 196 245 209 10 25 109 88 43 29 140 166 213
1901
+ 37 43 154 61 63 30 155 67 45 68 1 209 100 80 8 43 154 1 51 26 71 142 78 78
1902
+ 16 255 128 34 197 171 41 40 5 102 211 183 4 1 221 51 50 17 168 209 192 23 25 82
1903
+ 138 31 36 171 27 166 38 44 229 67 87 58 169 82 115 26 59 179 63 59 90 180 59 166
1904
+ 93 73 154 40 40 21 116 143 209 34 39 175 47 15 16 183 34 223 49 45 183 46 17 33
1905
+ 183 6 98 15 32 183 57 46 22 24 128 1 54 17 37 65 32 73 115 28 128 23 128 205
1906
+ 40 3 9 115 51 192 18 6 223 87 37 9 115 59 77 64 21 47 104 55 44 218 9 54
1907
+ 53 130 226 64 90 70 205 40 41 23 26 57 54 57 112 184 5 41 38 166 213 30 34 26
1908
+ 133 152 116 10 32 134 39 19 53 221 26 114 32 73 255 31 9 65 234 2 15 1 118 73
1909
+ 75 32 12 51 192 255 160 43 51 88 31 35 67 102 85 55 186 85 56 21 23 111 59 205
1910
+ 45 37 192 55 38 70 124 73 102 1 34 98 125 98 42 88 104 85 117 175 82 95 84 53
1911
+ 89 128 100 113 101 45 75 79 123 47 51 128 81 171 1 57 17 5 71 102 57 53 41 49
1912
+ 38 33 13 121 57 73 26 1 85 41 10 67 138 77 110 90 47 114 115 21 2 10 102 255
1913
+ 166 23 6 101 29 16 10 85 128 101 196 26 57 18 10 102 102 213 34 20 43 117 20 15
1914
+ 36 163 128 68 1 26 102 61 71 37 34 53 31 243 192 69 60 71 38 73 119 28 222 37
1915
+ 68 45 128 34 1 47 11 245 171 62 17 19 70 146 85 55 62 70 37 43 37 154 100 163
1916
+ 85 160 1 63 9 92 136 28 64 32 201 85 75 15 9 9 64 255 184 119 16 86 6 28
1917
+ 5 64 255 25 248 1 56 8 17 132 137 255 55 116 128 58 15 20 82 135 57 26 121 40
1918
+ 164 50 31 137 154 133 25 35 218 51 103 44 131 131 123 31 6 158 86 40 64 135 148 224
1919
+ 45 183 128 22 26 17 131 240 154 14 1 209 45 16 21 91 64 222 7 1 197 56 21 39
1920
+ 155 60 138 23 102 213 83 12 13 54 192 255 68 47 28 85 26 85 85 128 128 32 146 171
1921
+ 18 11 7 63 144 171 4 4 246 35 27 10 146 174 171 12 26 128 190 80 35 99 180 80
1922
+ 126 54 45 85 126 47 87 176 51 41 20 32 101 75 128 139 118 146 116 128 85 56 41 15
1923
+ 176 236 85 37 9 62 71 30 17 119 118 255 17 18 138 101 38 60 138 55 70 43 26 142
1924
+ 146 36 19 30 171 255 97 27 20 138 45 61 62 219 1 81 188 64 32 41 20 117 151 142
1925
+ 20 21 163 112 19 12 61 195 128 48 4 24
1926
+ ))
1927
+ }
1928
+
1929
+ }