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,767 @@
1
+ ; SPDX-License-Identifier: MIT
2
+
3
+ ; ==============================================================================
4
+ ; EvgTraceFit.rgr — optimal polygon + vertex adjust (Potrace paper §2.2)
5
+ ; ==============================================================================
6
+ ;
7
+ ; Clean-room implementation of the polygon phase described in
8
+ ; Peter Selinger, "Potrace: a polygon-based tracing algorithm" (2003):
9
+ ;
10
+ ; 1. prefix sums over the closed edge path
11
+ ; 2. longest "straight" pivot from each vertex (lon[])
12
+ ; 3. dynamic-programming optimal polygon (minimum segment count, then penalty)
13
+ ; 4. least-squares vertex adjustment into the unit square around each pivot
14
+ ;
15
+ ; Curve smoothing / optiCurve live in EvgBitmapTracer (alphamax stage). This
16
+ ; file is the hard part that RDP was standing in for — without it, axis-aligned
17
+ ; rects do not collapse to four corners and the SVG stays noisy.
18
+ ;
19
+ ; Not a derivative of the GPL Potrace sources.
20
+ ; ==============================================================================
21
+
22
+ Import "EvgTraceTypes.rgr"
23
+
24
+ class EvgTraceSum {
25
+ def x:double 0.0
26
+ def y:double 0.0
27
+ def xy:double 0.0
28
+ def x2:double 0.0
29
+ def y2:double 0.0
30
+
31
+ Constructor () {
32
+ }
33
+
34
+ sfn of:EvgTraceSum (x:double y:double xy:double x2:double y2:double) {
35
+ def s (new EvgTraceSum())
36
+ s.x = x
37
+ s.y = y
38
+ s.xy = xy
39
+ s.x2 = x2
40
+ s.y2 = y2
41
+ return s
42
+ }
43
+ }
44
+
45
+ class EvgTraceFit {
46
+ def pts:[EvgTracePoint]
47
+ def n:int 0
48
+ def x0:double 0.0
49
+ def y0:double 0.0
50
+ def sums:[EvgTraceSum]
51
+ def lon:[int]
52
+ def po:[int]
53
+ def m:int 0
54
+ def vertex:[EvgTracePoint]
55
+
56
+ Constructor () {
57
+ def p:[EvgTracePoint]
58
+ pts = p
59
+ def s:[EvgTraceSum]
60
+ sums = s
61
+ def l:[int]
62
+ lon = l
63
+ def o:[int]
64
+ po = o
65
+ def v:[EvgTracePoint]
66
+ vertex = v
67
+ }
68
+
69
+ sfn absD:double (v:double) {
70
+ if (v < 0.0) {
71
+ return (0.0 - v)
72
+ }
73
+ return v
74
+ }
75
+
76
+ sfn signI:int (v:int) {
77
+ if (v > 0) {
78
+ return 1
79
+ }
80
+ if (v < 0) {
81
+ return (0 - 1)
82
+ }
83
+ return 0
84
+ }
85
+
86
+ sfn modI:int (a:int n:int) {
87
+ if (n <= 0) {
88
+ return 0
89
+ }
90
+ def r:int (a - ((idiv a n) * n))
91
+ if (r < 0) {
92
+ r = (r + n)
93
+ }
94
+ return r
95
+ }
96
+
97
+ sfn cyclic:boolean (a:int b:int c:int) {
98
+ if (a <= c) {
99
+ return ((a <= b) && (b < c))
100
+ }
101
+ return ((a <= b) || (b < c))
102
+ }
103
+
104
+ sfn xprod:int (ax:int ay:int bx:int by:int) {
105
+ return ((ax * by) - (ay * bx))
106
+ }
107
+
108
+ ; Fit one closed edge-walk to an adjusted polygon. Returns vertices in
109
+ ; order around the ring (at least 3, or empty on failure).
110
+ sfn fitRing:[EvgTracePoint] (ring:EvgTraceRing) {
111
+ def fit (new EvgTraceFit())
112
+ return (fit.run(ring))
113
+ }
114
+
115
+ fn run:[EvgTracePoint] (ring:EvgTraceRing) {
116
+ def empty:[EvgTracePoint]
117
+ def src:[EvgTracePoint] ring.pts
118
+ def rawN:int (array_length src)
119
+ if (rawN < 3) {
120
+ return empty
121
+ }
122
+ ; Dedup consecutive identical points; drop closing duplicate if present.
123
+ def cleaned:[EvgTracePoint]
124
+ def i:int 0
125
+ while (i < rawN) {
126
+ def p:EvgTracePoint (itemAt src i)
127
+ if ((array_length cleaned) == 0) {
128
+ push cleaned p
129
+ } {
130
+ def prev:EvgTracePoint (itemAt cleaned ((array_length cleaned) - 1))
131
+ if ((prev.x == p.x) && (prev.y == p.y)) {
132
+ } {
133
+ push cleaned p
134
+ }
135
+ }
136
+ i = (i + 1)
137
+ }
138
+ def cn:int (array_length cleaned)
139
+ if (cn >= 2) {
140
+ def first:EvgTracePoint (itemAt cleaned 0)
141
+ def last:EvgTracePoint (itemAt cleaned (cn - 1))
142
+ if ((first.x == last.x) && (first.y == last.y)) {
143
+ def trimmed:[EvgTracePoint]
144
+ def k:int 0
145
+ while (k < (cn - 1)) {
146
+ push trimmed (itemAt cleaned k)
147
+ k = (k + 1)
148
+ }
149
+ cleaned = trimmed
150
+ cn = (array_length cleaned)
151
+ }
152
+ }
153
+ if (cn < 3) {
154
+ return empty
155
+ }
156
+ pts = cleaned
157
+ n = cn
158
+ def p0:EvgTracePoint (itemAt pts 0)
159
+ x0 = p0.x
160
+ y0 = p0.y
161
+ this.calcSums()
162
+ this.calcLon()
163
+ this.bestPolygon()
164
+ if (m < 3) {
165
+ return empty
166
+ }
167
+ this.adjustVertices()
168
+ return vertex
169
+ }
170
+
171
+ ; ------------------------------------------------------------------
172
+ fn calcSums:void () {
173
+ def s:[EvgTraceSum]
174
+ push s (EvgTraceSum.of(0.0 0.0 0.0 0.0 0.0))
175
+ def i:int 0
176
+ while (i < n) {
177
+ def p:EvgTracePoint (itemAt pts i)
178
+ def x:double (p.x - x0)
179
+ def y:double (p.y - y0)
180
+ def prev:EvgTraceSum (itemAt s i)
181
+ push s (EvgTraceSum.of((prev.x + x) (prev.y + y) (prev.xy + (x * y)) (prev.x2 + (x * x)) (prev.y2 + (y * y))))
182
+ i = (i + 1)
183
+ }
184
+ sums = s
185
+ }
186
+
187
+ ; Longest straight pivot from each vertex — paper §2.2.1–2.2.2.
188
+ ; A segment is straight if every point lies in a 1/2-neighbourhood of some
189
+ ; chord and the walk does not use all four compass directions.
190
+ fn calcLon:void () {
191
+ def pivk:[int]
192
+ def nc:[int]
193
+ def i:int 0
194
+ while (i < n) {
195
+ push pivk 0
196
+ push nc 0
197
+ i = (i + 1)
198
+ }
199
+ def k:int 0
200
+ i = (n - 1)
201
+ while (i >= 0) {
202
+ def pi:EvgTracePoint (itemAt pts i)
203
+ def pk:EvgTracePoint (itemAt pts k)
204
+ if ((pi.x != pk.x) && (pi.y != pk.y)) {
205
+ k = (i + 1)
206
+ }
207
+ set nc i k
208
+ i = (i - 1)
209
+ }
210
+
211
+ i = (n - 1)
212
+ while (i >= 0) {
213
+ def ct0:int 0
214
+ def ct1:int 0
215
+ def ct2:int 0
216
+ def ct3:int 0
217
+ def pi2:EvgTracePoint (itemAt pts i)
218
+ def piNext:EvgTracePoint (itemAt pts (EvgTraceFit.modI((i + 1) n)))
219
+ def dx0:int (to_int (piNext.x - pi2.x))
220
+ def dy0:int (to_int (piNext.y - pi2.y))
221
+ def dirNum0:int (3 + ((3 * dx0) + dy0))
222
+ def dir0:int (idiv dirNum0 2)
223
+ if (dir0 == 0) { ct0 = (ct0 + 1) }
224
+ if (dir0 == 1) { ct1 = (ct1 + 1) }
225
+ if (dir0 == 2) { ct2 = (ct2 + 1) }
226
+ if (dir0 == 3) { ct3 = (ct3 + 1) }
227
+
228
+ def c0x:int 0
229
+ def c0y:int 0
230
+ def c1x:int 0
231
+ def c1y:int 0
232
+ def kk:int (itemAt nc i)
233
+ def k1:int i
234
+ def found:boolean false
235
+ def guard:int 0
236
+ while ((found == false) && (guard < (n + 2))) {
237
+ def pk1:EvgTracePoint (itemAt pts kk)
238
+ def pk0:EvgTracePoint (itemAt pts k1)
239
+ def sdx:int (EvgTraceFit.signI((to_int (pk1.x - pk0.x))))
240
+ def sdy:int (EvgTraceFit.signI((to_int (pk1.y - pk0.y))))
241
+ def dirNum:int (3 + ((3 * sdx) + sdy))
242
+ def dir:int (idiv dirNum 2)
243
+ if (dir == 0) { ct0 = (ct0 + 1) }
244
+ if (dir == 1) { ct1 = (ct1 + 1) }
245
+ if (dir == 2) { ct2 = (ct2 + 1) }
246
+ if (dir == 3) { ct3 = (ct3 + 1) }
247
+ if ((((ct0 > 0) && (ct1 > 0)) && (ct2 > 0)) && (ct3 > 0)) {
248
+ set pivk i k1
249
+ found = true
250
+ } {
251
+ def curx:int (to_int (pk1.x - pi2.x))
252
+ def cury:int (to_int (pk1.y - pi2.y))
253
+ if (((EvgTraceFit.xprod(c0x c0y curx cury)) < 0) || ((EvgTraceFit.xprod(c1x c1y curx cury)) > 0)) {
254
+ guard = (n + 2)
255
+ } {
256
+ def ax:int (EvgTraceFit.absI(curx))
257
+ def ay:int (EvgTraceFit.absI(cury))
258
+ if ((ax > 1) || (ay > 1)) {
259
+ def off0x:int curx
260
+ def off0y:int cury
261
+ if ((cury > 0) || ((cury == 0) && (curx < 0))) {
262
+ off0x = (curx + 1)
263
+ } {
264
+ off0x = (curx - 1)
265
+ }
266
+ if ((curx < 0) || ((curx == 0) && (cury < 0))) {
267
+ off0y = (cury + 1)
268
+ } {
269
+ off0y = (cury - 1)
270
+ }
271
+ ; constraint[0] update when xprod >= 0
272
+ ; Recompute off0 with paper rules:
273
+ off0x = curx
274
+ off0y = cury
275
+ if ((cury >= 0) && ((cury > 0) || (curx < 0))) {
276
+ off0x = (curx + 1)
277
+ } {
278
+ off0x = (curx - 1)
279
+ }
280
+ if ((curx <= 0) && ((curx < 0) || (cury < 0))) {
281
+ off0y = (cury + 1)
282
+ } {
283
+ off0y = (cury - 1)
284
+ }
285
+ if ((EvgTraceFit.xprod(c0x c0y off0x off0y)) >= 0) {
286
+ c0x = off0x
287
+ c0y = off0y
288
+ }
289
+ def off1x:int curx
290
+ def off1y:int cury
291
+ if ((cury <= 0) && ((cury < 0) || (curx < 0))) {
292
+ off1x = (curx + 1)
293
+ } {
294
+ off1x = (curx - 1)
295
+ }
296
+ if ((curx >= 0) && ((curx > 0) || (cury < 0))) {
297
+ off1y = (cury + 1)
298
+ } {
299
+ off1y = (cury - 1)
300
+ }
301
+ if ((EvgTraceFit.xprod(c1x c1y off1x off1y)) <= 0) {
302
+ c1x = off1x
303
+ c1y = off1y
304
+ }
305
+ }
306
+ k1 = kk
307
+ kk = (itemAt nc k1)
308
+ if ((EvgTraceFit.cyclic(kk i k1)) == false) {
309
+ guard = (n + 2)
310
+ }
311
+ }
312
+ }
313
+ guard = (guard + 1)
314
+ }
315
+ if (found == false) {
316
+ def pkA:EvgTracePoint (itemAt pts kk)
317
+ def pkB:EvgTracePoint (itemAt pts k1)
318
+ def dkx:int (EvgTraceFit.signI((to_int (pkA.x - pkB.x))))
319
+ def dky:int (EvgTraceFit.signI((to_int (pkA.y - pkB.y))))
320
+ def cur2x:int (to_int (pkB.x - pi2.x))
321
+ def cur2y:int (to_int (pkB.y - pi2.y))
322
+ def a:int (EvgTraceFit.xprod(c0x c0y cur2x cur2y))
323
+ def b:int (EvgTraceFit.xprod(c0x c0y dkx dky))
324
+ def c:int (EvgTraceFit.xprod(c1x c1y cur2x cur2y))
325
+ def d:int (EvgTraceFit.xprod(c1x c1y dkx dky))
326
+ def j:int 10000000
327
+ if (b < 0) {
328
+ j = (idiv a (0 - b))
329
+ }
330
+ if (d > 0) {
331
+ def j2:int (idiv (0 - c) d)
332
+ if (j2 < j) {
333
+ j = j2
334
+ }
335
+ }
336
+ set pivk i (EvgTraceFit.modI((k1 + j) n))
337
+ }
338
+ i = (i - 1)
339
+ }
340
+
341
+ def lonOut:[int]
342
+ i = 0
343
+ while (i < n) {
344
+ push lonOut 0
345
+ i = (i + 1)
346
+ }
347
+ def jLon:int (itemAt pivk (n - 1))
348
+ set lonOut (n - 1) jLon
349
+ i = (n - 2)
350
+ while (i >= 0) {
351
+ if (EvgTraceFit.cyclic((i + 1) (itemAt pivk i) jLon)) {
352
+ jLon = (itemAt pivk i)
353
+ }
354
+ set lonOut i jLon
355
+ i = (i - 1)
356
+ }
357
+ i = (n - 1)
358
+ while (i >= 0) {
359
+ if (EvgTraceFit.cyclic((EvgTraceFit.modI((i + 1) n)) jLon (itemAt lonOut i))) {
360
+ set lonOut i jLon
361
+ i = (i - 1)
362
+ } {
363
+ i = (0 - 1)
364
+ }
365
+ }
366
+ lon = lonOut
367
+ }
368
+
369
+ sfn absI:int (v:int) {
370
+ if (v < 0) {
371
+ return (0 - v)
372
+ }
373
+ return v
374
+ }
375
+
376
+ ; Penalty for a candidate segment i→j (paper §2.2.3).
377
+ fn penalty3:double (i:int jIn:int) {
378
+ def j:int jIn
379
+ def r:int 0
380
+ if (j >= n) {
381
+ j = (j - n)
382
+ r = 1
383
+ }
384
+ def si:EvgTraceSum (itemAt sums i)
385
+ def sj:EvgTraceSum (itemAt sums (j + 1))
386
+ def sn:EvgTraceSum (itemAt sums n)
387
+ def x:double (sj.x - si.x)
388
+ def y:double (sj.y - si.y)
389
+ def x2:double (sj.x2 - si.x2)
390
+ def xy:double (sj.xy - si.xy)
391
+ def y2:double (sj.y2 - si.y2)
392
+ def k:double (to_double ((j + 1) - i))
393
+ if (r != 0) {
394
+ x = (x + sn.x)
395
+ y = (y + sn.y)
396
+ x2 = (x2 + sn.x2)
397
+ xy = (xy + sn.xy)
398
+ y2 = (y2 + sn.y2)
399
+ k = (k + (to_double n))
400
+ }
401
+ def pi:EvgTracePoint (itemAt pts i)
402
+ def pj:EvgTracePoint (itemAt pts j)
403
+ def pOrig:EvgTracePoint (itemAt pts 0)
404
+ def px:double ((((pi.x + pj.x) / 2.0) - pOrig.x))
405
+ def py:double ((((pi.y + pj.y) / 2.0) - pOrig.y))
406
+ def ey:double (pj.x - pi.x)
407
+ def ex:double (0.0 - (pj.y - pi.y))
408
+ def a:double ((((x2 - ((2.0 * x) * px)) / k) + (px * px)))
409
+ def b:double (((((xy - (x * py)) - (y * px)) / k) + (px * py)))
410
+ def c:double ((((y2 - ((2.0 * y) * py)) / k) + (py * py)))
411
+ def s:double ((((ex * ex) * a) + (((2.0 * ex) * ey) * b)) + ((ey * ey) * c))
412
+ if (s < 0.0) {
413
+ s = 0.0
414
+ }
415
+ return (sqrt s)
416
+ }
417
+
418
+ fn bestPolygon:void () {
419
+ def clip0:[int]
420
+ def clip1:[int]
421
+ def seg0:[int]
422
+ def seg1:[int]
423
+ def pen:[double]
424
+ def prev:[int]
425
+ def i:int 0
426
+ while (i < n) {
427
+ push clip0 0
428
+ i = (i + 1)
429
+ }
430
+ i = 0
431
+ while (i <= n) {
432
+ push clip1 0
433
+ push seg0 0
434
+ push seg1 0
435
+ push pen (0.0 - 1.0)
436
+ push prev 0
437
+ i = (i + 1)
438
+ }
439
+ set pen 0 0.0
440
+
441
+ i = 0
442
+ while (i < n) {
443
+ def c:int (EvgTraceFit.modI(((itemAt lon (EvgTraceFit.modI((i - 1) n))) - 1) n))
444
+ if (c == i) {
445
+ c = (EvgTraceFit.modI((i + 1) n))
446
+ }
447
+ if (c < i) {
448
+ set clip0 i n
449
+ } {
450
+ set clip0 i c
451
+ }
452
+ i = (i + 1)
453
+ }
454
+
455
+ def j:int 1
456
+ i = 0
457
+ while (i < n) {
458
+ while (j <= (itemAt clip0 i)) {
459
+ set clip1 j i
460
+ j = (j + 1)
461
+ }
462
+ i = (i + 1)
463
+ }
464
+
465
+ i = 0
466
+ j = 0
467
+ while (i < n) {
468
+ set seg0 j i
469
+ i = (itemAt clip0 i)
470
+ j = (j + 1)
471
+ }
472
+ set seg0 j n
473
+ m = j
474
+
475
+ i = n
476
+ j = m
477
+ while (j > 0) {
478
+ set seg1 j i
479
+ i = (itemAt clip1 i)
480
+ j = (j - 1)
481
+ }
482
+ set seg1 0 0
483
+
484
+ j = 1
485
+ while (j <= m) {
486
+ i = (itemAt seg1 j)
487
+ while (i <= (itemAt seg0 j)) {
488
+ def best:double (0.0 - 1.0)
489
+ def bestK:int 0
490
+ def k:int (itemAt seg0 (j - 1))
491
+ while (k >= (itemAt clip1 i)) {
492
+ def thispen:double (this.penalty3(k i))
493
+ def prevPen:double (itemAt pen k)
494
+ def total:double (thispen + prevPen)
495
+ if ((best < 0.0) || (total < best)) {
496
+ best = total
497
+ bestK = k
498
+ }
499
+ k = (k - 1)
500
+ }
501
+ set pen i best
502
+ set prev i bestK
503
+ i = (i + 1)
504
+ }
505
+ j = (j + 1)
506
+ }
507
+
508
+ def poOut:[int]
509
+ i = 0
510
+ while (i < m) {
511
+ push poOut 0
512
+ i = (i + 1)
513
+ }
514
+ i = n
515
+ j = (m - 1)
516
+ while (i > 0) {
517
+ i = (itemAt prev i)
518
+ set poOut j i
519
+ j = (j - 1)
520
+ }
521
+ po = poOut
522
+ }
523
+
524
+ ; Least-squares vertex placement inside the unit square of each pivot
525
+ ; (Potrace paper §2.2.4 / adjustVertices). For each polygon edge, fit a
526
+ ; line (centroid + direction) to the underlying path points; at each
527
+ ; vertex minimise the sum of squared distances to the two adjacent lines,
528
+ ; clamped to the 1×1 pixel square around the integer pivot.
529
+ fn adjustVertices:void () {
530
+ def ctr:[EvgTracePoint]
531
+ def dir:[EvgTracePoint]
532
+ def i:int 0
533
+ while (i < m) {
534
+ push ctr (EvgTracePoint.of(0.0 0.0))
535
+ push dir (EvgTracePoint.of(0.0 0.0))
536
+ i = (i + 1)
537
+ }
538
+ i = 0
539
+ while (i < m) {
540
+ def j:int (itemAt po (EvgTraceFit.modI((i + 1) m)))
541
+ def jj:int ((EvgTraceFit.modI((j - (itemAt po i)) n)) + (itemAt po i))
542
+ def c:EvgTracePoint (EvgTracePoint.of(0.0 0.0))
543
+ def d:EvgTracePoint (EvgTracePoint.of(0.0 0.0))
544
+ this.pointslope((itemAt po i) jj c d)
545
+ set ctr i c
546
+ set dir i d
547
+ i = (i + 1)
548
+ }
549
+
550
+ ; Quadratic forms Q[i]: v^T Q v = squared distance to line i.
551
+ ; Stored as 9 doubles per edge: row-major 3×3.
552
+ def qdata:[double]
553
+ i = 0
554
+ while (i < (m * 9)) {
555
+ push qdata 0.0
556
+ i = (i + 1)
557
+ }
558
+ i = 0
559
+ while (i < m) {
560
+ def di:EvgTracePoint (itemAt dir i)
561
+ def ci:EvgTracePoint (itemAt ctr i)
562
+ def d2:double ((di.x * di.x) + (di.y * di.y))
563
+ def base:int (i * 9)
564
+ if (d2 == 0.0) {
565
+ ; zero form already
566
+ } {
567
+ def v0:double di.y
568
+ def v1:double (0.0 - di.x)
569
+ def v2:double ((0.0 - (v1 * ci.y)) - (v0 * ci.x))
570
+ def l:int 0
571
+ while (l < 3) {
572
+ def k:int 0
573
+ while (k < 3) {
574
+ def vl:double v0
575
+ if (l == 1) { vl = v1 }
576
+ if (l == 2) { vl = v2 }
577
+ def vk:double v0
578
+ if (k == 1) { vk = v1 }
579
+ if (k == 2) { vk = v2 }
580
+ set qdata ((base + (l * 3)) + k) ((vl * vk) / d2)
581
+ k = (k + 1)
582
+ }
583
+ l = (l + 1)
584
+ }
585
+ }
586
+ i = (i + 1)
587
+ }
588
+
589
+ def out:[EvgTracePoint]
590
+ i = 0
591
+ while (i < m) {
592
+ def iPrev:int (EvgTraceFit.modI((i - 1) m))
593
+ def Q:[double]
594
+ def t:int 0
595
+ while (t < 9) {
596
+ push Q 0.0
597
+ t = (t + 1)
598
+ }
599
+ t = 0
600
+ while (t < 9) {
601
+ def a:double (itemAt qdata ((iPrev * 9) + t))
602
+ def b:double (itemAt qdata ((i * 9) + t))
603
+ set Q t (a + b)
604
+ t = (t + 1)
605
+ }
606
+ def pCur:EvgTracePoint (itemAt pts (itemAt po i))
607
+ def sx:double (pCur.x - x0)
608
+ def sy:double (pCur.y - y0)
609
+ def wx:double sx
610
+ def wy:double sy
611
+
612
+ ; Try to solve the 2×2 system from ∂Q/∂x = ∂Q/∂y = 0.
613
+ def q00:double (itemAt Q 0)
614
+ def q01:double (itemAt Q 1)
615
+ def q02:double (itemAt Q 2)
616
+ def q10:double (itemAt Q 3)
617
+ def q11:double (itemAt Q 4)
618
+ def q12:double (itemAt Q 5)
619
+ def det:double ((q00 * q11) - (q01 * q10))
620
+ def solved:boolean false
621
+ if (det != 0.0) {
622
+ wx = ((((0.0 - q02) * q11) + (q12 * q01)) / det)
623
+ wy = (((q02 * q10) - (q12 * q00)) / det)
624
+ solved = true
625
+ }
626
+ def dx:double (EvgTraceFit.absD((wx - sx)))
627
+ def dy:double (EvgTraceFit.absD((wy - sy)))
628
+ if ((solved == false) || (dx > 0.5) || (dy > 0.5)) {
629
+ ; Fall back: pick the minimum of Q over the unit square corners
630
+ ; and edge midpoints around the pivot.
631
+ def best:double (this.quadform(Q sx sy))
632
+ def bx:double sx
633
+ def by:double sy
634
+ def cand:[double]
635
+ ; edges
636
+ push cand (sx - 0.5)
637
+ push cand sy
638
+ push cand (sx + 0.5)
639
+ push cand sy
640
+ push cand sx
641
+ push cand (sy - 0.5)
642
+ push cand sx
643
+ push cand (sy + 0.5)
644
+ ; corners
645
+ push cand (sx - 0.5)
646
+ push cand (sy - 0.5)
647
+ push cand (sx + 0.5)
648
+ push cand (sy - 0.5)
649
+ push cand (sx - 0.5)
650
+ push cand (sy + 0.5)
651
+ push cand (sx + 0.5)
652
+ push cand (sy + 0.5)
653
+ def ci:int 0
654
+ while (ci < (array_length cand)) {
655
+ def cx:double (itemAt cand ci)
656
+ def cy:double (itemAt cand (ci + 1))
657
+ def val:double (this.quadform(Q cx cy))
658
+ if (val < best) {
659
+ best = val
660
+ bx = cx
661
+ by = cy
662
+ }
663
+ ci = (ci + 2)
664
+ }
665
+ wx = bx
666
+ wy = by
667
+ }
668
+ if (wx < (sx - 0.5)) { wx = (sx - 0.5) }
669
+ if (wx > (sx + 0.5)) { wx = (sx + 0.5) }
670
+ if (wy < (sy - 0.5)) { wy = (sy - 0.5) }
671
+ if (wy > (sy + 0.5)) { wy = (sy + 0.5) }
672
+ push out (EvgTracePoint.of((wx + x0) (wy + y0)))
673
+ i = (i + 1)
674
+ }
675
+ vertex = out
676
+ }
677
+
678
+ fn quadform:double (Q:[double] x:double y:double) {
679
+ def v0:double x
680
+ def v1:double y
681
+ def v2:double 1.0
682
+ def sum:double 0.0
683
+ def i:int 0
684
+ while (i < 3) {
685
+ def vi:double v0
686
+ if (i == 1) { vi = v1 }
687
+ if (i == 2) { vi = v2 }
688
+ def j:int 0
689
+ while (j < 3) {
690
+ def vj:double v0
691
+ if (j == 1) { vj = v1 }
692
+ if (j == 2) { vj = v2 }
693
+ def qij:double (itemAt Q ((i * 3) + j))
694
+ sum = (sum + ((vi * qij) * vj))
695
+ j = (j + 1)
696
+ }
697
+ i = (i + 1)
698
+ }
699
+ return sum
700
+ }
701
+
702
+ ; Fit centroid + unit direction of the path from i to j (inclusive wrap).
703
+ fn pointslope:void (iIn:int jIn:int ctr:EvgTracePoint dir:EvgTracePoint) {
704
+ def i:int iIn
705
+ def j:int jIn
706
+ def r:int 0
707
+ while (j >= n) {
708
+ j = (j - n)
709
+ r = (r + 1)
710
+ }
711
+ while (i >= n) {
712
+ i = (i - n)
713
+ r = (r - 1)
714
+ }
715
+ while (j < 0) {
716
+ j = (j + n)
717
+ r = (r - 1)
718
+ }
719
+ while (i < 0) {
720
+ i = (i + n)
721
+ r = (r + 1)
722
+ }
723
+ def si:EvgTraceSum (itemAt sums i)
724
+ def sj:EvgTraceSum (itemAt sums (j + 1))
725
+ def sn:EvgTraceSum (itemAt sums n)
726
+ def x:double ((sj.x - si.x) + ((to_double r) * sn.x))
727
+ def y:double ((sj.y - si.y) + ((to_double r) * sn.y))
728
+ def x2:double ((sj.x2 - si.x2) + ((to_double r) * sn.x2))
729
+ def xy:double ((sj.xy - si.xy) + ((to_double r) * sn.xy))
730
+ def y2:double ((sj.y2 - si.y2) + ((to_double r) * sn.y2))
731
+ def k:double (to_double (((j + 1) - i) + (r * n)))
732
+ if (k == 0.0) {
733
+ ctr.x = 0.0
734
+ ctr.y = 0.0
735
+ dir.x = 0.0
736
+ dir.y = 0.0
737
+ return
738
+ }
739
+ ctr.x = (x / k)
740
+ ctr.y = (y / k)
741
+ def a:double (((x2 - ((x * x) / k)) / k))
742
+ def b:double (((xy - ((x * y) / k)) / k))
743
+ def c:double (((y2 - ((y * y) / k)) / k))
744
+ def disc:double (((a - c) * (a - c)) + ((4.0 * b) * b))
745
+ def lambda2:double (((a + c) + (sqrt disc)) / 2.0)
746
+ a = (a - lambda2)
747
+ c = (c - lambda2)
748
+ def l:double 0.0
749
+ if ((EvgTraceFit.absD(a)) >= (EvgTraceFit.absD(c))) {
750
+ l = (sqrt ((a * a) + (b * b)))
751
+ if (l != 0.0) {
752
+ dir.x = ((0.0 - b) / l)
753
+ dir.y = (a / l)
754
+ }
755
+ } {
756
+ l = (sqrt ((c * c) + (b * b)))
757
+ if (l != 0.0) {
758
+ dir.x = ((0.0 - c) / l)
759
+ dir.y = (b / l)
760
+ }
761
+ }
762
+ if (l == 0.0) {
763
+ dir.x = 0.0
764
+ dir.y = 0.0
765
+ }
766
+ }
767
+ }