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,335 +0,0 @@
1
- import { createCanvas, loadImage, SKRSContext2D, Image } from '@napi-rs/canvas';
2
- import path from 'path';
3
- import fs from 'fs';
4
-
5
- /**
6
- * Applies a mask to an image
7
- * @param ctx - Canvas 2D context
8
- * @param image - Source image
9
- * @param maskSource - Mask image source (path, URL, or Buffer)
10
- * @param mode - Mask mode: 'alpha', 'luminance', or 'inverse'
11
- * @param x - X position
12
- * @param y - Y position
13
- * @param width - Image width
14
- * @param height - Image height
15
- */
16
- export async function applyImageMask(
17
- ctx: SKRSContext2D,
18
- image: Image,
19
- maskSource: string | Buffer,
20
- mode: 'alpha' | 'luminance' | 'inverse' = 'alpha',
21
- x: number,
22
- y: number,
23
- width: number,
24
- height: number
25
- ): Promise<void> {
26
- try {
27
- // Load mask image
28
- let maskImage: Image;
29
- if (Buffer.isBuffer(maskSource)) {
30
- maskImage = await loadImage(maskSource);
31
- } else if (maskSource.startsWith('http')) {
32
- maskImage = await loadImage(maskSource);
33
- } else {
34
- const maskPath = path.join(process.cwd(), maskSource);
35
- maskImage = await loadImage(fs.readFileSync(maskPath));
36
- }
37
-
38
- // Create temporary canvas for mask processing
39
- const maskCanvas = createCanvas(width, height);
40
- const maskCtx = maskCanvas.getContext('2d') as SKRSContext2D;
41
- if (!maskCtx) throw new Error("Unable to get 2D context for mask");
42
-
43
- // Draw mask image scaled to target size
44
- maskCtx.drawImage(maskImage, 0, 0, width, height);
45
-
46
- // Get mask image data
47
- const maskData = maskCtx.getImageData(0, 0, width, height);
48
- const maskPixels = maskData.data;
49
-
50
- // Get source image data
51
- const sourceCanvas = createCanvas(width, height);
52
- const sourceCtx = sourceCanvas.getContext('2d') as SKRSContext2D;
53
- if (!sourceCtx) throw new Error("Unable to get 2D context for source");
54
- sourceCtx.drawImage(image, 0, 0, width, height);
55
- const sourceData = sourceCtx.getImageData(0, 0, width, height);
56
- const sourcePixels = sourceData.data;
57
-
58
- // Apply mask based on mode
59
- for (let i = 0; i < sourcePixels.length; i += 4) {
60
- const maskR = maskPixels[i];
61
- const maskG = maskPixels[i + 1];
62
- const maskB = maskPixels[i + 2];
63
- const maskA = maskPixels[i + 3];
64
-
65
- let alpha = maskA / 255;
66
-
67
- if (mode === 'luminance') {
68
- // Use luminance of mask as alpha
69
- const luminance = (maskR * 0.299 + maskG * 0.587 + maskB * 0.114) / 255;
70
- alpha = luminance;
71
- } else if (mode === 'inverse') {
72
- // Invert the alpha
73
- alpha = 1 - (maskA / 255);
74
- }
75
- // 'alpha' mode uses mask alpha directly (already set above)
76
-
77
- // Apply mask alpha to source image
78
- sourcePixels[i + 3] = Math.round(sourcePixels[i + 3] * alpha);
79
- }
80
-
81
- // Put masked image data back
82
- sourceCtx.putImageData(sourceData, 0, 0);
83
- ctx.drawImage(sourceCanvas, x, y);
84
- } catch (error) {
85
- console.error('Error applying image mask:', error);
86
- throw error;
87
- }
88
- }
89
-
90
- /**
91
- * Applies a clipping path to the context
92
- * @param ctx - Canvas 2D context
93
- * @param clipPath - Array of points defining the polygon
94
- */
95
- export function applyClipPath(ctx: SKRSContext2D, clipPath: Array<{ x: number; y: number }>): void {
96
- if (!clipPath || clipPath.length < 3) {
97
- throw new Error('Clip path must have at least 3 points');
98
- }
99
-
100
- ctx.beginPath();
101
- ctx.moveTo(clipPath[0].x, clipPath[0].y);
102
- for (let i = 1; i < clipPath.length; i++) {
103
- ctx.lineTo(clipPath[i].x, clipPath[i].y);
104
- }
105
- ctx.closePath();
106
- ctx.clip();
107
- }
108
-
109
- /**
110
- * Applies perspective distortion to an image
111
- * @param ctx - Canvas 2D context
112
- * @param image - Source image
113
- * @param points - Four corner points for perspective transform
114
- * @param x - X position
115
- * @param y - Y position
116
- * @param width - Image width
117
- * @param height - Image height
118
- */
119
- export function applyPerspectiveDistortion(
120
- ctx: SKRSContext2D,
121
- image: Image,
122
- points: Array<{ x: number; y: number }>,
123
- x: number,
124
- y: number,
125
- width: number,
126
- height: number
127
- ): void {
128
- if (points.length !== 4) {
129
- throw new Error('Perspective distortion requires exactly 4 points');
130
- }
131
-
132
- // Source corners (original image)
133
- const srcCorners = [
134
- { x: 0, y: 0 },
135
- { x: width, y: 0 },
136
- { x: width, y: height },
137
- { x: 0, y: height }
138
- ];
139
-
140
- // Destination corners (transformed)
141
- const dstCorners = points.map(p => ({ x: p.x - x, y: p.y - y }));
142
-
143
- // Calculate perspective transform matrix
144
- const matrix = calculatePerspectiveMatrix(srcCorners, dstCorners);
145
-
146
- ctx.save();
147
- ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
148
- ctx.drawImage(image, 0, 0, width, height);
149
- ctx.restore();
150
- }
151
-
152
- /**
153
- * Calculates perspective transform matrix
154
- */
155
- function calculatePerspectiveMatrix(
156
- src: Array<{ x: number; y: number }>,
157
- dst: Array<{ x: number; y: number }>
158
- ): [number, number, number, number, number, number] {
159
- // Simplified perspective transform using 2D affine approximation
160
- // For true perspective, we'd need a 3x3 matrix, but canvas 2D only supports 2x3
161
-
162
- // Use the first 3 points for affine transform approximation
163
- const x0 = src[0].x, y0 = src[0].y;
164
- const x1 = src[1].x, y1 = src[1].y;
165
- const x2 = src[2].x, y2 = src[2].y;
166
-
167
- const u0 = dst[0].x, v0 = dst[0].y;
168
- const u1 = dst[1].x, v1 = dst[1].y;
169
- const u2 = dst[2].x, v2 = dst[2].y;
170
-
171
- // Solve for affine transform coefficients
172
- const denom = (x0 - x1) * (y0 - y2) - (x0 - x2) * (y0 - y1);
173
- if (Math.abs(denom) < 0.0001) {
174
- // Fallback to identity
175
- return [1, 0, 0, 1, 0, 0];
176
- }
177
-
178
- const a = ((u0 - u1) * (y0 - y2) - (u0 - u2) * (y0 - y1)) / denom;
179
- const b = ((u0 - u1) * (x0 - x2) - (u0 - u2) * (x0 - x1)) / denom;
180
- const c = u0 - a * x0 - b * y0;
181
- const d = ((v0 - v1) * (y0 - y2) - (v0 - v2) * (y0 - y1)) / denom;
182
- const e = ((v0 - v1) * (x0 - x2) - (v0 - v2) * (x0 - x1)) / denom;
183
- const f = v0 - d * x0 - e * y0;
184
-
185
- return [a, b, d, e, c, f];
186
- }
187
-
188
- /**
189
- * Applies bulge distortion to an image
190
- * @param ctx - Canvas 2D context
191
- * @param image - Source image
192
- * @param centerX - Center X of bulge
193
- * @param centerY - Center Y of bulge
194
- * @param radius - Radius of effect
195
- * @param intensity - Bulge intensity (-1 to 1, positive = bulge, negative = pinch)
196
- * @param x - X position
197
- * @param y - Y position
198
- * @param width - Image width
199
- * @param height - Image height
200
- */
201
- export function applyBulgeDistortion(
202
- ctx: SKRSContext2D,
203
- image: Image,
204
- centerX: number,
205
- centerY: number,
206
- radius: number,
207
- intensity: number,
208
- x: number,
209
- y: number,
210
- width: number,
211
- height: number
212
- ): void {
213
- // Create temporary canvas for distortion
214
- const tempCanvas = createCanvas(width, height);
215
- const tempCtx = tempCanvas.getContext('2d') as SKRSContext2D;
216
- if (!tempCtx) throw new Error("Unable to get 2D context");
217
-
218
- tempCtx.drawImage(image, 0, 0, width, height);
219
- const imageData = tempCtx.getImageData(0, 0, width, height);
220
- const pixels = imageData.data;
221
- const newPixels = new Uint8ClampedArray(pixels.length);
222
-
223
- const cx = centerX - x;
224
- const cy = centerY - y;
225
-
226
- for (let py = 0; py < height; py++) {
227
- for (let px = 0; px < width; px++) {
228
- const dx = px - cx;
229
- const dy = py - cy;
230
- const distance = Math.sqrt(dx * dx + dy * dy);
231
-
232
- if (distance < radius) {
233
- const r = distance / radius;
234
- const amount = intensity * (1 - r * r);
235
- const angle = Math.atan2(dy, dx);
236
- const newDistance = distance * (1 + amount);
237
- const newX = Math.round(cx + Math.cos(angle) * newDistance);
238
- const newY = Math.round(cy + Math.sin(angle) * newDistance);
239
-
240
- if (newX >= 0 && newX < width && newY >= 0 && newY < height) {
241
- const srcIdx = (py * width + px) * 4;
242
- const dstIdx = (newY * width + newX) * 4;
243
- newPixels[dstIdx] = pixels[srcIdx];
244
- newPixels[dstIdx + 1] = pixels[srcIdx + 1];
245
- newPixels[dstIdx + 2] = pixels[srcIdx + 2];
246
- newPixels[dstIdx + 3] = pixels[srcIdx + 3];
247
- }
248
- } else {
249
- const idx = (py * width + px) * 4;
250
- newPixels[idx] = pixels[idx];
251
- newPixels[idx + 1] = pixels[idx + 1];
252
- newPixels[idx + 2] = pixels[idx + 2];
253
- newPixels[idx + 3] = pixels[idx + 3];
254
- }
255
- }
256
- }
257
-
258
- tempCtx.putImageData(new ImageData(newPixels, width, height), 0, 0);
259
- ctx.drawImage(tempCanvas, x, y);
260
- }
261
-
262
- /**
263
- * Applies mesh warp to an image
264
- * @param ctx - Canvas 2D context
265
- * @param image - Source image
266
- * @param gridX - Number of grid divisions X
267
- * @param gridY - Number of grid divisions Y
268
- * @param controlPoints - Control point grid [y][x]
269
- * @param x - X position
270
- * @param y - Y position
271
- * @param width - Image width
272
- * @param height - Image height
273
- */
274
- export function applyMeshWarp(
275
- ctx: SKRSContext2D,
276
- image: Image,
277
- gridX: number,
278
- gridY: number,
279
- controlPoints: Array<Array<{ x: number; y: number }>>,
280
- x: number,
281
- y: number,
282
- width: number,
283
- height: number
284
- ): void {
285
- // Create temporary canvas
286
- const tempCanvas = createCanvas(width, height);
287
- const tempCtx = tempCanvas.getContext('2d') as SKRSContext2D;
288
- if (!tempCtx) throw new Error("Unable to get 2D context");
289
-
290
- tempCtx.drawImage(image, 0, 0, width, height);
291
- const imageData = tempCtx.getImageData(0, 0, width, height);
292
- const pixels = imageData.data;
293
- const newPixels = new Uint8ClampedArray(pixels.length);
294
-
295
- const cellWidth = width / gridX;
296
- const cellHeight = height / gridY;
297
-
298
- for (let py = 0; py < height; py++) {
299
- for (let px = 0; px < width; px++) {
300
- const gridCol = Math.floor(px / cellWidth);
301
- const gridRow = Math.floor(py / cellHeight);
302
-
303
- if (gridRow < gridY && gridCol < gridX &&
304
- gridRow < controlPoints.length &&
305
- gridCol < controlPoints[gridRow].length) {
306
- const cp = controlPoints[gridRow][gridCol];
307
- const localX = (px % cellWidth) / cellWidth;
308
- const localY = (py % cellHeight) / cellHeight;
309
-
310
- // Bilinear interpolation for smooth warping
311
- const newX = Math.round(cp.x + (px - cp.x) * localX);
312
- const newY = Math.round(cp.y + (py - cp.y) * localY);
313
-
314
- if (newX >= 0 && newX < width && newY >= 0 && newY < height) {
315
- const srcIdx = (py * width + px) * 4;
316
- const dstIdx = (newY * width + newX) * 4;
317
- newPixels[dstIdx] = pixels[srcIdx];
318
- newPixels[dstIdx + 1] = pixels[srcIdx + 1];
319
- newPixels[dstIdx + 2] = pixels[srcIdx + 2];
320
- newPixels[dstIdx + 3] = pixels[srcIdx + 3];
321
- }
322
- } else {
323
- const idx = (py * width + px) * 4;
324
- newPixels[idx] = pixels[idx];
325
- newPixels[idx + 1] = pixels[idx + 1];
326
- newPixels[idx + 2] = pixels[idx + 2];
327
- newPixels[idx + 3] = pixels[idx + 3];
328
- }
329
- }
330
- }
331
-
332
- tempCtx.putImageData(new ImageData(newPixels, width, height), 0, 0);
333
- ctx.drawImage(tempCanvas, x, y);
334
- }
335
-