apexify.js 5.1.1 → 5.2.1

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 +244 -1101
  3. package/dist/cjs/Canvas/ApexPainter.d.ts +183 -204
  4. package/dist/cjs/Canvas/ApexPainter.d.ts.map +1 -1
  5. package/dist/cjs/Canvas/ApexPainter.js +524 -1282
  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 +181 -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 +183 -204
  104. package/dist/esm/Canvas/ApexPainter.d.ts.map +1 -1
  105. package/dist/esm/Canvas/ApexPainter.js +524 -1282
  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 +181 -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 +235 -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,587 +0,0 @@
1
- import type { SKRSContext2D } from "@napi-rs/canvas";
2
- import type { borderPosition } from "../types";
3
-
4
- export function buildPath(
5
- ctx: SKRSContext2D,
6
- x: number, y: number, w: number, h: number,
7
- radius: number | "circular" = 0,
8
- borderPos: borderPosition = "all"
9
- ): void {
10
- ctx.beginPath();
11
-
12
- if (radius === "circular") {
13
- const r = Math.min(w, h) / 2;
14
- ctx.arc(x + w / 2, y + h / 2, r, 0, Math.PI * 2);
15
- ctx.closePath();
16
- return;
17
- }
18
-
19
- if (!radius || radius <= 0) {
20
- ctx.rect(x, y, w, h);
21
- ctx.closePath();
22
- return;
23
- }
24
-
25
- const br = Math.min(radius, w / 2, h / 2);
26
- const sel = new Set(borderPos.toLowerCase().split(",").map(s => s.trim()));
27
-
28
- const has = (name: string) =>
29
- sel.has("all") || sel.has(name) ||
30
- (name === "top-left" && (sel.has("top") || sel.has("left"))) ||
31
- (name === "top-right" && (sel.has("top") || sel.has("right"))) ||
32
- (name === "bottom-right" && (sel.has("bottom") || sel.has("right"))) ||
33
- (name === "bottom-left" && (sel.has("bottom") || sel.has("left")));
34
-
35
- const tl = has("top-left") ? br : 0;
36
- const tr = has("top-right") ? br : 0;
37
- const brR= has("bottom-right") ? br : 0;
38
- const bl = has("bottom-left") ? br : 0;
39
-
40
- ctx.moveTo(x + tl, y);
41
- ctx.lineTo(x + w - tr, y);
42
- if (tr) ctx.arcTo(x + w, y, x + w, y + tr, tr);
43
- ctx.lineTo(x + w, y + h - brR);
44
- if (brR) ctx.arcTo(x + w, y + h, x + w - brR, y + h, brR);
45
- ctx.lineTo(x + bl, y + h);
46
- if (bl) ctx.arcTo(x, y + h, x, y + h - bl, bl);
47
- ctx.lineTo(x, y + tl);
48
- if (tl) ctx.arcTo(x, y, x + tl, y, tl);
49
-
50
- ctx.closePath();
51
- }
52
-
53
- export function applyRotation(
54
- ctx: SKRSContext2D,
55
- deg: number | undefined,
56
- x: number, y: number, w: number, h: number
57
- ) {
58
- if (!deg) return;
59
- const cx = x + w / 2, cy = y + h / 2;
60
- ctx.translate(cx, cy);
61
- ctx.rotate((deg * Math.PI) / 180);
62
- ctx.translate(-cx, -cy);
63
- }
64
-
65
-
66
- function rotatePoint(
67
- x: number, y: number, px: number, py: number, deg = 0
68
- ): [number, number] {
69
- if (!deg) return [x, y];
70
- const a = (deg * Math.PI) / 180;
71
- const dx = x - px, dy = y - py;
72
- return [px + dx * Math.cos(a) - dy * Math.sin(a),
73
- py + dx * Math.sin(a) + dy * Math.cos(a)];
74
- }
75
-
76
- /**
77
- * Build a gradient in **rect-local coordinates**:
78
- * - Defaults for coords use rect {w,h}
79
- * - Rotation pivot defaults to rect center
80
- * - Offsets are applied by adding rect.x/rect.y to all points
81
- */
82
- export function createGradientFill(
83
- ctx: SKRSContext2D,
84
- g: gradient,
85
- rect: { x: number; y: number; w: number; h: number }
86
- ): CanvasGradient {
87
- const { x, y, w, h } = rect;
88
-
89
- if (g.type === "linear") {
90
- const {
91
- startX = 0, startY = 0,
92
- endX = w, endY = 0,
93
- rotate = 0,
94
- pivotX = w / 2, pivotY = h / 2,
95
- colors
96
- } = g;
97
-
98
- const [sx, sy] = rotatePoint(startX, startY, pivotX, pivotY, rotate);
99
- const [ex, ey] = rotatePoint(endX, endY, pivotX, pivotY, rotate);
100
-
101
- const grad = ctx.createLinearGradient(x + sx, y + sy, x + ex, y + ey);
102
- colors.forEach(cs => grad.addColorStop(cs.stop, cs.color));
103
- return grad;
104
- }
105
-
106
- // radial
107
- const {
108
- startX = w / 2, startY = h / 2, startRadius = 0,
109
- endX = w / 2, endY = h / 2, endRadius = Math.max(w, h) / 2,
110
- rotate = 0,
111
- pivotX = w / 2, pivotY = h / 2,
112
- colors
113
- } = g;
114
-
115
- const [sx, sy] = rotatePoint(startX, startY, pivotX, pivotY, rotate);
116
- const [ex, ey] = rotatePoint(endX, endY, pivotX, pivotY, rotate);
117
-
118
- const grad = ctx.createRadialGradient(
119
- x + sx, y + sy, startRadius,
120
- x + ex, y + ey, endRadius
121
- );
122
- colors.forEach(cs => grad.addColorStop(cs.stop, cs.color));
123
- return grad;
124
- }
125
-
126
- // utils/imageMath.ts
127
- import type { AlignMode, FitMode } from "../types";
128
-
129
- export function fitInto(
130
- boxX: number, boxY: number, boxW: number, boxH: number,
131
- imgW: number, imgH: number,
132
- fit: FitMode = "fill",
133
- align: AlignMode = "center"
134
- ) {
135
- let dx = boxX, dy = boxY, dw = boxW, dh = boxH, sx = 0, sy = 0, sw = imgW, sh = imgH;
136
-
137
- if (fit === "fill") {
138
- return { dx, dy, dw, dh, sx, sy, sw, sh };
139
- }
140
-
141
- const s = fit === "contain"
142
- ? Math.min(boxW / imgW, boxH / imgH)
143
- : Math.max(boxW / imgW, boxH / imgH);
144
-
145
- dw = imgW * s;
146
- dh = imgH * s;
147
-
148
- const cx = boxX + (boxW - dw) / 2;
149
- const cy = boxY + (boxH - dh) / 2;
150
-
151
- switch (align) {
152
- case "top-left": dx = boxX; dy = boxY; break;
153
- case "top": dx = cx; dy = boxY; break;
154
- case "top-right": dx = boxX + boxW - dw; dy = boxY; break;
155
- case "left": dx = boxX; dy = cy; break;
156
- case "center": dx = cx; dy = cy; break;
157
- case "right": dx = boxX + boxW - dw; dy = cy; break;
158
- case "bottom-left": dx = boxX; dy = boxY + boxH - dh; break;
159
- case "bottom": dx = cx; dy = boxY + boxH - dh; break;
160
- case "bottom-right": dx = boxX + boxW - dw; dy = boxY + boxH - dh; break;
161
- default: dx = cx; dy = cy; break;
162
- }
163
-
164
- return { dx, dy, dw, dh, sx, sy, sw, sh };
165
- }
166
-
167
-
168
- // utils/imageCache.ts
169
- import { loadImage, type Image } from "@napi-rs/canvas";
170
- import path from "path";
171
-
172
- const cache = new Map<string, Promise<Image>>();
173
-
174
- export function loadImageCached(src: string | Buffer): Promise<Image> {
175
- if (Buffer.isBuffer(src)) return loadImage(src);
176
- const key = src.startsWith("http") ? src : path.resolve(process.cwd(), src);
177
- if (!cache.has(key)) cache.set(key, loadImage(key));
178
- return cache.get(key)!;
179
- }
180
-
181
-
182
- // utils/drawPasses.ts
183
-
184
- import type { BoxBackground, ShadowOptions, StrokeOptions, gradient } from "../types";
185
-
186
- /** Shadow pass (independent) — supports solid color or gradient fill */
187
- // Shared rect type
188
- type Rect = { x: number; y: number; w: number; h: number };
189
-
190
- /* ---------------------------------------------
191
- SHADOW — overloaded to support both call styles
192
- --------------------------------------------- */
193
-
194
- // Overload 1: rect-first (new style)
195
- export function applyShadow(
196
- ctx: SKRSContext2D,
197
- rect: Rect,
198
- shadow?: ShadowOptions
199
- ): void;
200
-
201
- // Overload 2: positional (legacy createCanvas style)
202
- export function applyShadow(
203
- ctx: SKRSContext2D,
204
- shadow: ShadowOptions | undefined,
205
- x: number, y: number, width: number, height: number,
206
- borderRadius?: number | "circular",
207
- borderPosition?: borderPosition
208
- ): void;
209
-
210
- // Single implementation handling both
211
- export function applyShadow(
212
- ctx: SKRSContext2D,
213
- a: any,
214
- b?: any,
215
- c?: any, d?: any, e?: any, f?: any, g?: any
216
- ): void {
217
- let rect: Rect;
218
- let shadow: ShadowOptions | undefined;
219
- let radius: number | "circular" | undefined;
220
- let borderPos: borderPosition | undefined;
221
-
222
- // Detect which overload we’re in
223
- if (typeof a === "object" && "x" in a && "w" in a) {
224
- // (ctx, rect, shadow)
225
- rect = a as Rect;
226
- shadow = b as ShadowOptions | undefined;
227
- radius = shadow?.borderRadius ?? 0;
228
- borderPos = shadow?.borderPosition ?? "all";
229
- } else {
230
- // (ctx, shadow, x, y, w, h, radius?, borderPos?)
231
- shadow = a as ShadowOptions | undefined;
232
- rect = { x: b as number, y: c as number, w: d as number, h: e as number };
233
- radius = (f as number | "circular") ?? shadow?.borderRadius ?? 0;
234
- borderPos = (g as borderPosition) ?? shadow?.borderPosition ?? "all";
235
- }
236
-
237
- if (!shadow) return;
238
-
239
- const {
240
- color = "rgba(0,0,0,1)",
241
- gradient,
242
- opacity = 0.4,
243
- offsetX = 0,
244
- offsetY = 0,
245
- blur = 20
246
- } = shadow;
247
-
248
- const r = { x: rect.x + offsetX, y: rect.y + offsetY, w: rect.w, h: rect.h };
249
-
250
- ctx.save();
251
- ctx.globalAlpha = opacity;
252
- if (blur > 0) ctx.filter = `blur(${blur}px)`;
253
-
254
- buildPath(ctx, r.x, r.y, r.w, r.h, radius!, borderPos!);
255
-
256
- if (gradient) {
257
- const gfill = createGradientFill(ctx, gradient, r);
258
- ctx.fillStyle = gfill;
259
- } else {
260
- ctx.fillStyle = color;
261
- }
262
- ctx.fill();
263
-
264
- ctx.filter = "none";
265
- ctx.globalAlpha = 1;
266
- ctx.restore();
267
- }
268
-
269
-
270
- /* ---------------------------------------------
271
- STROKE — overloaded to support both call styles
272
- --------------------------------------------- */
273
-
274
- // Overload 1: rect-first (new style)
275
- export function applyStroke(
276
- ctx: SKRSContext2D,
277
- rect: Rect,
278
- stroke?: StrokeOptions
279
- ): void;
280
-
281
- // Overload 2: positional (legacy createCanvas style)
282
- export function applyStroke(
283
- ctx: SKRSContext2D,
284
- stroke: StrokeOptions | undefined,
285
- x: number, y: number, width: number, height: number,
286
- borderRadius?: number | "circular",
287
- borderPosition?: borderPosition
288
- ): void;
289
-
290
- // Single implementation handling both
291
- export function applyStroke(
292
- ctx: SKRSContext2D,
293
- a: any,
294
- b?: any,
295
- c?: any, d?: any, e?: any, f?: any, g?: any
296
- ): void {
297
- let rect: Rect;
298
- let stroke: StrokeOptions | undefined;
299
- let radius: number | "circular" | undefined;
300
- let borderPos: borderPosition | undefined;
301
-
302
- if (typeof a === "object" && "x" in a && "w" in a) {
303
- // (ctx, rect, stroke)
304
- rect = a as Rect;
305
- stroke = b as StrokeOptions | undefined;
306
- radius = stroke?.borderRadius ?? 0;
307
- borderPos = stroke?.borderPosition ?? "all";
308
- } else {
309
- // (ctx, stroke, x, y, w, h, radius?, borderPos?)
310
- stroke = a as StrokeOptions | undefined;
311
- rect = { x: b as number, y: c as number, w: d as number, h: e as number };
312
- radius = (f as number | "circular") ?? stroke?.borderRadius ?? 0;
313
- borderPos = (g as borderPosition) ?? stroke?.borderPosition ?? "all";
314
- }
315
-
316
- if (!stroke) return;
317
-
318
- const {
319
- color = "#000",
320
- gradient,
321
- width = 2,
322
- position = 0,
323
- blur = 0,
324
- opacity = 1,
325
- style = 'solid'
326
- } = stroke;
327
-
328
- // expand/shrink by `position`
329
- const r = {
330
- x: rect.x - position,
331
- y: rect.y - position,
332
- w: rect.w + position * 2,
333
- h: rect.h + position * 2
334
- };
335
-
336
- ctx.save();
337
- if (blur > 0) ctx.filter = `blur(${blur}px)`;
338
- ctx.globalAlpha = opacity;
339
-
340
- buildPath(ctx, r.x, r.y, r.w, r.h, radius!, borderPos!);
341
-
342
- ctx.lineWidth = width;
343
-
344
- if (gradient) {
345
- const gstroke = createGradientFill(ctx, gradient, r);
346
- ctx.strokeStyle = gstroke as any;
347
- } else {
348
- ctx.strokeStyle = color;
349
- }
350
-
351
- // Apply stroke style
352
- applyStrokeStyle(ctx, style, width);
353
-
354
- // Handle complex stroke styles that require multiple passes
355
- if (style === 'groove' || style === 'ridge' || style === 'double') {
356
- applyComplexStrokeStyle(ctx, style, width, color, gradient, r);
357
- } else {
358
- ctx.stroke();
359
- }
360
-
361
- ctx.filter = "none";
362
- ctx.globalAlpha = 1;
363
- ctx.restore();
364
- }
365
-
366
- /** Optional “box background” under the bitmap, inside the image clip */
367
- export function drawBoxBackground(
368
- ctx: SKRSContext2D,
369
- rect: { x: number; y: number; w: number; h: number },
370
- boxBg?: BoxBackground,
371
- borderRadius?: number | "circular",
372
- borderPosition?: string
373
- ) {
374
- if (!boxBg) return;
375
- const { color, gradient } = boxBg;
376
-
377
- // clip to the box radius, then fill
378
- ctx.save();
379
- buildPath(ctx, rect.x, rect.y, rect.w, rect.h, borderRadius ?? 0, borderPosition ?? "all");
380
- ctx.clip();
381
-
382
- if (gradient) {
383
- const g = createGradientFill(ctx, gradient, rect);
384
- ctx.fillStyle = g as any;
385
- ctx.fillRect(rect.x, rect.y, rect.w, rect.h);
386
- } else if (color && color !== "transparent") {
387
- ctx.fillStyle = color;
388
- ctx.fillRect(rect.x, rect.y, rect.w, rect.h);
389
- }
390
-
391
- ctx.restore();
392
- }
393
-
394
- /**
395
- * Applies stroke style to canvas context
396
- * @param ctx - Canvas 2D context
397
- * @param style - Stroke style type
398
- * @param width - Stroke width for calculating dash patterns
399
- */
400
- function applyStrokeStyle(
401
- ctx: SKRSContext2D,
402
- style: 'solid' | 'dashed' | 'dotted' | 'groove' | 'ridge' | 'double',
403
- width: number
404
- ): void {
405
- switch (style) {
406
- case 'solid':
407
- ctx.setLineDash([]);
408
- ctx.lineCap = 'butt';
409
- ctx.lineJoin = 'miter';
410
- break;
411
-
412
- case 'dashed':
413
- ctx.setLineDash([width * 3, width * 2]);
414
- ctx.lineCap = 'butt';
415
- ctx.lineJoin = 'miter';
416
- break;
417
-
418
- case 'dotted':
419
- ctx.setLineDash([width, width]);
420
- ctx.lineCap = 'round';
421
- ctx.lineJoin = 'round';
422
- break;
423
-
424
- case 'groove':
425
- // Groove effect: draw multiple strokes with different colors/opacity
426
- ctx.setLineDash([]);
427
- ctx.lineCap = 'butt';
428
- ctx.lineJoin = 'miter';
429
- // Note: Groove effect requires multiple passes - handled in main stroke function
430
- break;
431
-
432
- case 'ridge':
433
- // Ridge effect: draw multiple strokes with different colors/opacity
434
- ctx.setLineDash([]);
435
- ctx.lineCap = 'butt';
436
- ctx.lineJoin = 'miter';
437
- // Note: Ridge effect requires multiple passes - handled in main stroke function
438
- break;
439
-
440
- case 'double':
441
- // Double effect: draw multiple strokes
442
- ctx.setLineDash([]);
443
- ctx.lineCap = 'butt';
444
- ctx.lineJoin = 'miter';
445
- // Note: Double effect requires multiple passes - handled in main stroke function
446
- break;
447
-
448
- default:
449
- ctx.setLineDash([]);
450
- ctx.lineCap = 'butt';
451
- ctx.lineJoin = 'miter';
452
- break;
453
- }
454
- }
455
-
456
- /**
457
- * Applies complex stroke styles that require multiple passes
458
- * @param ctx - Canvas 2D context
459
- * @param style - Complex stroke style type
460
- * @param width - Stroke width
461
- * @param color - Base stroke color
462
- * @param gradient - Optional gradient
463
- * @param rect - Rectangle dimensions
464
- */
465
- function applyComplexStrokeStyle(
466
- ctx: SKRSContext2D,
467
- style: 'groove' | 'ridge' | 'double',
468
- width: number,
469
- color: string,
470
- gradient: any,
471
- rect: { x: number; y: number; w: number; h: number }
472
- ): void {
473
- const halfWidth = width / 2;
474
-
475
- switch (style) {
476
- case 'groove':
477
- // Groove: dark outer, light inner
478
- ctx.lineWidth = halfWidth;
479
-
480
- // Outer dark stroke
481
- if (gradient) {
482
- const gstroke = createGradientFill(ctx, gradient, rect);
483
- ctx.strokeStyle = gstroke as any;
484
- } else {
485
- ctx.strokeStyle = darkenColor(color, 0.3);
486
- }
487
- ctx.stroke();
488
-
489
- // Inner light stroke
490
- ctx.lineWidth = halfWidth;
491
- if (gradient) {
492
- const gstroke = createGradientFill(ctx, gradient, rect);
493
- ctx.strokeStyle = gstroke as any;
494
- } else {
495
- ctx.strokeStyle = lightenColor(color, 0.3);
496
- }
497
- ctx.stroke();
498
- break;
499
-
500
- case 'ridge':
501
- // Ridge: light outer, dark inner
502
- ctx.lineWidth = halfWidth;
503
-
504
- // Outer light stroke
505
- if (gradient) {
506
- const gstroke = createGradientFill(ctx, gradient, rect);
507
- ctx.strokeStyle = gstroke as any;
508
- } else {
509
- ctx.strokeStyle = lightenColor(color, 0.3);
510
- }
511
- ctx.stroke();
512
-
513
- // Inner dark stroke
514
- ctx.lineWidth = halfWidth;
515
- if (gradient) {
516
- const gstroke = createGradientFill(ctx, gradient, rect);
517
- ctx.strokeStyle = gstroke as any;
518
- } else {
519
- ctx.strokeStyle = darkenColor(color, 0.3);
520
- }
521
- ctx.stroke();
522
- break;
523
-
524
- case 'double':
525
- // Double: two parallel strokes
526
- const gap = Math.max(1, width / 4);
527
-
528
- // First stroke (outer)
529
- ctx.lineWidth = halfWidth;
530
- if (gradient) {
531
- const gstroke = createGradientFill(ctx, gradient, rect);
532
- ctx.strokeStyle = gstroke as any;
533
- } else {
534
- ctx.strokeStyle = color;
535
- }
536
- ctx.stroke();
537
-
538
- // Second stroke (inner)
539
- ctx.lineWidth = halfWidth;
540
- if (gradient) {
541
- const gstroke = createGradientFill(ctx, gradient, rect);
542
- ctx.strokeStyle = gstroke as any;
543
- } else {
544
- ctx.strokeStyle = color;
545
- }
546
- ctx.stroke();
547
- break;
548
- }
549
- }
550
-
551
- /**
552
- * Darkens a color by a factor
553
- * @param color - Color string
554
- * @param factor - Darkening factor (0-1)
555
- * @returns Darkened color string
556
- */
557
- function darkenColor(color: string, factor: number): string {
558
- // Simple darkening for hex colors
559
- if (color.startsWith('#')) {
560
- const hex = color.slice(1);
561
- const num = parseInt(hex, 16);
562
- const r = Math.max(0, Math.floor((num >> 16) * (1 - factor)));
563
- const g = Math.max(0, Math.floor(((num >> 8) & 0x00FF) * (1 - factor)));
564
- const b = Math.max(0, Math.floor((num & 0x0000FF) * (1 - factor)));
565
- return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;
566
- }
567
- return color; // Return original for non-hex colors
568
- }
569
-
570
- /**
571
- * Lightens a color by a factor
572
- * @param color - Color string
573
- * @param factor - Lightening factor (0-1)
574
- * @returns Lightened color string
575
- */
576
- function lightenColor(color: string, factor: number): string {
577
- // Simple lightening for hex colors
578
- if (color.startsWith('#')) {
579
- const hex = color.slice(1);
580
- const num = parseInt(hex, 16);
581
- const r = Math.min(255, Math.floor((num >> 16) + (255 - (num >> 16)) * factor));
582
- const g = Math.min(255, Math.floor(((num >> 8) & 0x00FF) + (255 - ((num >> 8) & 0x00FF)) * factor));
583
- const b = Math.min(255, Math.floor((num & 0x0000FF) + (255 - (num & 0x0000FF)) * factor));
584
- return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;
585
- }
586
- return color; // Return original for non-hex colors
587
- }