@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.
- package/CHANGELOG.md +18 -1
- package/dist/index.js +229 -491
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +229 -491
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +229 -491
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +229 -491
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/canvas/Canvas.d.ts.map +1 -1
- package/dist/src/canvas/Canvas.min.mjs +1 -1
- package/dist/src/canvas/Canvas.min.mjs.map +1 -1
- package/dist/src/canvas/Canvas.mjs +8 -9
- package/dist/src/canvas/Canvas.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.d.ts +1 -1
- package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts +4 -4
- package/dist/src/canvas/StaticCanvas.d.ts.map +1 -1
- package/dist/src/canvas/StaticCanvas.min.mjs +1 -1
- package/dist/src/canvas/StaticCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.mjs +0 -13
- package/dist/src/canvas/StaticCanvas.mjs.map +1 -1
- package/dist/src/color/Color.d.ts +1 -0
- package/dist/src/color/Color.d.ts.map +1 -1
- package/dist/src/color/Color.min.mjs +1 -1
- package/dist/src/color/Color.min.mjs.map +1 -1
- package/dist/src/color/Color.mjs +3 -1
- package/dist/src/color/Color.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.d.ts +16 -23
- package/dist/src/filters/BaseFilter.d.ts.map +1 -1
- package/dist/src/filters/BaseFilter.min.mjs +1 -1
- package/dist/src/filters/BaseFilter.min.mjs.map +1 -1
- package/dist/src/filters/BaseFilter.mjs +24 -41
- package/dist/src/filters/BaseFilter.mjs.map +1 -1
- package/dist/src/filters/BlendColor.d.ts +13 -24
- package/dist/src/filters/BlendColor.d.ts.map +1 -1
- package/dist/src/filters/BlendColor.min.mjs +1 -1
- package/dist/src/filters/BlendColor.min.mjs.map +1 -1
- package/dist/src/filters/BlendColor.mjs +1 -25
- package/dist/src/filters/BlendColor.mjs.map +1 -1
- package/dist/src/filters/BlendImage.d.ts +18 -19
- package/dist/src/filters/BlendImage.d.ts.map +1 -1
- package/dist/src/filters/BlendImage.min.mjs +1 -1
- package/dist/src/filters/BlendImage.min.mjs.map +1 -1
- package/dist/src/filters/BlendImage.mjs +13 -24
- package/dist/src/filters/BlendImage.mjs.map +1 -1
- package/dist/src/filters/Blur.d.ts +10 -12
- package/dist/src/filters/Blur.d.ts.map +1 -1
- package/dist/src/filters/Blur.min.mjs +1 -1
- package/dist/src/filters/Blur.min.mjs.map +1 -1
- package/dist/src/filters/Blur.mjs +5 -14
- package/dist/src/filters/Blur.mjs.map +1 -1
- package/dist/src/filters/Boilerplate.d.ts +11 -13
- package/dist/src/filters/Boilerplate.d.ts.map +1 -1
- package/dist/src/filters/Brightness.d.ts +10 -12
- package/dist/src/filters/Brightness.d.ts.map +1 -1
- package/dist/src/filters/Brightness.min.mjs +1 -1
- package/dist/src/filters/Brightness.min.mjs.map +1 -1
- package/dist/src/filters/Brightness.mjs +4 -16
- package/dist/src/filters/Brightness.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.d.ts +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.d.ts.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/Canvas2dFilterBackend.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.d.ts +17 -15
- package/dist/src/filters/ColorMatrix.d.ts.map +1 -1
- package/dist/src/filters/ColorMatrix.min.mjs +1 -1
- package/dist/src/filters/ColorMatrix.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrix.mjs +7 -27
- package/dist/src/filters/ColorMatrix.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.d.ts +63 -497
- package/dist/src/filters/ColorMatrixFilters.d.ts.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.min.mjs +1 -1
- package/dist/src/filters/ColorMatrixFilters.min.mjs.map +1 -1
- package/dist/src/filters/ColorMatrixFilters.mjs +13 -8
- package/dist/src/filters/ColorMatrixFilters.mjs.map +1 -1
- package/dist/src/filters/Composed.d.ts +11 -10
- package/dist/src/filters/Composed.d.ts.map +1 -1
- package/dist/src/filters/Composed.min.mjs +1 -1
- package/dist/src/filters/Composed.min.mjs.map +1 -1
- package/dist/src/filters/Composed.mjs +7 -12
- package/dist/src/filters/Composed.mjs.map +1 -1
- package/dist/src/filters/Contrast.d.ts +10 -12
- package/dist/src/filters/Contrast.d.ts.map +1 -1
- package/dist/src/filters/Contrast.min.mjs +1 -1
- package/dist/src/filters/Contrast.min.mjs.map +1 -1
- package/dist/src/filters/Contrast.mjs +6 -17
- package/dist/src/filters/Contrast.mjs.map +1 -1
- package/dist/src/filters/Convolute.d.ts +11 -14
- package/dist/src/filters/Convolute.d.ts.map +1 -1
- package/dist/src/filters/Convolute.min.mjs +1 -1
- package/dist/src/filters/Convolute.min.mjs.map +1 -1
- package/dist/src/filters/Convolute.mjs +1 -15
- package/dist/src/filters/Convolute.mjs.map +1 -1
- package/dist/src/filters/Gamma.d.ts +17 -14
- package/dist/src/filters/Gamma.d.ts.map +1 -1
- package/dist/src/filters/Gamma.min.mjs +1 -1
- package/dist/src/filters/Gamma.min.mjs.map +1 -1
- package/dist/src/filters/Gamma.mjs +20 -24
- package/dist/src/filters/Gamma.mjs.map +1 -1
- package/dist/src/filters/Grayscale.d.ts +8 -11
- package/dist/src/filters/Grayscale.d.ts.map +1 -1
- package/dist/src/filters/Grayscale.min.mjs +1 -1
- package/dist/src/filters/Grayscale.min.mjs.map +1 -1
- package/dist/src/filters/Grayscale.mjs +2 -14
- package/dist/src/filters/Grayscale.mjs.map +1 -1
- package/dist/src/filters/HueRotation.d.ts +11 -5
- package/dist/src/filters/HueRotation.d.ts.map +1 -1
- package/dist/src/filters/HueRotation.min.mjs +1 -1
- package/dist/src/filters/HueRotation.min.mjs.map +1 -1
- package/dist/src/filters/HueRotation.mjs +10 -5
- package/dist/src/filters/HueRotation.mjs.map +1 -1
- package/dist/src/filters/Invert.d.ts +10 -13
- package/dist/src/filters/Invert.d.ts.map +1 -1
- package/dist/src/filters/Invert.min.mjs +1 -1
- package/dist/src/filters/Invert.min.mjs.map +1 -1
- package/dist/src/filters/Invert.mjs +2 -15
- package/dist/src/filters/Invert.mjs.map +1 -1
- package/dist/src/filters/Noise.d.ts +9 -20
- package/dist/src/filters/Noise.d.ts.map +1 -1
- package/dist/src/filters/Noise.min.mjs +1 -1
- package/dist/src/filters/Noise.min.mjs.map +1 -1
- package/dist/src/filters/Noise.mjs +4 -27
- package/dist/src/filters/Noise.mjs.map +1 -1
- package/dist/src/filters/Pixelate.d.ts +8 -12
- package/dist/src/filters/Pixelate.d.ts.map +1 -1
- package/dist/src/filters/Pixelate.min.mjs +1 -1
- package/dist/src/filters/Pixelate.min.mjs.map +1 -1
- package/dist/src/filters/Pixelate.mjs +2 -16
- package/dist/src/filters/Pixelate.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.d.ts +12 -23
- package/dist/src/filters/RemoveColor.d.ts.map +1 -1
- package/dist/src/filters/RemoveColor.min.mjs +1 -1
- package/dist/src/filters/RemoveColor.min.mjs.map +1 -1
- package/dist/src/filters/RemoveColor.mjs +2 -25
- package/dist/src/filters/RemoveColor.mjs.map +1 -1
- package/dist/src/filters/Resize.d.ts +14 -30
- package/dist/src/filters/Resize.d.ts.map +1 -1
- package/dist/src/filters/Resize.min.mjs +1 -1
- package/dist/src/filters/Resize.min.mjs.map +1 -1
- package/dist/src/filters/Resize.mjs +3 -30
- package/dist/src/filters/Resize.mjs.map +1 -1
- package/dist/src/filters/Saturation.d.ts +9 -12
- package/dist/src/filters/Saturation.d.ts.map +1 -1
- package/dist/src/filters/Saturation.min.mjs +1 -1
- package/dist/src/filters/Saturation.min.mjs.map +1 -1
- package/dist/src/filters/Saturation.mjs +8 -20
- package/dist/src/filters/Saturation.mjs.map +1 -1
- package/dist/src/filters/Vibrance.d.ts +10 -13
- package/dist/src/filters/Vibrance.d.ts.map +1 -1
- package/dist/src/filters/Vibrance.min.mjs +1 -1
- package/dist/src/filters/Vibrance.min.mjs.map +1 -1
- package/dist/src/filters/Vibrance.mjs +6 -18
- package/dist/src/filters/Vibrance.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.d.ts +1 -1
- package/dist/src/filters/WebGLFilterBackend.d.ts.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.min.mjs.map +1 -1
- package/dist/src/filters/WebGLFilterBackend.mjs.map +1 -1
- package/dist/src/filters/shaders/blendImage.d.ts +1 -0
- package/dist/src/filters/shaders/blendImage.d.ts.map +1 -1
- package/dist/src/filters/shaders/blendImage.min.mjs +1 -1
- package/dist/src/filters/shaders/blendImage.min.mjs.map +1 -1
- package/dist/src/filters/shaders/blendImage.mjs +2 -1
- package/dist/src/filters/shaders/blendImage.mjs.map +1 -1
- package/dist/src/filters/typedefs.d.ts +22 -0
- package/dist/src/filters/typedefs.d.ts.map +1 -1
- package/dist/src/parser/elements_parser.d.ts +1 -1
- package/dist/src/parser/elements_parser.d.ts.map +1 -1
- package/dist/src/parser/elements_parser.min.mjs.map +1 -1
- package/dist/src/parser/elements_parser.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.d.ts +1 -1
- package/dist/src/shapes/ActiveSelection.d.ts.map +1 -1
- package/dist/src/shapes/ActiveSelection.min.mjs +1 -1
- package/dist/src/shapes/ActiveSelection.min.mjs.map +1 -1
- package/dist/src/shapes/ActiveSelection.mjs +13 -10
- package/dist/src/shapes/ActiveSelection.mjs.map +1 -1
- package/dist/src/shapes/Group.d.ts +9 -0
- package/dist/src/shapes/Group.d.ts.map +1 -1
- package/dist/src/shapes/Group.min.mjs +1 -1
- package/dist/src/shapes/Group.min.mjs.map +1 -1
- package/dist/src/shapes/Group.mjs +10 -1
- package/dist/src/shapes/Group.mjs.map +1 -1
- package/dist/src/shapes/Image.d.ts +4 -4
- package/dist/src/shapes/Image.d.ts.map +1 -1
- package/dist/src/shapes/Image.min.mjs.map +1 -1
- package/dist/src/shapes/Image.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.d.ts +3 -0
- package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs +3 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.d.ts +1 -16
- package/dist/src/shapes/Object/Object.d.ts.map +1 -1
- package/dist/src/shapes/Object/Object.min.mjs +1 -1
- package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.mjs +9 -10
- package/dist/src/shapes/Object/Object.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.d.ts +8 -15
- package/dist/src/shapes/Object/StackedObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/StackedObject.min.mjs +1 -1
- package/dist/src/shapes/Object/StackedObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/StackedObject.mjs +11 -21
- package/dist/src/shapes/Object/StackedObject.mjs.map +1 -1
- package/dist/src/shapes/Path.d.ts +2 -2
- package/dist/src/shapes/Path.d.ts.map +1 -1
- package/dist/src/shapes/Path.min.mjs.map +1 -1
- package/dist/src/shapes/Path.mjs +2 -2
- package/dist/src/shapes/Path.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.d.ts +2 -2
- package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
- package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
- package/package.json +2 -2
- package/src/canvas/Canvas.ts +6 -9
- package/src/canvas/SelectableCanvas.ts +2 -2
- package/src/canvas/StaticCanvas.ts +4 -18
- package/src/color/Color.ts +2 -1
- package/src/color/color.test.ts +6 -0
- package/src/filters/BaseFilter.ts +45 -51
- package/src/filters/BlendColor.ts +13 -35
- package/src/filters/BlendImage.ts +26 -40
- package/src/filters/Blur.ts +13 -20
- package/src/filters/Boilerplate.ts +13 -22
- package/src/filters/Brightness.ts +12 -21
- package/src/filters/Canvas2dFilterBackend.ts +1 -1
- package/src/filters/ColorMatrix.ts +29 -34
- package/src/filters/ColorMatrixFilters.ts +15 -9
- package/src/filters/Composed.ts +26 -16
- package/src/filters/Contrast.ts +15 -23
- package/src/filters/Convolute.ts +11 -23
- package/src/filters/Gamma.ts +32 -24
- package/src/filters/Grayscale.ts +8 -19
- package/src/filters/HueRotation.ts +21 -11
- package/src/filters/Invert.ts +11 -22
- package/src/filters/Noise.ts +11 -30
- package/src/filters/Pixelate.ts +9 -22
- package/src/filters/RemoveColor.ts +21 -35
- package/src/filters/Resize.ts +20 -44
- package/src/filters/Saturation.ts +16 -27
- package/src/filters/Vibrance.ts +14 -24
- package/src/filters/WebGLFilterBackend.ts +1 -1
- package/src/filters/shaders/blendImage.ts +12 -0
- package/src/filters/typedefs.ts +23 -0
- package/src/parser/elements_parser.ts +1 -1
- package/src/shapes/ActiveSelection.ts +8 -4
- package/src/shapes/Group.ts +16 -1
- package/src/shapes/Image.ts +8 -6
- package/src/shapes/Object/InteractiveObject.ts +3 -1
- package/src/shapes/Object/Object.ts +10 -35
- package/src/shapes/Object/StackedObject.ts +28 -44
- package/src/shapes/Path.ts +4 -4
- package/src/shapes/Text/TextSVGExportMixin.ts +1 -1
- 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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
43
|
-
static defaults:
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
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:
|
|
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:
|
|
46
|
+
alpha: BlendImageOwnProps['alpha'];
|
|
44
47
|
static type: string;
|
|
45
|
-
static defaults:
|
|
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:
|
|
84
|
-
image:
|
|
85
|
-
|
|
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;
|
|
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,
|
|
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":"ybAeaA,EAAiE,CAC5EC,KAAM,WACNC,MAAO,EACPC,aAAY,8TA6BP,MAAMC,UAAmBC,EA2B9BC,WAAAA,GACE,MAAAC,GAAAA,OAAUC,KAAKC,UAAIF,OAAIC,KAAKP,KAC9B,CAEAS,iBAAAA,GACE,OAAOC,EAAeH,KAAKP,KAC7B,CAEAW,YAAAA,CAAaC,GACX,MAAMC,EAAKD,EAAQE,QACjBC,EAAUR,KAAKS,cAAcJ,EAAQK,cAAeV,KAAKW,OAC3DX,KAAKY,sBAAsBN,EAAIE,EAAUF,EAAGO,UAC5CC,MAAMV,aAAaC,GACnBL,KAAKe,wBAAwBT,EAAIA,EAAGO,SACtC,CAEAJ,aAAAA,CAAcO,EAA6BL,GACzC,OAAOK,EAAQC,iBAAiBN,EAAMO,SAAUP,EAAMQ,aACxD,CAQAC,eAAAA,GACE,MAAMT,EAAQX,KAAKW,OACjBU,MAAEA,EAAKC,OAAEA,GAAWX,EAAMQ,aAC5B,MAAO,CACL,EAAIR,EAAMY,OACV,EACA,EACA,EACA,EAAIZ,EAAMa,OACV,GACCb,EAAMc,KAAOJ,GACbV,EAAMe,IAAMJ,EACb,EAEJ,CAQAK,SAAAA,CAASC,GAGY,IAFnBC,WAAWC,KAAEA,EAAIT,MAAEA,EAAKC,OAAEA,GAC1BZ,eAAeqB,UAAEA,IACAH,EACjB,MAAMjB,EAAQX,KAAKW,MACdoB,EAAUC,aACbD,EAAUC,WAAaC,KAEzB,MAAMC,EAAUH,EAAUC,WACpBzB,EAAU2B,EAAQC,WAAW,MAC/BD,EAAQb,QAAUA,GAASa,EAAQZ,SAAWA,GAChDY,EAAQb,MAAQA,EAChBa,EAAQZ,OAASA,GAEjBf,EAAQ6B,UAAU,EAAG,EAAGf,EAAOC,GAEjCf,EAAQ8B,aACN1B,EAAMY,OACN,EACA,EACAZ,EAAMa,OACNb,EAAMc,KACNd,EAAMe,KAERnB,EAAQ+B,UAAU3B,EAAMQ,aAAc,EAAG,EAAGE,EAAOC,GACnD,MAAMiB,EAAYhC,EAAQiC,aAAa,EAAG,EAAGnB,EAAOC,GAAQQ,KAC5D,IAAK,IAAIW,EAAI,EAAGA,EAAIX,EAAKY,OAAQD,GAAK,EAAG,CACvC,MAAME,EAAIb,EAAKW,GACTG,EAAId,EAAKW,EAAI,GACbI,EAAIf,EAAKW,EAAI,GACbK,EAAIhB,EAAKW,EAAI,GAEbM,EAAKR,EAAUE,GACfO,EAAKT,EAAUE,EAAI,GACnBQ,EAAKV,EAAUE,EAAI,GACnBS,EAAKX,EAAUE,EAAI,GAEzB,OAAQzC,KAAKP,MACX,IAAK,WACHqC,EAAKW,GAAME,EAAII,EAAM,IACrBjB,EAAKW,EAAI,GAAMG,EAAII,EAAM,IACzBlB,EAAKW,EAAI,GAAMI,EAAII,EAAM,IACzBnB,EAAKW,EAAI,GAAMK,EAAII,EAAM,IACzB,MACF,IAAK,OACHpB,EAAKW,EAAI,GAAKS,EAGpB,CACF,CAQAC,mBAAAA,CACE7C,EACA8C,GAEA,MAAO,CACLC,iBAAkB/C,EAAGgD,mBAAmBF,EAAS,oBACjDG,OAAQjD,EAAGgD,mBAAmBF,EAAS,UAE3C,CAQAI,eAAAA,CACElD,EACAmD,GAEA,MAAMC,EAAS1D,KAAKoB,kBACpBd,EAAGqD,UAAUF,EAAiBF,OAAQ,GACtCjD,EAAGsD,iBAAiBH,EAAiBJ,kBAAkB,EAAOK,EAChE,CAMAG,QAAAA,GACE,MAAO,CACL5D,KAAMD,KAAKC,KACXU,MAAOX,KAAKW,OAASX,KAAKW,MAAMkD,WAChCpE,KAAMO,KAAKP,KACXC,MAAOM,KAAKN,MAEhB,CAUA,iBAAOoE,CAAUC,EAEf1D,GACA,IAFAJ,KAAEA,EAAIU,MAAEA,GAA8CoD,EAApCC,EAAaC,EAAAF,EAAAG,GAG/B,OAAOC,EAAYL,WAAWnD,EAAON,GAAS+D,MAC3CC,GACC,IAAIrE,KAAIsE,EAAAA,KAAMN,GAAa,CAAA,EAAA,CAAErD,MAAO0D,MAE1C,EAzKAE,EAjBW3E,EAAU,OAuBP,cAAY2E,EAvBf3E,EAAU,WAyBHJ,GAoKpBgF,EAAcC,SAAS7E"}
|
|
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":"2cAmBaA,EAA8C,CACzDC,KAAM,WACNC,MAAO,GAmBF,MAAMC,UAAmBC,EA6B9BC,WAAAA,GACE,MAAAC,GAAAA,OAAUC,KAAKC,UAAIF,OAAIC,KAAKN,KAC9B,CAEAQ,iBAAAA,GACE,OAAOC,EAAeH,KAAKN,KAC7B,CAEAU,eAAAA,GACE,OAAOC,CACT,CAEAC,YAAAA,CAAaC,GACX,MAAMC,EAAKD,EAAQE,QACjBC,EAAUV,KAAKW,cAAcJ,EAAQK,cAAeZ,KAAKa,OAC3Db,KAAKc,sBAAsBN,EAAIE,EAAUF,EAAGO,UAC5CC,MAAMV,aAAaC,GACnBP,KAAKiB,wBAAwBT,EAAIA,EAAGO,SACtC,CAEAJ,aAAAA,CAAcO,EAA6BL,GACzC,OAAOK,EAAQC,iBAAiBN,EAAMO,SAAUP,EAAMQ,aACxD,CAQAC,eAAAA,GACE,MAAMT,EAAQb,KAAKa,OACjBU,MAAEA,EAAKC,OAAEA,GAAWX,EAAMQ,aAC5B,MAAO,CACL,EAAIR,EAAMY,OACV,EACA,EACA,EACA,EAAIZ,EAAMa,OACV,GACCb,EAAMc,KAAOJ,GACbV,EAAMe,IAAMJ,EACb,EAEJ,CAQAK,SAAAA,CAASC,GAGY,IAFnBC,WAAWC,KAAEA,EAAIT,MAAEA,EAAKC,OAAEA,GAC1BZ,eAAeqB,UAAEA,IACAH,EACjB,MAAMjB,EAAQb,KAAKa,MACdoB,EAAUC,aACbD,EAAUC,WAAaC,KAEzB,MAAMC,EAAUH,EAAUC,WACpBzB,EAAU2B,EAAQC,WAAW,MAC/BD,EAAQb,QAAUA,GAASa,EAAQZ,SAAWA,GAChDY,EAAQb,MAAQA,EAChBa,EAAQZ,OAASA,GAEjBf,EAAQ6B,UAAU,EAAG,EAAGf,EAAOC,GAEjCf,EAAQ8B,aACN1B,EAAMY,OACN,EACA,EACAZ,EAAMa,OACNb,EAAMc,KACNd,EAAMe,KAERnB,EAAQ+B,UAAU3B,EAAMQ,aAAc,EAAG,EAAGE,EAAOC,GACnD,MAAMiB,EAAYhC,EAAQiC,aAAa,EAAG,EAAGnB,EAAOC,GAAQQ,KAC5D,IAAK,IAAIW,EAAI,EAAGA,EAAIX,EAAKY,OAAQD,GAAK,EAAG,CACvC,MAAME,EAAIb,EAAKW,GACTG,EAAId,EAAKW,EAAI,GACbI,EAAIf,EAAKW,EAAI,GACbK,EAAIhB,EAAKW,EAAI,GAEbM,EAAKR,EAAUE,GACfO,EAAKT,EAAUE,EAAI,GACnBQ,EAAKV,EAAUE,EAAI,GACnBS,EAAKX,EAAUE,EAAI,GAEzB,OAAQ3C,KAAKN,MACX,IAAK,WACHsC,EAAKW,GAAME,EAAII,EAAM,IACrBjB,EAAKW,EAAI,GAAMG,EAAII,EAAM,IACzBlB,EAAKW,EAAI,GAAMI,EAAII,EAAM,IACzBnB,EAAKW,EAAI,GAAMK,EAAII,EAAM,IACzB,MACF,IAAK,OACHpB,EAAKW,EAAI,GAAKS,EAGpB,CACF,CAQAC,eAAAA,CACE7C,EACA8C,GAEA,MAAMC,EAASvD,KAAKsB,kBACpBd,EAAGgD,UAAUF,EAAiBG,OAAQ,GACtCjD,EAAGkD,iBAAiBJ,EAAiBK,kBAAkB,EAAOJ,EAChE,CAQAK,QAAAA,GAIE,OAAAC,EAAAA,EAAA,CAAA,EACK7C,MAAM4C,YAAU,GAAA,CACnB/C,MAAOb,KAAKa,OAASb,KAAKa,MAAM+C,YAEpC,CAUA,uBAAaE,CAAUC,EAErBxD,GACuD,IAFvDN,KAAEA,EAAIY,MAAEA,GAA8CkD,EAApCC,EAAaC,EAAAF,EAAAG,GAG/B,OAAOC,EAAYL,WAAWjD,EAAON,GAAS6D,MAC3CC,GACC,IAAIrE,KAAI6D,EAAAA,KAAMG,GAAa,CAAA,EAAA,CAAEnD,MAAOwD,MAE1C,EAlKAC,EAjBW1E,EAAU,OAuBP,cAAY0E,EAvBf1E,EAAU,WAyBHH,GAAuB6E,EAzB9B1E,EAAU,mBA2BK,CAAC,mBAAoB,WA2JjD2E,EAAcC,SAAS5E"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { defineProperty as _defineProperty,
|
|
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
|
-
|
|
151
|
-
|
|
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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"}
|