@guinetik/gcanvas 1.0.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 (349) hide show
  1. package/.github/workflows/release.yaml +70 -0
  2. package/.jshintrc +4 -0
  3. package/.vscode/settings.json +22 -0
  4. package/CLAUDE.md +310 -0
  5. package/blackhole.jpg +0 -0
  6. package/demo.png +0 -0
  7. package/demos/CNAME +1 -0
  8. package/demos/animations.html +31 -0
  9. package/demos/basic.html +38 -0
  10. package/demos/baskara.html +31 -0
  11. package/demos/bezier.html +35 -0
  12. package/demos/beziersignature.html +29 -0
  13. package/demos/blackhole.html +28 -0
  14. package/demos/blob.html +35 -0
  15. package/demos/demos.css +289 -0
  16. package/demos/easing.html +28 -0
  17. package/demos/events.html +195 -0
  18. package/demos/fluent.html +647 -0
  19. package/demos/fractals.html +36 -0
  20. package/demos/genart.html +26 -0
  21. package/demos/gendream.html +26 -0
  22. package/demos/group.html +36 -0
  23. package/demos/home.html +587 -0
  24. package/demos/index.html +364 -0
  25. package/demos/isometric.html +34 -0
  26. package/demos/js/animations.js +452 -0
  27. package/demos/js/basic.js +204 -0
  28. package/demos/js/baskara.js +751 -0
  29. package/demos/js/bezier.js +692 -0
  30. package/demos/js/beziersignature.js +241 -0
  31. package/demos/js/blackhole/accretiondisk.obj.js +379 -0
  32. package/demos/js/blackhole/blackhole.obj.js +318 -0
  33. package/demos/js/blackhole/index.js +409 -0
  34. package/demos/js/blackhole/particle.js +56 -0
  35. package/demos/js/blackhole/starfield.obj.js +218 -0
  36. package/demos/js/blob.js +2263 -0
  37. package/demos/js/easing.js +477 -0
  38. package/demos/js/fluent.js +183 -0
  39. package/demos/js/fractals.js +931 -0
  40. package/demos/js/fractalworker.js +93 -0
  41. package/demos/js/genart.js +268 -0
  42. package/demos/js/gendream.js +209 -0
  43. package/demos/js/group.js +140 -0
  44. package/demos/js/info-toggle.js +25 -0
  45. package/demos/js/isometric.js +863 -0
  46. package/demos/js/kerr.js +1556 -0
  47. package/demos/js/lavalamp.js +590 -0
  48. package/demos/js/layout.js +354 -0
  49. package/demos/js/mondrian.js +285 -0
  50. package/demos/js/opacity.js +275 -0
  51. package/demos/js/painter.js +484 -0
  52. package/demos/js/particles-showcase.js +514 -0
  53. package/demos/js/particles.js +299 -0
  54. package/demos/js/patterns.js +397 -0
  55. package/demos/js/penrose/artifact.js +69 -0
  56. package/demos/js/penrose/blackhole.js +121 -0
  57. package/demos/js/penrose/constants.js +73 -0
  58. package/demos/js/penrose/game.js +943 -0
  59. package/demos/js/penrose/lore.js +278 -0
  60. package/demos/js/penrose/penrosescene.js +892 -0
  61. package/demos/js/penrose/ship.js +216 -0
  62. package/demos/js/penrose/sounds.js +211 -0
  63. package/demos/js/penrose/voidparticle.js +55 -0
  64. package/demos/js/penrose/voidscene.js +258 -0
  65. package/demos/js/penrose/voidship.js +144 -0
  66. package/demos/js/penrose/wormhole.js +46 -0
  67. package/demos/js/pipeline.js +555 -0
  68. package/demos/js/scene.js +304 -0
  69. package/demos/js/scenes.js +320 -0
  70. package/demos/js/schrodinger.js +410 -0
  71. package/demos/js/schwarzschild.js +1023 -0
  72. package/demos/js/shapes.js +628 -0
  73. package/demos/js/space/alien.js +171 -0
  74. package/demos/js/space/boom.js +98 -0
  75. package/demos/js/space/boss.js +353 -0
  76. package/demos/js/space/buff.js +73 -0
  77. package/demos/js/space/bullet.js +102 -0
  78. package/demos/js/space/constants.js +85 -0
  79. package/demos/js/space/game.js +1884 -0
  80. package/demos/js/space/hud.js +112 -0
  81. package/demos/js/space/laserbeam.js +179 -0
  82. package/demos/js/space/lightning.js +277 -0
  83. package/demos/js/space/minion.js +192 -0
  84. package/demos/js/space/missile.js +212 -0
  85. package/demos/js/space/player.js +430 -0
  86. package/demos/js/space/powerup.js +90 -0
  87. package/demos/js/space/starfield.js +58 -0
  88. package/demos/js/space/starpower.js +90 -0
  89. package/demos/js/spacetime.js +559 -0
  90. package/demos/js/svgtween.js +204 -0
  91. package/demos/js/tde/accretiondisk.js +418 -0
  92. package/demos/js/tde/blackhole.js +219 -0
  93. package/demos/js/tde/blackholescene.js +209 -0
  94. package/demos/js/tde/config.js +59 -0
  95. package/demos/js/tde/index.js +695 -0
  96. package/demos/js/tde/jets.js +290 -0
  97. package/demos/js/tde/lensedstarfield.js +147 -0
  98. package/demos/js/tde/tdestar.js +317 -0
  99. package/demos/js/tde/tidalstream.js +356 -0
  100. package/demos/js/tde_old/blackhole.obj.js +354 -0
  101. package/demos/js/tde_old/debris.obj.js +791 -0
  102. package/demos/js/tde_old/flare.obj.js +239 -0
  103. package/demos/js/tde_old/index.js +448 -0
  104. package/demos/js/tde_old/star.obj.js +812 -0
  105. package/demos/js/tiles.js +312 -0
  106. package/demos/js/tweendemo.js +79 -0
  107. package/demos/js/visibility.js +102 -0
  108. package/demos/kerr.html +28 -0
  109. package/demos/lavalamp.html +27 -0
  110. package/demos/layouts.html +37 -0
  111. package/demos/logo.svg +4 -0
  112. package/demos/loop.html +84 -0
  113. package/demos/mondrian.html +32 -0
  114. package/demos/og_image.png +0 -0
  115. package/demos/opacity.html +36 -0
  116. package/demos/painter.html +39 -0
  117. package/demos/particles-showcase.html +28 -0
  118. package/demos/particles.html +24 -0
  119. package/demos/patterns.html +33 -0
  120. package/demos/penrose-game.html +31 -0
  121. package/demos/pipeline.html +737 -0
  122. package/demos/scene.html +33 -0
  123. package/demos/scenes.html +96 -0
  124. package/demos/schrodinger.html +27 -0
  125. package/demos/schwarzschild.html +27 -0
  126. package/demos/shapes.html +16 -0
  127. package/demos/space.html +85 -0
  128. package/demos/spacetime.html +27 -0
  129. package/demos/svgtween.html +29 -0
  130. package/demos/tde.html +28 -0
  131. package/demos/tiles.html +28 -0
  132. package/demos/transforms.html +400 -0
  133. package/demos/tween.html +45 -0
  134. package/demos/visibility.html +33 -0
  135. package/disk_example.png +0 -0
  136. package/docs/README.md +222 -0
  137. package/docs/concepts/architecture-overview.md +204 -0
  138. package/docs/concepts/lifecycle.md +255 -0
  139. package/docs/concepts/rendering-pipeline.md +279 -0
  140. package/docs/concepts/tde-zorder.md +106 -0
  141. package/docs/concepts/two-layer-architecture.md +229 -0
  142. package/docs/getting-started/first-game.md +354 -0
  143. package/docs/getting-started/hello-world.md +269 -0
  144. package/docs/getting-started/installation.md +157 -0
  145. package/docs/modules/collision/README.md +453 -0
  146. package/docs/modules/fluent/README.md +1075 -0
  147. package/docs/modules/game/README.md +303 -0
  148. package/docs/modules/isometric-camera.md +210 -0
  149. package/docs/modules/isometric.md +275 -0
  150. package/docs/modules/painter/README.md +328 -0
  151. package/docs/modules/particle/README.md +559 -0
  152. package/docs/modules/shapes/README.md +221 -0
  153. package/docs/modules/shapes/base/euclidian.md +123 -0
  154. package/docs/modules/shapes/base/geometry2d.md +204 -0
  155. package/docs/modules/shapes/base/renderable.md +215 -0
  156. package/docs/modules/shapes/base/shape.md +262 -0
  157. package/docs/modules/shapes/base/transformable.md +243 -0
  158. package/docs/modules/shapes/hierarchy.md +218 -0
  159. package/docs/modules/state/README.md +577 -0
  160. package/docs/modules/util/README.md +99 -0
  161. package/docs/modules/util/camera3d.md +412 -0
  162. package/docs/modules/util/scene3d.md +395 -0
  163. package/index.html +17 -0
  164. package/jsdoc.json +50 -0
  165. package/package.json +55 -0
  166. package/readme.md +599 -0
  167. package/scripts/build-demo.js +69 -0
  168. package/scripts/bundle4llm.js +276 -0
  169. package/scripts/clearconsole.js +48 -0
  170. package/src/collision/collision-system.js +332 -0
  171. package/src/collision/collision.js +303 -0
  172. package/src/collision/index.js +10 -0
  173. package/src/fluent/fluent-game.js +430 -0
  174. package/src/fluent/fluent-go.js +1060 -0
  175. package/src/fluent/fluent-layer.js +152 -0
  176. package/src/fluent/fluent-scene.js +291 -0
  177. package/src/fluent/index.js +98 -0
  178. package/src/fluent/sketch.js +380 -0
  179. package/src/game/game.js +467 -0
  180. package/src/game/index.js +49 -0
  181. package/src/game/objects/go.js +220 -0
  182. package/src/game/objects/imagego.js +30 -0
  183. package/src/game/objects/index.js +54 -0
  184. package/src/game/objects/isometric-scene.js +260 -0
  185. package/src/game/objects/layoutscene.js +549 -0
  186. package/src/game/objects/scene.js +175 -0
  187. package/src/game/objects/scene3d.js +118 -0
  188. package/src/game/objects/text.js +221 -0
  189. package/src/game/objects/wrapper.js +232 -0
  190. package/src/game/pipeline.js +243 -0
  191. package/src/game/ui/button.js +396 -0
  192. package/src/game/ui/cursor.js +93 -0
  193. package/src/game/ui/fps.js +91 -0
  194. package/src/game/ui/index.js +5 -0
  195. package/src/game/ui/togglebutton.js +93 -0
  196. package/src/game/ui/tooltip.js +249 -0
  197. package/src/index.js +25 -0
  198. package/src/io/events.js +20 -0
  199. package/src/io/index.js +86 -0
  200. package/src/io/input.js +70 -0
  201. package/src/io/keys.js +152 -0
  202. package/src/io/mouse.js +61 -0
  203. package/src/io/touch.js +39 -0
  204. package/src/logger/debugtab.js +138 -0
  205. package/src/logger/index.js +3 -0
  206. package/src/logger/loggable.js +47 -0
  207. package/src/logger/logger.js +113 -0
  208. package/src/math/complex.js +37 -0
  209. package/src/math/constants.js +1 -0
  210. package/src/math/fractal.js +1271 -0
  211. package/src/math/gr.js +201 -0
  212. package/src/math/heat.js +202 -0
  213. package/src/math/index.js +12 -0
  214. package/src/math/noise.js +433 -0
  215. package/src/math/orbital.js +191 -0
  216. package/src/math/patterns.js +1339 -0
  217. package/src/math/penrose.js +259 -0
  218. package/src/math/quantum.js +115 -0
  219. package/src/math/random.js +195 -0
  220. package/src/math/tensor.js +1009 -0
  221. package/src/mixins/anchor.js +131 -0
  222. package/src/mixins/draggable.js +72 -0
  223. package/src/mixins/index.js +2 -0
  224. package/src/motion/bezier.js +132 -0
  225. package/src/motion/bounce.js +58 -0
  226. package/src/motion/easing.js +349 -0
  227. package/src/motion/float.js +130 -0
  228. package/src/motion/follow.js +125 -0
  229. package/src/motion/hop.js +52 -0
  230. package/src/motion/index.js +82 -0
  231. package/src/motion/motion.js +1124 -0
  232. package/src/motion/orbit.js +49 -0
  233. package/src/motion/oscillate.js +39 -0
  234. package/src/motion/parabolic.js +141 -0
  235. package/src/motion/patrol.js +147 -0
  236. package/src/motion/pendulum.js +48 -0
  237. package/src/motion/pulse.js +88 -0
  238. package/src/motion/shake.js +83 -0
  239. package/src/motion/spiral.js +144 -0
  240. package/src/motion/spring.js +150 -0
  241. package/src/motion/swing.js +47 -0
  242. package/src/motion/tween.js +92 -0
  243. package/src/motion/tweenetik.js +139 -0
  244. package/src/motion/waypoint.js +210 -0
  245. package/src/painter/index.js +8 -0
  246. package/src/painter/painter.colors.js +331 -0
  247. package/src/painter/painter.effects.js +230 -0
  248. package/src/painter/painter.img.js +229 -0
  249. package/src/painter/painter.js +295 -0
  250. package/src/painter/painter.lines.js +189 -0
  251. package/src/painter/painter.opacity.js +41 -0
  252. package/src/painter/painter.shapes.js +277 -0
  253. package/src/painter/painter.text.js +273 -0
  254. package/src/particle/emitter.js +124 -0
  255. package/src/particle/index.js +11 -0
  256. package/src/particle/particle-system.js +322 -0
  257. package/src/particle/particle.js +71 -0
  258. package/src/particle/updaters.js +170 -0
  259. package/src/shapes/arc.js +43 -0
  260. package/src/shapes/arrow.js +33 -0
  261. package/src/shapes/bezier.js +42 -0
  262. package/src/shapes/circle.js +62 -0
  263. package/src/shapes/clouds.js +56 -0
  264. package/src/shapes/cone.js +219 -0
  265. package/src/shapes/cross.js +70 -0
  266. package/src/shapes/cube.js +244 -0
  267. package/src/shapes/cylinder.js +254 -0
  268. package/src/shapes/diamond.js +48 -0
  269. package/src/shapes/euclidian.js +111 -0
  270. package/src/shapes/figure.js +115 -0
  271. package/src/shapes/geometry.js +220 -0
  272. package/src/shapes/group.js +375 -0
  273. package/src/shapes/heart.js +42 -0
  274. package/src/shapes/hexagon.js +26 -0
  275. package/src/shapes/image.js +192 -0
  276. package/src/shapes/index.js +111 -0
  277. package/src/shapes/line.js +29 -0
  278. package/src/shapes/pattern.js +90 -0
  279. package/src/shapes/pin.js +44 -0
  280. package/src/shapes/poly.js +31 -0
  281. package/src/shapes/prism.js +226 -0
  282. package/src/shapes/rect.js +35 -0
  283. package/src/shapes/renderable.js +333 -0
  284. package/src/shapes/ring.js +26 -0
  285. package/src/shapes/roundrect.js +95 -0
  286. package/src/shapes/shape.js +117 -0
  287. package/src/shapes/slice.js +26 -0
  288. package/src/shapes/sphere.js +314 -0
  289. package/src/shapes/sphere3d.js +537 -0
  290. package/src/shapes/square.js +15 -0
  291. package/src/shapes/star.js +99 -0
  292. package/src/shapes/svg.js +408 -0
  293. package/src/shapes/text.js +553 -0
  294. package/src/shapes/traceable.js +83 -0
  295. package/src/shapes/transform.js +357 -0
  296. package/src/shapes/transformable.js +172 -0
  297. package/src/shapes/triangle.js +26 -0
  298. package/src/sound/index.js +17 -0
  299. package/src/sound/sound.js +473 -0
  300. package/src/sound/synth.analyzer.js +149 -0
  301. package/src/sound/synth.effects.js +207 -0
  302. package/src/sound/synth.envelope.js +59 -0
  303. package/src/sound/synth.js +229 -0
  304. package/src/sound/synth.musical.js +160 -0
  305. package/src/sound/synth.noise.js +85 -0
  306. package/src/sound/synth.oscillators.js +293 -0
  307. package/src/state/index.js +10 -0
  308. package/src/state/state-machine.js +371 -0
  309. package/src/util/camera3d.js +438 -0
  310. package/src/util/index.js +6 -0
  311. package/src/util/isometric-camera.js +235 -0
  312. package/src/util/layout.js +317 -0
  313. package/src/util/position.js +147 -0
  314. package/src/util/tasks.js +47 -0
  315. package/src/util/zindex.js +287 -0
  316. package/src/webgl/index.js +9 -0
  317. package/src/webgl/shaders/sphere-shaders.js +994 -0
  318. package/src/webgl/webgl-renderer.js +388 -0
  319. package/tde.png +0 -0
  320. package/test/math/orbital.test.js +61 -0
  321. package/test/math/tensor.test.js +114 -0
  322. package/test/particle/emitter.test.js +204 -0
  323. package/test/particle/particle-system.test.js +310 -0
  324. package/test/particle/particle.test.js +116 -0
  325. package/test/particle/updaters.test.js +386 -0
  326. package/test/setup.js +120 -0
  327. package/test/shapes/euclidian.test.js +44 -0
  328. package/test/shapes/geometry.test.js +86 -0
  329. package/test/shapes/group.test.js +86 -0
  330. package/test/shapes/rectangle.test.js +64 -0
  331. package/test/shapes/transform.test.js +379 -0
  332. package/test/util/camera3d.test.js +428 -0
  333. package/test/util/scene3d.test.js +352 -0
  334. package/types/collision.d.ts +249 -0
  335. package/types/common.d.ts +155 -0
  336. package/types/game.d.ts +497 -0
  337. package/types/index.d.ts +309 -0
  338. package/types/io.d.ts +188 -0
  339. package/types/logger.d.ts +127 -0
  340. package/types/math.d.ts +268 -0
  341. package/types/mixins.d.ts +92 -0
  342. package/types/motion.d.ts +678 -0
  343. package/types/painter.d.ts +378 -0
  344. package/types/shapes.d.ts +864 -0
  345. package/types/sound.d.ts +672 -0
  346. package/types/state.d.ts +251 -0
  347. package/types/util.d.ts +253 -0
  348. package/vite.config.js +50 -0
  349. package/vitest.config.js +13 -0
@@ -0,0 +1,378 @@
1
+ /**
2
+ * GCanvas Painter Module
3
+ * Static utility class for canvas drawing operations.
4
+ * @module painter
5
+ */
6
+
7
+ import { Point } from './common';
8
+ import { Logger } from './logger';
9
+
10
+ // ==========================================================================
11
+ // Main Painter Class
12
+ // ==========================================================================
13
+
14
+ /**
15
+ * Static utility class centralizing all canvas drawing operations.
16
+ * Must be initialized with a canvas context before use.
17
+ *
18
+ * @example
19
+ * // Initialize Painter
20
+ * Painter.init(canvas.getContext('2d'));
21
+ *
22
+ * // Draw shapes
23
+ * Painter.shapes.rect(10, 10, 100, 50, 'red');
24
+ * Painter.shapes.fillCircle(200, 100, 30, 'blue');
25
+ */
26
+ export class Painter {
27
+ /** The canvas 2D rendering context */
28
+ static ctx: CanvasRenderingContext2D;
29
+ /** Logger instance */
30
+ static logger: Logger;
31
+
32
+ /** Color utilities */
33
+ static readonly colors: typeof PainterColors;
34
+ /** Visual effects utilities */
35
+ static readonly effects: typeof PainterEffects;
36
+ /** Image drawing utilities */
37
+ static readonly img: typeof PainterImages;
38
+ /** Line drawing utilities */
39
+ static readonly lines: typeof PainterLines;
40
+ /** Opacity management utilities */
41
+ static readonly opacity: typeof PainterOpacity;
42
+ /** Shape drawing utilities */
43
+ static readonly shapes: typeof PainterShapes;
44
+ /** Text drawing utilities */
45
+ static readonly text: typeof PainterText;
46
+
47
+ /**
48
+ * Initialize Painter with a canvas context.
49
+ * @param ctx - The 2D rendering context
50
+ */
51
+ static init(ctx: CanvasRenderingContext2D): void;
52
+
53
+ /** Save the current canvas state */
54
+ static save(): void;
55
+ /** Restore the previously saved canvas state */
56
+ static restore(): void;
57
+
58
+ /**
59
+ * Translate to a position (resets previous translation).
60
+ * @param x - X position
61
+ * @param y - Y position
62
+ */
63
+ static translateTo(x: number, y: number): void;
64
+
65
+ /** Reset translation to origin */
66
+ static resetPosition(): void;
67
+
68
+ /**
69
+ * Execute a callback at a specific position.
70
+ * Saves state, translates, executes callback, then restores.
71
+ * @param x - X position
72
+ * @param y - Y position
73
+ * @param callback - Function to execute at position
74
+ */
75
+ static withPosition(x: number, y: number, callback: () => void): void;
76
+
77
+ /**
78
+ * Clear a rectangular area of the canvas.
79
+ * @param x - X position (default: 0)
80
+ * @param y - Y position (default: 0)
81
+ * @param width - Width (default: canvas width)
82
+ * @param height - Height (default: canvas height)
83
+ */
84
+ static clear(x?: number, y?: number, width?: number, height?: number): void;
85
+
86
+ /**
87
+ * Translate the canvas context.
88
+ * @param x - X offset
89
+ * @param y - Y offset
90
+ */
91
+ static translate(x: number, y: number): void;
92
+
93
+ /**
94
+ * Rotate the canvas context.
95
+ * @param angle - Rotation angle in radians
96
+ */
97
+ static rotate(angle: number): void;
98
+
99
+ /**
100
+ * Scale the canvas context.
101
+ * @param x - X scale factor
102
+ * @param y - Y scale factor
103
+ */
104
+ static scale(x: number, y: number): void;
105
+ }
106
+
107
+ // ==========================================================================
108
+ // Painter Sub-Modules
109
+ // ==========================================================================
110
+
111
+ /**
112
+ * Color manipulation utilities.
113
+ */
114
+ export class PainterColors {
115
+ /**
116
+ * Convert hex color to RGB object.
117
+ * @param hex - Hex color string (e.g., "#ff0000")
118
+ * @returns RGB values or null if invalid
119
+ */
120
+ static hexToRgb(hex: string): { r: number; g: number; b: number } | null;
121
+
122
+ /**
123
+ * Convert RGB values to hex string.
124
+ * @param r - Red (0-255)
125
+ * @param g - Green (0-255)
126
+ * @param b - Blue (0-255)
127
+ * @returns Hex color string
128
+ */
129
+ static rgbToHex(r: number, g: number, b: number): string;
130
+
131
+ /**
132
+ * Lighten a color.
133
+ * @param color - Color string
134
+ * @param amount - Lighten amount (0-1)
135
+ * @returns Lightened color
136
+ */
137
+ static lighten(color: string, amount: number): string;
138
+
139
+ /**
140
+ * Darken a color.
141
+ * @param color - Color string
142
+ * @param amount - Darken amount (0-1)
143
+ * @returns Darkened color
144
+ */
145
+ static darken(color: string, amount: number): string;
146
+ }
147
+
148
+ /**
149
+ * Visual effects utilities.
150
+ */
151
+ export class PainterEffects {
152
+ /**
153
+ * Set the canvas blend mode.
154
+ * @param mode - Composite operation mode
155
+ */
156
+ static setBlendMode(mode: GlobalCompositeOperation): void;
157
+
158
+ /** Reset blend mode to default (source-over) */
159
+ static resetBlendMode(): void;
160
+ }
161
+
162
+ /**
163
+ * Image drawing utilities.
164
+ */
165
+ export class PainterImages {
166
+ /**
167
+ * Draw an image to the canvas.
168
+ * @param image - Image or canvas element
169
+ * @param x - X position
170
+ * @param y - Y position
171
+ * @param width - Optional width (defaults to image width)
172
+ * @param height - Optional height (defaults to image height)
173
+ */
174
+ static drawImage(
175
+ image: HTMLImageElement | HTMLCanvasElement,
176
+ x: number,
177
+ y: number,
178
+ width?: number,
179
+ height?: number
180
+ ): void;
181
+ }
182
+
183
+ /**
184
+ * Line drawing utilities.
185
+ */
186
+ export class PainterLines {
187
+ /**
188
+ * Draw a solid line.
189
+ * @param x1 - Start X
190
+ * @param y1 - Start Y
191
+ * @param x2 - End X
192
+ * @param y2 - End Y
193
+ * @param color - Line color
194
+ * @param lineWidth - Line width (default: 1)
195
+ */
196
+ static line(
197
+ x1: number,
198
+ y1: number,
199
+ x2: number,
200
+ y2: number,
201
+ color: string,
202
+ lineWidth?: number
203
+ ): void;
204
+
205
+ /**
206
+ * Draw a dashed line.
207
+ * @param x1 - Start X
208
+ * @param y1 - Start Y
209
+ * @param x2 - End X
210
+ * @param y2 - End Y
211
+ * @param color - Line color
212
+ * @param dashArray - Dash pattern (e.g., [5, 5])
213
+ * @param lineWidth - Line width (default: 1)
214
+ */
215
+ static dashedLine(
216
+ x1: number,
217
+ y1: number,
218
+ x2: number,
219
+ y2: number,
220
+ color: string,
221
+ dashArray: number[],
222
+ lineWidth?: number
223
+ ): void;
224
+ }
225
+
226
+ /**
227
+ * Opacity/transparency management utilities.
228
+ */
229
+ export class PainterOpacity {
230
+ /**
231
+ * Push a new opacity value (multiplies with current).
232
+ * @param opacity - Opacity value (0-1)
233
+ */
234
+ static pushOpacity(opacity: number): void;
235
+
236
+ /** Pop the most recent opacity value */
237
+ static popOpacity(): void;
238
+
239
+ /** Save the current opacity state */
240
+ static saveOpacityState(): void;
241
+
242
+ /** Restore the previously saved opacity state */
243
+ static restoreOpacityState(): void;
244
+ }
245
+
246
+ /**
247
+ * Shape drawing utilities.
248
+ */
249
+ export class PainterShapes {
250
+ /**
251
+ * Draw a filled rectangle.
252
+ * @param x - X position
253
+ * @param y - Y position
254
+ * @param width - Width
255
+ * @param height - Height
256
+ * @param color - Fill color
257
+ */
258
+ static rect(x: number, y: number, width: number, height: number, color: string): void;
259
+
260
+ /**
261
+ * Draw a stroked rectangle.
262
+ * @param x - X position
263
+ * @param y - Y position
264
+ * @param width - Width
265
+ * @param height - Height
266
+ * @param color - Stroke color
267
+ * @param lineWidth - Line width (default: 1)
268
+ */
269
+ static outlineRect(
270
+ x: number,
271
+ y: number,
272
+ width: number,
273
+ height: number,
274
+ color: string,
275
+ lineWidth?: number
276
+ ): void;
277
+
278
+ /**
279
+ * Draw a filled rounded rectangle.
280
+ * @param x - X position
281
+ * @param y - Y position
282
+ * @param width - Width
283
+ * @param height - Height
284
+ * @param radius - Corner radius
285
+ * @param color - Fill color
286
+ */
287
+ static roundedRect(
288
+ x: number,
289
+ y: number,
290
+ width: number,
291
+ height: number,
292
+ radius: number,
293
+ color: string
294
+ ): void;
295
+
296
+ /**
297
+ * Draw a filled circle.
298
+ * @param x - Center X
299
+ * @param y - Center Y
300
+ * @param radius - Radius
301
+ * @param color - Fill color
302
+ */
303
+ static fillCircle(x: number, y: number, radius: number, color: string): void;
304
+
305
+ /**
306
+ * Draw a stroked circle.
307
+ * @param x - Center X
308
+ * @param y - Center Y
309
+ * @param radius - Radius
310
+ * @param color - Stroke color
311
+ * @param lineWidth - Line width (default: 1)
312
+ */
313
+ static strokeCircle(
314
+ x: number,
315
+ y: number,
316
+ radius: number,
317
+ color: string,
318
+ lineWidth?: number
319
+ ): void;
320
+
321
+ /**
322
+ * Draw an arc.
323
+ * @param x - Center X
324
+ * @param y - Center Y
325
+ * @param radius - Radius
326
+ * @param startAngle - Start angle in radians
327
+ * @param endAngle - End angle in radians
328
+ * @param color - Stroke color
329
+ * @param lineWidth - Line width (default: 1)
330
+ */
331
+ static arc(
332
+ x: number,
333
+ y: number,
334
+ radius: number,
335
+ startAngle: number,
336
+ endAngle: number,
337
+ color: string,
338
+ lineWidth?: number
339
+ ): void;
340
+
341
+ /**
342
+ * Draw a filled polygon.
343
+ * @param points - Array of points
344
+ * @param color - Fill color
345
+ */
346
+ static polygon(points: Point[], color: string): void;
347
+
348
+ /**
349
+ * Draw a stroked polygon.
350
+ * @param points - Array of points
351
+ * @param color - Stroke color
352
+ * @param lineWidth - Line width (default: 1)
353
+ */
354
+ static outlinePolygon(points: Point[], color: string, lineWidth?: number): void;
355
+ }
356
+
357
+ /**
358
+ * Text drawing utilities.
359
+ */
360
+ export class PainterText {
361
+ /**
362
+ * Draw text.
363
+ * @param text - Text string
364
+ * @param x - X position
365
+ * @param y - Y position
366
+ * @param color - Text color
367
+ * @param font - CSS font string (optional)
368
+ */
369
+ static text(text: string, x: number, y: number, color: string, font?: string): void;
370
+
371
+ /**
372
+ * Measure text dimensions.
373
+ * @param text - Text string
374
+ * @param font - CSS font string (optional)
375
+ * @returns Text metrics
376
+ */
377
+ static measureText(text: string, font?: string): TextMetrics;
378
+ }