@revideo/2d 0.1.0

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 (454) hide show
  1. package/LICENSE +21 -0
  2. package/editor/index.css +33 -0
  3. package/editor/index.js +340 -0
  4. package/editor/index.js.map +1 -0
  5. package/lib/code/CodeCursor.d.ts +83 -0
  6. package/lib/code/CodeCursor.d.ts.map +1 -0
  7. package/lib/code/CodeCursor.js +306 -0
  8. package/lib/code/CodeDiffer.d.ts +28 -0
  9. package/lib/code/CodeDiffer.d.ts.map +1 -0
  10. package/lib/code/CodeDiffer.js +51 -0
  11. package/lib/code/CodeFragment.d.ts +42 -0
  12. package/lib/code/CodeFragment.d.ts.map +1 -0
  13. package/lib/code/CodeFragment.js +72 -0
  14. package/lib/code/CodeHighlighter.d.ts +71 -0
  15. package/lib/code/CodeHighlighter.d.ts.map +1 -0
  16. package/lib/code/CodeHighlighter.js +2 -0
  17. package/lib/code/CodeMetrics.d.ts +11 -0
  18. package/lib/code/CodeMetrics.d.ts.map +1 -0
  19. package/lib/code/CodeMetrics.js +29 -0
  20. package/lib/code/CodeRange.d.ts +41 -0
  21. package/lib/code/CodeRange.d.ts.map +1 -0
  22. package/lib/code/CodeRange.js +179 -0
  23. package/lib/code/CodeScope.d.ts +16 -0
  24. package/lib/code/CodeScope.d.ts.map +1 -0
  25. package/lib/code/CodeScope.js +72 -0
  26. package/lib/code/CodeSelection.d.ts +6 -0
  27. package/lib/code/CodeSelection.d.ts.map +1 -0
  28. package/lib/code/CodeSelection.js +13 -0
  29. package/lib/code/CodeSignal.d.ts +60 -0
  30. package/lib/code/CodeSignal.d.ts.map +1 -0
  31. package/lib/code/CodeSignal.js +201 -0
  32. package/lib/code/CodeTokenizer.d.ts +8 -0
  33. package/lib/code/CodeTokenizer.d.ts.map +1 -0
  34. package/lib/code/CodeTokenizer.js +50 -0
  35. package/lib/code/DefaultHighlightStyle.d.ts +3 -0
  36. package/lib/code/DefaultHighlightStyle.d.ts.map +1 -0
  37. package/lib/code/DefaultHighlightStyle.js +98 -0
  38. package/lib/code/LezerHighlighter.d.ts +23 -0
  39. package/lib/code/LezerHighlighter.d.ts.map +1 -0
  40. package/lib/code/LezerHighlighter.js +113 -0
  41. package/lib/code/diff.d.ts +31 -0
  42. package/lib/code/diff.d.ts.map +1 -0
  43. package/lib/code/diff.js +236 -0
  44. package/lib/code/extractRange.d.ts +17 -0
  45. package/lib/code/extractRange.d.ts.map +1 -0
  46. package/lib/code/extractRange.js +94 -0
  47. package/lib/code/index.d.ts +14 -0
  48. package/lib/code/index.d.ts.map +1 -0
  49. package/lib/code/index.js +14 -0
  50. package/lib/components/Audio.d.ts +13 -0
  51. package/lib/components/Audio.d.ts.map +1 -0
  52. package/lib/components/Audio.js +120 -0
  53. package/lib/components/AudioTest.d.ts +99 -0
  54. package/lib/components/AudioTest.d.ts.map +1 -0
  55. package/lib/components/AudioTest.js +283 -0
  56. package/lib/components/Bezier.d.ts +22 -0
  57. package/lib/components/Bezier.d.ts.map +1 -0
  58. package/lib/components/Bezier.js +80 -0
  59. package/lib/components/Circle.d.ts +191 -0
  60. package/lib/components/Circle.d.ts.map +1 -0
  61. package/lib/components/Circle.js +178 -0
  62. package/lib/components/Code.d.ts +265 -0
  63. package/lib/components/Code.d.ts.map +1 -0
  64. package/lib/components/Code.js +325 -0
  65. package/lib/components/CodeBlock.d.ts +128 -0
  66. package/lib/components/CodeBlock.d.ts.map +1 -0
  67. package/lib/components/CodeBlock.js +458 -0
  68. package/lib/components/CubicBezier.d.ts +69 -0
  69. package/lib/components/CubicBezier.d.ts.map +1 -0
  70. package/lib/components/CubicBezier.js +81 -0
  71. package/lib/components/Curve.d.ts +202 -0
  72. package/lib/components/Curve.d.ts.map +1 -0
  73. package/lib/components/Curve.js +284 -0
  74. package/lib/components/Grid.d.ts +75 -0
  75. package/lib/components/Grid.d.ts.map +1 -0
  76. package/lib/components/Grid.js +91 -0
  77. package/lib/components/Icon.d.ts +58 -0
  78. package/lib/components/Icon.d.ts.map +1 -0
  79. package/lib/components/Icon.js +58 -0
  80. package/lib/components/Img.d.ts +116 -0
  81. package/lib/components/Img.d.ts.map +1 -0
  82. package/lib/components/Img.js +232 -0
  83. package/lib/components/Knot.d.ts +89 -0
  84. package/lib/components/Knot.d.ts.map +1 -0
  85. package/lib/components/Knot.js +68 -0
  86. package/lib/components/Latex.d.ts +34 -0
  87. package/lib/components/Latex.d.ts.map +1 -0
  88. package/lib/components/Latex.js +93 -0
  89. package/lib/components/Layout.d.ts +417 -0
  90. package/lib/components/Layout.d.ts.map +1 -0
  91. package/lib/components/Layout.js +690 -0
  92. package/lib/components/Line.d.ts +158 -0
  93. package/lib/components/Line.d.ts.map +1 -0
  94. package/lib/components/Line.js +312 -0
  95. package/lib/components/Media.d.ts +35 -0
  96. package/lib/components/Media.d.ts.map +1 -0
  97. package/lib/components/Media.js +135 -0
  98. package/lib/components/Node.d.ts +835 -0
  99. package/lib/components/Node.d.ts.map +1 -0
  100. package/lib/components/Node.js +1317 -0
  101. package/lib/components/Path.d.ts +18 -0
  102. package/lib/components/Path.d.ts.map +1 -0
  103. package/lib/components/Path.js +96 -0
  104. package/lib/components/Polygon.d.ts +111 -0
  105. package/lib/components/Polygon.d.ts.map +1 -0
  106. package/lib/components/Polygon.js +123 -0
  107. package/lib/components/QuadBezier.d.ts +61 -0
  108. package/lib/components/QuadBezier.d.ts.map +1 -0
  109. package/lib/components/QuadBezier.js +76 -0
  110. package/lib/components/Ray.d.ts +60 -0
  111. package/lib/components/Ray.d.ts.map +1 -0
  112. package/lib/components/Ray.js +95 -0
  113. package/lib/components/Rect.d.ts +112 -0
  114. package/lib/components/Rect.d.ts.map +1 -0
  115. package/lib/components/Rect.js +76 -0
  116. package/lib/components/SVG.d.ts +175 -0
  117. package/lib/components/SVG.d.ts.map +1 -0
  118. package/lib/components/SVG.js +577 -0
  119. package/lib/components/Shape.d.ts +39 -0
  120. package/lib/components/Shape.d.ts.map +1 -0
  121. package/lib/components/Shape.js +134 -0
  122. package/lib/components/Spline.d.ts +87 -0
  123. package/lib/components/Spline.d.ts.map +1 -0
  124. package/lib/components/Spline.js +229 -0
  125. package/lib/components/Txt.d.ts +51 -0
  126. package/lib/components/Txt.d.ts.map +1 -0
  127. package/lib/components/Txt.js +168 -0
  128. package/lib/components/TxtLeaf.d.ts +20 -0
  129. package/lib/components/TxtLeaf.d.ts.map +1 -0
  130. package/lib/components/TxtLeaf.js +174 -0
  131. package/lib/components/Video.d.ts +45 -0
  132. package/lib/components/Video.d.ts.map +1 -0
  133. package/lib/components/Video.js +148 -0
  134. package/lib/components/View2D.d.ts +25 -0
  135. package/lib/components/View2D.d.ts.map +1 -0
  136. package/lib/components/View2D.js +88 -0
  137. package/lib/components/index.d.ts +27 -0
  138. package/lib/components/index.d.ts.map +1 -0
  139. package/lib/components/index.js +27 -0
  140. package/lib/components/types.d.ts +17 -0
  141. package/lib/components/types.d.ts.map +1 -0
  142. package/lib/components/types.js +2 -0
  143. package/lib/curves/ArcSegment.d.ts +26 -0
  144. package/lib/curves/ArcSegment.d.ts.map +1 -0
  145. package/lib/curves/ArcSegment.js +101 -0
  146. package/lib/curves/CircleSegment.d.ts +18 -0
  147. package/lib/curves/CircleSegment.d.ts.map +1 -0
  148. package/lib/curves/CircleSegment.js +52 -0
  149. package/lib/curves/CubicBezierSegment.d.ts +18 -0
  150. package/lib/curves/CubicBezierSegment.d.ts.map +1 -0
  151. package/lib/curves/CubicBezierSegment.js +55 -0
  152. package/lib/curves/CurveDrawingInfo.d.ts +11 -0
  153. package/lib/curves/CurveDrawingInfo.d.ts.map +1 -0
  154. package/lib/curves/CurveDrawingInfo.js +2 -0
  155. package/lib/curves/CurvePoint.d.ts +15 -0
  156. package/lib/curves/CurvePoint.d.ts.map +1 -0
  157. package/lib/curves/CurvePoint.js +2 -0
  158. package/lib/curves/CurveProfile.d.ts +7 -0
  159. package/lib/curves/CurveProfile.d.ts.map +1 -0
  160. package/lib/curves/CurveProfile.js +2 -0
  161. package/lib/curves/KnotInfo.d.ts +12 -0
  162. package/lib/curves/KnotInfo.d.ts.map +1 -0
  163. package/lib/curves/KnotInfo.js +2 -0
  164. package/lib/curves/LineSegment.d.ts +16 -0
  165. package/lib/curves/LineSegment.d.ts.map +1 -0
  166. package/lib/curves/LineSegment.js +45 -0
  167. package/lib/curves/Polynomial.d.ts +118 -0
  168. package/lib/curves/Polynomial.d.ts.map +1 -0
  169. package/lib/curves/Polynomial.js +259 -0
  170. package/lib/curves/Polynomial2D.d.ts +22 -0
  171. package/lib/curves/Polynomial2D.d.ts.map +1 -0
  172. package/lib/curves/Polynomial2D.js +45 -0
  173. package/lib/curves/PolynomialSegment.d.ts +39 -0
  174. package/lib/curves/PolynomialSegment.d.ts.map +1 -0
  175. package/lib/curves/PolynomialSegment.js +85 -0
  176. package/lib/curves/QuadBezierSegment.d.ts +17 -0
  177. package/lib/curves/QuadBezierSegment.d.ts.map +1 -0
  178. package/lib/curves/QuadBezierSegment.js +49 -0
  179. package/lib/curves/Segment.d.ts +9 -0
  180. package/lib/curves/Segment.d.ts.map +1 -0
  181. package/lib/curves/Segment.js +3 -0
  182. package/lib/curves/UniformPolynomialCurveSampler.d.ts +43 -0
  183. package/lib/curves/UniformPolynomialCurveSampler.d.ts.map +1 -0
  184. package/lib/curves/UniformPolynomialCurveSampler.js +73 -0
  185. package/lib/curves/createCurveProfileLerp.d.ts +32 -0
  186. package/lib/curves/createCurveProfileLerp.d.ts.map +1 -0
  187. package/lib/curves/createCurveProfileLerp.js +351 -0
  188. package/lib/curves/getBezierSplineProfile.d.ts +12 -0
  189. package/lib/curves/getBezierSplineProfile.d.ts.map +1 -0
  190. package/lib/curves/getBezierSplineProfile.js +137 -0
  191. package/lib/curves/getCircleProfile.d.ts +4 -0
  192. package/lib/curves/getCircleProfile.d.ts.map +1 -0
  193. package/lib/curves/getCircleProfile.js +44 -0
  194. package/lib/curves/getPathProfile.d.ts +3 -0
  195. package/lib/curves/getPathProfile.d.ts.map +1 -0
  196. package/lib/curves/getPathProfile.js +128 -0
  197. package/lib/curves/getPointAtDistance.d.ts +4 -0
  198. package/lib/curves/getPointAtDistance.d.ts.map +1 -0
  199. package/lib/curves/getPointAtDistance.js +15 -0
  200. package/lib/curves/getPolylineProfile.d.ts +4 -0
  201. package/lib/curves/getPolylineProfile.d.ts.map +1 -0
  202. package/lib/curves/getPolylineProfile.js +58 -0
  203. package/lib/curves/getRectProfile.d.ts +4 -0
  204. package/lib/curves/getRectProfile.d.ts.map +1 -0
  205. package/lib/curves/getRectProfile.js +57 -0
  206. package/lib/curves/index.d.ts +17 -0
  207. package/lib/curves/index.d.ts.map +1 -0
  208. package/lib/curves/index.js +17 -0
  209. package/lib/decorators/canvasStyleSignal.d.ts +5 -0
  210. package/lib/decorators/canvasStyleSignal.d.ts.map +1 -0
  211. package/lib/decorators/canvasStyleSignal.js +12 -0
  212. package/lib/decorators/colorSignal.d.ts +2 -0
  213. package/lib/decorators/colorSignal.d.ts.map +1 -0
  214. package/lib/decorators/colorSignal.js +9 -0
  215. package/lib/decorators/compound.d.ts +26 -0
  216. package/lib/decorators/compound.d.ts.map +1 -0
  217. package/lib/decorators/compound.js +49 -0
  218. package/lib/decorators/computed.d.ts +9 -0
  219. package/lib/decorators/computed.d.ts.map +1 -0
  220. package/lib/decorators/computed.js +18 -0
  221. package/lib/decorators/defaultStyle.d.ts +2 -0
  222. package/lib/decorators/defaultStyle.d.ts.map +1 -0
  223. package/lib/decorators/defaultStyle.js +14 -0
  224. package/lib/decorators/filtersSignal.d.ts +11 -0
  225. package/lib/decorators/filtersSignal.d.ts.map +1 -0
  226. package/lib/decorators/filtersSignal.js +73 -0
  227. package/lib/decorators/index.d.ts +11 -0
  228. package/lib/decorators/index.d.ts.map +1 -0
  229. package/lib/decorators/index.js +11 -0
  230. package/lib/decorators/initializers.d.ts +4 -0
  231. package/lib/decorators/initializers.d.ts.map +1 -0
  232. package/lib/decorators/initializers.js +27 -0
  233. package/lib/decorators/nodeName.d.ts +9 -0
  234. package/lib/decorators/nodeName.d.ts.map +1 -0
  235. package/lib/decorators/nodeName.js +13 -0
  236. package/lib/decorators/signal.d.ts +183 -0
  237. package/lib/decorators/signal.d.ts.map +1 -0
  238. package/lib/decorators/signal.js +285 -0
  239. package/lib/decorators/spacingSignal.d.ts +2 -0
  240. package/lib/decorators/spacingSignal.d.ts.map +1 -0
  241. package/lib/decorators/spacingSignal.js +15 -0
  242. package/lib/decorators/vector2Signal.d.ts +8 -0
  243. package/lib/decorators/vector2Signal.d.ts.map +1 -0
  244. package/lib/decorators/vector2Signal.js +15 -0
  245. package/lib/index.d.ts +9 -0
  246. package/lib/index.d.ts.map +1 -0
  247. package/lib/index.js +9 -0
  248. package/lib/jsx-dev-runtime.d.ts +3 -0
  249. package/lib/jsx-dev-runtime.d.ts.map +1 -0
  250. package/lib/jsx-dev-runtime.js +3 -0
  251. package/lib/jsx-runtime.d.ts +12 -0
  252. package/lib/jsx-runtime.d.ts.map +1 -0
  253. package/lib/jsx-runtime.js +23 -0
  254. package/lib/partials/Filter.d.ts +82 -0
  255. package/lib/partials/Filter.d.ts.map +1 -0
  256. package/lib/partials/Filter.js +135 -0
  257. package/lib/partials/Gradient.d.ts +31 -0
  258. package/lib/partials/Gradient.d.ts.map +1 -0
  259. package/lib/partials/Gradient.js +63 -0
  260. package/lib/partials/Pattern.d.ts +13 -0
  261. package/lib/partials/Pattern.d.ts.map +1 -0
  262. package/lib/partials/Pattern.js +27 -0
  263. package/lib/partials/ShaderConfig.d.ts +81 -0
  264. package/lib/partials/ShaderConfig.d.ts.map +1 -0
  265. package/lib/partials/ShaderConfig.js +25 -0
  266. package/lib/partials/index.d.ts +5 -0
  267. package/lib/partials/index.d.ts.map +1 -0
  268. package/lib/partials/index.js +5 -0
  269. package/lib/partials/types.d.ts +35 -0
  270. package/lib/partials/types.d.ts.map +1 -0
  271. package/lib/partials/types.js +2 -0
  272. package/lib/scenes/Scene2D.d.ts +24 -0
  273. package/lib/scenes/Scene2D.d.ts.map +1 -0
  274. package/lib/scenes/Scene2D.js +158 -0
  275. package/lib/scenes/index.d.ts +4 -0
  276. package/lib/scenes/index.d.ts.map +1 -0
  277. package/lib/scenes/index.js +4 -0
  278. package/lib/scenes/makeScene2D.d.ts +5 -0
  279. package/lib/scenes/makeScene2D.d.ts.map +1 -0
  280. package/lib/scenes/makeScene2D.js +12 -0
  281. package/lib/scenes/useScene2D.d.ts +3 -0
  282. package/lib/scenes/useScene2D.d.ts.map +1 -0
  283. package/lib/scenes/useScene2D.js +5 -0
  284. package/lib/tsconfig.build.tsbuildinfo +1 -0
  285. package/lib/utils/CanvasUtils.d.ts +21 -0
  286. package/lib/utils/CanvasUtils.d.ts.map +1 -0
  287. package/lib/utils/CanvasUtils.js +138 -0
  288. package/lib/utils/diff.d.ts +31 -0
  289. package/lib/utils/diff.d.ts.map +1 -0
  290. package/lib/utils/diff.js +97 -0
  291. package/lib/utils/index.d.ts +3 -0
  292. package/lib/utils/index.d.ts.map +1 -0
  293. package/lib/utils/index.js +3 -0
  294. package/lib/utils/is.d.ts +8 -0
  295. package/lib/utils/is.d.ts.map +1 -0
  296. package/lib/utils/is.js +10 -0
  297. package/lib/utils/makeSignalExtensions.d.ts +4 -0
  298. package/lib/utils/makeSignalExtensions.d.ts.map +1 -0
  299. package/lib/utils/makeSignalExtensions.js +20 -0
  300. package/package.json +49 -0
  301. package/src/editor/NodeInspectorConfig.tsx +76 -0
  302. package/src/editor/PreviewOverlayConfig.tsx +66 -0
  303. package/src/editor/Provider.tsx +97 -0
  304. package/src/editor/SceneGraphTabConfig.tsx +82 -0
  305. package/src/editor/icons/CircleIcon.tsx +7 -0
  306. package/src/editor/icons/CodeBlockIcon.tsx +8 -0
  307. package/src/editor/icons/CurveIcon.tsx +7 -0
  308. package/src/editor/icons/GridIcon.tsx +7 -0
  309. package/src/editor/icons/IconMap.ts +35 -0
  310. package/src/editor/icons/ImgIcon.tsx +8 -0
  311. package/src/editor/icons/LayoutIcon.tsx +9 -0
  312. package/src/editor/icons/LineIcon.tsx +7 -0
  313. package/src/editor/icons/NodeIcon.tsx +7 -0
  314. package/src/editor/icons/RayIcon.tsx +7 -0
  315. package/src/editor/icons/RectIcon.tsx +7 -0
  316. package/src/editor/icons/ShapeIcon.tsx +7 -0
  317. package/src/editor/icons/TxtIcon.tsx +8 -0
  318. package/src/editor/icons/VideoIcon.tsx +7 -0
  319. package/src/editor/icons/View2DIcon.tsx +10 -0
  320. package/src/editor/index.css +0 -0
  321. package/src/editor/index.ts +17 -0
  322. package/src/editor/tree/DetachedRoot.tsx +23 -0
  323. package/src/editor/tree/NodeElement.tsx +73 -0
  324. package/src/editor/tree/TreeElement.tsx +72 -0
  325. package/src/editor/tree/TreeRoot.tsx +10 -0
  326. package/src/editor/tree/ViewRoot.tsx +20 -0
  327. package/src/editor/tree/index.module.scss +38 -0
  328. package/src/editor/tree/index.ts +3 -0
  329. package/src/editor/tsconfig.build.json +5 -0
  330. package/src/editor/tsconfig.json +12 -0
  331. package/src/editor/tsdoc.json +4 -0
  332. package/src/editor/vite-env.d.ts +1 -0
  333. package/src/lib/code/CodeCursor.ts +449 -0
  334. package/src/lib/code/CodeDiffer.ts +77 -0
  335. package/src/lib/code/CodeFragment.ts +96 -0
  336. package/src/lib/code/CodeHighlighter.ts +75 -0
  337. package/src/lib/code/CodeMetrics.ts +47 -0
  338. package/src/lib/code/CodeRange.test.ts +74 -0
  339. package/src/lib/code/CodeRange.ts +216 -0
  340. package/src/lib/code/CodeScope.ts +100 -0
  341. package/src/lib/code/CodeSelection.ts +28 -0
  342. package/src/lib/code/CodeSignal.ts +338 -0
  343. package/src/lib/code/CodeTokenizer.ts +54 -0
  344. package/src/lib/code/DefaultHighlightStyle.ts +98 -0
  345. package/src/lib/code/LezerHighlighter.ts +139 -0
  346. package/src/lib/code/diff.test.ts +311 -0
  347. package/src/lib/code/diff.ts +319 -0
  348. package/src/lib/code/extractRange.ts +120 -0
  349. package/src/lib/code/index.ts +13 -0
  350. package/src/lib/components/Audio.ts +130 -0
  351. package/src/lib/components/Bezier.ts +103 -0
  352. package/src/lib/components/Circle.ts +269 -0
  353. package/src/lib/components/Code.ts +553 -0
  354. package/src/lib/components/CodeBlock.ts +578 -0
  355. package/src/lib/components/CubicBezier.ts +111 -0
  356. package/src/lib/components/Curve.ts +455 -0
  357. package/src/lib/components/Grid.ts +134 -0
  358. package/src/lib/components/Icon.ts +95 -0
  359. package/src/lib/components/Img.ts +305 -0
  360. package/src/lib/components/Knot.ts +156 -0
  361. package/src/lib/components/Latex.ts +112 -0
  362. package/src/lib/components/Layout.ts +1057 -0
  363. package/src/lib/components/Line.ts +390 -0
  364. package/src/lib/components/Media.ts +165 -0
  365. package/src/lib/components/Node.ts +1932 -0
  366. package/src/lib/components/Path.ts +132 -0
  367. package/src/lib/components/Polygon.ts +174 -0
  368. package/src/lib/components/QuadBezier.ts +99 -0
  369. package/src/lib/components/Ray.ts +121 -0
  370. package/src/lib/components/Rect.ts +186 -0
  371. package/src/lib/components/SVG.ts +788 -0
  372. package/src/lib/components/Shape.ts +146 -0
  373. package/src/lib/components/Spline.ts +317 -0
  374. package/src/lib/components/Txt.test.tsx +81 -0
  375. package/src/lib/components/Txt.ts +201 -0
  376. package/src/lib/components/TxtLeaf.ts +202 -0
  377. package/src/lib/components/Video.ts +198 -0
  378. package/src/lib/components/View2D.ts +90 -0
  379. package/src/lib/components/__logs__/image-without-source.md +17 -0
  380. package/src/lib/components/__logs__/line-without-points.md +30 -0
  381. package/src/lib/components/__logs__/reactive-playback-rate.md +21 -0
  382. package/src/lib/components/__logs__/spline-with-insufficient-knots.md +24 -0
  383. package/src/lib/components/__tests__/children.test.tsx +142 -0
  384. package/src/lib/components/__tests__/clone.test.tsx +126 -0
  385. package/src/lib/components/__tests__/generatorTest.ts +27 -0
  386. package/src/lib/components/__tests__/mockScene2D.ts +50 -0
  387. package/src/lib/components/__tests__/query.test.tsx +122 -0
  388. package/src/lib/components/__tests__/state.test.tsx +60 -0
  389. package/src/lib/components/index.ts +26 -0
  390. package/src/lib/components/types.ts +35 -0
  391. package/src/lib/curves/ArcSegment.ts +149 -0
  392. package/src/lib/curves/CircleSegment.ts +77 -0
  393. package/src/lib/curves/CubicBezierSegment.ts +78 -0
  394. package/src/lib/curves/CurveDrawingInfo.ts +11 -0
  395. package/src/lib/curves/CurvePoint.ts +15 -0
  396. package/src/lib/curves/CurveProfile.ts +7 -0
  397. package/src/lib/curves/KnotInfo.ts +10 -0
  398. package/src/lib/curves/LineSegment.ts +62 -0
  399. package/src/lib/curves/Polynomial.ts +355 -0
  400. package/src/lib/curves/Polynomial2D.ts +62 -0
  401. package/src/lib/curves/PolynomialSegment.ts +124 -0
  402. package/src/lib/curves/QuadBezierSegment.ts +64 -0
  403. package/src/lib/curves/Segment.ts +17 -0
  404. package/src/lib/curves/UniformPolynomialCurveSampler.ts +93 -0
  405. package/src/lib/curves/createCurveProfileLerp.ts +471 -0
  406. package/src/lib/curves/getBezierSplineProfile.ts +223 -0
  407. package/src/lib/curves/getCircleProfile.ts +86 -0
  408. package/src/lib/curves/getPathProfile.ts +177 -0
  409. package/src/lib/curves/getPointAtDistance.ts +21 -0
  410. package/src/lib/curves/getPolylineProfile.test.ts +21 -0
  411. package/src/lib/curves/getPolylineProfile.ts +88 -0
  412. package/src/lib/curves/getRectProfile.ts +138 -0
  413. package/src/lib/curves/index.ts +16 -0
  414. package/src/lib/decorators/canvasStyleSignal.ts +15 -0
  415. package/src/lib/decorators/colorSignal.ts +9 -0
  416. package/src/lib/decorators/compound.ts +72 -0
  417. package/src/lib/decorators/computed.ts +18 -0
  418. package/src/lib/decorators/defaultStyle.ts +18 -0
  419. package/src/lib/decorators/filtersSignal.ts +133 -0
  420. package/src/lib/decorators/index.ts +10 -0
  421. package/src/lib/decorators/initializers.ts +32 -0
  422. package/src/lib/decorators/nodeName.ts +13 -0
  423. package/src/lib/decorators/signal.test.ts +89 -0
  424. package/src/lib/decorators/signal.ts +348 -0
  425. package/src/lib/decorators/spacingSignal.ts +15 -0
  426. package/src/lib/decorators/vector2Signal.ts +29 -0
  427. package/src/lib/globals.d.ts +3 -0
  428. package/src/lib/index.ts +8 -0
  429. package/src/lib/jsx-dev-runtime.ts +2 -0
  430. package/src/lib/jsx-runtime.ts +45 -0
  431. package/src/lib/parse-svg-path.d.ts +14 -0
  432. package/src/lib/partials/Filter.ts +185 -0
  433. package/src/lib/partials/Gradient.ts +103 -0
  434. package/src/lib/partials/Pattern.ts +35 -0
  435. package/src/lib/partials/ShaderConfig.ts +122 -0
  436. package/src/lib/partials/index.ts +4 -0
  437. package/src/lib/partials/types.ts +58 -0
  438. package/src/lib/scenes/Scene2D.ts +210 -0
  439. package/src/lib/scenes/index.ts +3 -0
  440. package/src/lib/scenes/makeScene2D.ts +19 -0
  441. package/src/lib/scenes/useScene2D.ts +6 -0
  442. package/src/lib/tsconfig.build.json +5 -0
  443. package/src/lib/tsconfig.json +14 -0
  444. package/src/lib/tsdoc.json +4 -0
  445. package/src/lib/utils/CanvasUtils.ts +304 -0
  446. package/src/lib/utils/diff.test.ts +453 -0
  447. package/src/lib/utils/diff.ts +148 -0
  448. package/src/lib/utils/index.ts +2 -0
  449. package/src/lib/utils/is.ts +11 -0
  450. package/src/lib/utils/makeSignalExtensions.ts +29 -0
  451. package/src/tsconfig.base.json +18 -0
  452. package/src/tsconfig.build.json +8 -0
  453. package/src/tsconfig.json +5 -0
  454. package/tsconfig.project.json +7 -0
@@ -0,0 +1,120 @@
1
+ import {CodeRange} from './CodeRange';
2
+ import {CodeTag, resolveCodeTag} from './CodeScope';
3
+
4
+ /**
5
+ * Transform the fragments to isolate the given range into its own fragment.
6
+ *
7
+ * @remarks
8
+ * This function will try to preserve the original fragments, resolving them
9
+ * only if they overlap with the range.
10
+ *
11
+ * @param range - The range to extract.
12
+ * @param fragments - The fragments to transform.
13
+ *
14
+ * @returns A tuple containing the transformed fragments and the index of the
15
+ * isolated fragment within.
16
+ */
17
+ export function extractRange(
18
+ range: CodeRange,
19
+ fragments: CodeTag[],
20
+ ): [CodeTag[], number] {
21
+ const [from, to] = range;
22
+ let [fromRow, fromColumn] = from;
23
+ let [toRow, toColumn] = to;
24
+ if (fromRow > toRow || (fromRow === toRow && fromColumn > toColumn)) {
25
+ [fromRow, fromColumn] = to;
26
+ [toRow, toColumn] = from;
27
+ }
28
+
29
+ let currentRow = 0;
30
+ let currentColumn = 0;
31
+ const newFragments: CodeTag[] = [];
32
+ let index = -1;
33
+ let found = false;
34
+ let extracted = '';
35
+
36
+ for (const fragment of fragments) {
37
+ if (found) {
38
+ newFragments.push(fragment);
39
+ continue;
40
+ }
41
+
42
+ const resolved = resolveCodeTag(fragment, false);
43
+ const lines = resolved.split('\n');
44
+ const newRows = lines.length - 1;
45
+ const lastColumn = lines[newRows].length;
46
+ const nextColumn = newRows > 0 ? lastColumn : currentColumn + lastColumn;
47
+
48
+ if (
49
+ fromRow > currentRow + newRows ||
50
+ (fromRow === currentRow + newRows && fromColumn > nextColumn)
51
+ ) {
52
+ currentRow += newRows;
53
+ currentColumn = nextColumn;
54
+ newFragments.push(fragment);
55
+ continue;
56
+ }
57
+
58
+ for (let i = 0; i < resolved.length; i++) {
59
+ const char = resolved.charAt(i);
60
+ if (fromRow === currentRow && fromColumn >= currentColumn) {
61
+ if (fromColumn === currentColumn) {
62
+ index = newFragments.length + 1;
63
+ newFragments.push(resolved.slice(0, i), '');
64
+ }
65
+
66
+ if (char === '\n') {
67
+ index = newFragments.length + 1;
68
+ newFragments.push(
69
+ resolved.slice(0, i) + ' '.repeat(fromColumn - currentColumn),
70
+ '',
71
+ );
72
+ }
73
+ }
74
+
75
+ if (index !== -1 && toRow === currentRow && toColumn >= currentColumn) {
76
+ if (toColumn === currentColumn) {
77
+ newFragments.push(resolved.slice(i));
78
+ found = true;
79
+ break;
80
+ }
81
+
82
+ if (char === '\n') {
83
+ newFragments.push(resolved.slice(i));
84
+ found = true;
85
+ break;
86
+ }
87
+ }
88
+
89
+ if (index !== -1) {
90
+ extracted += char;
91
+ }
92
+
93
+ if (char === '\n') {
94
+ currentRow++;
95
+ currentColumn = 0;
96
+ } else {
97
+ currentColumn++;
98
+ }
99
+ }
100
+
101
+ if (index === -1) {
102
+ newFragments.push(fragment);
103
+ }
104
+ }
105
+
106
+ if (index === -1) {
107
+ index = newFragments.length + 1;
108
+ const missingRows = fromRow - currentRow;
109
+ const missingColumns =
110
+ missingRows > 0 ? fromColumn : fromColumn - currentColumn;
111
+ newFragments.push(
112
+ '\n'.repeat(missingRows) + ' '.repeat(missingColumns),
113
+ '',
114
+ );
115
+ }
116
+
117
+ newFragments[index] = extracted;
118
+
119
+ return [newFragments, index];
120
+ }
@@ -0,0 +1,13 @@
1
+ export * from './CodeCursor';
2
+ export * from './CodeDiffer';
3
+ export * from './CodeFragment';
4
+ export * from './CodeHighlighter';
5
+ export * from './CodeRange';
6
+ export * from './CodeScope';
7
+ export * from './CodeSelection';
8
+ export * from './CodeSignal';
9
+ export * from './CodeTokenizer';
10
+ export * from './DefaultHighlightStyle';
11
+ export * from './LezerHighlighter';
12
+ export * from './diff';
13
+ export * from './extractRange';
@@ -0,0 +1,130 @@
1
+ import {DependencyContext, PlaybackState, viaProxy} from '@revideo/core';
2
+ import {computed, nodeName} from '../decorators';
3
+ import {Media, MediaProps} from './Media';
4
+
5
+ @nodeName('Audio')
6
+ export class Audio extends Media {
7
+ private static readonly pool: Record<string, HTMLAudioElement> = {};
8
+
9
+ public constructor(props: MediaProps) {
10
+ super(props);
11
+ }
12
+
13
+ protected mediaElement(): HTMLAudioElement {
14
+ return this.audio();
15
+ }
16
+
17
+ protected seekedMedia(): HTMLAudioElement {
18
+ return this.seekedAudio();
19
+ }
20
+
21
+ protected fastSeekedMedia(): HTMLAudioElement {
22
+ return this.fastSeekedAudio();
23
+ }
24
+
25
+ @computed()
26
+ protected audio(): HTMLAudioElement {
27
+ const src = viaProxy(this.src());
28
+ const key = `${this.key}/${src}`;
29
+ let audio = Audio.pool[key];
30
+ if (!audio) {
31
+ audio = document.createElement('audio');
32
+ audio.crossOrigin = 'anonymous';
33
+ audio.src = src;
34
+ Audio.pool[key] = audio;
35
+ }
36
+ if (audio.readyState < 2) {
37
+ DependencyContext.collectPromise(
38
+ new Promise<void>(resolve => {
39
+ const listener = () => {
40
+ resolve();
41
+ audio.removeEventListener('canplay', listener);
42
+ };
43
+ audio.addEventListener('canplay', listener);
44
+ }),
45
+ );
46
+ }
47
+
48
+ return audio;
49
+ }
50
+
51
+ @computed()
52
+ protected seekedAudio(): HTMLAudioElement {
53
+ const audio = this.audio();
54
+
55
+ audio.addEventListener('ended', () => {
56
+ this.pause();
57
+ });
58
+
59
+ if (!(this.time() < audio.duration)) {
60
+ this.pause();
61
+ return audio;
62
+ }
63
+
64
+ const time = this.clampTime(this.time());
65
+ audio.playbackRate = this.playbackRate();
66
+
67
+ if (!audio.paused) {
68
+ audio.pause();
69
+ }
70
+
71
+ if (this.lastTime === time) {
72
+ return audio;
73
+ }
74
+
75
+ this.setCurrentTime(time);
76
+
77
+ return audio;
78
+ }
79
+
80
+ @computed()
81
+ protected fastSeekedAudio(): HTMLAudioElement {
82
+ const audio = this.audio();
83
+
84
+ if (!(this.time() < audio.duration)) {
85
+ this.pause();
86
+ return audio;
87
+ }
88
+
89
+ const time = this.clampTime(this.time());
90
+
91
+ audio.playbackRate = this.playbackRate();
92
+
93
+ if (this.lastTime === time) {
94
+ return audio;
95
+ }
96
+
97
+ const playing =
98
+ this.playing() && time < audio.duration && audio.playbackRate > 0;
99
+ if (playing) {
100
+ if (audio.paused) {
101
+ DependencyContext.collectPromise(audio.play());
102
+ }
103
+ } else {
104
+ if (!audio.paused) {
105
+ audio.pause();
106
+ }
107
+ }
108
+ if (Math.abs(audio.currentTime - time) > 0.3) {
109
+ this.setCurrentTime(time);
110
+ } else if (!playing) {
111
+ audio.currentTime = time;
112
+ }
113
+
114
+ return audio;
115
+ }
116
+
117
+ protected override draw(context: CanvasRenderingContext2D) {
118
+ const playbackState = this.view().playbackState();
119
+
120
+ playbackState === PlaybackState.Playing ||
121
+ playbackState === PlaybackState.Presenting
122
+ ? this.fastSeekedAudio()
123
+ : this.seekedAudio();
124
+
125
+ context.save();
126
+ context.restore();
127
+
128
+ this.drawChildren(context);
129
+ }
130
+ }
@@ -0,0 +1,103 @@
1
+ import {BBox, SerializedVector2, Vector2} from '@revideo/core';
2
+ import {CurveProfile} from '../curves';
3
+ import {PolynomialSegment} from '../curves/PolynomialSegment';
4
+ import {computed} from '../decorators';
5
+ import {DesiredLength} from '../partials';
6
+ import {arc, drawLine, drawPivot, moveTo} from '../utils';
7
+ import {Curve} from './Curve';
8
+
9
+ export interface BezierOverlayInfo {
10
+ curve: Path2D;
11
+ handleLines: Path2D;
12
+ controlPoints: Vector2[];
13
+ startPoint: Vector2;
14
+ endPoint: Vector2;
15
+ }
16
+
17
+ export abstract class Bezier extends Curve {
18
+ public override profile(): CurveProfile {
19
+ const segment = this.segment();
20
+ return {
21
+ segments: [segment],
22
+ arcLength: segment.arcLength,
23
+ minSin: 0,
24
+ };
25
+ }
26
+
27
+ protected abstract segment(): PolynomialSegment;
28
+
29
+ protected abstract overlayInfo(matrix: DOMMatrix): BezierOverlayInfo;
30
+
31
+ @computed()
32
+ protected childrenBBox(): BBox {
33
+ return BBox.fromPoints(...this.segment().points);
34
+ }
35
+
36
+ protected override desiredSize(): SerializedVector2<DesiredLength> {
37
+ return this.segment().getBBox().size;
38
+ }
39
+
40
+ protected override offsetComputedLayout(box: BBox): BBox {
41
+ box.position = box.position.sub(this.segment().getBBox().center);
42
+ return box;
43
+ }
44
+
45
+ public override drawOverlay(
46
+ context: CanvasRenderingContext2D,
47
+ matrix: DOMMatrix,
48
+ ) {
49
+ const size = this.computedSize();
50
+ const box = this.childrenBBox().transformCorners(matrix);
51
+ const offset = size.mul(this.offset()).scale(0.5).transformAsPoint(matrix);
52
+ const overlayInfo = this.overlayInfo(matrix);
53
+
54
+ context.lineWidth = 1;
55
+ context.strokeStyle = 'white';
56
+ context.fillStyle = 'white';
57
+
58
+ // Draw the curve itself first so everything else gets drawn on top of it
59
+ context.stroke(overlayInfo.curve);
60
+
61
+ context.fillStyle = 'white';
62
+ context.globalAlpha = 0.5;
63
+
64
+ context.beginPath();
65
+ context.stroke(overlayInfo.handleLines);
66
+
67
+ context.globalAlpha = 1;
68
+ context.lineWidth = 2;
69
+
70
+ // Draw start and end points
71
+ for (const point of [overlayInfo.startPoint, overlayInfo.endPoint]) {
72
+ moveTo(context, point);
73
+ context.beginPath();
74
+ arc(context, point, 4);
75
+ context.closePath();
76
+ context.stroke();
77
+ context.fill();
78
+ }
79
+
80
+ // Draw the control points
81
+ context.fillStyle = 'black';
82
+ for (const point of overlayInfo.controlPoints) {
83
+ moveTo(context, point);
84
+ context.beginPath();
85
+ arc(context, point, 4);
86
+ context.closePath();
87
+ context.fill();
88
+ context.stroke();
89
+ }
90
+
91
+ // Draw the offset marker
92
+ context.lineWidth = 1;
93
+ context.beginPath();
94
+ drawPivot(context, offset);
95
+ context.stroke();
96
+
97
+ // Draw the bounding box
98
+ context.beginPath();
99
+ drawLine(context, box);
100
+ context.closePath();
101
+ context.stroke();
102
+ }
103
+ }
@@ -0,0 +1,269 @@
1
+ import {
2
+ BBox,
3
+ DEG2RAD,
4
+ SerializedVector2,
5
+ SignalValue,
6
+ SimpleSignal,
7
+ } from '@revideo/core';
8
+ import {CurveProfile, getCircleProfile} from '../curves';
9
+ import {computed, initial, nodeName, signal} from '../decorators';
10
+ import {DesiredLength} from '../partials';
11
+ import {Curve, CurveProps} from './Curve';
12
+
13
+ export interface CircleProps extends CurveProps {
14
+ /**
15
+ * {@inheritDoc Circle.startAngle}
16
+ */
17
+ startAngle?: SignalValue<number>;
18
+ /**
19
+ * {@inheritDoc Circle.endAngle}
20
+ */
21
+ endAngle?: SignalValue<number>;
22
+ /**
23
+ * {@inheritDoc Circle.counterclockwise}
24
+ */
25
+ counterclockwise?: SignalValue<boolean>;
26
+ /**
27
+ * {@inheritDoc Circle.closed}
28
+ */
29
+ closed?: SignalValue<boolean>;
30
+ }
31
+
32
+ /**
33
+ * A node for drawing circular shapes.
34
+ *
35
+ * @remarks
36
+ * This node can be used to render shapes such as: circle, ellipse, arc, and
37
+ * sector (pie chart).
38
+ *
39
+ * @preview
40
+ * ```tsx editor
41
+ * // snippet Simple circle
42
+ * import {makeScene2D, Circle} from '@revideo/2d';
43
+ *
44
+ * export default makeScene2D(function* (view) {
45
+ * view.add(
46
+ * <Circle
47
+ * size={160}
48
+ * fill={'lightseagreen'}
49
+ * />
50
+ * );
51
+ * });
52
+ *
53
+ * // snippet Ellipse
54
+ * import {makeScene2D, Circle} from '@revideo/2d';
55
+ *
56
+ * export default makeScene2D(function* (view) {
57
+ * view.add(
58
+ * <Circle
59
+ * width={160}
60
+ * height={80}
61
+ * fill={'lightseagreen'}
62
+ * />
63
+ * );
64
+ * });
65
+ *
66
+ * // snippet Sector (pie chart):
67
+ * import {makeScene2D, Circle} from '@revideo/2d';
68
+ * import {createRef} from '@revideo/core';
69
+ *
70
+ * export default makeScene2D(function* (view) {
71
+ * const ref = createRef<Circle>();
72
+ * view.add(
73
+ * <Circle
74
+ * ref={ref}
75
+ * size={160}
76
+ * fill={'lightseagreen'}
77
+ * startAngle={30}
78
+ * endAngle={270}
79
+ * closed={true}
80
+ * />
81
+ * );
82
+ *
83
+ * yield* ref().startAngle(270, 2).to(30, 2);
84
+ * });
85
+ *
86
+ * // snippet Arc:
87
+ * import {makeScene2D, Circle} from '@revideo/2d';
88
+ * import {createRef} from '@revideo/core';
89
+ *
90
+ * export default makeScene2D(function* (view) {
91
+ * const ref = createRef<Circle>();
92
+ * view.add(
93
+ * <Circle
94
+ * ref={ref}
95
+ * size={160}
96
+ * stroke={'lightseagreen'}
97
+ * lineWidth={8}
98
+ * startAngle={-90}
99
+ * endAngle={90}
100
+ * />
101
+ * );
102
+ *
103
+ * yield* ref().startAngle(-270, 2).to(-90, 2);
104
+ * });
105
+ *
106
+ * // snippet Curve properties:
107
+ * import {makeScene2D, Circle} from '@revideo/2d';
108
+ * import {all, createRef, easeInCubic, easeOutCubic} from '@revideo/core';
109
+ *
110
+ * export default makeScene2D(function* (view) {
111
+ * const ref = createRef<Circle>();
112
+ * view.add(
113
+ * <Circle
114
+ * ref={ref}
115
+ * size={160}
116
+ * stroke={'lightseagreen'}
117
+ * lineWidth={8}
118
+ * endAngle={270}
119
+ * endArrow
120
+ * />,
121
+ * );
122
+ *
123
+ * yield* all(ref().start(1, 1), ref().rotation(180, 1, easeInCubic));
124
+ * ref().start(0).end(0);
125
+ * yield* all(ref().end(1, 1), ref().rotation(360, 1, easeOutCubic));
126
+ * });
127
+ * ```
128
+ */
129
+ @nodeName('Circle')
130
+ export class Circle extends Curve {
131
+ /**
132
+ * The starting angle in degrees for the circle sector.
133
+ *
134
+ * @remarks
135
+ * This property can be used together with {@link startAngle} to turn this
136
+ * circle into a sector (when using fill) or an arc (when using stroke).
137
+ *
138
+ * @defaultValue 0
139
+ */
140
+ @initial(0)
141
+ @signal()
142
+ public declare readonly startAngle: SimpleSignal<number, this>;
143
+
144
+ /**
145
+ * The ending angle in degrees for the circle sector.
146
+ *
147
+ * @remarks
148
+ * This property can be used together with {@link endAngle} to turn this
149
+ * circle into a sector (when using fill) or an arc (when using stroke).
150
+ *
151
+ * @defaultValue 360
152
+ */
153
+ @initial(360)
154
+ @signal()
155
+ public declare readonly endAngle: SimpleSignal<number, this>;
156
+
157
+ /**
158
+ * Whether the circle sector should be drawn counterclockwise.
159
+ *
160
+ * @remarks
161
+ * By default, the circle begins at {@link startAngle} and is drawn clockwise
162
+ * until reaching {@link endAngle}. Setting this property to true will reverse
163
+ * this direction.
164
+ */
165
+ @initial(false)
166
+ @signal()
167
+ public declare readonly counterclockwise: SimpleSignal<boolean, this>;
168
+
169
+ /**
170
+ * Whether the path of this circle should be closed.
171
+ *
172
+ * @remarks
173
+ * When set to true, the path of this circle will start and end at the center.
174
+ * This can be used to fine-tune how sectors are rendered.
175
+ *
176
+ * @example
177
+ * A closed circle will look like a pie chart:
178
+ * ```tsx
179
+ * <Circle
180
+ * size={300}
181
+ * fill={'lightseagreen'}
182
+ * endAngle={230}
183
+ * closed={true}
184
+ * />
185
+ * ```
186
+ * An open one will look like an arc:
187
+ * ```tsx
188
+ * <Circle
189
+ * size={300}
190
+ * stroke={'lightseagreen'}
191
+ * lineWidth={8}
192
+ * endAngle={230}
193
+ * closed={false}
194
+ * />
195
+ * ```
196
+ *
197
+ * @defaultValue false
198
+ */
199
+ public declare readonly closed: SimpleSignal<boolean, this>;
200
+
201
+ public constructor(props: CircleProps) {
202
+ super(props);
203
+ }
204
+
205
+ @computed()
206
+ public profile(): CurveProfile {
207
+ return getCircleProfile(
208
+ this.size().scale(0.5),
209
+ this.startAngle() * DEG2RAD,
210
+ this.endAngle() * DEG2RAD,
211
+ this.closed(),
212
+ this.counterclockwise(),
213
+ );
214
+ }
215
+
216
+ protected override desiredSize(): SerializedVector2<DesiredLength> {
217
+ return {
218
+ x: this.width.context.getter(),
219
+ y: this.height.context.getter(),
220
+ };
221
+ }
222
+
223
+ protected override offsetComputedLayout(box: BBox): BBox {
224
+ return box;
225
+ }
226
+
227
+ protected override childrenBBox(): BBox {
228
+ return BBox.fromSizeCentered(this.computedSize());
229
+ }
230
+
231
+ protected override getPath(): Path2D {
232
+ if (this.requiresProfile()) {
233
+ return this.curveDrawingInfo().path;
234
+ }
235
+
236
+ return this.createPath();
237
+ }
238
+
239
+ protected override getRipplePath(): Path2D {
240
+ return this.createPath(this.rippleSize());
241
+ }
242
+
243
+ protected override getCacheBBox(): BBox {
244
+ return super.getCacheBBox().expand(this.rippleSize());
245
+ }
246
+
247
+ protected createPath(expand = 0) {
248
+ const path = new Path2D();
249
+ const start = this.startAngle() * DEG2RAD;
250
+ let end = this.endAngle() * DEG2RAD;
251
+ const size = this.size().scale(0.5).add(expand);
252
+ const closed = this.closed();
253
+
254
+ if (end > start + Math.PI * 2) {
255
+ const loops = Math.floor((end - start) / (Math.PI * 2));
256
+ end -= Math.PI * 2 * loops;
257
+ }
258
+
259
+ if (closed) {
260
+ path.moveTo(0, 0);
261
+ }
262
+ path.ellipse(0, 0, size.x, size.y, 0, start, end, this.counterclockwise());
263
+ if (closed) {
264
+ path.closePath();
265
+ }
266
+
267
+ return path;
268
+ }
269
+ }