apexify.js 5.1.1 → 5.2.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 (236) hide show
  1. package/CHANGELOG.md +240 -0
  2. package/README.md +248 -1105
  3. package/dist/cjs/Canvas/ApexPainter.d.ts +182 -204
  4. package/dist/cjs/Canvas/ApexPainter.d.ts.map +1 -1
  5. package/dist/cjs/Canvas/ApexPainter.js +482 -1286
  6. package/dist/cjs/Canvas/ApexPainter.js.map +1 -1
  7. package/dist/cjs/Canvas/extended/CanvasCreator.d.ts +33 -0
  8. package/dist/cjs/Canvas/extended/CanvasCreator.d.ts.map +1 -0
  9. package/dist/cjs/Canvas/extended/CanvasCreator.js +223 -0
  10. package/dist/cjs/Canvas/extended/CanvasCreator.js.map +1 -0
  11. package/dist/cjs/Canvas/extended/ChartCreator.d.ts +26 -0
  12. package/dist/cjs/Canvas/extended/ChartCreator.d.ts.map +1 -0
  13. package/dist/cjs/Canvas/extended/ChartCreator.js +50 -0
  14. package/dist/cjs/Canvas/extended/ChartCreator.js.map +1 -0
  15. package/dist/cjs/Canvas/extended/GIFCreator.d.ts +43 -0
  16. package/dist/cjs/Canvas/extended/GIFCreator.d.ts.map +1 -0
  17. package/dist/cjs/Canvas/extended/GIFCreator.js +157 -0
  18. package/dist/cjs/Canvas/extended/GIFCreator.js.map +1 -0
  19. package/dist/cjs/Canvas/extended/ImageCreator.d.ts +83 -0
  20. package/dist/cjs/Canvas/extended/ImageCreator.d.ts.map +1 -0
  21. package/dist/cjs/Canvas/extended/ImageCreator.js +479 -0
  22. package/dist/cjs/Canvas/extended/ImageCreator.js.map +1 -0
  23. package/dist/cjs/Canvas/extended/TextCreator.d.ts +35 -0
  24. package/dist/cjs/Canvas/extended/TextCreator.d.ts.map +1 -0
  25. package/dist/cjs/Canvas/extended/TextCreator.js +98 -0
  26. package/dist/cjs/Canvas/extended/TextCreator.js.map +1 -0
  27. package/dist/cjs/Canvas/extended/VideoCreator.d.ts +370 -0
  28. package/dist/cjs/Canvas/extended/VideoCreator.d.ts.map +1 -0
  29. package/dist/cjs/Canvas/extended/VideoCreator.js +478 -0
  30. package/dist/cjs/Canvas/extended/VideoCreator.js.map +1 -0
  31. package/dist/cjs/Canvas/utils/Background/bg.d.ts +1 -1
  32. package/dist/cjs/Canvas/utils/Background/bg.d.ts.map +1 -1
  33. package/dist/cjs/Canvas/utils/Background/bg.js +43 -7
  34. package/dist/cjs/Canvas/utils/Background/bg.js.map +1 -1
  35. package/dist/cjs/Canvas/utils/Charts/barchart.d.ts +230 -0
  36. package/dist/cjs/Canvas/utils/Charts/barchart.d.ts.map +1 -0
  37. package/dist/cjs/Canvas/utils/Charts/barchart.js +1891 -0
  38. package/dist/cjs/Canvas/utils/Charts/barchart.js.map +1 -0
  39. package/dist/cjs/Canvas/utils/Charts/comparisonchart.d.ts +103 -0
  40. package/dist/cjs/Canvas/utils/Charts/comparisonchart.d.ts.map +1 -0
  41. package/dist/cjs/Canvas/utils/Charts/comparisonchart.js +368 -0
  42. package/dist/cjs/Canvas/utils/Charts/comparisonchart.js.map +1 -0
  43. package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.d.ts +178 -0
  44. package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.d.ts.map +1 -0
  45. package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.js +1389 -0
  46. package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.js.map +1 -0
  47. package/dist/cjs/Canvas/utils/Charts/index.d.ts +45 -0
  48. package/dist/cjs/Canvas/utils/Charts/index.d.ts.map +1 -0
  49. package/dist/cjs/Canvas/utils/Charts/index.js +17 -0
  50. package/dist/cjs/Canvas/utils/Charts/index.js.map +1 -0
  51. package/dist/cjs/Canvas/utils/Charts/linechart.d.ts +216 -0
  52. package/dist/cjs/Canvas/utils/Charts/linechart.d.ts.map +1 -0
  53. package/dist/cjs/Canvas/utils/Charts/linechart.js +1761 -0
  54. package/dist/cjs/Canvas/utils/Charts/linechart.js.map +1 -0
  55. package/dist/cjs/Canvas/utils/Charts/piechart.d.ts +167 -0
  56. package/dist/cjs/Canvas/utils/Charts/piechart.d.ts.map +1 -0
  57. package/dist/cjs/Canvas/utils/Charts/piechart.js +794 -0
  58. package/dist/cjs/Canvas/utils/Charts/piechart.js.map +1 -0
  59. package/dist/cjs/Canvas/utils/General/batchOperations.d.ts.map +1 -1
  60. package/dist/cjs/Canvas/utils/General/batchOperations.js +3 -4
  61. package/dist/cjs/Canvas/utils/General/batchOperations.js.map +1 -1
  62. package/dist/cjs/Canvas/utils/General/general functions.d.ts.map +1 -1
  63. package/dist/cjs/Canvas/utils/General/general functions.js +62 -33
  64. package/dist/cjs/Canvas/utils/General/general functions.js.map +1 -1
  65. package/dist/cjs/Canvas/utils/General/imageStitching.d.ts.map +1 -1
  66. package/dist/cjs/Canvas/utils/General/imageStitching.js +3 -6
  67. package/dist/cjs/Canvas/utils/General/imageStitching.js.map +1 -1
  68. package/dist/cjs/Canvas/utils/Image/imageMasking.d.ts.map +1 -1
  69. package/dist/cjs/Canvas/utils/Image/imageMasking.js +5 -12
  70. package/dist/cjs/Canvas/utils/Image/imageMasking.js.map +1 -1
  71. package/dist/cjs/Canvas/utils/Image/imageProperties.d.ts +4 -4
  72. package/dist/cjs/Canvas/utils/Image/imageProperties.d.ts.map +1 -1
  73. package/dist/cjs/Canvas/utils/Image/imageProperties.js +44 -9
  74. package/dist/cjs/Canvas/utils/Image/imageProperties.js.map +1 -1
  75. package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.d.ts +5 -0
  76. package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.d.ts.map +1 -1
  77. package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.js +48 -5
  78. package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.js.map +1 -1
  79. package/dist/cjs/Canvas/utils/Texts/textProperties.d.ts +1 -1
  80. package/dist/cjs/Canvas/utils/Texts/textProperties.d.ts.map +1 -1
  81. package/dist/cjs/Canvas/utils/Texts/textProperties.js +48 -5
  82. package/dist/cjs/Canvas/utils/Texts/textProperties.js.map +1 -1
  83. package/dist/cjs/Canvas/utils/Video/videoHelpers.d.ts +489 -0
  84. package/dist/cjs/Canvas/utils/Video/videoHelpers.d.ts.map +1 -0
  85. package/dist/cjs/Canvas/utils/Video/videoHelpers.js +1835 -0
  86. package/dist/cjs/Canvas/utils/Video/videoHelpers.js.map +1 -0
  87. package/dist/cjs/Canvas/utils/errorUtils.d.ts +15 -0
  88. package/dist/cjs/Canvas/utils/errorUtils.d.ts.map +1 -0
  89. package/dist/cjs/Canvas/utils/errorUtils.js +26 -0
  90. package/dist/cjs/Canvas/utils/errorUtils.js.map +1 -0
  91. package/dist/cjs/Canvas/utils/types.d.ts +17 -178
  92. package/dist/cjs/Canvas/utils/types.d.ts.map +1 -1
  93. package/dist/cjs/Canvas/utils/types.js.map +1 -1
  94. package/dist/cjs/Canvas/utils/utils.d.ts +4 -3
  95. package/dist/cjs/Canvas/utils/utils.d.ts.map +1 -1
  96. package/dist/cjs/Canvas/utils/utils.js +40 -6
  97. package/dist/cjs/Canvas/utils/utils.js.map +1 -1
  98. package/dist/cjs/index.d.ts +1 -8
  99. package/dist/cjs/index.d.ts.map +1 -1
  100. package/dist/cjs/index.js +14 -45
  101. package/dist/cjs/index.js.map +1 -1
  102. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  103. package/dist/esm/Canvas/ApexPainter.d.ts +182 -204
  104. package/dist/esm/Canvas/ApexPainter.d.ts.map +1 -1
  105. package/dist/esm/Canvas/ApexPainter.js +482 -1286
  106. package/dist/esm/Canvas/ApexPainter.js.map +1 -1
  107. package/dist/esm/Canvas/extended/CanvasCreator.d.ts +33 -0
  108. package/dist/esm/Canvas/extended/CanvasCreator.d.ts.map +1 -0
  109. package/dist/esm/Canvas/extended/CanvasCreator.js +223 -0
  110. package/dist/esm/Canvas/extended/CanvasCreator.js.map +1 -0
  111. package/dist/esm/Canvas/extended/ChartCreator.d.ts +26 -0
  112. package/dist/esm/Canvas/extended/ChartCreator.d.ts.map +1 -0
  113. package/dist/esm/Canvas/extended/ChartCreator.js +50 -0
  114. package/dist/esm/Canvas/extended/ChartCreator.js.map +1 -0
  115. package/dist/esm/Canvas/extended/GIFCreator.d.ts +43 -0
  116. package/dist/esm/Canvas/extended/GIFCreator.d.ts.map +1 -0
  117. package/dist/esm/Canvas/extended/GIFCreator.js +157 -0
  118. package/dist/esm/Canvas/extended/GIFCreator.js.map +1 -0
  119. package/dist/esm/Canvas/extended/ImageCreator.d.ts +83 -0
  120. package/dist/esm/Canvas/extended/ImageCreator.d.ts.map +1 -0
  121. package/dist/esm/Canvas/extended/ImageCreator.js +479 -0
  122. package/dist/esm/Canvas/extended/ImageCreator.js.map +1 -0
  123. package/dist/esm/Canvas/extended/TextCreator.d.ts +35 -0
  124. package/dist/esm/Canvas/extended/TextCreator.d.ts.map +1 -0
  125. package/dist/esm/Canvas/extended/TextCreator.js +98 -0
  126. package/dist/esm/Canvas/extended/TextCreator.js.map +1 -0
  127. package/dist/esm/Canvas/extended/VideoCreator.d.ts +370 -0
  128. package/dist/esm/Canvas/extended/VideoCreator.d.ts.map +1 -0
  129. package/dist/esm/Canvas/extended/VideoCreator.js +478 -0
  130. package/dist/esm/Canvas/extended/VideoCreator.js.map +1 -0
  131. package/dist/esm/Canvas/utils/Background/bg.d.ts +1 -1
  132. package/dist/esm/Canvas/utils/Background/bg.d.ts.map +1 -1
  133. package/dist/esm/Canvas/utils/Background/bg.js +43 -7
  134. package/dist/esm/Canvas/utils/Background/bg.js.map +1 -1
  135. package/dist/esm/Canvas/utils/Charts/barchart.d.ts +230 -0
  136. package/dist/esm/Canvas/utils/Charts/barchart.d.ts.map +1 -0
  137. package/dist/esm/Canvas/utils/Charts/barchart.js +1891 -0
  138. package/dist/esm/Canvas/utils/Charts/barchart.js.map +1 -0
  139. package/dist/esm/Canvas/utils/Charts/comparisonchart.d.ts +103 -0
  140. package/dist/esm/Canvas/utils/Charts/comparisonchart.d.ts.map +1 -0
  141. package/dist/esm/Canvas/utils/Charts/comparisonchart.js +368 -0
  142. package/dist/esm/Canvas/utils/Charts/comparisonchart.js.map +1 -0
  143. package/dist/esm/Canvas/utils/Charts/horizontalbarchart.d.ts +178 -0
  144. package/dist/esm/Canvas/utils/Charts/horizontalbarchart.d.ts.map +1 -0
  145. package/dist/esm/Canvas/utils/Charts/horizontalbarchart.js +1389 -0
  146. package/dist/esm/Canvas/utils/Charts/horizontalbarchart.js.map +1 -0
  147. package/dist/esm/Canvas/utils/Charts/index.d.ts +45 -0
  148. package/dist/esm/Canvas/utils/Charts/index.d.ts.map +1 -0
  149. package/dist/esm/Canvas/utils/Charts/index.js +17 -0
  150. package/dist/esm/Canvas/utils/Charts/index.js.map +1 -0
  151. package/dist/esm/Canvas/utils/Charts/linechart.d.ts +216 -0
  152. package/dist/esm/Canvas/utils/Charts/linechart.d.ts.map +1 -0
  153. package/dist/esm/Canvas/utils/Charts/linechart.js +1761 -0
  154. package/dist/esm/Canvas/utils/Charts/linechart.js.map +1 -0
  155. package/dist/esm/Canvas/utils/Charts/piechart.d.ts +167 -0
  156. package/dist/esm/Canvas/utils/Charts/piechart.d.ts.map +1 -0
  157. package/dist/esm/Canvas/utils/Charts/piechart.js +794 -0
  158. package/dist/esm/Canvas/utils/Charts/piechart.js.map +1 -0
  159. package/dist/esm/Canvas/utils/General/batchOperations.d.ts.map +1 -1
  160. package/dist/esm/Canvas/utils/General/batchOperations.js +3 -4
  161. package/dist/esm/Canvas/utils/General/batchOperations.js.map +1 -1
  162. package/dist/esm/Canvas/utils/General/general functions.d.ts.map +1 -1
  163. package/dist/esm/Canvas/utils/General/general functions.js +62 -33
  164. package/dist/esm/Canvas/utils/General/general functions.js.map +1 -1
  165. package/dist/esm/Canvas/utils/General/imageStitching.d.ts.map +1 -1
  166. package/dist/esm/Canvas/utils/General/imageStitching.js +3 -6
  167. package/dist/esm/Canvas/utils/General/imageStitching.js.map +1 -1
  168. package/dist/esm/Canvas/utils/Image/imageMasking.d.ts.map +1 -1
  169. package/dist/esm/Canvas/utils/Image/imageMasking.js +5 -12
  170. package/dist/esm/Canvas/utils/Image/imageMasking.js.map +1 -1
  171. package/dist/esm/Canvas/utils/Image/imageProperties.d.ts +4 -4
  172. package/dist/esm/Canvas/utils/Image/imageProperties.d.ts.map +1 -1
  173. package/dist/esm/Canvas/utils/Image/imageProperties.js +44 -9
  174. package/dist/esm/Canvas/utils/Image/imageProperties.js.map +1 -1
  175. package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.d.ts +5 -0
  176. package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.d.ts.map +1 -1
  177. package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.js +48 -5
  178. package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.js.map +1 -1
  179. package/dist/esm/Canvas/utils/Texts/textProperties.d.ts +1 -1
  180. package/dist/esm/Canvas/utils/Texts/textProperties.d.ts.map +1 -1
  181. package/dist/esm/Canvas/utils/Texts/textProperties.js +48 -5
  182. package/dist/esm/Canvas/utils/Texts/textProperties.js.map +1 -1
  183. package/dist/esm/Canvas/utils/Video/videoHelpers.d.ts +489 -0
  184. package/dist/esm/Canvas/utils/Video/videoHelpers.d.ts.map +1 -0
  185. package/dist/esm/Canvas/utils/Video/videoHelpers.js +1835 -0
  186. package/dist/esm/Canvas/utils/Video/videoHelpers.js.map +1 -0
  187. package/dist/esm/Canvas/utils/errorUtils.d.ts +15 -0
  188. package/dist/esm/Canvas/utils/errorUtils.d.ts.map +1 -0
  189. package/dist/esm/Canvas/utils/errorUtils.js +26 -0
  190. package/dist/esm/Canvas/utils/errorUtils.js.map +1 -0
  191. package/dist/esm/Canvas/utils/types.d.ts +17 -178
  192. package/dist/esm/Canvas/utils/types.d.ts.map +1 -1
  193. package/dist/esm/Canvas/utils/types.js.map +1 -1
  194. package/dist/esm/Canvas/utils/utils.d.ts +4 -3
  195. package/dist/esm/Canvas/utils/utils.d.ts.map +1 -1
  196. package/dist/esm/Canvas/utils/utils.js +40 -6
  197. package/dist/esm/Canvas/utils/utils.js.map +1 -1
  198. package/dist/esm/index.d.ts +1 -8
  199. package/dist/esm/index.d.ts.map +1 -1
  200. package/dist/esm/index.js +14 -45
  201. package/dist/esm/index.js.map +1 -1
  202. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  203. package/package.json +234 -198
  204. package/dist/cjs/Canvas/utils/Charts/charts.d.ts +0 -13
  205. package/dist/cjs/Canvas/utils/Charts/charts.d.ts.map +0 -1
  206. package/dist/cjs/Canvas/utils/Charts/charts.js +0 -466
  207. package/dist/cjs/Canvas/utils/Charts/charts.js.map +0 -1
  208. package/dist/esm/Canvas/utils/Charts/charts.d.ts +0 -13
  209. package/dist/esm/Canvas/utils/Charts/charts.d.ts.map +0 -1
  210. package/dist/esm/Canvas/utils/Charts/charts.js +0 -466
  211. package/dist/esm/Canvas/utils/Charts/charts.js.map +0 -1
  212. package/lib/Canvas/ApexPainter.ts +0 -5414
  213. package/lib/Canvas/utils/Background/bg.ts +0 -285
  214. package/lib/Canvas/utils/Charts/charts.ts +0 -548
  215. package/lib/Canvas/utils/Custom/advancedLines.ts +0 -387
  216. package/lib/Canvas/utils/Custom/customLines.ts +0 -206
  217. package/lib/Canvas/utils/General/batchOperations.ts +0 -103
  218. package/lib/Canvas/utils/General/conversion.ts +0 -34
  219. package/lib/Canvas/utils/General/general functions.ts +0 -726
  220. package/lib/Canvas/utils/General/imageCompression.ts +0 -316
  221. package/lib/Canvas/utils/General/imageStitching.ts +0 -252
  222. package/lib/Canvas/utils/Image/imageEffects.ts +0 -175
  223. package/lib/Canvas/utils/Image/imageFilters.ts +0 -356
  224. package/lib/Canvas/utils/Image/imageMasking.ts +0 -335
  225. package/lib/Canvas/utils/Image/imageProperties.ts +0 -587
  226. package/lib/Canvas/utils/Image/professionalImageFilters.ts +0 -391
  227. package/lib/Canvas/utils/Image/simpleProfessionalFilters.ts +0 -229
  228. package/lib/Canvas/utils/Patterns/enhancedPatternRenderer.ts +0 -455
  229. package/lib/Canvas/utils/Shapes/shapes.ts +0 -528
  230. package/lib/Canvas/utils/Texts/enhancedTextRenderer.ts +0 -716
  231. package/lib/Canvas/utils/Texts/textPathRenderer.ts +0 -320
  232. package/lib/Canvas/utils/Texts/textProperties.ts +0 -231
  233. package/lib/Canvas/utils/types.ts +0 -983
  234. package/lib/Canvas/utils/utils.ts +0 -135
  235. package/lib/index.ts +0 -81
  236. package/lib/utils.ts +0 -5
@@ -1,455 +0,0 @@
1
- import { SKRSContext2D, Canvas } from '@napi-rs/canvas';
2
- import { PatternOptions, GradientConfig } from '../types';
3
- import { createGradientFill } from '../Image/imageProperties';
4
- import { loadImage } from '@napi-rs/canvas';
5
- import path from 'path';
6
-
7
- /**
8
- * Enhanced pattern renderer supporting all pattern types
9
- */
10
- export class EnhancedPatternRenderer {
11
- /**
12
- * Renders a pattern overlay on the canvas
13
- * @param ctx - Canvas 2D context
14
- * @param canvas - Canvas instance
15
- * @param patternOptions - Pattern configuration
16
- */
17
- static async renderPattern(
18
- ctx: SKRSContext2D,
19
- canvas: Canvas,
20
- patternOptions: PatternOptions
21
- ): Promise<void> {
22
- if (!patternOptions || !patternOptions.type) return;
23
-
24
- ctx.save();
25
-
26
- try {
27
- // Set pattern opacity
28
- const opacity = patternOptions.opacity !== undefined ? patternOptions.opacity : 0.3;
29
- ctx.globalAlpha = opacity;
30
-
31
- // Set blend mode
32
- const blendMode = patternOptions.blendMode || 'overlay';
33
- ctx.globalCompositeOperation = blendMode;
34
-
35
- // Apply rotation if specified
36
- if (patternOptions.rotation && patternOptions.rotation !== 0) {
37
- const centerX = canvas.width / 2;
38
- const centerY = canvas.height / 2;
39
- ctx.translate(centerX, centerY);
40
- ctx.rotate((patternOptions.rotation * Math.PI) / 180);
41
- ctx.translate(-centerX, -centerY);
42
- }
43
-
44
- // Apply offset if specified
45
- if (patternOptions.offsetX || patternOptions.offsetY) {
46
- ctx.translate(patternOptions.offsetX || 0, patternOptions.offsetY || 0);
47
- }
48
-
49
- // Render based on pattern type
50
- switch (patternOptions.type) {
51
- case 'grid':
52
- this.renderGridPattern(ctx, canvas, patternOptions);
53
- break;
54
- case 'dots':
55
- this.renderDotsPattern(ctx, canvas, patternOptions);
56
- break;
57
- case 'diagonal':
58
- this.renderDiagonalPattern(ctx, canvas, patternOptions);
59
- break;
60
- case 'stripes':
61
- this.renderStripesPattern(ctx, canvas, patternOptions);
62
- break;
63
- case 'waves':
64
- this.renderWavesPattern(ctx, canvas, patternOptions);
65
- break;
66
- case 'crosses':
67
- this.renderCrossesPattern(ctx, canvas, patternOptions);
68
- break;
69
- case 'hexagons':
70
- this.renderHexagonsPattern(ctx, canvas, patternOptions);
71
- break;
72
- case 'checkerboard':
73
- this.renderCheckerboardPattern(ctx, canvas, patternOptions);
74
- break;
75
- case 'diamonds':
76
- this.renderDiamondsPattern(ctx, canvas, patternOptions);
77
- break;
78
- case 'triangles':
79
- this.renderTrianglesPattern(ctx, canvas, patternOptions);
80
- break;
81
- case 'stars':
82
- this.renderStarsPattern(ctx, canvas, patternOptions);
83
- break;
84
- case 'polka':
85
- this.renderPolkaPattern(ctx, canvas, patternOptions);
86
- break;
87
- case 'custom':
88
- await this.renderCustomPattern(ctx, canvas, patternOptions);
89
- break;
90
- default:
91
- console.warn(`Unknown pattern type: ${patternOptions.type}`);
92
- }
93
- } finally {
94
- ctx.restore();
95
- }
96
- }
97
-
98
- /**
99
- * Renders grid pattern
100
- */
101
- private static renderGridPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
102
- const size = options.size || 20;
103
- const spacing = options.spacing || 10;
104
- const color = options.color || '#ffffff';
105
-
106
- ctx.strokeStyle = color;
107
- ctx.lineWidth = 1;
108
-
109
- // Calculate proper grid spacing
110
- const gridSpacing = size + spacing;
111
-
112
- // Vertical lines - start from 0 and go to canvas width
113
- for (let x = 0; x <= canvas.width; x += gridSpacing) {
114
- ctx.beginPath();
115
- ctx.moveTo(x, 0);
116
- ctx.lineTo(x, canvas.height);
117
- ctx.stroke();
118
- }
119
-
120
- // Horizontal lines - start from 0 and go to canvas height
121
- for (let y = 0; y <= canvas.height; y += gridSpacing) {
122
- ctx.beginPath();
123
- ctx.moveTo(0, y);
124
- ctx.lineTo(canvas.width, y);
125
- ctx.stroke();
126
- }
127
- }
128
-
129
- /**
130
- * Renders dots pattern
131
- */
132
- private static renderDotsPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
133
- const size = options.size || 20;
134
- const spacing = options.spacing || 10;
135
- const color = options.color || '#ffffff';
136
-
137
- ctx.fillStyle = color;
138
-
139
- // Calculate proper dot spacing
140
- const dotSpacing = size + spacing;
141
- const dotRadius = size / 4;
142
-
143
- // Start from spacing offset to center first dot, then continue with full spacing
144
- for (let x = spacing; x <= canvas.width; x += dotSpacing) {
145
- for (let y = spacing; y <= canvas.height; y += dotSpacing) {
146
- ctx.beginPath();
147
- ctx.arc(x, y, dotRadius, 0, Math.PI * 2);
148
- ctx.fill();
149
- }
150
- }
151
- }
152
-
153
- /**
154
- * Renders diagonal pattern
155
- */
156
- private static renderDiagonalPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
157
- const size = options.size || 20;
158
- const spacing = options.spacing || 10;
159
- const color = options.color || '#ffffff';
160
-
161
- ctx.strokeStyle = color;
162
- ctx.lineWidth = 2;
163
-
164
- const diagonalSpacing = size + spacing;
165
-
166
- // Diagonal lines going up-right
167
- for (let i = -canvas.height; i <= canvas.width; i += diagonalSpacing) {
168
- ctx.beginPath();
169
- ctx.moveTo(i, 0);
170
- ctx.lineTo(i + canvas.height, canvas.height);
171
- ctx.stroke();
172
- }
173
- }
174
-
175
- /**
176
- * Renders stripes pattern
177
- */
178
- private static renderStripesPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
179
- const size = options.size || 20;
180
- const spacing = options.spacing || 10;
181
- const color = options.color || '#ffffff';
182
-
183
- ctx.fillStyle = color;
184
-
185
- // Calculate proper stripe spacing
186
- const stripeSpacing = size + spacing;
187
-
188
- for (let y = 0; y <= canvas.height; y += stripeSpacing) {
189
- ctx.fillRect(0, y, canvas.width, size);
190
- }
191
- }
192
-
193
- /**
194
- * Renders waves pattern
195
- */
196
- private static renderWavesPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
197
- const size = options.size || 20;
198
- const spacing = options.spacing || 10;
199
- const color = options.color || '#ffffff';
200
-
201
- ctx.strokeStyle = color;
202
- ctx.lineWidth = 2;
203
-
204
- for (let y = 0; y <= canvas.height; y += size + spacing) {
205
- ctx.beginPath();
206
- ctx.moveTo(0, y);
207
-
208
- for (let x = 0; x <= canvas.width; x += 10) {
209
- const waveY = y + Math.sin(x * 0.1) * (size / 4);
210
- ctx.lineTo(x, waveY);
211
- }
212
-
213
- ctx.stroke();
214
- }
215
- }
216
-
217
- /**
218
- * Renders crosses pattern
219
- */
220
- private static renderCrossesPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
221
- const size = options.size || 20;
222
- const spacing = options.spacing || 10;
223
- const color = options.color || '#ffffff';
224
-
225
- ctx.strokeStyle = color;
226
- ctx.lineWidth = 2;
227
-
228
- for (let x = 0; x <= canvas.width; x += size + spacing) {
229
- for (let y = 0; y <= canvas.height; y += size + spacing) {
230
- const crossSize = size / 2;
231
-
232
- // Horizontal line
233
- ctx.beginPath();
234
- ctx.moveTo(x - crossSize, y);
235
- ctx.lineTo(x + crossSize, y);
236
- ctx.stroke();
237
-
238
- // Vertical line
239
- ctx.beginPath();
240
- ctx.moveTo(x, y - crossSize);
241
- ctx.lineTo(x, y + crossSize);
242
- ctx.stroke();
243
- }
244
- }
245
- }
246
-
247
- /**
248
- * Renders hexagons pattern
249
- */
250
- private static renderHexagonsPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
251
- const size = options.size || 20;
252
- const spacing = options.spacing || 10;
253
- const color = options.color || '#ffffff';
254
-
255
- ctx.strokeStyle = color;
256
- ctx.lineWidth = 2;
257
-
258
- const hexWidth = size;
259
- const hexHeight = size * Math.sqrt(3) / 2;
260
-
261
- for (let x = 0; x <= canvas.width + hexWidth; x += hexWidth + spacing) {
262
- for (let y = 0; y <= canvas.height + hexHeight; y += hexHeight * 1.5 + spacing) {
263
- this.drawHexagon(ctx, x, y, hexWidth / 2);
264
- }
265
- }
266
- }
267
-
268
- /**
269
- * Renders checkerboard pattern
270
- */
271
- private static renderCheckerboardPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
272
- const size = options.size || 20;
273
- const color = options.color || '#ffffff';
274
- const secondaryColor = options.secondaryColor || 'transparent';
275
-
276
- for (let x = 0; x <= canvas.width; x += size) {
277
- for (let y = 0; y <= canvas.height; y += size) {
278
- const isEven = ((x / size) + (y / size)) % 2 === 0;
279
- ctx.fillStyle = isEven ? color : secondaryColor;
280
- ctx.fillRect(x, y, size, size);
281
- }
282
- }
283
- }
284
-
285
- /**
286
- * Renders diamonds pattern
287
- */
288
- private static renderDiamondsPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
289
- const size = options.size || 20;
290
- const spacing = options.spacing || 10;
291
- const color = options.color || '#ffffff';
292
-
293
- ctx.strokeStyle = color;
294
- ctx.lineWidth = 2;
295
-
296
- for (let x = 0; x <= canvas.width + size; x += size + spacing) {
297
- for (let y = 0; y <= canvas.height + size; y += size + spacing) {
298
- this.drawDiamond(ctx, x, y, size / 2);
299
- }
300
- }
301
- }
302
-
303
- /**
304
- * Renders triangles pattern
305
- */
306
- private static renderTrianglesPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
307
- const size = options.size || 20;
308
- const spacing = options.spacing || 10;
309
- const color = options.color || '#ffffff';
310
-
311
- ctx.strokeStyle = color;
312
- ctx.lineWidth = 2;
313
-
314
- for (let x = 0; x <= canvas.width + size; x += size + spacing) {
315
- for (let y = 0; y <= canvas.height + size; y += size + spacing) {
316
- this.drawTriangle(ctx, x, y, size / 2);
317
- }
318
- }
319
- }
320
-
321
- /**
322
- * Renders stars pattern
323
- */
324
- private static renderStarsPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
325
- const size = options.size || 20;
326
- const spacing = options.spacing || 10;
327
- const color = options.color || '#ffffff';
328
-
329
- ctx.fillStyle = color;
330
-
331
- for (let x = 0; x <= canvas.width + size; x += size + spacing) {
332
- for (let y = 0; y <= canvas.height + size; y += size + spacing) {
333
- this.drawStar(ctx, x, y, size / 4);
334
- }
335
- }
336
- }
337
-
338
- /**
339
- * Renders polka pattern (larger dots)
340
- */
341
- private static renderPolkaPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): void {
342
- const size = options.size || 20;
343
- const spacing = options.spacing || 10;
344
- const color = options.color || '#ffffff';
345
-
346
- ctx.fillStyle = color;
347
-
348
- for (let x = 0; x <= canvas.width; x += size + spacing) {
349
- for (let y = 0; y <= canvas.height; y += size + spacing) {
350
- ctx.beginPath();
351
- ctx.arc(x, y, size / 2, 0, Math.PI * 2);
352
- ctx.fill();
353
- }
354
- }
355
- }
356
-
357
- /**
358
- * Renders custom pattern from image
359
- */
360
- private static async renderCustomPattern(ctx: SKRSContext2D, canvas: Canvas, options: PatternOptions): Promise<void> {
361
- if (!options.customPatternImage) return;
362
-
363
- try {
364
- let imagePath = options.customPatternImage;
365
- if (!/^https?:\/\//i.test(imagePath)) {
366
- imagePath = path.join(process.cwd(), imagePath);
367
- }
368
-
369
- const image = await loadImage(imagePath);
370
- const scale = options.scale || 1;
371
- const repeat = options.repeat || 'repeat';
372
-
373
- const scaledWidth = image.width * scale;
374
- const scaledHeight = image.height * scale;
375
-
376
- switch (repeat) {
377
- case 'repeat':
378
- for (let x = 0; x <= canvas.width; x += scaledWidth) {
379
- for (let y = 0; y <= canvas.height; y += scaledHeight) {
380
- ctx.drawImage(image, x, y, scaledWidth, scaledHeight);
381
- }
382
- }
383
- break;
384
- case 'repeat-x':
385
- for (let x = 0; x <= canvas.width; x += scaledWidth) {
386
- ctx.drawImage(image, x, 0, scaledWidth, scaledHeight);
387
- }
388
- break;
389
- case 'repeat-y':
390
- for (let y = 0; y <= canvas.height; y += scaledHeight) {
391
- ctx.drawImage(image, 0, y, scaledWidth, scaledHeight);
392
- }
393
- break;
394
- case 'no-repeat':
395
- ctx.drawImage(image, 0, 0, scaledWidth, scaledHeight);
396
- break;
397
- }
398
- } catch (error) {
399
- console.warn(`Failed to load custom pattern image: ${options.customPatternImage}`, error);
400
- }
401
- }
402
-
403
- // === HELPER DRAWING FUNCTIONS ===
404
-
405
- private static drawHexagon(ctx: SKRSContext2D, x: number, y: number, radius: number): void {
406
- ctx.beginPath();
407
- for (let i = 0; i < 6; i++) {
408
- const angle = (i * Math.PI) / 3;
409
- const px = x + radius * Math.cos(angle);
410
- const py = y + radius * Math.sin(angle);
411
- if (i === 0) {
412
- ctx.moveTo(px, py);
413
- } else {
414
- ctx.lineTo(px, py);
415
- }
416
- }
417
- ctx.closePath();
418
- ctx.stroke();
419
- }
420
-
421
- private static drawDiamond(ctx: SKRSContext2D, x: number, y: number, size: number): void {
422
- ctx.beginPath();
423
- ctx.moveTo(x, y - size);
424
- ctx.lineTo(x + size, y);
425
- ctx.lineTo(x, y + size);
426
- ctx.lineTo(x - size, y);
427
- ctx.closePath();
428
- ctx.stroke();
429
- }
430
-
431
- private static drawTriangle(ctx: SKRSContext2D, x: number, y: number, size: number): void {
432
- ctx.beginPath();
433
- ctx.moveTo(x, y - size);
434
- ctx.lineTo(x + size, y + size);
435
- ctx.lineTo(x - size, y + size);
436
- ctx.closePath();
437
- ctx.stroke();
438
- }
439
-
440
- private static drawStar(ctx: SKRSContext2D, x: number, y: number, radius: number): void {
441
- ctx.beginPath();
442
- for (let i = 0; i < 5; i++) {
443
- const angle = (i * 4 * Math.PI) / 5;
444
- const px = x + radius * Math.cos(angle);
445
- const py = y + radius * Math.sin(angle);
446
- if (i === 0) {
447
- ctx.moveTo(px, py);
448
- } else {
449
- ctx.lineTo(px, py);
450
- }
451
- }
452
- ctx.closePath();
453
- ctx.fill();
454
- }
455
- }