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,648 @@
1
+ ; SPDX-License-Identifier: MIT
2
+
3
+ ; ==============================================================================
4
+ ; EvgTraceCurve.rgr — alphamax smooth + optiCurve (Potrace paper §2.3–2.4)
5
+ ; ==============================================================================
6
+ ;
7
+ ; After EvgTraceFit produces an optimal polygon, this stage:
8
+ ; 1. classifies each vertex as CORNER or CURVE via alphamax
9
+ ; 2. optionally joins consecutive CURVE spans (optiCurve / -O)
10
+ ; 3. emits PathCommands
11
+ ;
12
+ ; Corner-only rings (axis-aligned rects) emit the polygon vertices directly —
13
+ ; the same compact form the Potrace CLI SVG backend produces for those shapes.
14
+ ;
15
+ ; Clean-room from the published algorithm description, not a GPL port.
16
+ ; ==============================================================================
17
+
18
+ Import "EvgTraceTypes.rgr"
19
+ Import "VectorShapes.rgr"
20
+
21
+ ; One candidate join produced by opti_penalty.
22
+ class EvgTraceOpti {
23
+ def pen:double 0.0
24
+ def c0:EvgTracePoint (EvgTracePoint.of(0.0 0.0))
25
+ def c1:EvgTracePoint (EvgTracePoint.of(0.0 0.0))
26
+ def t:double 0.0
27
+ def s:double 0.0
28
+ def alpha:double 0.0
29
+ def ok:boolean false
30
+
31
+ Constructor () {
32
+ }
33
+ }
34
+
35
+ class EvgTraceCurve {
36
+ def n:int 0
37
+ def tag:[string]
38
+ def vertex:[EvgTracePoint]
39
+ def c0:[EvgTracePoint]
40
+ def c1:[EvgTracePoint]
41
+ def c2:[EvgTracePoint]
42
+ def alpha:[double]
43
+ def alpha0:[double]
44
+ def beta:[double]
45
+
46
+ Constructor () {
47
+ def t:[string]
48
+ tag = t
49
+ def v:[EvgTracePoint]
50
+ vertex = v
51
+ def a:[EvgTracePoint]
52
+ c0 = a
53
+ def b:[EvgTracePoint]
54
+ c1 = b
55
+ def c:[EvgTracePoint]
56
+ c2 = c
57
+ def al:[double]
58
+ alpha = al
59
+ def a0:[double]
60
+ alpha0 = a0
61
+ def be:[double]
62
+ beta = be
63
+ }
64
+
65
+ sfn alloc:EvgTraceCurve (n:int) {
66
+ def curve (new EvgTraceCurve())
67
+ curve.n = n
68
+ def i:int 0
69
+ while (i < n) {
70
+ push curve.tag "CURVE"
71
+ push curve.vertex (EvgTracePoint.of(0.0 0.0))
72
+ push curve.c0 (EvgTracePoint.of(0.0 0.0))
73
+ push curve.c1 (EvgTracePoint.of(0.0 0.0))
74
+ push curve.c2 (EvgTracePoint.of(0.0 0.0))
75
+ push curve.alpha 0.0
76
+ push curve.alpha0 0.0
77
+ push curve.beta 0.5
78
+ i = (i + 1)
79
+ }
80
+ return curve
81
+ }
82
+
83
+ sfn modI:int (a:int n:int) {
84
+ if (n <= 0) {
85
+ return 0
86
+ }
87
+ def r:int (a - ((idiv a n) * n))
88
+ if (r < 0) {
89
+ r = (r + n)
90
+ }
91
+ return r
92
+ }
93
+
94
+ sfn absD:double (v:double) {
95
+ if (v < 0.0) {
96
+ return (0.0 - v)
97
+ }
98
+ return v
99
+ }
100
+
101
+ sfn signD:int (v:double) {
102
+ if (v > 0.0) {
103
+ return 1
104
+ }
105
+ if (v < 0.0) {
106
+ return (0 - 1)
107
+ }
108
+ return 0
109
+ }
110
+
111
+ sfn interval:EvgTracePoint (lambda:double a:EvgTracePoint b:EvgTracePoint) {
112
+ return (EvgTracePoint.of(((a.x * (1.0 - lambda)) + (b.x * lambda)) ((a.y * (1.0 - lambda)) + (b.y * lambda))))
113
+ }
114
+
115
+ sfn dpara:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint) {
116
+ def x1:double (p1.x - p0.x)
117
+ def y1:double (p1.y - p0.y)
118
+ def x2:double (p2.x - p0.x)
119
+ def y2:double (p2.y - p0.y)
120
+ return ((x1 * y2) - (y1 * x2))
121
+ }
122
+
123
+ sfn cprod:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint p3:EvgTracePoint) {
124
+ def x1:double (p1.x - p0.x)
125
+ def y1:double (p1.y - p0.y)
126
+ def x2:double (p3.x - p2.x)
127
+ def y2:double (p3.y - p2.y)
128
+ return ((x1 * y2) - (y1 * x2))
129
+ }
130
+
131
+ sfn iprod:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint) {
132
+ def x1:double (p1.x - p0.x)
133
+ def y1:double (p1.y - p0.y)
134
+ def x2:double (p2.x - p0.x)
135
+ def y2:double (p2.y - p0.y)
136
+ return ((x1 * x2) + (y1 * y2))
137
+ }
138
+
139
+ sfn iprod1:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint p3:EvgTracePoint) {
140
+ def x1:double (p1.x - p0.x)
141
+ def y1:double (p1.y - p0.y)
142
+ def x2:double (p3.x - p2.x)
143
+ def y2:double (p3.y - p2.y)
144
+ return ((x1 * x2) + (y1 * y2))
145
+ }
146
+
147
+ sfn ddist:double (p:EvgTracePoint q:EvgTracePoint) {
148
+ def dx:double (p.x - q.x)
149
+ def dy:double (p.y - q.y)
150
+ return (sqrt ((dx * dx) + (dy * dy)))
151
+ }
152
+
153
+ sfn ddenom:double (p0:EvgTracePoint p2:EvgTracePoint) {
154
+ def ax:double (EvgTraceCurve.absD((p0.x - p2.x)))
155
+ def ay:double (EvgTraceCurve.absD((p0.y - p2.y)))
156
+ return (ax + ay)
157
+ }
158
+
159
+ sfn bezierAt:EvgTracePoint (t:double p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint p3:EvgTracePoint) {
160
+ def s:double (1.0 - t)
161
+ def s2:double (s * s)
162
+ def t2:double (t * t)
163
+ def x:double ((((s2 * s) * p0.x) + (((3.0 * s2) * t) * p1.x)) + ((((3.0 * t2) * s) * p2.x) + ((t2 * t) * p3.x)))
164
+ def y:double ((((s2 * s) * p0.y) + (((3.0 * s2) * t) * p1.y)) + ((((3.0 * t2) * s) * p2.y) + ((t2 * t) * p3.y)))
165
+ return (EvgTracePoint.of(x y))
166
+ }
167
+
168
+ ; Parameter t in [0,1] where the cubic is tangent to line q0→q1, or -1.
169
+ sfn tangent:double (p0:EvgTracePoint p1:EvgTracePoint p2:EvgTracePoint p3:EvgTracePoint q0:EvgTracePoint q1:EvgTracePoint) {
170
+ def A:double (EvgTraceCurve.cprod(p0 p1 q0 q1))
171
+ def B:double (EvgTraceCurve.cprod(p1 p2 q0 q1))
172
+ def C:double (EvgTraceCurve.cprod(p2 p3 q0 q1))
173
+ def a:double ((A - (2.0 * B)) + C)
174
+ def b:double ((0.0 - (2.0 * A)) + (2.0 * B))
175
+ def c:double A
176
+ def disc:double ((b * b) - ((4.0 * a) * c))
177
+ if (a == 0.0) {
178
+ return (0.0 - 1.0)
179
+ }
180
+ if (disc < 0.0) {
181
+ return (0.0 - 1.0)
182
+ }
183
+ def s:double (sqrt disc)
184
+ def r1:double (((0.0 - b) + s) / (2.0 * a))
185
+ def r2:double (((0.0 - b) - s) / (2.0 * a))
186
+ if ((r1 >= 0.0) && (r1 <= 1.0)) {
187
+ return r1
188
+ }
189
+ if ((r2 >= 0.0) && (r2 <= 1.0)) {
190
+ return r2
191
+ }
192
+ return (0.0 - 1.0)
193
+ }
194
+
195
+ ; ------------------------------------------------------------------
196
+ ; Build a curve from an adjusted polygon (alphamax smooth).
197
+ ; ------------------------------------------------------------------
198
+ sfn fromPolygon:EvgTraceCurve (poly:[EvgTracePoint] alphamax:double) {
199
+ def m:int (array_length poly)
200
+ def curve:EvgTraceCurve (EvgTraceCurve.alloc(m))
201
+ if (m < 3) {
202
+ return curve
203
+ }
204
+ def i:int 0
205
+ while (i < m) {
206
+ set curve.vertex i (itemAt poly i)
207
+ i = (i + 1)
208
+ }
209
+ i = 0
210
+ while (i < m) {
211
+ def j:int (EvgTraceCurve.modI((i + 1) m))
212
+ def k:int (EvgTraceCurve.modI((i + 2) m))
213
+ def vi:EvgTracePoint (itemAt curve.vertex i)
214
+ def vj:EvgTracePoint (itemAt curve.vertex j)
215
+ def vk:EvgTracePoint (itemAt curve.vertex k)
216
+ def p4:EvgTracePoint (EvgTraceCurve.interval(0.5 vk vj))
217
+ def denom:double (EvgTraceCurve.ddenom(vi vk))
218
+ def alpha:double (4.0 / 3.0)
219
+ if (denom != 0.0) {
220
+ def para:double (EvgTraceCurve.dpara(vi vj vk))
221
+ def ratio:double (para / denom)
222
+ def dd:double (EvgTraceCurve.absD(ratio))
223
+ if (dd > 1.0) {
224
+ alpha = (1.0 - (1.0 / dd))
225
+ } {
226
+ alpha = 0.0
227
+ }
228
+ alpha = (alpha / 0.75)
229
+ }
230
+ set curve.alpha0 j alpha
231
+ if (alpha >= alphamax) {
232
+ set curve.tag j "CORNER"
233
+ set curve.c1 j vj
234
+ set curve.c2 j p4
235
+ set curve.alpha j alpha
236
+ } {
237
+ def a2:double alpha
238
+ if (a2 < 0.55) {
239
+ a2 = 0.55
240
+ }
241
+ if (a2 > 1.0) {
242
+ a2 = 1.0
243
+ }
244
+ def p2:EvgTracePoint (EvgTraceCurve.interval((0.5 + (0.5 * a2)) vi vj))
245
+ def p3:EvgTracePoint (EvgTraceCurve.interval((0.5 + (0.5 * a2)) vk vj))
246
+ set curve.tag j "CURVE"
247
+ set curve.c0 j p2
248
+ set curve.c1 j p3
249
+ set curve.c2 j p4
250
+ set curve.alpha j a2
251
+ }
252
+ set curve.beta j 0.5
253
+ i = (i + 1)
254
+ }
255
+ return curve
256
+ }
257
+
258
+ fn curveCount:int () {
259
+ def nC:int 0
260
+ def i:int 0
261
+ while (i < n) {
262
+ if ((itemAt tag i) == "CURVE") {
263
+ nC = (nC + 1)
264
+ }
265
+ i = (i + 1)
266
+ }
267
+ return nC
268
+ }
269
+
270
+ fn cornerCount:int () {
271
+ def nC:int 0
272
+ def i:int 0
273
+ while (i < n) {
274
+ if ((itemAt tag i) == "CORNER") {
275
+ nC = (nC + 1)
276
+ }
277
+ i = (i + 1)
278
+ }
279
+ return nC
280
+ }
281
+
282
+ ; ------------------------------------------------------------------
283
+ ; optiCurve — join consecutive CURVE spans within opttolerance.
284
+ ; ------------------------------------------------------------------
285
+ fn optimize:EvgTraceCurve (opttolerance:double) {
286
+ if (n < 3) {
287
+ return this
288
+ }
289
+ if ((this.curveCount()) < 2) {
290
+ return this
291
+ }
292
+ def convc:[int]
293
+ def areac:[double]
294
+ def i:int 0
295
+ while (i < n) {
296
+ push convc 0
297
+ i = (i + 1)
298
+ }
299
+ push areac 0.0
300
+ i = 0
301
+ while (i < n) {
302
+ if ((itemAt tag i) == "CURVE") {
303
+ def iPrev:int (EvgTraceCurve.modI((i - 1) n))
304
+ def iNext:int (EvgTraceCurve.modI((i + 1) n))
305
+ def para:double (EvgTraceCurve.dpara((itemAt vertex iPrev) (itemAt vertex i) (itemAt vertex iNext)))
306
+ set convc i (EvgTraceCurve.signD(para))
307
+ } {
308
+ set convc i 0
309
+ }
310
+ i = (i + 1)
311
+ }
312
+ def area:double 0.0
313
+ def p0:EvgTracePoint (itemAt vertex 0)
314
+ i = 0
315
+ while (i < n) {
316
+ def i1:int (EvgTraceCurve.modI((i + 1) n))
317
+ if ((itemAt tag i1) == "CURVE") {
318
+ def al:double (itemAt alpha i1)
319
+ def d1:double (EvgTraceCurve.dpara((itemAt c2 i) (itemAt vertex i1) (itemAt c2 i1)))
320
+ area = (area + (((0.3 * al) * (4.0 - al)) * (d1 / 2.0)))
321
+ def d2:double (EvgTraceCurve.dpara(p0 (itemAt c2 i) (itemAt c2 i1)))
322
+ area = (area + (d2 / 2.0))
323
+ }
324
+ push areac area
325
+ i = (i + 1)
326
+ }
327
+
328
+ def pt:[int]
329
+ def pen:[double]
330
+ def lenArr:[int]
331
+ def optPen:[double]
332
+ def optC0:[EvgTracePoint]
333
+ def optC1:[EvgTracePoint]
334
+ def optT:[double]
335
+ def optS:[double]
336
+ def optAlpha:[double]
337
+ def optValid:[int]
338
+ i = 0
339
+ while (i <= n) {
340
+ push pt (0 - 1)
341
+ push pen 0.0
342
+ push lenArr 0
343
+ push optPen 0.0
344
+ push optC0 (EvgTracePoint.of(0.0 0.0))
345
+ push optC1 (EvgTracePoint.of(0.0 0.0))
346
+ push optT 0.0
347
+ push optS 0.0
348
+ push optAlpha 0.0
349
+ push optValid 0
350
+ i = (i + 1)
351
+ }
352
+ set pt 0 (0 - 1)
353
+ set pen 0 0.0
354
+ set lenArr 0 0
355
+
356
+ def j:int 1
357
+ while (j <= n) {
358
+ set pt j (j - 1)
359
+ set pen j (itemAt pen (j - 1))
360
+ set lenArr j ((itemAt lenArr (j - 1)) + 1)
361
+ def iBack:int (j - 2)
362
+ while (iBack >= 0) {
363
+ def res:EvgTraceOpti (this.optiPenalty(iBack (EvgTraceCurve.modI(j n)) opttolerance convc areac))
364
+ if (res.ok == false) {
365
+ iBack = (0 - 1)
366
+ } {
367
+ def lenJ:int (itemAt lenArr j)
368
+ def lenI:int (itemAt lenArr iBack)
369
+ def penJ:double (itemAt pen j)
370
+ def penI:double (itemAt pen iBack)
371
+ def better:boolean false
372
+ if (lenJ > (lenI + 1)) {
373
+ better = true
374
+ }
375
+ if ((lenJ == (lenI + 1)) && (penJ > (penI + res.pen))) {
376
+ better = true
377
+ }
378
+ if better {
379
+ set pt j iBack
380
+ set pen j (penI + res.pen)
381
+ set lenArr j (lenI + 1)
382
+ set optPen j res.pen
383
+ def jc0:EvgTracePoint res.c0
384
+ def jc1:EvgTracePoint res.c1
385
+ set optC0 j jc0
386
+ set optC1 j jc1
387
+ set optT j res.t
388
+ set optS j res.s
389
+ set optAlpha j res.alpha
390
+ set optValid j 1
391
+ }
392
+ iBack = (iBack - 1)
393
+ }
394
+ }
395
+ j = (j + 1)
396
+ }
397
+
398
+ def om:int (itemAt lenArr n)
399
+ if (om >= n) {
400
+ ; No joins found — keep the original curve.
401
+ return this
402
+ }
403
+ if (om < 3) {
404
+ return this
405
+ }
406
+ def ocurve:EvgTraceCurve (EvgTraceCurve.alloc(om))
407
+ def sArr:[double]
408
+ def tArr:[double]
409
+ i = 0
410
+ while (i < om) {
411
+ push sArr 1.0
412
+ push tArr 1.0
413
+ i = (i + 1)
414
+ }
415
+ j = n
416
+ i = (om - 1)
417
+ while (i >= 0) {
418
+ def prevJ:int (itemAt pt j)
419
+ if (prevJ == (j - 1)) {
420
+ def idx:int (EvgTraceCurve.modI(j n))
421
+ set ocurve.tag i (itemAt tag idx)
422
+ set ocurve.c0 i (itemAt c0 idx)
423
+ set ocurve.c1 i (itemAt c1 idx)
424
+ set ocurve.c2 i (itemAt c2 idx)
425
+ set ocurve.vertex i (itemAt vertex idx)
426
+ set ocurve.alpha i (itemAt alpha idx)
427
+ set ocurve.alpha0 i (itemAt alpha0 idx)
428
+ set ocurve.beta i (itemAt beta idx)
429
+ set sArr i 1.0
430
+ set tArr i 1.0
431
+ } {
432
+ def idx2:int (EvgTraceCurve.modI(j n))
433
+ set ocurve.tag i "CURVE"
434
+ set ocurve.c0 i (itemAt optC0 j)
435
+ set ocurve.c1 i (itemAt optC1 j)
436
+ set ocurve.c2 i (itemAt c2 idx2)
437
+ def sVal:double (itemAt optS j)
438
+ def newV:EvgTracePoint (EvgTraceCurve.interval(sVal (itemAt c2 idx2) (itemAt vertex idx2)))
439
+ set ocurve.vertex i newV
440
+ set ocurve.alpha i (itemAt optAlpha j)
441
+ set ocurve.alpha0 i (itemAt optAlpha j)
442
+ set sArr i (itemAt optS j)
443
+ set tArr i (itemAt optT j)
444
+ }
445
+ j = prevJ
446
+ i = (i - 1)
447
+ }
448
+ i = 0
449
+ while (i < om) {
450
+ def i1:int (EvgTraceCurve.modI((i + 1) om))
451
+ def s0:double (itemAt sArr i)
452
+ def t1:double (itemAt tArr i1)
453
+ def denom:double (s0 + t1)
454
+ if (denom == 0.0) {
455
+ set ocurve.beta i 0.5
456
+ } {
457
+ set ocurve.beta i (s0 / denom)
458
+ }
459
+ i = (i + 1)
460
+ }
461
+ return ocurve
462
+ }
463
+
464
+ ; Returns res.ok=false when the span i..j cannot be joined.
465
+ fn optiPenalty:EvgTraceOpti (i:int j:int opttolerance:double convc:[int] areac:[double]) {
466
+ def res (new EvgTraceOpti())
467
+ res.ok = false
468
+ if (i == j) {
469
+ return res
470
+ }
471
+ def m:int n
472
+ def k:int i
473
+ def i1:int (EvgTraceCurve.modI((i + 1) m))
474
+ def k1:int (EvgTraceCurve.modI((k + 1) m))
475
+ def conv:int (itemAt convc k1)
476
+ if (conv == 0) {
477
+ return res
478
+ }
479
+ def d:double (EvgTraceCurve.ddist((itemAt vertex i) (itemAt vertex i1)))
480
+ k = k1
481
+ while (k != j) {
482
+ k1 = (EvgTraceCurve.modI((k + 1) m))
483
+ def k2:int (EvgTraceCurve.modI((k + 2) m))
484
+ if ((itemAt convc k1) != conv) {
485
+ return res
486
+ }
487
+ def cp:double (EvgTraceCurve.cprod((itemAt vertex i) (itemAt vertex i1) (itemAt vertex k1) (itemAt vertex k2)))
488
+ if ((EvgTraceCurve.signD(cp)) != conv) {
489
+ return res
490
+ }
491
+ def ip:double (EvgTraceCurve.iprod1((itemAt vertex i) (itemAt vertex i1) (itemAt vertex k1) (itemAt vertex k2)))
492
+ def d2:double (EvgTraceCurve.ddist((itemAt vertex k1) (itemAt vertex k2)))
493
+ if (ip < ((d * d2) * (0.0 - 0.999847695156))) {
494
+ return res
495
+ }
496
+ k = k1
497
+ }
498
+
499
+ def p0:EvgTracePoint (itemAt c2 (EvgTraceCurve.modI(i m)))
500
+ def p1:EvgTracePoint (itemAt vertex (EvgTraceCurve.modI((i + 1) m)))
501
+ def p2:EvgTracePoint (itemAt vertex (EvgTraceCurve.modI(j m)))
502
+ def p3:EvgTracePoint (itemAt c2 (EvgTraceCurve.modI(j m)))
503
+
504
+ def area:double ((itemAt areac j) - (itemAt areac i))
505
+ def areaAdj:double (EvgTraceCurve.dpara((itemAt vertex 0) (itemAt c2 i) (itemAt c2 j)))
506
+ area = (area - (areaAdj / 2.0))
507
+ if (i >= j) {
508
+ area = (area + (itemAt areac m))
509
+ }
510
+
511
+ def A1:double (EvgTraceCurve.dpara(p0 p1 p2))
512
+ def A2:double (EvgTraceCurve.dpara(p0 p1 p3))
513
+ def A3:double (EvgTraceCurve.dpara(p0 p2 p3))
514
+ def A4:double ((A1 + A3) - A2)
515
+ if (A2 == A1) {
516
+ return res
517
+ }
518
+ def t:double (A3 / (A3 - A4))
519
+ def s:double (A2 / (A2 - A1))
520
+ def A:double ((A2 * t) / 2.0)
521
+ if (A == 0.0) {
522
+ return res
523
+ }
524
+ def R:double (area / A)
525
+ def inner:double (4.0 - (R / 0.3))
526
+ if (inner < 0.0) {
527
+ return res
528
+ }
529
+ def joinAlpha:double (2.0 - (sqrt inner))
530
+ res.c0 = (EvgTraceCurve.interval((t * joinAlpha) p0 p1))
531
+ res.c1 = (EvgTraceCurve.interval((s * joinAlpha) p3 p2))
532
+ res.alpha = joinAlpha
533
+ res.t = t
534
+ res.s = s
535
+ res.pen = 0.0
536
+
537
+ def q0:EvgTracePoint p0
538
+ def q1:EvgTracePoint (EvgTracePoint.of(res.c0.x res.c0.y))
539
+ def q2:EvgTracePoint (EvgTracePoint.of(res.c1.x res.c1.y))
540
+ def q3:EvgTracePoint p3
541
+
542
+ k = (EvgTraceCurve.modI((i + 1) m))
543
+ while (k != j) {
544
+ k1 = (EvgTraceCurve.modI((k + 1) m))
545
+ def vk:EvgTracePoint (itemAt vertex k)
546
+ def vk1:EvgTracePoint (itemAt vertex k1)
547
+ def tv:double (EvgTraceCurve.tangent(q0 q1 q2 q3 vk vk1))
548
+ if (tv < (0.0 - 0.5)) {
549
+ return res
550
+ }
551
+ def bezPt:EvgTracePoint (EvgTraceCurve.bezierAt(tv q0 q1 q2 q3))
552
+ def dd:double (EvgTraceCurve.ddist(vk vk1))
553
+ if (dd == 0.0) {
554
+ return res
555
+ }
556
+ def d1:double (EvgTraceCurve.dpara(vk vk1 bezPt))
557
+ d1 = (d1 / dd)
558
+ if ((EvgTraceCurve.absD(d1)) > opttolerance) {
559
+ return res
560
+ }
561
+ if ((EvgTraceCurve.iprod(vk vk1 bezPt)) < 0.0) {
562
+ return res
563
+ }
564
+ if ((EvgTraceCurve.iprod(vk1 vk bezPt)) < 0.0) {
565
+ return res
566
+ }
567
+ res.pen = (res.pen + (d1 * d1))
568
+ k = k1
569
+ }
570
+
571
+ k = i
572
+ while (k != j) {
573
+ k1 = (EvgTraceCurve.modI((k + 1) m))
574
+ def ck:EvgTracePoint (itemAt c2 k)
575
+ def ck1:EvgTracePoint (itemAt c2 k1)
576
+ def tv2:double (EvgTraceCurve.tangent(q0 q1 q2 q3 ck ck1))
577
+ if (tv2 < (0.0 - 0.5)) {
578
+ return res
579
+ }
580
+ def bezPt2:EvgTracePoint (EvgTraceCurve.bezierAt(tv2 q0 q1 q2 q3))
581
+ def dd2:double (EvgTraceCurve.ddist(ck ck1))
582
+ if (dd2 == 0.0) {
583
+ return res
584
+ }
585
+ def d1b:double (EvgTraceCurve.dpara(ck ck1 bezPt2))
586
+ d1b = (d1b / dd2)
587
+ def vk1b:EvgTracePoint (itemAt vertex k1)
588
+ def d2b:double (EvgTraceCurve.dpara(ck ck1 vk1b))
589
+ d2b = (d2b / dd2)
590
+ def ak1:double (itemAt alpha k1)
591
+ d2b = (d2b * (0.75 * ak1))
592
+ if (d2b < 0.0) {
593
+ d1b = (0.0 - d1b)
594
+ d2b = (0.0 - d2b)
595
+ }
596
+ if (d1b < (d2b - opttolerance)) {
597
+ return res
598
+ }
599
+ if (d1b < d2b) {
600
+ def diff:double (d1b - d2b)
601
+ res.pen = (res.pen + (diff * diff))
602
+ }
603
+ k = k1
604
+ }
605
+ res.ok = true
606
+ return res
607
+ }
608
+
609
+ ; ------------------------------------------------------------------
610
+ ; Emit path commands.
611
+ ; ------------------------------------------------------------------
612
+ fn emit:void (out:[PathCommand]) {
613
+ if (n < 3) {
614
+ return
615
+ }
616
+ ; Corner-only ring → compact polygon through the vertices (CLI style).
617
+ if ((this.curveCount()) == 0) {
618
+ def v0:EvgTracePoint (itemAt vertex 0)
619
+ push out (VectorShapes.moveTo(v0.x v0.y))
620
+ def i:int 1
621
+ while (i < n) {
622
+ def v:EvgTracePoint (itemAt vertex i)
623
+ push out (VectorShapes.lineTo(v.x v.y))
624
+ i = (i + 1)
625
+ }
626
+ push out (VectorShapes.closePath())
627
+ return
628
+ }
629
+ def start:EvgTracePoint (itemAt c2 (n - 1))
630
+ push out (VectorShapes.moveTo(start.x start.y))
631
+ def i2:int 0
632
+ while (i2 < n) {
633
+ def tg:string (itemAt tag i2)
634
+ def endP:EvgTracePoint (itemAt c2 i2)
635
+ if (tg == "CORNER") {
636
+ def corner:EvgTracePoint (itemAt c1 i2)
637
+ push out (VectorShapes.lineTo(corner.x corner.y))
638
+ push out (VectorShapes.lineTo(endP.x endP.y))
639
+ } {
640
+ def a:EvgTracePoint (itemAt c0 i2)
641
+ def b:EvgTracePoint (itemAt c1 i2)
642
+ push out (VectorShapes.cubicTo(a.x a.y b.x b.y endP.x endP.y))
643
+ }
644
+ i2 = (i2 + 1)
645
+ }
646
+ push out (VectorShapes.closePath())
647
+ }
648
+ }