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,175 +0,0 @@
1
- import { SKRSContext2D, Image } from '@napi-rs/canvas';
2
-
3
- /**
4
- * Applies vignette effect to the canvas
5
- * @param ctx - Canvas 2D context
6
- * @param intensity - Vignette intensity (0-1)
7
- * @param size - Vignette size (0-1, where 1 = full canvas)
8
- * @param width - Canvas width
9
- * @param height - Canvas height
10
- */
11
- export function applyVignette(
12
- ctx: SKRSContext2D,
13
- intensity: number,
14
- size: number,
15
- width: number,
16
- height: number
17
- ): void {
18
- const imageData = ctx.getImageData(0, 0, width, height);
19
- const pixels = imageData.data;
20
- const centerX = width / 2;
21
- const centerY = height / 2;
22
- const maxDistance = Math.sqrt(centerX * centerX + centerY * centerY);
23
- const vignetteRadius = maxDistance * size;
24
-
25
- for (let i = 0; i < pixels.length; i += 4) {
26
- const x = (i / 4) % width;
27
- const y = Math.floor((i / 4) / width);
28
- const dx = x - centerX;
29
- const dy = y - centerY;
30
- const distance = Math.sqrt(dx * dx + dy * dy);
31
-
32
- if (distance > vignetteRadius) {
33
- const vignetteAmount = Math.min(1, (distance - vignetteRadius) / (maxDistance - vignetteRadius));
34
- const darken = 1 - (vignetteAmount * intensity);
35
-
36
- pixels[i] = Math.round(pixels[i] * darken); // R
37
- pixels[i + 1] = Math.round(pixels[i + 1] * darken); // G
38
- pixels[i + 2] = Math.round(pixels[i + 2] * darken); // B
39
- }
40
- }
41
-
42
- ctx.putImageData(imageData, 0, 0);
43
- }
44
-
45
- /**
46
- * Applies lens flare effect to the canvas
47
- * @param ctx - Canvas 2D context
48
- * @param flareX - Flare center X position
49
- * @param flareY - Flare center Y position
50
- * @param intensity - Flare intensity (0-1)
51
- * @param width - Canvas width
52
- * @param height - Canvas height
53
- */
54
- export function applyLensFlare(
55
- ctx: SKRSContext2D,
56
- flareX: number,
57
- flareY: number,
58
- intensity: number,
59
- width: number,
60
- height: number
61
- ): void {
62
- ctx.save();
63
-
64
- // Create gradient for lens flare
65
- const gradient = ctx.createRadialGradient(
66
- flareX, flareY, 0,
67
- flareX, flareY, Math.max(width, height) * 0.5
68
- );
69
-
70
- const flareColor = `rgba(255, 255, 255, ${intensity * 0.6})`;
71
- gradient.addColorStop(0, flareColor);
72
- gradient.addColorStop(0.3, `rgba(255, 255, 255, ${intensity * 0.3})`);
73
- gradient.addColorStop(0.6, `rgba(255, 255, 200, ${intensity * 0.1})`);
74
- gradient.addColorStop(1, 'rgba(255, 255, 255, 0)');
75
-
76
- ctx.globalCompositeOperation = 'screen';
77
- ctx.fillStyle = gradient;
78
- ctx.fillRect(0, 0, width, height);
79
-
80
- // Add additional flare elements
81
- const flareElements = [
82
- { x: flareX * 0.7, y: flareY * 0.7, size: 30, opacity: intensity * 0.4 },
83
- { x: flareX * 1.3, y: flareY * 1.1, size: 20, opacity: intensity * 0.3 },
84
- { x: flareX * 0.9, y: flareY * 1.2, size: 15, opacity: intensity * 0.2 }
85
- ];
86
-
87
- for (const element of flareElements) {
88
- if (element.x >= 0 && element.x < width && element.y >= 0 && element.y < height) {
89
- const elementGradient = ctx.createRadialGradient(
90
- element.x, element.y, 0,
91
- element.x, element.y, element.size
92
- );
93
- elementGradient.addColorStop(0, `rgba(255, 255, 255, ${element.opacity})`);
94
- elementGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');
95
- ctx.fillStyle = elementGradient;
96
- ctx.fillRect(element.x - element.size, element.y - element.size, element.size * 2, element.size * 2);
97
- }
98
- }
99
-
100
- ctx.restore();
101
- }
102
-
103
- /**
104
- * Applies chromatic aberration effect
105
- * @param ctx - Canvas 2D context
106
- * @param intensity - Aberration intensity (0-1)
107
- * @param width - Canvas width
108
- * @param height - Canvas height
109
- */
110
- export function applyChromaticAberration(
111
- ctx: SKRSContext2D,
112
- intensity: number,
113
- width: number,
114
- height: number
115
- ): void {
116
- const imageData = ctx.getImageData(0, 0, width, height);
117
- const pixels = imageData.data;
118
- const newPixels = new Uint8ClampedArray(pixels.length);
119
- const offset = Math.round(intensity * 5); // Max 5 pixel offset
120
-
121
- for (let y = 0; y < height; y++) {
122
- for (let x = 0; x < width; x++) {
123
- const idx = (y * width + x) * 4;
124
-
125
- // Red channel - shift left
126
- const redX = Math.max(0, Math.min(width - 1, x - offset));
127
- const redIdx = (y * width + redX) * 4;
128
- newPixels[idx] = pixels[redIdx];
129
-
130
- // Green channel - no shift
131
- newPixels[idx + 1] = pixels[idx + 1];
132
-
133
- // Blue channel - shift right
134
- const blueX = Math.max(0, Math.min(width - 1, x + offset));
135
- const blueIdx = (y * width + blueX) * 4;
136
- newPixels[idx + 2] = pixels[blueIdx];
137
-
138
- // Alpha channel - no change
139
- newPixels[idx + 3] = pixels[idx + 3];
140
- }
141
- }
142
-
143
- ctx.putImageData(new ImageData(newPixels, width, height), 0, 0);
144
- }
145
-
146
- /**
147
- * Applies film grain effect
148
- * @param ctx - Canvas 2D context
149
- * @param intensity - Grain intensity (0-1)
150
- * @param width - Canvas width
151
- * @param height - Canvas height
152
- */
153
- export function applyFilmGrain(
154
- ctx: SKRSContext2D,
155
- intensity: number,
156
- width: number,
157
- height: number
158
- ): void {
159
- const imageData = ctx.getImageData(0, 0, width, height);
160
- const pixels = imageData.data;
161
- const grainAmount = intensity * 30; // Max 30 pixel variation
162
-
163
- for (let i = 0; i < pixels.length; i += 4) {
164
- // Generate random grain
165
- const grain = (Math.random() - 0.5) * grainAmount;
166
-
167
- pixels[i] = Math.max(0, Math.min(255, pixels[i] + grain)); // R
168
- pixels[i + 1] = Math.max(0, Math.min(255, pixels[i + 1] + grain)); // G
169
- pixels[i + 2] = Math.max(0, Math.min(255, pixels[i + 2] + grain)); // B
170
- // Alpha unchanged
171
- }
172
-
173
- ctx.putImageData(imageData, 0, 0);
174
- }
175
-
@@ -1,356 +0,0 @@
1
- import { SKRSContext2D } from '@napi-rs/canvas';
2
- import { ImageFilter } from '../types';
3
-
4
- /**
5
- * Applies image filters to a canvas context
6
- * @param ctx Canvas 2D context
7
- * @param filters Array of filters to apply
8
- * @param width Canvas width
9
- * @param height Canvas height
10
- */
11
- export function applyImageFilters(
12
- ctx: SKRSContext2D,
13
- filters: ImageFilter[],
14
- width: number,
15
- height: number
16
- ): void {
17
- if (!filters || filters.length === 0) return;
18
-
19
- ctx.save();
20
-
21
- for (const filter of filters) {
22
- switch (filter.type) {
23
- case 'gaussianBlur':
24
- applyGaussianBlur(ctx, filter.intensity || 0);
25
- break;
26
- case 'motionBlur':
27
- applyMotionBlur(ctx, filter.intensity || 0, filter.angle || 0);
28
- break;
29
- case 'radialBlur':
30
- applyRadialBlur(ctx, filter.intensity || 0, filter.centerX || width/2, filter.centerY || height/2);
31
- break;
32
- case 'sharpen':
33
- applySharpen(ctx, filter.intensity || 0);
34
- break;
35
- case 'noise':
36
- applyNoise(ctx, filter.intensity || 0.1);
37
- break;
38
- case 'grain':
39
- applyGrain(ctx, filter.intensity || 0.05);
40
- break;
41
- case 'edgeDetection':
42
- applyEdgeDetection(ctx, filter.intensity || 1);
43
- break;
44
- case 'emboss':
45
- applyEmboss(ctx, filter.intensity || 1);
46
- break;
47
- case 'invert':
48
- applyInvert(ctx);
49
- break;
50
- case 'grayscale':
51
- applyGrayscale(ctx);
52
- break;
53
- case 'sepia':
54
- applySepia(ctx);
55
- break;
56
- case 'pixelate':
57
- applyPixelate(ctx, filter.size || 10);
58
- break;
59
- case 'brightness':
60
- applyBrightness(ctx, filter.value || 0);
61
- break;
62
- case 'contrast':
63
- applyContrast(ctx, filter.value || 0);
64
- break;
65
- case 'saturation':
66
- applySaturation(ctx, filter.value || 0);
67
- break;
68
- case 'hueShift':
69
- applyHueShift(ctx, filter.value || 0);
70
- break;
71
- case 'posterize':
72
- applyPosterize(ctx, filter.levels || 4);
73
- break;
74
- }
75
- }
76
-
77
- ctx.restore();
78
- }
79
-
80
- // Individual filter implementations
81
- function applyGaussianBlur(ctx: SKRSContext2D, intensity: number): void {
82
- if (intensity > 0) {
83
- ctx.filter = `blur(${intensity}px)`;
84
- }
85
- }
86
-
87
- function applyMotionBlur(ctx: SKRSContext2D, intensity: number, angle: number): void {
88
- if (intensity > 0) {
89
- // Motion blur is approximated with directional blur
90
- const radians = (angle * Math.PI) / 180;
91
- const blurX = Math.cos(radians) * intensity;
92
- const blurY = Math.sin(radians) * intensity;
93
- ctx.filter = `blur(${Math.abs(blurX)}px ${Math.abs(blurY)}px)`;
94
- }
95
- }
96
-
97
- function applyRadialBlur(ctx: SKRSContext2D, intensity: number, centerX: number, centerY: number): void {
98
- if (intensity > 0) {
99
- // Radial blur is approximated with multiple directional blurs
100
- ctx.filter = `blur(${intensity}px)`;
101
- }
102
- }
103
-
104
- function applySharpen(ctx: SKRSContext2D, intensity: number): void {
105
- if (intensity > 0) {
106
- const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
107
- const data = imageData.data;
108
- const width = ctx.canvas.width;
109
- const height = ctx.canvas.height;
110
-
111
- // Create a copy for the sharpening kernel
112
- const originalData = new Uint8ClampedArray(data);
113
-
114
- // Apply sharpening kernel
115
- for (let y = 1; y < height - 1; y++) {
116
- for (let x = 1; x < width - 1; x++) {
117
- const idx = (y * width + x) * 4;
118
-
119
- // Sharpening kernel: [[0,-1,0],[-1,5,-1],[0,-1,0]]
120
- let r = 0, g = 0, b = 0;
121
-
122
- for (let ky = -1; ky <= 1; ky++) {
123
- for (let kx = -1; kx <= 1; kx++) {
124
- const kidx = ((y + ky) * width + (x + kx)) * 4;
125
- const kernelValue = (ky === 0 && kx === 0) ? 5 : -1;
126
-
127
- r += originalData[kidx] * kernelValue;
128
- g += originalData[kidx + 1] * kernelValue;
129
- b += originalData[kidx + 2] * kernelValue;
130
- }
131
- }
132
-
133
- // Apply intensity
134
- data[idx] = Math.max(0, Math.min(255, originalData[idx] + (r - originalData[idx]) * intensity));
135
- data[idx + 1] = Math.max(0, Math.min(255, originalData[idx + 1] + (g - originalData[idx + 1]) * intensity));
136
- data[idx + 2] = Math.max(0, Math.min(255, originalData[idx + 2] + (b - originalData[idx + 2]) * intensity));
137
- }
138
- }
139
-
140
- ctx.putImageData(imageData, 0, 0);
141
- }
142
- }
143
-
144
- function applyNoise(ctx: SKRSContext2D, intensity: number): void {
145
- if (intensity > 0) {
146
- const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
147
- const data = imageData.data;
148
-
149
- for (let i = 0; i < data.length; i += 4) {
150
- const noise = (Math.random() - 0.5) * intensity * 255;
151
- data[i] = Math.max(0, Math.min(255, data[i] + noise)); // R
152
- data[i + 1] = Math.max(0, Math.min(255, data[i + 1] + noise)); // G
153
- data[i + 2] = Math.max(0, Math.min(255, data[i + 2] + noise)); // B
154
- }
155
-
156
- ctx.putImageData(imageData, 0, 0);
157
- }
158
- }
159
-
160
- function applyGrain(ctx: SKRSContext2D, intensity: number): void {
161
- if (intensity > 0) {
162
- const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
163
- const data = imageData.data;
164
-
165
- for (let i = 0; i < data.length; i += 4) {
166
- const grain = (Math.random() - 0.5) * intensity * 100;
167
- data[i] = Math.max(0, Math.min(255, data[i] + grain)); // R
168
- data[i + 1] = Math.max(0, Math.min(255, data[i + 1] + grain)); // G
169
- data[i + 2] = Math.max(0, Math.min(255, data[i + 2] + grain)); // B
170
- }
171
-
172
- ctx.putImageData(imageData, 0, 0);
173
- }
174
- }
175
-
176
- function applyEdgeDetection(ctx: SKRSContext2D, intensity: number): void {
177
- if (intensity > 0) {
178
- const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
179
- const data = imageData.data;
180
- const width = ctx.canvas.width;
181
- const height = ctx.canvas.height;
182
-
183
- // Create a copy for the edge detection kernel
184
- const originalData = new Uint8ClampedArray(data);
185
-
186
- // Apply Sobel edge detection kernel
187
- for (let y = 1; y < height - 1; y++) {
188
- for (let x = 1; x < width - 1; x++) {
189
- const idx = (y * width + x) * 4;
190
-
191
- // Sobel X kernel: [[-1,0,1],[-2,0,2],[-1,0,1]]
192
- // Sobel Y kernel: [[-1,-2,-1],[0,0,0],[1,2,1]]
193
- let gx = 0, gy = 0;
194
-
195
- for (let ky = -1; ky <= 1; ky++) {
196
- for (let kx = -1; kx <= 1; kx++) {
197
- const kidx = ((y + ky) * width + (x + kx)) * 4;
198
- const gray = (originalData[kidx] + originalData[kidx + 1] + originalData[kidx + 2]) / 3;
199
-
200
- const sobelX = (kx === -1) ? -1 : (kx === 0) ? 0 : 1;
201
- const sobelY = (ky === -1) ? -1 : (ky === 0) ? 0 : 1;
202
-
203
- gx += gray * sobelX;
204
- gy += gray * sobelY;
205
- }
206
- }
207
-
208
- const magnitude = Math.sqrt(gx * gx + gy * gy) * intensity;
209
- const edgeValue = Math.min(255, magnitude);
210
-
211
- data[idx] = edgeValue; // R
212
- data[idx + 1] = edgeValue; // G
213
- data[idx + 2] = edgeValue; // B
214
- }
215
- }
216
-
217
- ctx.putImageData(imageData, 0, 0);
218
- }
219
- }
220
-
221
- function applyEmboss(ctx: SKRSContext2D, intensity: number): void {
222
- if (intensity > 0) {
223
- const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
224
- const data = imageData.data;
225
- const width = ctx.canvas.width;
226
- const height = ctx.canvas.height;
227
-
228
- // Create a copy for the emboss kernel
229
- const originalData = new Uint8ClampedArray(data);
230
-
231
- // Apply emboss kernel
232
- for (let y = 1; y < height - 1; y++) {
233
- for (let x = 1; x < width - 1; x++) {
234
- const idx = (y * width + x) * 4;
235
-
236
- // Emboss kernel: [[-2,-1,0],[-1,1,1],[0,1,2]]
237
- let r = 0, g = 0, b = 0;
238
-
239
- for (let ky = -1; ky <= 1; ky++) {
240
- for (let kx = -1; kx <= 1; kx++) {
241
- const kidx = ((y + ky) * width + (x + kx)) * 4;
242
- let kernelValue = 0;
243
-
244
- if (ky === -1 && kx === -1) kernelValue = -2;
245
- else if (ky === -1 && kx === 0) kernelValue = -1;
246
- else if (ky === -1 && kx === 1) kernelValue = 0;
247
- else if (ky === 0 && kx === -1) kernelValue = -1;
248
- else if (ky === 0 && kx === 0) kernelValue = 1;
249
- else if (ky === 0 && kx === 1) kernelValue = 1;
250
- else if (ky === 1 && kx === -1) kernelValue = 0;
251
- else if (ky === 1 && kx === 0) kernelValue = 1;
252
- else if (ky === 1 && kx === 1) kernelValue = 2;
253
-
254
- r += originalData[kidx] * kernelValue;
255
- g += originalData[kidx + 1] * kernelValue;
256
- b += originalData[kidx + 2] * kernelValue;
257
- }
258
- }
259
-
260
- // Apply intensity and add 128 for emboss effect
261
- data[idx] = Math.max(0, Math.min(255, 128 + r * intensity));
262
- data[idx + 1] = Math.max(0, Math.min(255, 128 + g * intensity));
263
- data[idx + 2] = Math.max(0, Math.min(255, 128 + b * intensity));
264
- }
265
- }
266
-
267
- ctx.putImageData(imageData, 0, 0);
268
- }
269
- }
270
-
271
- function applyInvert(ctx: SKRSContext2D): void {
272
- ctx.filter = 'invert(100%)';
273
- }
274
-
275
- function applyGrayscale(ctx: SKRSContext2D): void {
276
- ctx.filter = 'grayscale(100%)';
277
- }
278
-
279
- function applySepia(ctx: SKRSContext2D): void {
280
- ctx.filter = 'sepia(100%)';
281
- }
282
-
283
- function applyPixelate(ctx: SKRSContext2D, size: number): void {
284
- if (size > 1) {
285
- const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
286
- const data = imageData.data;
287
- const width = ctx.canvas.width;
288
- const height = ctx.canvas.height;
289
-
290
- // Create pixelated version
291
- for (let y = 0; y < height; y += size) {
292
- for (let x = 0; x < width; x += size) {
293
- // Get average color of the block
294
- let r = 0, g = 0, b = 0, count = 0;
295
-
296
- for (let dy = 0; dy < size && y + dy < height; dy++) {
297
- for (let dx = 0; dx < size && x + dx < width; dx++) {
298
- const idx = ((y + dy) * width + (x + dx)) * 4;
299
- r += data[idx];
300
- g += data[idx + 1];
301
- b += data[idx + 2];
302
- count++;
303
- }
304
- }
305
-
306
- r = Math.round(r / count);
307
- g = Math.round(g / count);
308
- b = Math.round(b / count);
309
-
310
- // Apply the average color to the entire block
311
- for (let dy = 0; dy < size && y + dy < height; dy++) {
312
- for (let dx = 0; dx < size && x + dx < width; dx++) {
313
- const idx = ((y + dy) * width + (x + dx)) * 4;
314
- data[idx] = r;
315
- data[idx + 1] = g;
316
- data[idx + 2] = b;
317
- }
318
- }
319
- }
320
- }
321
-
322
- ctx.putImageData(imageData, 0, 0);
323
- }
324
- }
325
-
326
- function applyBrightness(ctx: SKRSContext2D, value: number): void {
327
- ctx.filter = `brightness(${100 + value}%)`;
328
- }
329
-
330
- function applyContrast(ctx: SKRSContext2D, value: number): void {
331
- ctx.filter = `contrast(${100 + value}%)`;
332
- }
333
-
334
- function applySaturation(ctx: SKRSContext2D, value: number): void {
335
- ctx.filter = `saturate(${100 + value}%)`;
336
- }
337
-
338
- function applyHueShift(ctx: SKRSContext2D, value: number): void {
339
- ctx.filter = `hue-rotate(${value}deg)`;
340
- }
341
-
342
- function applyPosterize(ctx: SKRSContext2D, levels: number): void {
343
- if (levels > 1) {
344
- const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
345
- const data = imageData.data;
346
- const step = 255 / (levels - 1);
347
-
348
- for (let i = 0; i < data.length; i += 4) {
349
- data[i] = Math.round(data[i] / step) * step; // R
350
- data[i + 1] = Math.round(data[i + 1] / step) * step; // G
351
- data[i + 2] = Math.round(data[i + 2] / step) * step; // B
352
- }
353
-
354
- ctx.putImageData(imageData, 0, 0);
355
- }
356
- }