@postermywall/fabricjs-2 6.0.0-rc2.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/dist/index.js +229 -491
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.min.js +1 -1
  5. package/dist/index.min.js.map +1 -1
  6. package/dist/index.min.mjs +1 -1
  7. package/dist/index.min.mjs.map +1 -1
  8. package/dist/index.mjs +229 -491
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/index.node.cjs +229 -491
  11. package/dist/index.node.cjs.map +1 -1
  12. package/dist/index.node.mjs +229 -491
  13. package/dist/index.node.mjs.map +1 -1
  14. package/dist/package.json.min.mjs +1 -1
  15. package/dist/package.json.mjs +1 -1
  16. package/dist/src/canvas/Canvas.d.ts.map +1 -1
  17. package/dist/src/canvas/Canvas.min.mjs +1 -1
  18. package/dist/src/canvas/Canvas.min.mjs.map +1 -1
  19. package/dist/src/canvas/Canvas.mjs +8 -9
  20. package/dist/src/canvas/Canvas.mjs.map +1 -1
  21. package/dist/src/canvas/SelectableCanvas.d.ts +1 -1
  22. package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
  23. package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
  24. package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
  25. package/dist/src/canvas/SelectableCanvas.mjs +1 -1
  26. package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
  27. package/dist/src/canvas/StaticCanvas.d.ts +4 -4
  28. package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
  29. package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
  30. package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
  31. package/dist/src/canvas/StaticCanvas.mjs +0 -13
  32. package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
  33. package/dist/src/color/Color.d.ts +1 -0
  34. package/dist/src/color/Color.d.ts.map +1 -1
  35. package/dist/src/color/Color.min.mjs +1 -1
  36. package/dist/src/color/Color.min.mjs.map +1 -1
  37. package/dist/src/color/Color.mjs +3 -1
  38. package/dist/src/color/Color.mjs.map +1 -1
  39. package/dist/src/filters/BaseFilter.d.ts +16 -23
  40. package/dist/src/filters/BaseFilter.d.ts.map +1 -1
  41. package/dist/src/filters/BaseFilter.min.mjs +1 -1
  42. package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
  43. package/dist/src/filters/BaseFilter.mjs +24 -41
  44. package/dist/src/filters/BaseFilter.mjs.map +1 -1
  45. package/dist/src/filters/BlendColor.d.ts +13 -24
  46. package/dist/src/filters/BlendColor.d.ts.map +1 -1
  47. package/dist/src/filters/BlendColor.min.mjs +1 -1
  48. package/dist/src/filters/BlendColor.min.mjs.map +1 -1
  49. package/dist/src/filters/BlendColor.mjs +1 -25
  50. package/dist/src/filters/BlendColor.mjs.map +1 -1
  51. package/dist/src/filters/BlendImage.d.ts +18 -19
  52. package/dist/src/filters/BlendImage.d.ts.map +1 -1
  53. package/dist/src/filters/BlendImage.min.mjs +1 -1
  54. package/dist/src/filters/BlendImage.min.mjs.map +1 -1
  55. package/dist/src/filters/BlendImage.mjs +13 -24
  56. package/dist/src/filters/BlendImage.mjs.map +1 -1
  57. package/dist/src/filters/Blur.d.ts +10 -12
  58. package/dist/src/filters/Blur.d.ts.map +1 -1
  59. package/dist/src/filters/Blur.min.mjs +1 -1
  60. package/dist/src/filters/Blur.min.mjs.map +1 -1
  61. package/dist/src/filters/Blur.mjs +5 -14
  62. package/dist/src/filters/Blur.mjs.map +1 -1
  63. package/dist/src/filters/Boilerplate.d.ts +11 -13
  64. package/dist/src/filters/Boilerplate.d.ts.map +1 -1
  65. package/dist/src/filters/Brightness.d.ts +10 -12
  66. package/dist/src/filters/Brightness.d.ts.map +1 -1
  67. package/dist/src/filters/Brightness.min.mjs +1 -1
  68. package/dist/src/filters/Brightness.min.mjs.map +1 -1
  69. package/dist/src/filters/Brightness.mjs +4 -16
  70. package/dist/src/filters/Brightness.mjs.map +1 -1
  71. package/dist/src/filters/Canvas2dFilterBackend.d.ts +1 -1
  72. package/dist/src/filters/Canvas2dFilterBackend.d.ts.map +1 -1
  73. package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +1 -1
  74. package/dist/src/filters/Canvas2dFilterBackend.mjs.map +1 -1
  75. package/dist/src/filters/ColorMatrix.d.ts +17 -15
  76. package/dist/src/filters/ColorMatrix.d.ts.map +1 -1
  77. package/dist/src/filters/ColorMatrix.min.mjs +1 -1
  78. package/dist/src/filters/ColorMatrix.min.mjs.map +1 -1
  79. package/dist/src/filters/ColorMatrix.mjs +7 -27
  80. package/dist/src/filters/ColorMatrix.mjs.map +1 -1
  81. package/dist/src/filters/ColorMatrixFilters.d.ts +63 -497
  82. package/dist/src/filters/ColorMatrixFilters.d.ts.map +1 -1
  83. package/dist/src/filters/ColorMatrixFilters.min.mjs +1 -1
  84. package/dist/src/filters/ColorMatrixFilters.min.mjs.map +1 -1
  85. package/dist/src/filters/ColorMatrixFilters.mjs +13 -8
  86. package/dist/src/filters/ColorMatrixFilters.mjs.map +1 -1
  87. package/dist/src/filters/Composed.d.ts +11 -10
  88. package/dist/src/filters/Composed.d.ts.map +1 -1
  89. package/dist/src/filters/Composed.min.mjs +1 -1
  90. package/dist/src/filters/Composed.min.mjs.map +1 -1
  91. package/dist/src/filters/Composed.mjs +7 -12
  92. package/dist/src/filters/Composed.mjs.map +1 -1
  93. package/dist/src/filters/Contrast.d.ts +10 -12
  94. package/dist/src/filters/Contrast.d.ts.map +1 -1
  95. package/dist/src/filters/Contrast.min.mjs +1 -1
  96. package/dist/src/filters/Contrast.min.mjs.map +1 -1
  97. package/dist/src/filters/Contrast.mjs +6 -17
  98. package/dist/src/filters/Contrast.mjs.map +1 -1
  99. package/dist/src/filters/Convolute.d.ts +11 -14
  100. package/dist/src/filters/Convolute.d.ts.map +1 -1
  101. package/dist/src/filters/Convolute.min.mjs +1 -1
  102. package/dist/src/filters/Convolute.min.mjs.map +1 -1
  103. package/dist/src/filters/Convolute.mjs +1 -15
  104. package/dist/src/filters/Convolute.mjs.map +1 -1
  105. package/dist/src/filters/Gamma.d.ts +17 -14
  106. package/dist/src/filters/Gamma.d.ts.map +1 -1
  107. package/dist/src/filters/Gamma.min.mjs +1 -1
  108. package/dist/src/filters/Gamma.min.mjs.map +1 -1
  109. package/dist/src/filters/Gamma.mjs +20 -24
  110. package/dist/src/filters/Gamma.mjs.map +1 -1
  111. package/dist/src/filters/Grayscale.d.ts +8 -11
  112. package/dist/src/filters/Grayscale.d.ts.map +1 -1
  113. package/dist/src/filters/Grayscale.min.mjs +1 -1
  114. package/dist/src/filters/Grayscale.min.mjs.map +1 -1
  115. package/dist/src/filters/Grayscale.mjs +2 -14
  116. package/dist/src/filters/Grayscale.mjs.map +1 -1
  117. package/dist/src/filters/HueRotation.d.ts +11 -5
  118. package/dist/src/filters/HueRotation.d.ts.map +1 -1
  119. package/dist/src/filters/HueRotation.min.mjs +1 -1
  120. package/dist/src/filters/HueRotation.min.mjs.map +1 -1
  121. package/dist/src/filters/HueRotation.mjs +10 -5
  122. package/dist/src/filters/HueRotation.mjs.map +1 -1
  123. package/dist/src/filters/Invert.d.ts +10 -13
  124. package/dist/src/filters/Invert.d.ts.map +1 -1
  125. package/dist/src/filters/Invert.min.mjs +1 -1
  126. package/dist/src/filters/Invert.min.mjs.map +1 -1
  127. package/dist/src/filters/Invert.mjs +2 -15
  128. package/dist/src/filters/Invert.mjs.map +1 -1
  129. package/dist/src/filters/Noise.d.ts +9 -20
  130. package/dist/src/filters/Noise.d.ts.map +1 -1
  131. package/dist/src/filters/Noise.min.mjs +1 -1
  132. package/dist/src/filters/Noise.min.mjs.map +1 -1
  133. package/dist/src/filters/Noise.mjs +4 -27
  134. package/dist/src/filters/Noise.mjs.map +1 -1
  135. package/dist/src/filters/Pixelate.d.ts +8 -12
  136. package/dist/src/filters/Pixelate.d.ts.map +1 -1
  137. package/dist/src/filters/Pixelate.min.mjs +1 -1
  138. package/dist/src/filters/Pixelate.min.mjs.map +1 -1
  139. package/dist/src/filters/Pixelate.mjs +2 -16
  140. package/dist/src/filters/Pixelate.mjs.map +1 -1
  141. package/dist/src/filters/RemoveColor.d.ts +12 -23
  142. package/dist/src/filters/RemoveColor.d.ts.map +1 -1
  143. package/dist/src/filters/RemoveColor.min.mjs +1 -1
  144. package/dist/src/filters/RemoveColor.min.mjs.map +1 -1
  145. package/dist/src/filters/RemoveColor.mjs +2 -25
  146. package/dist/src/filters/RemoveColor.mjs.map +1 -1
  147. package/dist/src/filters/Resize.d.ts +14 -30
  148. package/dist/src/filters/Resize.d.ts.map +1 -1
  149. package/dist/src/filters/Resize.min.mjs +1 -1
  150. package/dist/src/filters/Resize.min.mjs.map +1 -1
  151. package/dist/src/filters/Resize.mjs +3 -30
  152. package/dist/src/filters/Resize.mjs.map +1 -1
  153. package/dist/src/filters/Saturation.d.ts +9 -12
  154. package/dist/src/filters/Saturation.d.ts.map +1 -1
  155. package/dist/src/filters/Saturation.min.mjs +1 -1
  156. package/dist/src/filters/Saturation.min.mjs.map +1 -1
  157. package/dist/src/filters/Saturation.mjs +8 -20
  158. package/dist/src/filters/Saturation.mjs.map +1 -1
  159. package/dist/src/filters/Vibrance.d.ts +10 -13
  160. package/dist/src/filters/Vibrance.d.ts.map +1 -1
  161. package/dist/src/filters/Vibrance.min.mjs +1 -1
  162. package/dist/src/filters/Vibrance.min.mjs.map +1 -1
  163. package/dist/src/filters/Vibrance.mjs +6 -18
  164. package/dist/src/filters/Vibrance.mjs.map +1 -1
  165. package/dist/src/filters/WebGLFilterBackend.d.ts +1 -1
  166. package/dist/src/filters/WebGLFilterBackend.d.ts.map +1 -1
  167. package/dist/src/filters/WebGLFilterBackend.min.mjs.map +1 -1
  168. package/dist/src/filters/WebGLFilterBackend.mjs.map +1 -1
  169. package/dist/src/filters/shaders/blendImage.d.ts +1 -0
  170. package/dist/src/filters/shaders/blendImage.d.ts.map +1 -1
  171. package/dist/src/filters/shaders/blendImage.min.mjs +1 -1
  172. package/dist/src/filters/shaders/blendImage.min.mjs.map +1 -1
  173. package/dist/src/filters/shaders/blendImage.mjs +2 -1
  174. package/dist/src/filters/shaders/blendImage.mjs.map +1 -1
  175. package/dist/src/filters/typedefs.d.ts +22 -0
  176. package/dist/src/filters/typedefs.d.ts.map +1 -1
  177. package/dist/src/parser/elements_parser.d.ts +1 -1
  178. package/dist/src/parser/elements_parser.d.ts.map +1 -1
  179. package/dist/src/parser/elements_parser.min.mjs.map +1 -1
  180. package/dist/src/parser/elements_parser.mjs.map +1 -1
  181. package/dist/src/shapes/ActiveSelection.d.ts +1 -1
  182. package/dist/src/shapes/ActiveSelection.d.ts.map +1 -1
  183. package/dist/src/shapes/ActiveSelection.min.mjs +1 -1
  184. package/dist/src/shapes/ActiveSelection.min.mjs.map +1 -1
  185. package/dist/src/shapes/ActiveSelection.mjs +13 -10
  186. package/dist/src/shapes/ActiveSelection.mjs.map +1 -1
  187. package/dist/src/shapes/Group.d.ts +9 -0
  188. package/dist/src/shapes/Group.d.ts.map +1 -1
  189. package/dist/src/shapes/Group.min.mjs +1 -1
  190. package/dist/src/shapes/Group.min.mjs.map +1 -1
  191. package/dist/src/shapes/Group.mjs +10 -1
  192. package/dist/src/shapes/Group.mjs.map +1 -1
  193. package/dist/src/shapes/Image.d.ts +4 -4
  194. package/dist/src/shapes/Image.d.ts.map +1 -1
  195. package/dist/src/shapes/Image.min.mjs.map +1 -1
  196. package/dist/src/shapes/Image.mjs.map +1 -1
  197. package/dist/src/shapes/Object/InteractiveObject.d.ts +3 -0
  198. package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
  199. package/dist/src/shapes/Object/InteractiveObject.min.mjs +1 -1
  200. package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
  201. package/dist/src/shapes/Object/InteractiveObject.mjs +3 -1
  202. package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
  203. package/dist/src/shapes/Object/Object.d.ts +1 -16
  204. package/dist/src/shapes/Object/Object.d.ts.map +1 -1
  205. package/dist/src/shapes/Object/Object.min.mjs +1 -1
  206. package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
  207. package/dist/src/shapes/Object/Object.mjs +9 -10
  208. package/dist/src/shapes/Object/Object.mjs.map +1 -1
  209. package/dist/src/shapes/Object/StackedObject.d.ts +8 -15
  210. package/dist/src/shapes/Object/StackedObject.d.ts.map +1 -1
  211. package/dist/src/shapes/Object/StackedObject.min.mjs +1 -1
  212. package/dist/src/shapes/Object/StackedObject.min.mjs.map +1 -1
  213. package/dist/src/shapes/Object/StackedObject.mjs +11 -21
  214. package/dist/src/shapes/Object/StackedObject.mjs.map +1 -1
  215. package/dist/src/shapes/Path.d.ts +2 -2
  216. package/dist/src/shapes/Path.d.ts.map +1 -1
  217. package/dist/src/shapes/Path.min.mjs.map +1 -1
  218. package/dist/src/shapes/Path.mjs +2 -2
  219. package/dist/src/shapes/Path.mjs.map +1 -1
  220. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +1 -1
  221. package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
  222. package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
  223. package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
  224. package/dist/src/util/misc/objectEnlive.d.ts +2 -2
  225. package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
  226. package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
  227. package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
  228. package/package.json +2 -2
  229. package/src/canvas/Canvas.ts +6 -9
  230. package/src/canvas/SelectableCanvas.ts +2 -2
  231. package/src/canvas/StaticCanvas.ts +4 -18
  232. package/src/color/Color.ts +2 -1
  233. package/src/color/color.test.ts +6 -0
  234. package/src/filters/BaseFilter.ts +45 -51
  235. package/src/filters/BlendColor.ts +13 -35
  236. package/src/filters/BlendImage.ts +26 -40
  237. package/src/filters/Blur.ts +13 -20
  238. package/src/filters/Boilerplate.ts +13 -22
  239. package/src/filters/Brightness.ts +12 -21
  240. package/src/filters/Canvas2dFilterBackend.ts +1 -1
  241. package/src/filters/ColorMatrix.ts +29 -34
  242. package/src/filters/ColorMatrixFilters.ts +15 -9
  243. package/src/filters/Composed.ts +26 -16
  244. package/src/filters/Contrast.ts +15 -23
  245. package/src/filters/Convolute.ts +11 -23
  246. package/src/filters/Gamma.ts +32 -24
  247. package/src/filters/Grayscale.ts +8 -19
  248. package/src/filters/HueRotation.ts +21 -11
  249. package/src/filters/Invert.ts +11 -22
  250. package/src/filters/Noise.ts +11 -30
  251. package/src/filters/Pixelate.ts +9 -22
  252. package/src/filters/RemoveColor.ts +21 -35
  253. package/src/filters/Resize.ts +20 -44
  254. package/src/filters/Saturation.ts +16 -27
  255. package/src/filters/Vibrance.ts +14 -24
  256. package/src/filters/WebGLFilterBackend.ts +1 -1
  257. package/src/filters/shaders/blendImage.ts +12 -0
  258. package/src/filters/typedefs.ts +23 -0
  259. package/src/parser/elements_parser.ts +1 -1
  260. package/src/shapes/ActiveSelection.ts +8 -4
  261. package/src/shapes/Group.ts +16 -1
  262. package/src/shapes/Image.ts +8 -6
  263. package/src/shapes/Object/InteractiveObject.ts +3 -1
  264. package/src/shapes/Object/Object.ts +10 -35
  265. package/src/shapes/Object/StackedObject.ts +28 -44
  266. package/src/shapes/Path.ts +4 -4
  267. package/src/shapes/Text/TextSVGExportMixin.ts +1 -1
  268. package/src/util/misc/objectEnlive.ts +12 -2
@@ -1,8 +1,12 @@
1
- import type { TClassProperties } from '../typedefs';
2
1
  import { BaseFilter } from './BaseFilter';
3
2
  import type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';
4
3
  export type TBlendMode = 'multiply' | 'add' | 'difference' | 'screen' | 'subtract' | 'darken' | 'lighten' | 'overlay' | 'exclusion' | 'tint';
5
- export declare const blendColorDefaultValues: Partial<TClassProperties<BlendColor>>;
4
+ type BlendColorOwnProps = {
5
+ color: string;
6
+ mode: TBlendMode;
7
+ alpha: number;
8
+ };
9
+ export declare const blendColorDefaultValues: BlendColorOwnProps;
6
10
  /**
7
11
  * Color Blend filter class
8
12
  * @example
@@ -19,29 +23,30 @@ export declare const blendColorDefaultValues: Partial<TClassProperties<BlendColo
19
23
  * object.applyFilters();
20
24
  * canvas.renderAll();
21
25
  */
22
- export declare class BlendColor extends BaseFilter {
26
+ export declare class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {
23
27
  /**
24
28
  * Color to make the blend operation with. default to a reddish color since black or white
25
29
  * gives always strong result.
26
30
  * @type String
27
31
  * @default
28
32
  **/
29
- color: string;
33
+ color: BlendColorOwnProps['color'];
30
34
  /**
31
35
  * Blend mode for the filter: one of multiply, add, difference, screen, subtract,
32
36
  * darken, lighten, overlay, exclusion, tint.
33
37
  * @type String
34
38
  * @default
35
39
  **/
36
- mode: TBlendMode;
40
+ mode: BlendColorOwnProps['mode'];
37
41
  /**
38
42
  * alpha value. represent the strength of the blend color operation.
39
43
  * @type Number
40
44
  * @default
41
45
  **/
42
- alpha: number;
43
- static defaults: Partial<TClassProperties<BlendColor>>;
46
+ alpha: BlendColorOwnProps['alpha'];
47
+ static defaults: BlendColorOwnProps;
44
48
  static type: string;
49
+ static uniformLocations: string[];
45
50
  getCacheKey(): string;
46
51
  protected getFragmentSource(): string;
47
52
  /**
@@ -51,13 +56,6 @@ export declare class BlendColor extends BaseFilter {
51
56
  * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.
52
57
  */
53
58
  applyTo2d({ imageData: { data } }: T2DPipelineState): void;
54
- /**
55
- * Return WebGL uniform locations for this filter's shader.
56
- *
57
- * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
58
- * @param {WebGLShaderProgram} program This filter's compiled shader program.
59
- */
60
- getUniformLocations(gl: WebGLRenderingContext, program: WebGLProgram): TWebGLUniformLocationMap;
61
59
  /**
62
60
  * Send data from this filter to its shader program's uniforms.
63
61
  *
@@ -65,15 +63,6 @@ export declare class BlendColor extends BaseFilter {
65
63
  * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects
66
64
  */
67
65
  sendUniformData(gl: WebGLRenderingContext, uniformLocations: TWebGLUniformLocationMap): void;
68
- /**
69
- * Returns object representation of an instance
70
- * @return {Object} Object representation of an instance
71
- */
72
- toObject(): {
73
- type: string;
74
- color: string;
75
- mode: TBlendMode;
76
- alpha: number;
77
- };
78
66
  }
67
+ export {};
79
68
  //# sourceMappingURL=BlendColor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlendColor.d.ts","sourceRoot":"","sources":["../../../src/filters/BlendColor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAI7E,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,KAAK,GACL,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,SAAS,GACT,SAAS,GACT,WAAW,GACX,MAAM,CAAC;AAEX,eAAO,MAAM,uBAAuB,EAAE,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAIzE,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC;;;;;QAKI;IACI,KAAK,EAAE,MAAM,CAAC;IAEtB;;;;;QAKI;IACI,IAAI,EAAE,UAAU,CAAC;IAEzB;;;;QAII;IACI,KAAK,EAAE,MAAM,CAAC;IAEtB,MAAM,CAAC,QAAQ,wCAA2B;IAE1C,MAAM,CAAC,IAAI,SAAgB;IAE3B,WAAW;IAIX,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAgBrC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,gBAAgB;IA2EnD;;;;;OAKG;IACH,mBAAmB,CACjB,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,YAAY,GACpB,wBAAwB;IAM3B;;;;;OAKG;IACH,eAAe,CACb,EAAE,EAAE,qBAAqB,EACzB,gBAAgB,EAAE,wBAAwB;IAU5C;;;OAGG;IACH,QAAQ;;;;;;CAQT"}
1
+ {"version":3,"file":"BlendColor.d.ts","sourceRoot":"","sources":["../../../src/filters/BlendColor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAI7E,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,KAAK,GACL,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,SAAS,GACT,SAAS,GACT,WAAW,GACX,MAAM,CAAC;AAEX,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,kBAIrC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAW,SAAQ,UAAU,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1E;;;;;QAKI;IACI,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE3C;;;;;QAKI;IACI,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACzC;;;;QAII;IACI,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,CAAC,QAAQ,qBAA2B;IAE1C,MAAM,CAAC,IAAI,SAAgB;IAE3B,MAAM,CAAC,gBAAgB,WAAc;IAErC,WAAW;IAIX,SAAS,CAAC,iBAAiB,IAAI,MAAM;IAgBrC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,gBAAgB;IA2EnD;;;;;OAKG;IACH,eAAe,CACb,EAAE,EAAE,qBAAqB,EACzB,gBAAgB,EAAE,wBAAwB;CAS7C"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as e}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{Color as a}from"../color/Color.min.mjs";import{BaseFilter as o}from"./BaseFilter.min.mjs";import{classRegistry as t}from"../ClassRegistry.min.mjs";import{blendColorFragmentSource as r}from"./shaders/blendColor.min.mjs";const s={color:"#F95C63",mode:"multiply",alpha:1};class i extends o{getCacheKey(){return"".concat(this.type,"_").concat(this.mode)}getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ".concat(r[this.mode],"\n }\n }\n ")}applyTo2d(e){let{imageData:{data:o}}=e;const t=new a(this.color).getSource(),r=t[0]*this.alpha,s=t[1]*this.alpha,i=t[2]*this.alpha,n=1-this.alpha;for(let e=0;e<o.length;e+=4){const a=o[e],t=o[e+1],l=o[e+2];switch(this.mode){case"multiply":o[e]=a*r/255,o[e+1]=t*s/255,o[e+2]=l*i/255;break;case"screen":o[e]=255-(255-a)*(255-r)/255,o[e+1]=255-(255-t)*(255-s)/255,o[e+2]=255-(255-l)*(255-i)/255;break;case"add":o[e]=a+r,o[e+1]=t+s,o[e+2]=l+i;break;case"difference":o[e]=Math.abs(a-r),o[e+1]=Math.abs(t-s),o[e+2]=Math.abs(l-i);break;case"subtract":o[e]=a-r,o[e+1]=t-s,o[e+2]=l-i;break;case"darken":o[e]=Math.min(a,r),o[e+1]=Math.min(t,s),o[e+2]=Math.min(l,i);break;case"lighten":o[e]=Math.max(a,r),o[e+1]=Math.max(t,s),o[e+2]=Math.max(l,i);break;case"overlay":o[e]=r<128?2*a*r/255:255-2*(255-a)*(255-r)/255,o[e+1]=s<128?2*t*s/255:255-2*(255-t)*(255-s)/255,o[e+2]=i<128?2*l*i/255:255-2*(255-l)*(255-i)/255;break;case"exclusion":o[e]=r+a-2*r*a/255,o[e+1]=s+t-2*s*t/255,o[e+2]=i+l-2*i*l/255;break;case"tint":o[e]=r+a*n,o[e+1]=s+t*n,o[e+2]=i+l*n}}}getUniformLocations(e,a){return{uColor:e.getUniformLocation(a,"uColor")}}sendUniformData(e,o){const t=new a(this.color).getSource();t[0]=this.alpha*t[0]/255,t[1]=this.alpha*t[1]/255,t[2]=this.alpha*t[2]/255,t[3]=this.alpha,e.uniform4fv(o.uColor,t)}toObject(){return{type:this.type,color:this.color,mode:this.mode,alpha:this.alpha}}}e(i,"defaults",s),e(i,"type","BlendColor"),t.setClass(i);export{i as BlendColor,s as blendColorDefaultValues};
1
+ import{defineProperty as a}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{Color as e}from"../color/Color.min.mjs";import{BaseFilter as o}from"./BaseFilter.min.mjs";import{classRegistry as t}from"../ClassRegistry.min.mjs";import{blendColorFragmentSource as r}from"./shaders/blendColor.min.mjs";const s={color:"#F95C63",mode:"multiply",alpha:1};class n extends o{getCacheKey(){return"".concat(this.type,"_").concat(this.mode)}getFragmentSource(){return"\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ".concat(r[this.mode],"\n }\n }\n ")}applyTo2d(a){let{imageData:{data:o}}=a;const t=new e(this.color).getSource(),r=t[0]*this.alpha,s=t[1]*this.alpha,n=t[2]*this.alpha,i=1-this.alpha;for(let a=0;a<o.length;a+=4){const e=o[a],t=o[a+1],l=o[a+2];switch(this.mode){case"multiply":o[a]=e*r/255,o[a+1]=t*s/255,o[a+2]=l*n/255;break;case"screen":o[a]=255-(255-e)*(255-r)/255,o[a+1]=255-(255-t)*(255-s)/255,o[a+2]=255-(255-l)*(255-n)/255;break;case"add":o[a]=e+r,o[a+1]=t+s,o[a+2]=l+n;break;case"difference":o[a]=Math.abs(e-r),o[a+1]=Math.abs(t-s),o[a+2]=Math.abs(l-n);break;case"subtract":o[a]=e-r,o[a+1]=t-s,o[a+2]=l-n;break;case"darken":o[a]=Math.min(e,r),o[a+1]=Math.min(t,s),o[a+2]=Math.min(l,n);break;case"lighten":o[a]=Math.max(e,r),o[a+1]=Math.max(t,s),o[a+2]=Math.max(l,n);break;case"overlay":o[a]=r<128?2*e*r/255:255-2*(255-e)*(255-r)/255,o[a+1]=s<128?2*t*s/255:255-2*(255-t)*(255-s)/255,o[a+2]=n<128?2*l*n/255:255-2*(255-l)*(255-n)/255;break;case"exclusion":o[a]=r+e-2*r*e/255,o[a+1]=s+t-2*s*t/255,o[a+2]=n+l-2*n*l/255;break;case"tint":o[a]=r+e*i,o[a+1]=s+t*i,o[a+2]=n+l*i}}}sendUniformData(a,o){const t=new e(this.color).getSource();t[0]=this.alpha*t[0]/255,t[1]=this.alpha*t[1]/255,t[2]=this.alpha*t[2]/255,t[3]=this.alpha,a.uniform4fv(o.uColor,t)}}a(n,"defaults",s),a(n,"type","BlendColor"),a(n,"uniformLocations",["uColor"]),t.setClass(n);export{n as BlendColor,s as blendColorDefaultValues};
2
2
  //# sourceMappingURL=BlendColor.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlendColor.min.mjs","sources":["../../../src/filters/BlendColor.ts"],"sourcesContent":["import { Color } from '../color/Color';\nimport type { TClassProperties } from '../typedefs';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\nexport const blendColorDefaultValues: Partial<TClassProperties<BlendColor>> = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n * @default\n **/\n declare color: string;\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n * @default\n **/\n declare mode: TBlendMode;\n\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n * @default\n **/\n declare alpha: number;\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const tr = source[0] * this.alpha;\n const tg = source[1] * this.alpha;\n const tb = source[2] * this.alpha;\n const alpha1 = 1 - this.alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n break;\n case 'screen':\n data[i] = 255 - ((255 - r) * (255 - tr)) / 255;\n data[i + 1] = 255 - ((255 - g) * (255 - tg)) / 255;\n data[i + 2] = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n data[i + 1] =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n data[i + 2] =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n data[i] = tr + r - (2 * tr * r) / 255;\n data[i + 1] = tg + g - (2 * tg * g) / 255;\n data[i + 2] = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n }\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n return {\n uColor: gl.getUniformLocation(program, 'uColor'),\n };\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n type: this.type,\n color: this.color,\n mode: this.mode,\n alpha: this.alpha,\n };\n }\n}\n\nclassRegistry.setClass(BlendColor);\n"],"names":["blendColorDefaultValues","color","mode","alpha","BlendColor","BaseFilter","getCacheKey","concat","this","type","getFragmentSource","blendColorFragmentSource","applyTo2d","_ref","imageData","data","source","Color","getSource","tr","tg","tb","alpha1","i","length","r","g","b","Math","abs","min","max","getUniformLocations","gl","program","uColor","getUniformLocation","sendUniformData","uniformLocations","uniform4fv","toObject","_defineProperty","classRegistry","setClass"],"mappings":"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"}
1
+ {"version":3,"file":"BlendColor.min.mjs","sources":["../../../src/filters/BlendColor.ts"],"sourcesContent":["import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n * @default\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n * @default\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n * @default\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const tr = source[0] * this.alpha;\n const tg = source[1] * this.alpha;\n const tb = source[2] * this.alpha;\n const alpha1 = 1 - this.alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n break;\n case 'screen':\n data[i] = 255 - ((255 - r) * (255 - tr)) / 255;\n data[i + 1] = 255 - ((255 - g) * (255 - tg)) / 255;\n data[i + 2] = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n data[i + 1] =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n data[i + 2] =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n data[i] = tr + r - (2 * tr * r) / 255;\n data[i + 1] = tg + g - (2 * tg * g) / 255;\n data[i + 2] = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n"],"names":["blendColorDefaultValues","color","mode","alpha","BlendColor","BaseFilter","getCacheKey","concat","this","type","getFragmentSource","blendColorFragmentSource","applyTo2d","_ref","imageData","data","source","Color","getSource","tr","tg","tb","alpha1","i","length","r","g","b","Math","abs","min","max","sendUniformData","gl","uniformLocations","uniform4fv","uColor","_defineProperty","classRegistry","setClass"],"mappings":"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"}
@@ -109,18 +109,6 @@ class BlendColor extends BaseFilter {
109
109
  }
110
110
  }
111
111
 
112
- /**
113
- * Return WebGL uniform locations for this filter's shader.
114
- *
115
- * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
116
- * @param {WebGLShaderProgram} program This filter's compiled shader program.
117
- */
118
- getUniformLocations(gl, program) {
119
- return {
120
- uColor: gl.getUniformLocation(program, 'uColor')
121
- };
122
- }
123
-
124
112
  /**
125
113
  * Send data from this filter to its shader program's uniforms.
126
114
  *
@@ -135,19 +123,6 @@ class BlendColor extends BaseFilter {
135
123
  source[3] = this.alpha;
136
124
  gl.uniform4fv(uniformLocations.uColor, source);
137
125
  }
138
-
139
- /**
140
- * Returns object representation of an instance
141
- * @return {Object} Object representation of an instance
142
- */
143
- toObject() {
144
- return {
145
- type: this.type,
146
- color: this.color,
147
- mode: this.mode,
148
- alpha: this.alpha
149
- };
150
- }
151
126
  }
152
127
  /**
153
128
  * Color to make the blend operation with. default to a reddish color since black or white
@@ -168,6 +143,7 @@ class BlendColor extends BaseFilter {
168
143
  **/
169
144
  _defineProperty(BlendColor, "defaults", blendColorDefaultValues);
170
145
  _defineProperty(BlendColor, "type", 'BlendColor');
146
+ _defineProperty(BlendColor, "uniformLocations", ['uColor']);
171
147
  classRegistry.setClass(BlendColor);
172
148
 
173
149
  export { BlendColor, blendColorDefaultValues };
@@ -1 +1 @@
1
- {"version":3,"file":"BlendColor.mjs","sources":["../../../src/filters/BlendColor.ts"],"sourcesContent":["import { Color } from '../color/Color';\nimport type { TClassProperties } from '../typedefs';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\nexport const blendColorDefaultValues: Partial<TClassProperties<BlendColor>> = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n * @default\n **/\n declare color: string;\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n * @default\n **/\n declare mode: TBlendMode;\n\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n * @default\n **/\n declare alpha: number;\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const tr = source[0] * this.alpha;\n const tg = source[1] * this.alpha;\n const tb = source[2] * this.alpha;\n const alpha1 = 1 - this.alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n break;\n case 'screen':\n data[i] = 255 - ((255 - r) * (255 - tr)) / 255;\n data[i + 1] = 255 - ((255 - g) * (255 - tg)) / 255;\n data[i + 2] = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n data[i + 1] =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n data[i + 2] =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n data[i] = tr + r - (2 * tr * r) / 255;\n data[i + 1] = tg + g - (2 * tg * g) / 255;\n data[i + 2] = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n }\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n return {\n uColor: gl.getUniformLocation(program, 'uColor'),\n };\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n type: this.type,\n color: this.color,\n mode: this.mode,\n alpha: this.alpha,\n };\n }\n}\n\nclassRegistry.setClass(BlendColor);\n"],"names":["blendColorDefaultValues","color","mode","alpha","BlendColor","BaseFilter","getCacheKey","concat","type","getFragmentSource","blendColorFragmentSource","applyTo2d","_ref","imageData","data","source","Color","getSource","tr","tg","tb","alpha1","i","length","r","g","b","Math","abs","min","max","getUniformLocations","gl","program","uColor","getUniformLocation","sendUniformData","uniformLocations","uniform4fv","toObject","_defineProperty","classRegistry","setClass"],"mappings":"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"}
1
+ {"version":3,"file":"BlendColor.mjs","sources":["../../../src/filters/BlendColor.ts"],"sourcesContent":["import { Color } from '../color/Color';\nimport { BaseFilter } from './BaseFilter';\nimport type { T2DPipelineState, TWebGLUniformLocationMap } from './typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { blendColorFragmentSource } from './shaders/blendColor';\n\nexport type TBlendMode =\n | 'multiply'\n | 'add'\n | 'difference'\n | 'screen'\n | 'subtract'\n | 'darken'\n | 'lighten'\n | 'overlay'\n | 'exclusion'\n | 'tint';\n\ntype BlendColorOwnProps = {\n color: string;\n mode: TBlendMode;\n alpha: number;\n};\n\nexport const blendColorDefaultValues: BlendColorOwnProps = {\n color: '#F95C63',\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Color Blend filter class\n * @example\n * const filter = new BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendColor extends BaseFilter<'BlendColor', BlendColorOwnProps> {\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n * @default\n **/\n declare color: BlendColorOwnProps['color'];\n\n /**\n * Blend mode for the filter: one of multiply, add, difference, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n * @default\n **/\n declare mode: BlendColorOwnProps['mode'];\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n * @default\n **/\n declare alpha: BlendColorOwnProps['alpha'];\n\n static defaults = blendColorDefaultValues;\n\n static type = 'BlendColor';\n\n static uniformLocations = ['uColor'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n protected getFragmentSource(): string {\n return `\n precision highp float;\n uniform sampler2D uTexture;\n uniform vec4 uColor;\n varying vec2 vTexCoord;\n void main() {\n vec4 color = texture2D(uTexture, vTexCoord);\n gl_FragColor = color;\n if (color.a > 0.0) {\n ${blendColorFragmentSource[this.mode]}\n }\n }\n `;\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({ imageData: { data } }: T2DPipelineState) {\n const source = new Color(this.color).getSource();\n const tr = source[0] * this.alpha;\n const tg = source[1] * this.alpha;\n const tb = source[2] * this.alpha;\n const alpha1 = 1 - this.alpha;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n break;\n case 'screen':\n data[i] = 255 - ((255 - r) * (255 - tr)) / 255;\n data[i + 1] = 255 - ((255 - g) * (255 - tg)) / 255;\n data[i + 2] = 255 - ((255 - b) * (255 - tb)) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] =\n tr < 128\n ? (2 * r * tr) / 255\n : 255 - (2 * (255 - r) * (255 - tr)) / 255;\n data[i + 1] =\n tg < 128\n ? (2 * g * tg) / 255\n : 255 - (2 * (255 - g) * (255 - tg)) / 255;\n data[i + 2] =\n tb < 128\n ? (2 * b * tb) / 255\n : 255 - (2 * (255 - b) * (255 - tb)) / 255;\n break;\n case 'exclusion':\n data[i] = tr + r - (2 * tr * r) / 255;\n data[i + 1] = tg + g - (2 * tg * g) / 255;\n data[i + 2] = tb + b - (2 * tb * b) / 255;\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ) {\n const source = new Color(this.color).getSource();\n source[0] = (this.alpha * source[0]) / 255;\n source[1] = (this.alpha * source[1]) / 255;\n source[2] = (this.alpha * source[2]) / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n }\n}\n\nclassRegistry.setClass(BlendColor);\n"],"names":["blendColorDefaultValues","color","mode","alpha","BlendColor","BaseFilter","getCacheKey","concat","type","getFragmentSource","blendColorFragmentSource","applyTo2d","_ref","imageData","data","source","Color","getSource","tr","tg","tb","alpha1","i","length","r","g","b","Math","abs","min","max","sendUniformData","gl","uniformLocations","uniform4fv","uColor","_defineProperty","classRegistry","setClass"],"mappings":"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"}
@@ -1,10 +1,13 @@
1
1
  import { FabricImage } from '../shapes/Image';
2
- import type { TClassProperties } from '../typedefs';
3
2
  import { BaseFilter } from './BaseFilter';
4
3
  import type { T2DPipelineState, TWebGLPipelineState, TWebGLUniformLocationMap } from './typedefs';
5
4
  import type { WebGLFilterBackend } from './WebGLFilterBackend';
6
5
  export type TBlendImageMode = 'multiply' | 'mask';
7
- export declare const blendImageDefaultValues: Partial<TClassProperties<BlendImage>>;
6
+ type BlendImageOwnProps = {
7
+ mode: TBlendImageMode;
8
+ alpha: number;
9
+ };
10
+ export declare const blendImageDefaultValues: BlendImageOwnProps;
8
11
  /**
9
12
  * Image Blend filter class
10
13
  * @example
@@ -21,7 +24,7 @@ export declare const blendImageDefaultValues: Partial<TClassProperties<BlendImag
21
24
  * object.applyFilters();
22
25
  * canvas.renderAll();
23
26
  */
24
- export declare class BlendImage extends BaseFilter {
27
+ export declare class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {
25
28
  /**
26
29
  * Image to make the blend operation with.
27
30
  **/
@@ -35,16 +38,18 @@ export declare class BlendImage extends BaseFilter {
35
38
  * @type String
36
39
  * @default
37
40
  **/
38
- mode: TBlendImageMode;
41
+ mode: BlendImageOwnProps['mode'];
39
42
  /**
40
43
  * alpha value. represent the strength of the blend image operation.
41
44
  * not implemented.
42
45
  **/
43
- alpha: number;
46
+ alpha: BlendImageOwnProps['alpha'];
44
47
  static type: string;
45
- static defaults: Partial<TClassProperties<BlendImage>>;
48
+ static defaults: BlendImageOwnProps;
49
+ static uniformLocations: string[];
46
50
  getCacheKey(): string;
47
51
  getFragmentSource(): string;
52
+ getVertexSource(): string;
48
53
  applyToWebGL(options: TWebGLPipelineState): void;
49
54
  createTexture(backend: WebGLFilterBackend, image: FabricImage): WebGLTexture | null;
50
55
  /**
@@ -61,13 +66,6 @@ export declare class BlendImage extends BaseFilter {
61
66
  * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.
62
67
  */
63
68
  applyTo2d({ imageData: { data, width, height }, filterBackend: { resources }, }: T2DPipelineState): void;
64
- /**
65
- * Return WebGL uniform locations for this filter's shader.
66
- *
67
- * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
68
- * @param {WebGLShaderProgram} program This filter's compiled shader program.
69
- */
70
- getUniformLocations(gl: WebGLRenderingContext, program: WebGLProgram): TWebGLUniformLocationMap;
71
69
  /**
72
70
  * Send data from this filter to its shader program's uniforms.
73
71
  *
@@ -77,14 +75,14 @@ export declare class BlendImage extends BaseFilter {
77
75
  sendUniformData(gl: WebGLRenderingContext, uniformLocations: TWebGLUniformLocationMap): void;
78
76
  /**
79
77
  * Returns object representation of an instance
78
+ * TODO: Handle the possibility of missing image better.
79
+ * As of now a BlendImage filter without image can't be used with fromObject
80
80
  * @return {Object} Object representation of an instance
81
81
  */
82
82
  toObject(): {
83
- type: string;
84
- image: Pick<Omit<Partial<import("../shapes/Image").ImageProps> & TClassProperties<FabricImage<Partial<import("../shapes/Image").ImageProps>, import("../shapes/Image").SerializedImageProps, import("../EventTypeDefs").ObjectEvents>>, keyof import("../shapes/Image").SerializedImageProps>, never> & import("../shapes/Image").SerializedImageProps;
85
- mode: TBlendImageMode;
86
- alpha: number;
87
- };
83
+ type: 'BlendImage';
84
+ image: ReturnType<FabricImage['toObject']>;
85
+ } & BlendImageOwnProps;
88
86
  /**
89
87
  * Create filter instance from an object representation
90
88
  * @static
@@ -95,6 +93,7 @@ export declare class BlendImage extends BaseFilter {
95
93
  */
96
94
  static fromObject({ type, image, ...filterOptions }: Record<string, any>, options: {
97
95
  signal: AbortSignal;
98
- }): Promise<BaseFilter>;
96
+ }): Promise<BaseFilter<'BlendImage', BlendImageOwnProps>>;
99
97
  }
98
+ export {};
100
99
  //# sourceMappingURL=BlendImage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlendImage.d.ts","sourceRoot":"","sources":["../../../src/filters/BlendImage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI/D,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,CAAC;AAElD,eAAO,MAAM,uBAAuB,EAAE,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAczE,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC;;QAEI;IACI,KAAK,EAAE,WAAW,CAAC;IAE3B;;;;;;;;QAQI;IACI,IAAI,EAAE,eAAe,CAAC;IAE9B;;;QAGI;IACI,KAAK,EAAE,MAAM,CAAC;IAEtB,MAAM,CAAC,IAAI,SAAgB;IAE3B,MAAM,CAAC,QAAQ,wCAA2B;IAE1C,WAAW;IAIX,iBAAiB,IAAI,MAAM;IAI3B,YAAY,CAAC,OAAO,EAAE,mBAAmB;IAQzC,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW;IAI7D;;;;;OAKG;IACH,eAAe;IAgBf;;;;;OAKG;IACH,SAAS,CAAC,EACR,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAClC,aAAa,EAAE,EAAE,SAAS,EAAE,GAC7B,EAAE,gBAAgB;IAgDnB;;;;;OAKG;IACH,mBAAmB,CACjB,EAAE,EAAE,qBAAqB,EACzB,OAAO,EAAE,YAAY,GACpB,wBAAwB;IAO3B;;;;;OAKG;IACH,eAAe,CACb,EAAE,EAAE,qBAAqB,EACzB,gBAAgB,EAAE,wBAAwB;IAO5C;;;OAGG;IACH,QAAQ;;;;;;IASR;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CACf,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtD,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE;CAOnC"}
1
+ {"version":3,"file":"BlendImage.d.ts","sourceRoot":"","sources":["../../../src/filters/BlendImage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI/D,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,CAAC;AAElD,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,kBAGrC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAW,SAAQ,UAAU,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1E;;QAEI;IACI,KAAK,EAAE,WAAW,CAAC;IAE3B;;;;;;;;QAQI;IACI,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAEzC;;;QAGI;IACI,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,CAAC,IAAI,SAAgB;IAE3B,MAAM,CAAC,QAAQ,qBAA2B;IAE1C,MAAM,CAAC,gBAAgB,WAAkC;IAEzD,WAAW;IAIX,iBAAiB,IAAI,MAAM;IAI3B,eAAe,IAAI,MAAM;IAIzB,YAAY,CAAC,OAAO,EAAE,mBAAmB;IAQzC,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW;IAI7D;;;;;OAKG;IACH,eAAe;IAgBf;;;;;OAKG;IACH,SAAS,CAAC,EACR,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAClC,aAAa,EAAE,EAAE,SAAS,EAAE,GAC7B,EAAE,gBAAgB;IAgDnB;;;;;OAKG;IACH,eAAe,CACb,EAAE,EAAE,qBAAqB,EACzB,gBAAgB,EAAE,wBAAwB;IAO5C;;;;;OAKG;IACH,QAAQ,IAAI;QACV,IAAI,EAAE,YAAY,CAAC;QACnB,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;KAC5C,GAAG,kBAAkB;IAOtB;;;;;;;OAOG;WACU,UAAU,CACrB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtD,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,GAC/B,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;CAMzD"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as e,objectWithoutProperties as t,objectSpread2 as a}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{FabricImage as i}from"../shapes/Image.min.mjs";import{createCanvasElement as r}from"../util/misc/dom.min.mjs";import{BaseFilter as o}from"./BaseFilter.min.mjs";import{classRegistry as n}from"../ClassRegistry.min.mjs";import{fragmentSource as s}from"./shaders/blendImage.min.mjs";const m=["type","image"],c={mode:"multiply",alpha:1,vertexSource:"\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n "};class l extends o{getCacheKey(){return"".concat(this.type,"_").concat(this.mode)}getFragmentSource(){return s[this.mode]}applyToWebGL(e){const t=e.context,a=this.createTexture(e.filterBackend,this.image);this.bindAdditionalTexture(t,a,t.TEXTURE1),super.applyToWebGL(e),this.unbindAdditionalTexture(t,t.TEXTURE1)}createTexture(e,t){return e.getCachedTexture(t.cacheKey,t.getElement())}calculateMatrix(){const e=this.image,{width:t,height:a}=e.getElement();return[1/e.scaleX,0,0,0,1/e.scaleY,0,-e.left/t,-e.top/a,1]}applyTo2d(e){let{imageData:{data:t,width:a,height:i},filterBackend:{resources:o}}=e;const n=this.image;o.blendImage||(o.blendImage=r());const s=o.blendImage,m=s.getContext("2d");s.width!==a||s.height!==i?(s.width=a,s.height=i):m.clearRect(0,0,a,i),m.setTransform(n.scaleX,0,0,n.scaleY,n.left,n.top),m.drawImage(n.getElement(),0,0,a,i);const c=m.getImageData(0,0,a,i).data;for(let e=0;e<t.length;e+=4){const a=t[e],i=t[e+1],r=t[e+2],o=t[e+3],n=c[e],s=c[e+1],m=c[e+2],l=c[e+3];switch(this.mode){case"multiply":t[e]=a*n/255,t[e+1]=i*s/255,t[e+2]=r*m/255,t[e+3]=o*l/255;break;case"mask":t[e+3]=l}}}getUniformLocations(e,t){return{uTransformMatrix:e.getUniformLocation(t,"uTransformMatrix"),uImage:e.getUniformLocation(t,"uImage")}}sendUniformData(e,t){const a=this.calculateMatrix();e.uniform1i(t.uImage,1),e.uniformMatrix3fv(t.uTransformMatrix,!1,a)}toObject(){return{type:this.type,image:this.image&&this.image.toObject(),mode:this.mode,alpha:this.alpha}}static fromObject(e,r){let{type:o,image:n}=e,s=t(e,m);return i.fromObject(n,r).then((e=>new this(a(a({},s),{},{image:e}))))}}e(l,"type","BlendImage"),e(l,"defaults",c),n.setClass(l);export{l as BlendImage,c as blendImageDefaultValues};
1
+ import{defineProperty as e,objectSpread2 as t,objectWithoutProperties as a}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{FabricImage as i}from"../shapes/Image.min.mjs";import{createCanvasElement as r}from"../util/misc/dom.min.mjs";import{BaseFilter as s}from"./BaseFilter.min.mjs";import{classRegistry as m}from"../ClassRegistry.min.mjs";import{fragmentSource as o,vertexSource as n}from"./shaders/blendImage.min.mjs";const c=["type","image"],l={mode:"multiply",alpha:1};class g extends s{getCacheKey(){return"".concat(this.type,"_").concat(this.mode)}getFragmentSource(){return o[this.mode]}getVertexSource(){return n}applyToWebGL(e){const t=e.context,a=this.createTexture(e.filterBackend,this.image);this.bindAdditionalTexture(t,a,t.TEXTURE1),super.applyToWebGL(e),this.unbindAdditionalTexture(t,t.TEXTURE1)}createTexture(e,t){return e.getCachedTexture(t.cacheKey,t.getElement())}calculateMatrix(){const e=this.image,{width:t,height:a}=e.getElement();return[1/e.scaleX,0,0,0,1/e.scaleY,0,-e.left/t,-e.top/a,1]}applyTo2d(e){let{imageData:{data:t,width:a,height:i},filterBackend:{resources:s}}=e;const m=this.image;s.blendImage||(s.blendImage=r());const o=s.blendImage,n=o.getContext("2d");o.width!==a||o.height!==i?(o.width=a,o.height=i):n.clearRect(0,0,a,i),n.setTransform(m.scaleX,0,0,m.scaleY,m.left,m.top),n.drawImage(m.getElement(),0,0,a,i);const c=n.getImageData(0,0,a,i).data;for(let e=0;e<t.length;e+=4){const a=t[e],i=t[e+1],r=t[e+2],s=t[e+3],m=c[e],o=c[e+1],n=c[e+2],l=c[e+3];switch(this.mode){case"multiply":t[e]=a*m/255,t[e+1]=i*o/255,t[e+2]=r*n/255,t[e+3]=s*l/255;break;case"mask":t[e+3]=l}}}sendUniformData(e,t){const a=this.calculateMatrix();e.uniform1i(t.uImage,1),e.uniformMatrix3fv(t.uTransformMatrix,!1,a)}toObject(){return t(t({},super.toObject()),{},{image:this.image&&this.image.toObject()})}static async fromObject(e,r){let{type:s,image:m}=e,o=a(e,c);return i.fromObject(m,r).then((e=>new this(t(t({},o),{},{image:e}))))}}e(g,"type","BlendImage"),e(g,"defaults",l),e(g,"uniformLocations",["uTransformMatrix","uImage"]),m.setClass(g);export{g as BlendImage,l as blendImageDefaultValues};
2
2
  //# sourceMappingURL=BlendImage.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlendImage.min.mjs","sources":["../../../src/filters/BlendImage.ts"],"sourcesContent":["import { FabricImage } from '../shapes/Image';\nimport type { TClassProperties } from '../typedefs';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\nexport const blendImageDefaultValues: Partial<TClassProperties<BlendImage>> = {\n mode: 'multiply',\n alpha: 1,\n vertexSource: `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n `,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n * @default\n **/\n declare mode: TBlendImageMode;\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: number;\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n return {\n uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n uImage: gl.getUniformLocation(program, 'uImage'),\n };\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n type: this.type,\n image: this.image && this.image.toObject(),\n mode: this.mode,\n alpha: this.alpha,\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @static\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<BlendImage>}\n */\n static fromObject(\n { type, image, ...filterOptions }: Record<string, any>,\n options: { signal: AbortSignal }\n ) {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) =>\n new this({ ...filterOptions, image: enlivedImage }) as BaseFilter\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n"],"names":["blendImageDefaultValues","mode","alpha","vertexSource","BlendImage","BaseFilter","getCacheKey","concat","this","type","getFragmentSource","fragmentSource","applyToWebGL","options","gl","context","texture","createTexture","filterBackend","image","bindAdditionalTexture","TEXTURE1","super","unbindAdditionalTexture","backend","getCachedTexture","cacheKey","getElement","calculateMatrix","width","height","scaleX","scaleY","left","top","applyTo2d","_ref","imageData","data","resources","blendImage","createCanvasElement","canvas1","getContext","clearRect","setTransform","drawImage","blendData","getImageData","i","length","r","g","b","a","tr","tg","tb","ta","getUniformLocations","program","uTransformMatrix","getUniformLocation","uImage","sendUniformData","uniformLocations","matrix","uniform1i","uniformMatrix3fv","toObject","fromObject","_ref2","filterOptions","_objectWithoutProperties","_excluded","FabricImage","then","enlivedImage","_objectSpread","_defineProperty","classRegistry","setClass"],"mappings":"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"}
1
+ {"version":3,"file":"BlendImage.min.mjs","sources":["../../../src/filters/BlendImage.ts"],"sourcesContent":["import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n * @default\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType<FabricImage['toObject']>;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @static\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<BlendImage>}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record<string, any>,\n options: { signal: AbortSignal }\n ): Promise<BaseFilter<'BlendImage', BlendImageOwnProps>> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) =>\n new this({ ...filterOptions, image: enlivedImage }) as BlendImage\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n"],"names":["blendImageDefaultValues","mode","alpha","BlendImage","BaseFilter","getCacheKey","concat","this","type","getFragmentSource","fragmentSource","getVertexSource","vertexSource","applyToWebGL","options","gl","context","texture","createTexture","filterBackend","image","bindAdditionalTexture","TEXTURE1","super","unbindAdditionalTexture","backend","getCachedTexture","cacheKey","getElement","calculateMatrix","width","height","scaleX","scaleY","left","top","applyTo2d","_ref","imageData","data","resources","blendImage","createCanvasElement","canvas1","getContext","clearRect","setTransform","drawImage","blendData","getImageData","i","length","r","g","b","a","tr","tg","tb","ta","sendUniformData","uniformLocations","matrix","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","toObject","_objectSpread","fromObject","_ref2","filterOptions","_objectWithoutProperties","_excluded","FabricImage","then","enlivedImage","_defineProperty","classRegistry","setClass"],"mappings":"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"}
@@ -1,15 +1,14 @@
1
- import { defineProperty as _defineProperty, objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.mjs';
1
+ import { defineProperty as _defineProperty, objectSpread2 as _objectSpread2, objectWithoutProperties as _objectWithoutProperties } from '../../_virtual/_rollupPluginBabelHelpers.mjs';
2
2
  import { FabricImage } from '../shapes/Image.mjs';
3
3
  import { createCanvasElement } from '../util/misc/dom.mjs';
4
4
  import { BaseFilter } from './BaseFilter.mjs';
5
5
  import { classRegistry } from '../ClassRegistry.mjs';
6
- import { fragmentSource } from './shaders/blendImage.mjs';
6
+ import { fragmentSource, vertexSource } from './shaders/blendImage.mjs';
7
7
 
8
8
  const _excluded = ["type", "image"];
9
9
  const blendImageDefaultValues = {
10
10
  mode: 'multiply',
11
- alpha: 1,
12
- vertexSource: "\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n "
11
+ alpha: 1
13
12
  };
14
13
 
15
14
  /**
@@ -35,6 +34,9 @@ class BlendImage extends BaseFilter {
35
34
  getFragmentSource() {
36
35
  return fragmentSource[this.mode];
37
36
  }
37
+ getVertexSource() {
38
+ return vertexSource;
39
+ }
38
40
  applyToWebGL(options) {
39
41
  const gl = options.context,
40
42
  texture = this.createTexture(options.filterBackend, this.image);
@@ -116,19 +118,6 @@ class BlendImage extends BaseFilter {
116
118
  }
117
119
  }
118
120
 
119
- /**
120
- * Return WebGL uniform locations for this filter's shader.
121
- *
122
- * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.
123
- * @param {WebGLShaderProgram} program This filter's compiled shader program.
124
- */
125
- getUniformLocations(gl, program) {
126
- return {
127
- uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),
128
- uImage: gl.getUniformLocation(program, 'uImage')
129
- };
130
- }
131
-
132
121
  /**
133
122
  * Send data from this filter to its shader program's uniforms.
134
123
  *
@@ -143,15 +132,14 @@ class BlendImage extends BaseFilter {
143
132
 
144
133
  /**
145
134
  * Returns object representation of an instance
135
+ * TODO: Handle the possibility of missing image better.
136
+ * As of now a BlendImage filter without image can't be used with fromObject
146
137
  * @return {Object} Object representation of an instance
147
138
  */
148
139
  toObject() {
149
- return {
150
- type: this.type,
151
- image: this.image && this.image.toObject(),
152
- mode: this.mode,
153
- alpha: this.alpha
154
- };
140
+ return _objectSpread2(_objectSpread2({}, super.toObject()), {}, {
141
+ image: this.image && this.image.toObject()
142
+ });
155
143
  }
156
144
 
157
145
  /**
@@ -162,7 +150,7 @@ class BlendImage extends BaseFilter {
162
150
  * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal
163
151
  * @returns {Promise<BlendImage>}
164
152
  */
165
- static fromObject(_ref2, options) {
153
+ static async fromObject(_ref2, options) {
166
154
  let {
167
155
  type,
168
156
  image
@@ -191,6 +179,7 @@ class BlendImage extends BaseFilter {
191
179
  **/
192
180
  _defineProperty(BlendImage, "type", 'BlendImage');
193
181
  _defineProperty(BlendImage, "defaults", blendImageDefaultValues);
182
+ _defineProperty(BlendImage, "uniformLocations", ['uTransformMatrix', 'uImage']);
194
183
  classRegistry.setClass(BlendImage);
195
184
 
196
185
  export { BlendImage, blendImageDefaultValues };
@@ -1 +1 @@
1
- {"version":3,"file":"BlendImage.mjs","sources":["../../../src/filters/BlendImage.ts"],"sourcesContent":["import { FabricImage } from '../shapes/Image';\nimport type { TClassProperties } from '../typedefs';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\nexport const blendImageDefaultValues: Partial<TClassProperties<BlendImage>> = {\n mode: 'multiply',\n alpha: 1,\n vertexSource: `\n attribute vec2 aPosition;\n varying vec2 vTexCoord;\n varying vec2 vTexCoord2;\n uniform mat3 uTransformMatrix;\n void main() {\n vTexCoord = aPosition;\n vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n }\n `,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n * @default\n **/\n declare mode: TBlendImageMode;\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: number;\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations(\n gl: WebGLRenderingContext,\n program: WebGLProgram\n ): TWebGLUniformLocationMap {\n return {\n uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n uImage: gl.getUniformLocation(program, 'uImage'),\n };\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject() {\n return {\n type: this.type,\n image: this.image && this.image.toObject(),\n mode: this.mode,\n alpha: this.alpha,\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @static\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<BlendImage>}\n */\n static fromObject(\n { type, image, ...filterOptions }: Record<string, any>,\n options: { signal: AbortSignal }\n ) {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) =>\n new this({ ...filterOptions, image: enlivedImage }) as BaseFilter\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n"],"names":["blendImageDefaultValues","mode","alpha","vertexSource","BlendImage","BaseFilter","getCacheKey","concat","type","getFragmentSource","fragmentSource","applyToWebGL","options","gl","context","texture","createTexture","filterBackend","image","bindAdditionalTexture","TEXTURE1","unbindAdditionalTexture","backend","getCachedTexture","cacheKey","getElement","calculateMatrix","width","height","scaleX","scaleY","left","top","applyTo2d","_ref","imageData","data","resources","blendImage","createCanvasElement","canvas1","getContext","clearRect","setTransform","drawImage","blendData","getImageData","i","length","r","g","b","a","tr","tg","tb","ta","getUniformLocations","program","uTransformMatrix","getUniformLocation","uImage","sendUniformData","uniformLocations","matrix","uniform1i","uniformMatrix3fv","toObject","fromObject","_ref2","filterOptions","_objectWithoutProperties","_excluded","FabricImage","then","enlivedImage","_objectSpread","_defineProperty","classRegistry","setClass"],"mappings":"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"}
1
+ {"version":3,"file":"BlendImage.mjs","sources":["../../../src/filters/BlendImage.ts"],"sourcesContent":["import { FabricImage } from '../shapes/Image';\nimport { createCanvasElement } from '../util/misc/dom';\nimport { BaseFilter } from './BaseFilter';\nimport type {\n T2DPipelineState,\n TWebGLPipelineState,\n TWebGLUniformLocationMap,\n} from './typedefs';\nimport type { WebGLFilterBackend } from './WebGLFilterBackend';\nimport { classRegistry } from '../ClassRegistry';\nimport { fragmentSource, vertexSource } from './shaders/blendImage';\n\nexport type TBlendImageMode = 'multiply' | 'mask';\n\ntype BlendImageOwnProps = {\n mode: TBlendImageMode;\n alpha: number;\n};\n\nexport const blendImageDefaultValues: BlendImageOwnProps = {\n mode: 'multiply',\n alpha: 1,\n};\n\n/**\n * Image Blend filter class\n * @example\n * const filter = new filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * const filter = new BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply'\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\nexport class BlendImage extends BaseFilter<'BlendImage', BlendImageOwnProps> {\n /**\n * Image to make the blend operation with.\n **/\n declare image: FabricImage;\n\n /**\n * Blend mode for the filter: either 'multiply' or 'mask'. 'multiply' will\n * multiply the values of each channel (R, G, B, and A) of the filter image by\n * their corresponding values in the base image. 'mask' will only look at the\n * alpha channel of the filter image, and apply those values to the base\n * image's alpha channel.\n * @type String\n * @default\n **/\n declare mode: BlendImageOwnProps['mode'];\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n declare alpha: BlendImageOwnProps['alpha'];\n\n static type = 'BlendImage';\n\n static defaults = blendImageDefaultValues;\n\n static uniformLocations = ['uTransformMatrix', 'uImage'];\n\n getCacheKey() {\n return `${this.type}_${this.mode}`;\n }\n\n getFragmentSource(): string {\n return fragmentSource[this.mode];\n }\n\n getVertexSource(): string {\n return vertexSource;\n }\n\n applyToWebGL(options: TWebGLPipelineState) {\n const gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture!, gl.TEXTURE1);\n super.applyToWebGL(options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n }\n\n createTexture(backend: WebGLFilterBackend, image: FabricImage) {\n return backend.getCachedTexture(image.cacheKey, image.getElement());\n }\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix() {\n const image = this.image,\n { width, height } = image.getElement();\n return [\n 1 / image.scaleX,\n 0,\n 0,\n 0,\n 1 / image.scaleY,\n 0,\n -image.left / width,\n -image.top / height,\n 1,\n ];\n }\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d({\n imageData: { data, width, height },\n filterBackend: { resources },\n }: T2DPipelineState) {\n const image = this.image;\n if (!resources.blendImage) {\n resources.blendImage = createCanvasElement();\n }\n const canvas1 = resources.blendImage;\n const context = canvas1.getContext('2d')!;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n } else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(\n image.scaleX,\n 0,\n 0,\n image.scaleY,\n image.left,\n image.top\n );\n context.drawImage(image.getElement(), 0, 0, width, height);\n const blendData = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const a = data[i + 3];\n\n const tr = blendData[i];\n const tg = blendData[i + 1];\n const tb = blendData[i + 2];\n const ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = (r * tr) / 255;\n data[i + 1] = (g * tg) / 255;\n data[i + 2] = (b * tb) / 255;\n data[i + 3] = (a * ta) / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n }\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData(\n gl: WebGLRenderingContext,\n uniformLocations: TWebGLUniformLocationMap\n ) {\n const matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n }\n\n /**\n * Returns object representation of an instance\n * TODO: Handle the possibility of missing image better.\n * As of now a BlendImage filter without image can't be used with fromObject\n * @return {Object} Object representation of an instance\n */\n toObject(): {\n type: 'BlendImage';\n image: ReturnType<FabricImage['toObject']>;\n } & BlendImageOwnProps {\n return {\n ...super.toObject(),\n image: this.image && this.image.toObject(),\n };\n }\n\n /**\n * Create filter instance from an object representation\n * @static\n * @param {object} object Object to create an instance from\n * @param {object} [options]\n * @param {AbortSignal} [options.signal] handle aborting image loading, see https://developer.mozilla.org/en-US/docs/Web/API/AbortController/signal\n * @returns {Promise<BlendImage>}\n */\n static async fromObject(\n { type, image, ...filterOptions }: Record<string, any>,\n options: { signal: AbortSignal }\n ): Promise<BaseFilter<'BlendImage', BlendImageOwnProps>> {\n return FabricImage.fromObject(image, options).then(\n (enlivedImage) =>\n new this({ ...filterOptions, image: enlivedImage }) as BlendImage\n );\n }\n}\n\nclassRegistry.setClass(BlendImage);\n"],"names":["blendImageDefaultValues","mode","alpha","BlendImage","BaseFilter","getCacheKey","concat","type","getFragmentSource","fragmentSource","getVertexSource","vertexSource","applyToWebGL","options","gl","context","texture","createTexture","filterBackend","image","bindAdditionalTexture","TEXTURE1","unbindAdditionalTexture","backend","getCachedTexture","cacheKey","getElement","calculateMatrix","width","height","scaleX","scaleY","left","top","applyTo2d","_ref","imageData","data","resources","blendImage","createCanvasElement","canvas1","getContext","clearRect","setTransform","drawImage","blendData","getImageData","i","length","r","g","b","a","tr","tg","tb","ta","sendUniformData","uniformLocations","matrix","uniform1i","uImage","uniformMatrix3fv","uTransformMatrix","toObject","_objectSpread","fromObject","_ref2","filterOptions","_objectWithoutProperties","_excluded","FabricImage","then","enlivedImage","_defineProperty","classRegistry","setClass"],"mappings":"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"}