fabric-vectr 6.7.11 → 6.7.13
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/dist/index.js +34 -9
- 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 +34 -9
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +34 -9
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +6 -6
- package/dist/index.node.mjs +34 -9
- 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/Pattern/Pattern.d.ts.map +1 -1
- package/dist/src/Pattern/Pattern.min.mjs +1 -1
- package/dist/src/Pattern/Pattern.min.mjs.map +1 -1
- package/dist/src/Pattern/Pattern.mjs +5 -1
- package/dist/src/Pattern/Pattern.mjs.map +1 -1
- 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 +11 -1
- package/dist/src/shapes/Group.mjs.map +1 -1
- package/dist/src/shapes/Image.d.ts +2 -2
- package/dist/src/shapes/Image.d.ts.map +1 -1
- package/dist/src/shapes/Image.min.mjs +1 -1
- package/dist/src/shapes/Image.min.mjs.map +1 -1
- package/dist/src/shapes/Image.mjs +4 -2
- package/dist/src/shapes/Image.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.d.ts +6 -1
- package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
- package/dist/src/util/misc/objectEnlive.min.mjs +1 -1
- package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.mjs +16 -5
- package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
- package/dist-extensions/src/Pattern/Pattern.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Group.d.ts.map +1 -1
- package/dist-extensions/src/shapes/Image.d.ts +2 -2
- package/dist-extensions/src/shapes/Image.d.ts.map +1 -1
- package/dist-extensions/src/util/misc/objectEnlive.d.ts +6 -1
- package/dist-extensions/src/util/misc/objectEnlive.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Pattern/Pattern.spec.ts +63 -0
- package/src/Pattern/Pattern.ts +3 -1
- package/src/shapes/Group.spec.ts +40 -0
- package/src/shapes/Group.ts +20 -1
- package/src/shapes/Image.spec.ts +21 -2
- package/src/shapes/Image.ts +24 -12
- package/src/util/misc/objectEnlive.spec.ts +49 -2
- package/src/util/misc/objectEnlive.ts +29 -5
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var r="6.7.
|
|
1
|
+
var r="6.7.13";export{r as version};
|
|
2
2
|
//# sourceMappingURL=package.json.min.mjs.map
|
package/dist/package.json.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pattern.d.ts","sourceRoot":"","sources":["../../../src/Pattern/Pattern.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAO1E,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAGjB;;;GAGG;AACH,qBAAa,OAAO;IAClB,MAAM,CAAC,IAAI,SAAa;IAExB;;;;;;;OAOG;IACH,IAAI,IAAI,WAEP;IAED,IAAI,IAAI,CAAC,KAAK,QAAA,EAEb;IAED;;;OAGG;IACH,MAAM,EAAE,aAAa,CAAY;IAEjC;;;;OAIG;IACH,OAAO,SAAK;IAEZ;;;;OAIG;IACH,OAAO,SAAK;IAEZ;;;OAGG;IACH,WAAW,EAAE,YAAY,CAAM;IAE/B;;;;;OAKG;IACK,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAElC;;OAEG;IACK,MAAM,EAAE,iBAAiB,CAAC;IAElC;;;OAGG;IACK,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;OAGG;IACH,SAAiB,EAAE,EAAE,MAAM,CAAC;IAE5B;;;;OAIG;gBACS,OAAO,EAAE,cAAc;IAKnC;;OAEG;IACH,aAAa,IAAI,IAAI,IAAI;QAAE,MAAM,EAAE,gBAAgB,CAAA;KAAE;IAMrD;;OAEG;IACH,cAAc,IAAI,IAAI,IAAI;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE;IAIvD,cAAc,IAAI,MAAM;IAQxB;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,aAAa,GAAG,IAAI;IAgB3D;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,GAAE,MAAM,EAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAiBjE;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,MAAM;WAgC1B,UAAU,CACrB,EACE,IAAI,EACJ,MAAM,EACN,gBAAgB,EAChB,GAAG,YAAY,EAChB,EAAE,wBAAwB,EAC3B,OAAO,CAAC,EAAE,SAAS,GAClB,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Pattern.d.ts","sourceRoot":"","sources":["../../../src/Pattern/Pattern.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAO1E,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAGjB;;;GAGG;AACH,qBAAa,OAAO;IAClB,MAAM,CAAC,IAAI,SAAa;IAExB;;;;;;;OAOG;IACH,IAAI,IAAI,WAEP;IAED,IAAI,IAAI,CAAC,KAAK,QAAA,EAEb;IAED;;;OAGG;IACH,MAAM,EAAE,aAAa,CAAY;IAEjC;;;;OAIG;IACH,OAAO,SAAK;IAEZ;;;;OAIG;IACH,OAAO,SAAK;IAEZ;;;OAGG;IACH,WAAW,EAAE,YAAY,CAAM;IAE/B;;;;;OAKG;IACK,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAElC;;OAEG;IACK,MAAM,EAAE,iBAAiB,CAAC;IAElC;;;OAGG;IACK,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;OAGG;IACH,SAAiB,EAAE,EAAE,MAAM,CAAC;IAE5B;;;;OAIG;gBACS,OAAO,EAAE,cAAc;IAKnC;;OAEG;IACH,aAAa,IAAI,IAAI,IAAI;QAAE,MAAM,EAAE,gBAAgB,CAAA;KAAE;IAMrD;;OAEG;IACH,cAAc,IAAI,IAAI,IAAI;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE;IAIvD,cAAc,IAAI,MAAM;IAQxB;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,aAAa,GAAG,IAAI;IAgB3D;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,GAAE,MAAM,EAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAiBjE;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,MAAM;WAgC1B,UAAU,CACrB,EACE,IAAI,EACJ,MAAM,EACN,gBAAgB,EAChB,GAAG,YAAY,EAChB,EAAE,wBAAwB,EAC3B,OAAO,CAAC,EAAE,SAAS,GAClB,OAAO,CAAC,OAAO,CAAC;CAcpB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as e}from"../config.min.mjs";import{ifNaN as s}from"../util/internals/ifNaN.min.mjs";import{uid as r}from"../util/internals/uid.min.mjs";import{loadImage as i}from"../util/misc/objectEnlive.min.mjs";import{pick as o}from"../util/misc/pick.min.mjs";import{toFixed as n}from"../util/misc/toFixed.min.mjs";import{classRegistry as a}from"../ClassRegistry.min.mjs";import{log as h}from"../util/internals/console.min.mjs";class c{get type(){return"pattern"}set type(t){h("warn","Setting type has no effect",t)}constructor(e){t(this,"repeat","repeat"),t(this,"offsetX",0),t(this,"offsetY",0),t(this,"crossOrigin",""),this.id=r(),Object.assign(this,e)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const{repeat:s,crossOrigin:r}=this;return{...o(this,t),type:"pattern",source:this.sourceToString(),repeat:s,crossOrigin:r,offsetX:n(this.offsetX,e.NUM_FRACTION_DIGITS),offsetY:n(this.offsetY,e.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG(t){let{width:e,height:r}=t;const{source:i,repeat:o,id:n}=this,a=s(this.offsetX/e,0),h=s(this.offsetY/r,0);return[`<pattern id="SVGID_${n}" x="${a}" y="${h}" width="${"repeat-y"===o||"no-repeat"===o?1+Math.abs(a||0):s(i.width/e,0)}" height="${"repeat-x"===o||"no-repeat"===o?1+Math.abs(h||0):s(i.height/r,0)}">`,`<image x="0" y="0" width="${i.width}" height="${i.height}" xlink:href="${this.sourceToString()}"></image>`,"</pattern>",""].join("\n")}static async fromObject(t,e){let{type:s,source:r,patternTransform:o,...n}=t;const
|
|
1
|
+
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as e}from"../config.min.mjs";import{ifNaN as s}from"../util/internals/ifNaN.min.mjs";import{uid as r}from"../util/internals/uid.min.mjs";import{loadImage as i}from"../util/misc/objectEnlive.min.mjs";import{pick as o}from"../util/misc/pick.min.mjs";import{toFixed as n}from"../util/misc/toFixed.min.mjs";import{classRegistry as a}from"../ClassRegistry.min.mjs";import{log as h}from"../util/internals/console.min.mjs";class c{get type(){return"pattern"}set type(t){h("warn","Setting type has no effect",t)}constructor(e){t(this,"repeat","repeat"),t(this,"offsetX",0),t(this,"offsetY",0),t(this,"crossOrigin",""),this.id=r(),Object.assign(this,e)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const{repeat:s,crossOrigin:r}=this;return{...o(this,t),type:"pattern",source:this.sourceToString(),repeat:s,crossOrigin:r,offsetX:n(this.offsetX,e.NUM_FRACTION_DIGITS),offsetY:n(this.offsetY,e.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG(t){let{width:e,height:r}=t;const{source:i,repeat:o,id:n}=this,a=s(this.offsetX/e,0),h=s(this.offsetY/r,0);return[`<pattern id="SVGID_${n}" x="${a}" y="${h}" width="${"repeat-y"===o||"no-repeat"===o?1+Math.abs(a||0):s(i.width/e,0)}" height="${"repeat-x"===o||"no-repeat"===o?1+Math.abs(h||0):s(i.height/r,0)}">`,`<image x="0" y="0" width="${i.width}" height="${i.height}" xlink:href="${this.sourceToString()}"></image>`,"</pattern>",""].join("\n")}static async fromObject(t,e){let{type:s,source:r,patternTransform:o,...n}=t;const{crossOrigin:a}=n,h=await i(r,{...e,crossOrigin:a,fallbackToEmptyImage:!0});return new this({...n,patternTransform:o&&o.slice(0),source:h})}}t(c,"type","Pattern"),a.setClass(c),a.setClass(c,"pattern");export{c as Pattern};
|
|
2
2
|
//# sourceMappingURL=Pattern.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pattern.min.mjs","sources":["../../../src/Pattern/Pattern.ts"],"sourcesContent":["import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabricjs.com/patterns demo}\n * @see {@link http://fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n * @default\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n * @default\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an <img> element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a <canvas> element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record<string, any> {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN(\n ((patternSource as HTMLImageElement).width as number) / width,\n 0,\n ),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN(\n ((patternSource as HTMLImageElement).height as number) / height,\n 0,\n );\n\n return [\n `<pattern id=\"SVGID_${id}\" x=\"${patternOffsetX}\" y=\"${patternOffsetY}\" width=\"${patternWidth}\" height=\"${patternHeight}\">`,\n `<image x=\"0\" y=\"0\" width=\"${\n (patternSource as HTMLImageElement).width\n }\" height=\"${\n (patternSource as HTMLImageElement).height\n }\" xlink:href=\"${this.sourceToString()}\"></image>`,\n `</pattern>`,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise<Pattern> {\n const img = await loadImage(source, {\n ...options,\n crossOrigin:
|
|
1
|
+
{"version":3,"file":"Pattern.min.mjs","sources":["../../../src/Pattern/Pattern.ts"],"sourcesContent":["import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabricjs.com/patterns demo}\n * @see {@link http://fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n * @default\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n * @default\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an <img> element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a <canvas> element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record<string, any> {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN(\n ((patternSource as HTMLImageElement).width as number) / width,\n 0,\n ),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN(\n ((patternSource as HTMLImageElement).height as number) / height,\n 0,\n );\n\n return [\n `<pattern id=\"SVGID_${id}\" x=\"${patternOffsetX}\" y=\"${patternOffsetY}\" width=\"${patternWidth}\" height=\"${patternHeight}\">`,\n `<image x=\"0\" y=\"0\" width=\"${\n (patternSource as HTMLImageElement).width\n }\" height=\"${\n (patternSource as HTMLImageElement).height\n }\" xlink:href=\"${this.sourceToString()}\"></image>`,\n `</pattern>`,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise<Pattern> {\n const { crossOrigin } = otherOptions;\n const img = await loadImage(source, {\n ...options,\n crossOrigin,\n fallbackToEmptyImage: true,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n"],"names":["Pattern","type","value","log","constructor","options","_defineProperty","this","id","uid","Object","assign","isImageSource","source","src","isCanvasSource","toDataURL","sourceToString","toLive","ctx","complete","naturalWidth","naturalHeight","createPattern","repeat","toObject","propertiesToInclude","arguments","length","undefined","crossOrigin","pick","offsetX","toFixed","config","NUM_FRACTION_DIGITS","offsetY","patternTransform","toSVG","_ref","width","height","patternSource","patternOffsetX","ifNaN","patternOffsetY","Math","abs","join","fromObject","_ref2","otherOptions","img","loadImage","fallbackToEmptyImage","slice","classRegistry","setClass"],"mappings":"ggBAmBO,MAAMA,EAWX,QAAIC,GACF,MAAO,SACT,CAEA,QAAIA,CAAKC,GACPC,EAAI,OAAQ,6BAA8BD,EAC5C,CA0DAE,WAAAA,CAAYC,GAAyBC,gBApDb,UAExBA,iBAKU,GAEVA,iBAKU,GAEVA,qBAI4B,IAiC1BC,KAAKC,GAAKC,IACVC,OAAOC,OAAOJ,KAAMF,EACtB,CAKAO,aAAAA,GACE,QACIL,KAAKM,QAA2D,iBAAzCN,KAAKM,OAA4BC,GAE9D,CAKAC,cAAAA,GACE,QAASR,KAAKM,UAAaN,KAAKM,OAA6BG,SAC/D,CAEAC,cAAAA,GACE,OAAOV,KAAKK,gBACRL,KAAKM,OAAOC,IACZP,KAAKQ,iBACHR,KAAKM,OAAOG,YACZ,EACR,CAOAE,MAAAA,CAAOC,GACL,OAEGZ,KAAKM,UAELN,KAAKK,iBACFL,KAAKM,OAAOO,UACiB,IAA7Bb,KAAKM,OAAOQ,cACkB,IAA9Bd,KAAKM,OAAOS,eAKXH,EAAII,cAAchB,KAAKM,OAAQN,KAAKiB,QAHlC,IAIX,CAOAC,QAAAA,GAAkE,IAAzDC,EAA6BC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GACvC,MAAMH,OAAEA,EAAMM,YAAEA,GAAgBvB,KAChC,MAAO,IACFwB,EAAKxB,KAAMmB,GACdzB,KAAM,UACNY,OAAQN,KAAKU,iBACbO,SACAM,cACAE,QAASC,EAAQ1B,KAAKyB,QAASE,EAAOC,qBACtCC,QAASH,EAAQ1B,KAAK6B,QAASF,EAAOC,qBACtCE,iBAAkB9B,KAAK8B,iBACnB,IAAI9B,KAAK8B,kBACT,KAER,CAMAC,KAAAA,CAAKC,GAAmC,IAAlCC,MAAEA,EAAKC,OAAEA,GAAeF,EAC5B,MAAQ1B,OAAQ6B,EAAalB,OAAEA,EAAMhB,GAAEA,GAAOD,KAC5CoC,EAAiBC,EAAMrC,KAAKyB,QAAUQ,EAAO,GAC7CK,EAAiBD,EAAMrC,KAAK6B,QAAUK,EAAQ,GAgBhD,MAAO,CACL,sBAAsBjC,SAAUmC,SAAsBE,aAfzC,aAAXrB,GAAoC,cAAXA,EACrB,EAAIsB,KAAKC,IAAIJ,GAAkB,GAC/BC,EACIF,EAAmCF,MAAmBA,EACxD,eAGK,aAAXhB,GAAoC,cAAXA,EACrB,EAAIsB,KAAKC,IAAIF,GAAkB,GAC/BD,EACIF,EAAmCD,OAAoBA,EACzD,OAKR,6BACGC,EAAmCF,kBAEnCE,EAAmCD,uBACrBlC,KAAKU,6BACtB,aACA,IACA+B,KAAK,KACT,CAGA,uBAAaC,CAAUC,EAOrB7C,GACkB,IAPlBJ,KACEA,EAAIY,OACJA,EAAMwB,iBACNA,KACGc,GACsBD,EAG3B,MAAMpB,YAAEA,GAAgBqB,EAClBC,QAAYC,EAAUxC,EAAQ,IAC/BR,EACHyB,cACAwB,sBAAsB,IAExB,OAAO,IAAI/C,KAAK,IACX4C,EACHd,iBACEA,GAAqBA,EAAiBkB,MAAM,GAC9C1C,OAAQuC,GAEZ,EACD9C,EA5MYN,EAAO,OACJ,WA6MhBwD,EAAcC,SAASzD,GAEvBwD,EAAcC,SAASzD,EAAS"}
|
|
@@ -167,9 +167,13 @@ class Pattern {
|
|
|
167
167
|
patternTransform,
|
|
168
168
|
...otherOptions
|
|
169
169
|
} = _ref2;
|
|
170
|
+
const {
|
|
171
|
+
crossOrigin
|
|
172
|
+
} = otherOptions;
|
|
170
173
|
const img = await loadImage(source, {
|
|
171
174
|
...options,
|
|
172
|
-
crossOrigin
|
|
175
|
+
crossOrigin,
|
|
176
|
+
fallbackToEmptyImage: true
|
|
173
177
|
});
|
|
174
178
|
return new this({
|
|
175
179
|
...otherOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pattern.mjs","sources":["../../../src/Pattern/Pattern.ts"],"sourcesContent":["import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabricjs.com/patterns demo}\n * @see {@link http://fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n * @default\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n * @default\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an <img> element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a <canvas> element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record<string, any> {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN(\n ((patternSource as HTMLImageElement).width as number) / width,\n 0,\n ),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN(\n ((patternSource as HTMLImageElement).height as number) / height,\n 0,\n );\n\n return [\n `<pattern id=\"SVGID_${id}\" x=\"${patternOffsetX}\" y=\"${patternOffsetY}\" width=\"${patternWidth}\" height=\"${patternHeight}\">`,\n `<image x=\"0\" y=\"0\" width=\"${\n (patternSource as HTMLImageElement).width\n }\" height=\"${\n (patternSource as HTMLImageElement).height\n }\" xlink:href=\"${this.sourceToString()}\"></image>`,\n `</pattern>`,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise<Pattern> {\n const img = await loadImage(source, {\n ...options,\n crossOrigin: otherOptions.crossOrigin,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n"],"names":["Pattern","type","value","log","constructor","options","_defineProperty","id","uid","Object","assign","isImageSource","source","src","isCanvasSource","toDataURL","sourceToString","toLive","ctx","complete","naturalWidth","naturalHeight","createPattern","repeat","toObject","propertiesToInclude","arguments","length","undefined","crossOrigin","pick","offsetX","toFixed","config","NUM_FRACTION_DIGITS","offsetY","patternTransform","toSVG","_ref","width","height","patternSource","patternOffsetX","ifNaN","patternOffsetY","patternWidth","Math","abs","patternHeight","join","fromObject","_ref2","otherOptions","img","loadImage","slice","classRegistry","setClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pattern.mjs","sources":["../../../src/Pattern/Pattern.ts"],"sourcesContent":["import { config } from '../config';\nimport type { Abortable, TCrossOrigin, TMat2D, TSize } from '../typedefs';\nimport { ifNaN } from '../util/internals/ifNaN';\nimport { uid } from '../util/internals/uid';\nimport { loadImage } from '../util/misc/objectEnlive';\nimport { pick } from '../util/misc/pick';\nimport { toFixed } from '../util/misc/toFixed';\nimport { classRegistry } from '../ClassRegistry';\nimport type {\n PatternRepeat,\n PatternOptions,\n SerializedPatternOptions,\n} from './types';\nimport { log } from '../util/internals/console';\n\n/**\n * @see {@link http://fabricjs.com/patterns demo}\n * @see {@link http://fabricjs.com/dynamic-patterns demo}\n */\nexport class Pattern {\n static type = 'Pattern';\n\n /**\n * Legacy identifier of the class. Prefer using this.constructor.type 'Pattern'\n * or utils like isPattern, or instance of to indentify a pattern in your code.\n * Will be removed in future versiones\n * @TODO add sustainable warning message\n * @type string\n * @deprecated\n */\n get type() {\n return 'pattern';\n }\n\n set type(value) {\n log('warn', 'Setting type has no effect', value);\n }\n\n /**\n * @type PatternRepeat\n * @defaults\n */\n repeat: PatternRepeat = 'repeat';\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetX = 0;\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetY = 0;\n\n /**\n * @type TCrossOrigin\n * @default\n */\n crossOrigin: TCrossOrigin = '';\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @todo verify if using the identity matrix as default makes the rest of the code more easy\n * @type Array\n * @default\n */\n declare patternTransform?: TMat2D;\n\n /**\n * The actual pixel source of the pattern\n */\n declare source: CanvasImageSource;\n\n /**\n * If true, this object will not be exported during the serialization of a canvas\n * @type boolean\n */\n declare excludeFromExport?: boolean;\n\n /**\n * ID used for SVG export functionalities\n * @type number\n */\n declare readonly id: number;\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {option.source} [source] the pattern source, eventually empty or a drawable\n */\n constructor(options: PatternOptions) {\n this.id = uid();\n Object.assign(this, options);\n }\n\n /**\n * @returns true if {@link source} is an <img> element\n */\n isImageSource(): this is { source: HTMLImageElement } {\n return (\n !!this.source && typeof (this.source as HTMLImageElement).src === 'string'\n );\n }\n\n /**\n * @returns true if {@link source} is a <canvas> element\n */\n isCanvasSource(): this is { source: HTMLCanvasElement } {\n return !!this.source && !!(this.source as HTMLCanvasElement).toDataURL;\n }\n\n sourceToString(): string {\n return this.isImageSource()\n ? this.source.src\n : this.isCanvasSource()\n ? this.source.toDataURL()\n : '';\n }\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive(ctx: CanvasRenderingContext2D): CanvasPattern | null {\n if (\n // if the image failed to load, return, and allow rest to continue loading\n !this.source ||\n // if an image\n (this.isImageSource() &&\n (!this.source.complete ||\n this.source.naturalWidth === 0 ||\n this.source.naturalHeight === 0))\n ) {\n return null;\n }\n\n return ctx.createPattern(this.source, this.repeat)!;\n }\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {object} Object representation of a pattern instance\n */\n toObject(propertiesToInclude: string[] = []): Record<string, any> {\n const { repeat, crossOrigin } = this;\n return {\n ...pick(this, propertiesToInclude as (keyof this)[]),\n type: 'pattern',\n source: this.sourceToString(),\n repeat,\n crossOrigin,\n offsetX: toFixed(this.offsetX, config.NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, config.NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform\n ? [...this.patternTransform]\n : null,\n };\n }\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n */\n toSVG({ width, height }: TSize): string {\n const { source: patternSource, repeat, id } = this,\n patternOffsetX = ifNaN(this.offsetX / width, 0),\n patternOffsetY = ifNaN(this.offsetY / height, 0),\n patternWidth =\n repeat === 'repeat-y' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetX || 0)\n : ifNaN(\n ((patternSource as HTMLImageElement).width as number) / width,\n 0,\n ),\n patternHeight =\n repeat === 'repeat-x' || repeat === 'no-repeat'\n ? 1 + Math.abs(patternOffsetY || 0)\n : ifNaN(\n ((patternSource as HTMLImageElement).height as number) / height,\n 0,\n );\n\n return [\n `<pattern id=\"SVGID_${id}\" x=\"${patternOffsetX}\" y=\"${patternOffsetY}\" width=\"${patternWidth}\" height=\"${patternHeight}\">`,\n `<image x=\"0\" y=\"0\" width=\"${\n (patternSource as HTMLImageElement).width\n }\" height=\"${\n (patternSource as HTMLImageElement).height\n }\" xlink:href=\"${this.sourceToString()}\"></image>`,\n `</pattern>`,\n '',\n ].join('\\n');\n }\n /* _TO_SVG_END_ */\n\n static async fromObject(\n {\n type,\n source,\n patternTransform,\n ...otherOptions\n }: SerializedPatternOptions,\n options?: Abortable,\n ): Promise<Pattern> {\n const { crossOrigin } = otherOptions;\n const img = await loadImage(source, {\n ...options,\n crossOrigin,\n fallbackToEmptyImage: true,\n });\n return new this({\n ...otherOptions,\n patternTransform:\n patternTransform && (patternTransform.slice(0) as TMat2D),\n source: img,\n });\n }\n}\n\nclassRegistry.setClass(Pattern);\n// kept for compatibility reason\nclassRegistry.setClass(Pattern, 'pattern');\n"],"names":["Pattern","type","value","log","constructor","options","_defineProperty","id","uid","Object","assign","isImageSource","source","src","isCanvasSource","toDataURL","sourceToString","toLive","ctx","complete","naturalWidth","naturalHeight","createPattern","repeat","toObject","propertiesToInclude","arguments","length","undefined","crossOrigin","pick","offsetX","toFixed","config","NUM_FRACTION_DIGITS","offsetY","patternTransform","toSVG","_ref","width","height","patternSource","patternOffsetX","ifNaN","patternOffsetY","patternWidth","Math","abs","patternHeight","join","fromObject","_ref2","otherOptions","img","loadImage","fallbackToEmptyImage","slice","classRegistry","setClass"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../../src/shapes/Group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,SAAS,EACV,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../../src/shapes/Group.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{createCollectionMixin as e}from"../Collection.min.mjs";import{multiplyTransformMatrices as s,invertTransform as r}from"../util/misc/matrix.min.mjs";import{enlivenObjects as i,enlivenObjectEnlivables as o}from"../util/misc/objectEnlive.min.mjs";import{
|
|
1
|
+
import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{createCollectionMixin as e}from"../Collection.min.mjs";import{multiplyTransformMatrices as s,invertTransform as r}from"../util/misc/matrix.min.mjs";import{enlivenObjects as i,enlivenObjectEnlivables as o}from"../util/misc/objectEnlive.min.mjs";import{calcPlaneChangeMatrix as n}from"../util/misc/planeChange.min.mjs";import{applyTransformToObject as a}from"../util/misc/objectTransforms.min.mjs";import{matrixToSVG as c}from"../util/misc/svgExport.min.mjs";import{FabricObject as h}from"./Object/FabricObject.min.mjs";import{Rect as l}from"./Rect.min.mjs";import{classRegistry as u}from"../ClassRegistry.min.mjs";import{log as p}from"../util/internals/console.min.mjs";import{LayoutManager as g}from"../LayoutManager/LayoutManager.min.mjs";import{LAYOUT_TYPE_INITIALIZATION as _,LAYOUT_TYPE_ADDED as d,LAYOUT_TYPE_REMOVED as f,LAYOUT_TYPE_IMPERATIVE as j}from"../LayoutManager/constants.min.mjs";class b extends g{performLayout(){}}const m={strokeWidth:0,subTargetCheck:!1,interactive:!1};class O extends(e(h)){static getDefaults(){return{...super.getDefaults(),...O.ownDefaults}}constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"_activeObjects",[]),t(this,"__objectSelectionTracker",void 0),t(this,"__objectSelectionDisposer",void 0),Object.assign(this,O.ownDefaults),this.setOptions(s),this.groupInit(e,s)}groupInit(t,e){var s;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject((t=>{this.enterGroup(t,!1)})),this.layoutManager=null!==(s=e.layoutManager)&&void 0!==s?s:new g,this.layoutManager.performLayout({type:_,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(p("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(p("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter(((t,e,s)=>this.canEnterGroup(t)&&s.indexOf(t)===e))}add(){for(var t=arguments.length,e=new Array(t),s=0;s<t;s++)e[s]=arguments[s];const r=this._filterObjectsBeforeEnteringGroup(e),i=super.add(...r);return this._onAfterObjectsChange(d,r),i}insertAt(t){for(var e=arguments.length,s=new Array(e>1?e-1:0),r=1;r<e;r++)s[r-1]=arguments[r];const i=this._filterObjectsBeforeEnteringGroup(s),o=super.insertAt(t,...i);return this._onAfterObjectsChange(d,i),o}remove(){const t=super.remove(...arguments);return this._onAfterObjectsChange(f,t),t}_onObjectAdded(t){this.enterGroup(t,!0),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t,e){this.exitGroup(t,e),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onAfterObjectsChange(t,e){this.layoutManager.performLayout({type:t,targets:e,target:this})}_onStackOrderChanged(){this._set("dirty",!0)}_set(t,e){const s=this[t];return super._set(t,e),"canvas"===t&&s!==e&&(this._objects||[]).forEach((s=>{s._set(t,e)})),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,e){let{target:s}=e;const r=this._activeObjects;if(t)r.push(s),this._set("dirty",!0);else if(r.length>0){const t=r.indexOf(s);t>-1&&(r.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&a(t,s(r(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);const i=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();i&&(i===t||t.isDescendantOf(i))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(a(t,s(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);const r=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;r>-1&&this._activeObjects.splice(r,1)}shouldCache(){const t=h.prototype.shouldCache.call(this);if(t)for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow()||this._objects[t].preventGroupCache)return this.ownCaching=!1,!1;return t}willDrawShadow(){if(super.willDrawShadow())return!0;for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return!0;return!1}isOnACache(){return this.ownCaching||!!this.parent&&this.parent.isOnACache()}drawObject(t,e,s){this._renderBackground(t);for(let e=0;e<this._objects.length;e++){var i;const s=this._objects[e];null!==(i=this.canvas)&&void 0!==i&&i.preserveObjectStacking&&s.group!==this?(t.save(),t.transform(...r(this.calcTransformMatrix())),s.render(t),t.restore()):s.group===this&&s.render(t)}this._drawClipPath(t,this.clipPath,s)}setCoords(){super.setCoords(),this._shouldSetNestedCoords()&&this.forEachObject((t=>t.setCoords()))}triggerLayout(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.layoutManager.performLayout({target:this,type:j,...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){const s=this.includeDefaultValues;return this._objects.filter((function(t){return!t.excludeFromExport})).map((function(r){const i=r.includeDefaultValues;r.includeDefaultValues=s;const o=r[t||"toObject"](e);return r.includeDefaultValues=i,o}))}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];const e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#<Group: (${this.complexity()})>`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject((t=>{this._watchObject(!1,t),t.dispose()})),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";const e=l.prototype._toSVG.call(this),s=e.indexOf("COMMON_PARTS");e[s]='for="group" ';const r=e.join("");return t?t(r):r}_toSVG(t){const e=["<g ","COMMON_PARTS"," >\n"],s=this._createSVGBgRect(t),r=this.calcTransformMatrix();s&&e.push("\t\t",s);for(let s=0;s<this._objects.length;s++){const i=this._objects[s];if(i.group&&i.group!==this){const s=n(i.group.calcTransformMatrix(),r);e.push('\t\t<g transform="',c(s),'">\n\t\t',i.toSVG(t),"\t\t</g>\n")}else e.push("\t\t",i.toSVG(t))}return e.push("</g>\n"),e}getSvgStyles(){const t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${this.opacity};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){const e=[],s=this._createSVGBgRect(t);s&&e.push("\t",s);for(let s=0;s<this._objects.length;s++)e.push("\t",this._objects[s].toClipPathSVG(t));return this._createBaseClipPathSVGMarkup(e,{reviver:t})}static fromObject(t,e){let{type:s,objects:r=[],layoutManager:n,...a}=t;return Promise.all([i(r,e),o(a,e)]).then((t=>{let[e,s]=t;const r=new this(e,{...a,...s,layoutManager:new b});if(n){const t=u.getClass(n.type),e=u.getClass(n.strategy);r.layoutManager=new t(new e)}else r.layoutManager=new g;return r.layoutManager.subscribeTargets({type:_,target:r,targets:r.getObjects()}),r.setCoords(),r}))}}t(O,"type","Group"),t(O,"ownDefaults",m),u.setClass(O);export{O as Group,m as groupDefaultValues};
|
|
2
2
|
//# sourceMappingURL=Group.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Group.min.mjs","sources":["../../../src/shapes/Group.ts"],"sourcesContent":["import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial<TClassProperties<Group>> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject<GroupProps, SerializedGroupProps, GroupEvents>,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @default\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @default\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record<string, any> = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial<GroupProps> = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor<T extends boolean>(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (\n this._objects[i].willDrawShadow() ||\n this._objects[i].preventGroupCache\n ) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties<this>,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#<Group: (${this.complexity()})>`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @static\n * @memberOf Group\n * @param {Object} object Object to create a group from\n * @returns {Promise<Group>}\n */\n static fromObject<T extends TOptions<SerializedGroupProps>>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects<FabricObject>(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass<typeof LayoutManager>(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass<typeof FitContentLayout>(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n"],"names":["NoopLayoutManager","LayoutManager","performLayout","groupDefaultValues","strokeWidth","subTargetCheck","interactive","Group","createCollectionMixin","FabricObject","getDefaults","super","ownDefaults","constructor","objects","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","groupInit","_options$layoutManage","_objects","__objectSelectionTracker","__objectSelectionMonitor","bind","__objectSelectionDisposer","forEachObject","object","enterGroup","layoutManager","type","LAYOUT_TYPE_INITIALIZATION","target","targets","x","left","y","top","canEnterGroup","isDescendantOf","log","indexOf","_filterObjectsBeforeEnteringGroup","filter","index","array","add","_len","Array","_key","allowedObjects","size","_onAfterObjectsChange","LAYOUT_TYPE_ADDED","insertAt","_len2","_key2","remove","removed","LAYOUT_TYPE_REMOVED","_onObjectAdded","fire","_onObjectRemoved","removeParentTransform","exitGroup","_onStackOrderChanged","_set","key","value","prev","forEach","_shouldSetNestedCoords","removeAll","_activeObjects","selected","_ref","activeObjects","push","splice","_watchObject","watch","on","off","group","_enterGroup","applyTransformToObject","multiplyTransformMatrices","invertTransform","calcTransformMatrix","setCoords","canvas","activeObject","getActiveObject","_exitGroup","shouldCache","ownCache","prototype","call","i","willDrawShadow","preventGroupCache","ownCaching","isOnACache","parent","drawObject","ctx","forClipping","context","_renderBackground","_this$canvas","obj","preserveObjectStacking","save","transform","render","restore","_drawClipPath","clipPath","triggerLayout","LAYOUT_TYPE_IMPERATIVE","_transformDone","__serializeObjects","method","propertiesToInclude","_includeDefaultValues","includeDefaultValues","excludeFromExport","map","originalDefaults","data","toObject","strategy","toString","complexity","dispose","unsubscribeTargets","getObjects","_createSVGBgRect","reviver","backgroundColor","fillStroke","Rect","_toSVG","commons","markup","join","svgString","bg","toSVG","getSvgStyles","opacity","visibility","visible","getSvgFilter","toClipPathSVG","_createBaseClipPathSVGMarkup","fromObject","_ref2","abortable","Promise","all","enlivenObjects","enlivenObjectEnlivables","then","_ref3","hydratedOptions","layoutClass","classRegistry","getClass","strategyClass","subscribeTargets","setClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Group.min.mjs","sources":["../../../src/shapes/Group.ts"],"sourcesContent":["import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { calcPlaneChangeMatrix } from '../util/misc/planeChange';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { matrixToSVG } from '../util/misc/svgExport';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial<TClassProperties<Group>> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject<GroupProps, SerializedGroupProps, GroupEvents>,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @default\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @default\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record<string, any> = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial<GroupProps> = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor<T extends boolean>(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (\n this._objects[i].willDrawShadow() ||\n this._objects[i].preventGroupCache\n ) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<\n GroupProps & TClassProperties<this>,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#<Group: (${this.complexity()})>`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n const bg = this._createSVGBgRect(reviver);\n const groupTransformMatrix = this.calcTransformMatrix();\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n const object = this._objects[i];\n if (object.group && object.group !== this) {\n // 组内对象被 ActiveSelection 临时接管时,需要补回当前组坐标系的变换。\n const planeChangeMatrix = calcPlaneChangeMatrix(\n object.group.calcTransformMatrix(),\n groupTransformMatrix,\n );\n svgString.push(\n '\\t\\t<g transform=\"',\n matrixToSVG(planeChangeMatrix),\n '\">\\n\\t\\t',\n object.toSVG(reviver),\n '\\t\\t</g>\\n',\n );\n continue;\n }\n svgString.push('\\t\\t', object.toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @static\n * @memberOf Group\n * @param {Object} object Object to create a group from\n * @returns {Promise<Group>}\n */\n static fromObject<T extends TOptions<SerializedGroupProps>>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects<FabricObject>(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass<typeof LayoutManager>(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass<typeof FitContentLayout>(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n"],"names":["NoopLayoutManager","LayoutManager","performLayout","groupDefaultValues","strokeWidth","subTargetCheck","interactive","Group","createCollectionMixin","FabricObject","getDefaults","super","ownDefaults","constructor","objects","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","groupInit","_options$layoutManage","_objects","__objectSelectionTracker","__objectSelectionMonitor","bind","__objectSelectionDisposer","forEachObject","object","enterGroup","layoutManager","type","LAYOUT_TYPE_INITIALIZATION","target","targets","x","left","y","top","canEnterGroup","isDescendantOf","log","indexOf","_filterObjectsBeforeEnteringGroup","filter","index","array","add","_len","Array","_key","allowedObjects","size","_onAfterObjectsChange","LAYOUT_TYPE_ADDED","insertAt","_len2","_key2","remove","removed","LAYOUT_TYPE_REMOVED","_onObjectAdded","fire","_onObjectRemoved","removeParentTransform","exitGroup","_onStackOrderChanged","_set","key","value","prev","forEach","_shouldSetNestedCoords","removeAll","_activeObjects","selected","_ref","activeObjects","push","splice","_watchObject","watch","on","off","group","_enterGroup","applyTransformToObject","multiplyTransformMatrices","invertTransform","calcTransformMatrix","setCoords","canvas","activeObject","getActiveObject","_exitGroup","shouldCache","ownCache","prototype","call","i","willDrawShadow","preventGroupCache","ownCaching","isOnACache","parent","drawObject","ctx","forClipping","context","_renderBackground","_this$canvas","obj","preserveObjectStacking","save","transform","render","restore","_drawClipPath","clipPath","triggerLayout","LAYOUT_TYPE_IMPERATIVE","_transformDone","__serializeObjects","method","propertiesToInclude","_includeDefaultValues","includeDefaultValues","excludeFromExport","map","originalDefaults","data","toObject","strategy","toString","complexity","dispose","unsubscribeTargets","getObjects","_createSVGBgRect","reviver","backgroundColor","fillStroke","Rect","_toSVG","commons","markup","join","svgString","bg","groupTransformMatrix","planeChangeMatrix","calcPlaneChangeMatrix","matrixToSVG","toSVG","getSvgStyles","opacity","visibility","visible","getSvgFilter","toClipPathSVG","_createBaseClipPathSVGMarkup","fromObject","_ref2","abortable","Promise","all","enlivenObjects","enlivenObjectEnlivables","then","_ref3","hydratedOptions","layoutClass","classRegistry","getClass","strategyClass","subscribeTargets","setClass"],"mappings":"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"}
|
|
@@ -2,7 +2,9 @@ import { defineProperty as _defineProperty } from '../../_virtual/_rollupPluginB
|
|
|
2
2
|
import { createCollectionMixin } from '../Collection.mjs';
|
|
3
3
|
import { multiplyTransformMatrices, invertTransform } from '../util/misc/matrix.mjs';
|
|
4
4
|
import { enlivenObjects, enlivenObjectEnlivables } from '../util/misc/objectEnlive.mjs';
|
|
5
|
+
import { calcPlaneChangeMatrix } from '../util/misc/planeChange.mjs';
|
|
5
6
|
import { applyTransformToObject } from '../util/misc/objectTransforms.mjs';
|
|
7
|
+
import { matrixToSVG } from '../util/misc/svgExport.mjs';
|
|
6
8
|
import { FabricObject } from './Object/FabricObject.mjs';
|
|
7
9
|
import { Rect } from './Rect.mjs';
|
|
8
10
|
import { classRegistry } from '../ClassRegistry.mjs';
|
|
@@ -523,9 +525,17 @@ class Group extends createCollectionMixin(FabricObject) {
|
|
|
523
525
|
_toSVG(reviver) {
|
|
524
526
|
const svgString = ['<g ', 'COMMON_PARTS', ' >\n'];
|
|
525
527
|
const bg = this._createSVGBgRect(reviver);
|
|
528
|
+
const groupTransformMatrix = this.calcTransformMatrix();
|
|
526
529
|
bg && svgString.push('\t\t', bg);
|
|
527
530
|
for (let i = 0; i < this._objects.length; i++) {
|
|
528
|
-
|
|
531
|
+
const object = this._objects[i];
|
|
532
|
+
if (object.group && object.group !== this) {
|
|
533
|
+
// 组内对象被 ActiveSelection 临时接管时,需要补回当前组坐标系的变换。
|
|
534
|
+
const planeChangeMatrix = calcPlaneChangeMatrix(object.group.calcTransformMatrix(), groupTransformMatrix);
|
|
535
|
+
svgString.push('\t\t<g transform="', matrixToSVG(planeChangeMatrix), '">\n\t\t', object.toSVG(reviver), '\t\t</g>\n');
|
|
536
|
+
continue;
|
|
537
|
+
}
|
|
538
|
+
svgString.push('\t\t', object.toSVG(reviver));
|
|
529
539
|
}
|
|
530
540
|
svgString.push('</g>\n');
|
|
531
541
|
return svgString;
|