@erase2d/fabric 1.1.0-1 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +3 -1
  2. package/dist/_virtual/_rollupPluginBabelHelpers.js +542 -1
  3. package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
  4. package/dist/core/dist/src/erase.js +36 -0
  5. package/dist/core/dist/src/erase.js.map +1 -0
  6. package/dist/fabric/index.js +3 -1
  7. package/dist/fabric/index.js.map +1 -1
  8. package/dist/fabric/src/ClippingGroup.js +51 -1
  9. package/dist/fabric/src/ClippingGroup.js.map +1 -1
  10. package/dist/fabric/src/EraserBrush.js +435 -1
  11. package/dist/fabric/src/EraserBrush.js.map +1 -1
  12. package/dist/fabric/src/ErasingEffect.js +116 -1
  13. package/dist/fabric/src/ErasingEffect.js.map +1 -1
  14. package/dist/fabric/src/isTransparent.js +51 -1
  15. package/dist/fabric/src/isTransparent.js.map +1 -1
  16. package/dist/{fabric/index.d.ts → index.d.ts} +1 -1
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/src/ClippingGroup.d.ts.map +1 -0
  19. package/dist/src/EraserBrush.d.ts.map +1 -0
  20. package/dist/{fabric/src → src}/ErasingEffect.d.ts +3 -0
  21. package/dist/{fabric/src → src}/ErasingEffect.d.ts.map +1 -1
  22. package/dist/src/isTransparent.d.ts.map +1 -0
  23. package/package.json +9 -2
  24. package/rollup.config.mjs +42 -0
  25. package/tsconfig.json +1 -1
  26. package/dist/core/erase.d.ts +0 -11
  27. package/dist/core/erase.d.ts.map +0 -1
  28. package/dist/core/erase.js +0 -2
  29. package/dist/core/erase.js.map +0 -1
  30. package/dist/fabric/index.d.ts.map +0 -1
  31. package/dist/fabric/src/ClippingGroup.d.ts.map +0 -1
  32. package/dist/fabric/src/EraserBrush.d.ts.map +0 -1
  33. package/dist/fabric/src/isTransparent.d.ts.map +0 -1
  34. package/dist/fabric/src/util.d.ts +0 -19
  35. package/dist/fabric/src/util.d.ts.map +0 -1
  36. /package/dist/{fabric/src → src}/ClippingGroup.d.ts +0 -0
  37. /package/dist/{fabric/src → src}/EraserBrush.d.ts +0 -0
  38. /package/dist/{fabric/src → src}/isTransparent.d.ts +0 -0
@@ -1,2 +1,52 @@
1
- import{defineProperty as t,inherits as e,createClass as i,classCallCheck as r,callSuper as a,objectSpread2 as s,assertThisInitialized as n,get as o,getPrototypeOf as l}from"../../_virtual/_rollupPluginBabelHelpers.js";import{classRegistry as c,LayoutManager as h,FixedLayout as u,Path as f,Group as p}from"fabric";var g=function(c){function g(e,i){var o;return r(this,g),o=a(this,g,[e,s({layoutManager:new h(new u)},i)]),t(n(o),"blockErasing",!1),o}return e(g,p),i(g,[{key:"drawObject",value:function(t){var e=[],i=[];this._objects.forEach((function(t){return(t instanceof f?e:i).push(t)})),t.save(),t.fillStyle="black",t.fillRect(-this.width/2,-this.height/2,this.width,this.height),t.restore(),!this.blockErasing&&e.forEach((function(e){e.render(t)})),i.forEach((function(e){e.globalCompositeOperation=e.inverted?"destination-out":"source-in",e.render(t)}))}}],[{key:"getDefaults",value:function(){return s(s({},o(l(g),"getDefaults",this).call(this)),{},{originX:"center",originY:"center",left:0,top:0})}}]),g}();t(g,"type","clipping"),c.setClass(g);export{g as ClippingGroup};
1
+ import { defineProperty as _defineProperty, inherits as _inherits, createClass as _createClass, classCallCheck as _classCallCheck, callSuper as _callSuper, objectSpread2 as _objectSpread2, assertThisInitialized as _assertThisInitialized, get as _get, getPrototypeOf as _getPrototypeOf } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { classRegistry, LayoutManager, FixedLayout, Path, Group } from 'fabric';
3
+
4
+ var ClippingGroup = /*#__PURE__*/function (_Group) {
5
+ _inherits(ClippingGroup, _Group);
6
+ function ClippingGroup(objects, options) {
7
+ var _this;
8
+ _classCallCheck(this, ClippingGroup);
9
+ _this = _callSuper(this, ClippingGroup, [objects, _objectSpread2({
10
+ layoutManager: new LayoutManager(new FixedLayout())
11
+ }, options)]);
12
+ _defineProperty(_assertThisInitialized(_this), "blockErasing", false);
13
+ return _this;
14
+ }
15
+ _createClass(ClippingGroup, [{
16
+ key: "drawObject",
17
+ value: function drawObject(ctx) {
18
+ var paths = [];
19
+ var objects = [];
20
+ this._objects.forEach(function (object) {
21
+ return (object instanceof Path ? paths : objects).push(object);
22
+ });
23
+ ctx.save();
24
+ ctx.fillStyle = 'black';
25
+ ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);
26
+ ctx.restore();
27
+ !this.blockErasing && paths.forEach(function (path) {
28
+ path.render(ctx);
29
+ });
30
+ objects.forEach(function (object) {
31
+ object.globalCompositeOperation = object.inverted ? 'destination-out' : 'source-in';
32
+ object.render(ctx);
33
+ });
34
+ }
35
+ }], [{
36
+ key: "getDefaults",
37
+ value: function getDefaults() {
38
+ return _objectSpread2(_objectSpread2({}, _get(_getPrototypeOf(ClippingGroup), "getDefaults", this).call(this)), {}, {
39
+ originX: 'center',
40
+ originY: 'center',
41
+ left: 0,
42
+ top: 0
43
+ });
44
+ }
45
+ }]);
46
+ return ClippingGroup;
47
+ }(Group);
48
+ _defineProperty(ClippingGroup, "type", 'clipping');
49
+ classRegistry.setClass(ClippingGroup);
50
+
51
+ export { ClippingGroup };
2
52
  //# sourceMappingURL=ClippingGroup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClippingGroup.js","sources":["../../../src/ClippingGroup.ts"],"sourcesContent":["import {\n Group,\n LayoutManager,\n FixedLayout,\n Path,\n FabricObject,\n GroupProps,\n classRegistry,\n} from 'fabric';\n\nexport class ClippingGroup extends Group {\n static type = 'clipping';\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n originX: 'center',\n originY: 'center',\n left: 0,\n top: 0,\n };\n }\n\n private blockErasing = false;\n\n constructor(objects: FabricObject[], options: Partial<GroupProps>) {\n super(objects, {\n layoutManager: new LayoutManager(new FixedLayout()),\n ...options,\n });\n }\n\n drawObject(ctx: CanvasRenderingContext2D) {\n const paths: Path[] = [];\n const objects: FabricObject[] = [];\n this._objects.forEach((object) =>\n (object instanceof Path ? paths : objects).push(object)\n );\n\n ctx.save();\n ctx.fillStyle = 'black';\n ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);\n ctx.restore();\n\n !this.blockErasing &&\n paths.forEach((path) => {\n path.render(ctx);\n });\n\n objects.forEach((object) => {\n object.globalCompositeOperation = object.inverted\n ? 'destination-out'\n : 'source-in';\n object.render(ctx);\n });\n }\n}\n\nclassRegistry.setClass(ClippingGroup);\n"],"names":["ClippingGroup","_Group","objects","options","_this","_classCallCheck","_callSuper","this","_objectSpread","layoutManager","LayoutManager","FixedLayout","_defineProperty","_assertThisInitialized","_inherits","Group","_createClass","key","value","ctx","paths","_objects","forEach","object","Path","push","save","fillStyle","fillRect","width","height","restore","blockErasing","path","render","globalCompositeOperation","inverted","_get","_getPrototypeOf","call","originX","originY","left","top","classRegistry","setClass"],"mappings":"0TAUaA,IAAAA,WAAaC,GAexB,SAAAD,EAAYE,EAAyBC,GAA8B,IAAAC,EAFvC,OAEuCC,OAAAL,GACjEI,EAAAE,EAAAC,KAAAP,EAAME,CAAAA,EAAOM,EAAA,CACXC,cAAe,IAAIC,EAAc,IAAIC,IAClCR,KACFS,EAAAC,EAAAT,mBANkB,GAAKA,CAO5B,CATC,OAXuBU,EAAAd,EAASe,GAoBhCC,EAAAhB,EAAA,CAAA,CAAAiB,IAAA,aAAAC,MAED,SAAWC,GACT,IAAMC,EAAgB,GAChBlB,EAA0B,GAChCK,KAAKc,SAASC,SAAQ,SAACC,GAAM,OAC1BA,aAAkBC,EAAOJ,EAAQlB,GAASuB,KAAKF,EAAO,IAGzDJ,EAAIO,OACJP,EAAIQ,UAAY,QAChBR,EAAIS,UAAUrB,KAAKsB,MAAQ,GAAItB,KAAKuB,OAAS,EAAGvB,KAAKsB,MAAOtB,KAAKuB,QACjEX,EAAIY,WAEHxB,KAAKyB,cACJZ,EAAME,SAAQ,SAACW,GACbA,EAAKC,OAAOf,EACd,IAEFjB,EAAQoB,SAAQ,SAACC,GACfA,EAAOY,yBAA2BZ,EAAOa,SACrC,kBACA,YACJb,EAAOW,OAAOf,EAChB,GACF,IAAC,CAAA,CAAAF,IAAA,cAAAC,MA1CD,WACE,OAAAV,EAAAA,EAAA6B,CAAAA,EAAAA,EAAAC,EAAAtC,GAAA,cAAAO,MAAAgC,KAAAhC,OAAA,CAAA,EAAA,CAEEiC,QAAS,SACTC,QAAS,SACTC,KAAM,EACNC,IAAK,GAET,KAAC3C,CAAA,IAmCFY,EA9CYZ,EAAa,OACV,YA+ChB4C,EAAcC,SAAS7C"}
1
+ {"version":3,"file":"ClippingGroup.js","sources":["../../../src/ClippingGroup.ts"],"sourcesContent":["import {\n Group,\n LayoutManager,\n FixedLayout,\n Path,\n FabricObject,\n GroupProps,\n classRegistry,\n} from 'fabric';\n\nexport class ClippingGroup extends Group {\n static type = 'clipping';\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n originX: 'center',\n originY: 'center',\n left: 0,\n top: 0,\n };\n }\n\n private blockErasing = false;\n\n constructor(objects: FabricObject[], options: Partial<GroupProps>) {\n super(objects, {\n layoutManager: new LayoutManager(new FixedLayout()),\n ...options,\n });\n }\n\n drawObject(ctx: CanvasRenderingContext2D) {\n const paths: Path[] = [];\n const objects: FabricObject[] = [];\n this._objects.forEach((object) =>\n (object instanceof Path ? paths : objects).push(object)\n );\n\n ctx.save();\n ctx.fillStyle = 'black';\n ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);\n ctx.restore();\n\n !this.blockErasing &&\n paths.forEach((path) => {\n path.render(ctx);\n });\n\n objects.forEach((object) => {\n object.globalCompositeOperation = object.inverted\n ? 'destination-out'\n : 'source-in';\n object.render(ctx);\n });\n }\n}\n\nclassRegistry.setClass(ClippingGroup);\n"],"names":["ClippingGroup","_Group","_inherits","objects","options","_this","_classCallCheck","_callSuper","_objectSpread","layoutManager","LayoutManager","FixedLayout","_defineProperty","_assertThisInitialized","_createClass","key","value","drawObject","ctx","paths","_objects","forEach","object","Path","push","save","fillStyle","fillRect","width","height","restore","blockErasing","path","render","globalCompositeOperation","inverted","getDefaults","_get","_getPrototypeOf","call","originX","originY","left","top","Group","classRegistry","setClass"],"mappings":";;;AAUaA,IAAAA,aAAa,0BAAAC,MAAA,EAAA;EAAAC,SAAA,CAAAF,aAAA,EAAAC,MAAA,CAAA,CAAA;AAexB,EAAA,SAAAD,aAAYG,CAAAA,OAAuB,EAAEC,OAA4B,EAAE;AAAA,IAAA,IAAAC,KAAA,CAAA;AAAAC,IAAAA,eAAA,OAAAN,aAAA,CAAA,CAAA;AACjEK,IAAAA,KAAA,GAAAE,UAAA,CAAA,IAAA,EAAAP,aAAA,EAAMG,CAAAA,OAAO,EAAAK,cAAA,CAAA;AACXC,MAAAA,aAAa,EAAE,IAAIC,aAAa,CAAC,IAAIC,WAAW,EAAE,CAAA;AAAC,KAAA,EAChDP,OAAO,CAAA,CAAA,CAAA,CAAA;AACTQ,IAAAA,eAAA,CAAAC,sBAAA,CAAAR,KAAA,mBANkB,KAAK,CAAA,CAAA;AAAA,IAAA,OAAAA,KAAA,CAAA;AAO5B,GAAA;AAACS,EAAAA,YAAA,CAAAd,aAAA,EAAA,CAAA;IAAAe,GAAA,EAAA,YAAA;AAAAC,IAAAA,KAAA,EAED,SAAAC,UAAWC,CAAAA,GAA6B,EAAE;MACxC,IAAMC,KAAa,GAAG,EAAE,CAAA;MACxB,IAAMhB,OAAuB,GAAG,EAAE,CAAA;AAClC,MAAA,IAAI,CAACiB,QAAQ,CAACC,OAAO,CAAC,UAACC,MAAM,EAAA;AAAA,QAAA,OAC3B,CAACA,MAAM,YAAYC,IAAI,GAAGJ,KAAK,GAAGhB,OAAO,EAAEqB,IAAI,CAACF,MAAM,CAAC,CAAA;AAAA,OACzD,CAAC,CAAA;MAEDJ,GAAG,CAACO,IAAI,EAAE,CAAA;MACVP,GAAG,CAACQ,SAAS,GAAG,OAAO,CAAA;MACvBR,GAAG,CAACS,QAAQ,CAAC,CAAC,IAAI,CAACC,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAACC,MAAM,GAAG,CAAC,EAAE,IAAI,CAACD,KAAK,EAAE,IAAI,CAACC,MAAM,CAAC,CAAA;MACxEX,GAAG,CAACY,OAAO,EAAE,CAAA;MAEb,CAAC,IAAI,CAACC,YAAY,IAChBZ,KAAK,CAACE,OAAO,CAAC,UAACW,IAAI,EAAK;AACtBA,QAAAA,IAAI,CAACC,MAAM,CAACf,GAAG,CAAC,CAAA;AAClB,OAAC,CAAC,CAAA;AAEJf,MAAAA,OAAO,CAACkB,OAAO,CAAC,UAACC,MAAM,EAAK;QAC1BA,MAAM,CAACY,wBAAwB,GAAGZ,MAAM,CAACa,QAAQ,GAC7C,iBAAiB,GACjB,WAAW,CAAA;AACfb,QAAAA,MAAM,CAACW,MAAM,CAACf,GAAG,CAAC,CAAA;AACpB,OAAC,CAAC,CAAA;AACJ,KAAA;AAAC,GAAA,CAAA,EAAA,CAAA;IAAAH,GAAA,EAAA,aAAA;IAAAC,KAAA,EA1CD,SAAAoB,WAAAA,GAA0C;MACxC,OAAA5B,cAAA,CAAAA,cAAA,CAAA6B,EAAAA,EAAAA,IAAA,CAAAC,eAAA,CAAAtC,aAAA,CAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAAuC,IAAA,CAAA,IAAA,CAAA,CAAA,EAAA,EAAA,EAAA;AAEEC,QAAAA,OAAO,EAAE,QAAQ;AACjBC,QAAAA,OAAO,EAAE,QAAQ;AACjBC,QAAAA,IAAI,EAAE,CAAC;AACPC,QAAAA,GAAG,EAAE,CAAA;AAAC,OAAA,CAAA,CAAA;AAEV,KAAA;AAAC,GAAA,CAAA,CAAA,CAAA;AAAA,EAAA,OAAA3C,aAAA,CAAA;AAAA,CAAA,CAXgC4C,KAAK,EAAA;AA8CvChC,eAAA,CA9CYZ,aAAa,EAAA,MAAA,EACV,UAAU,CAAA,CAAA;AA+C1B6C,aAAa,CAACC,QAAQ,CAAC9C,aAAa,CAAC;;;;"}
@@ -1,2 +1,436 @@
1
- import{asyncToGenerator as t,inherits as e,createClass as n,regeneratorRuntime as r,classCallCheck as a,callSuper as i,defineProperty as s,assertThisInitialized as o,get as c,getPrototypeOf as u,toConsumableArray as l,slicedToArray as h}from"../../_virtual/_rollupPluginBabelHelpers.js";import*as v from"fabric";import{Group as p}from"fabric";import{erase as f}from"../../core/erase.js";import{ClippingGroup as d}from"./ClippingGroup.js";import{draw as m}from"./ErasingEffect.js";function y(t,e){return t.flatMap((function(t){return t.erasable&&t.intersectsWithObject(e)?t instanceof p&&"deep"===t.erasable?y(t.getObjects(),e):[t]:[]}))}var g=function(t){var e=t.clipPath;if(e instanceof d)return e;var n=new d([],{width:t.width,height:t.height});if(e){var r=e.translateToOriginPoint(new v.Point,e.originX,e.originY),a=r.x,i=r.y;e.originX=e.originY="center",v.util.sendObjectToPlane(e,void 0,v.util.createTranslateMatrix(a,i)),n.add(e)}return t.clipPath=n};function w(t,e){var n=g(t);n.add(e),n.set("dirty",!0),t.set("dirty",!0)}function x(t,e){return E.apply(this,arguments)}function E(){return(E=t(r().mark((function t(e,n){var a;return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,n.clone();case 2:return a=t.sent,v.util.sendObjectToPlane(a,void 0,e.calcTransformMatrix()),w(e,a),t.abrupt("return",a);case 6:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function b(t,e,n){return k.apply(this,arguments)}function k(){return(k=t(r().mark((function t(e,n,a){var i,s;return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,a.clone();case 2:return i=t.sent,s=n&&e.translateToOriginPoint(new v.Point,e.originX,e.originY),v.util.sendObjectToPlane(i,void 0,s?v.util.multiplyTransformMatrixArray([[1,0,0,1,s.x,s.y],n,[1,0,0,1,-s.x,-s.y],e.calcTransformMatrix()]):e.calcTransformMatrix()),w(e,i),t.abrupt("return",i);case 7:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var P=function(p){function d(t){var e;a(this,d),e=i(this,d,[t]),s(o(e),"inverted",!1),s(o(e),"active",!1);var n=document.createElement("canvas"),r=n.getContext("2d");if(!r)throw new Error("Failed to get context");return function(t,e,n){var r=n.width,a=n.height,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;t.width=r,t.height=a,i>1&&(t.setAttribute("width",(r*i).toString()),t.setAttribute("height",(a*i).toString()),e.scale(i,i))}(n,r,t,e.canvas.getRetinaScaling()),e.effectContext=r,e.eventEmitter=new EventTarget,e}var g;return e(d,p),n(d,[{key:"on",value:function(t,e,n){var r=this;return this.eventEmitter.addEventListener(t,e,n),function(){return r.eventEmitter.removeEventListener(t,e,n)}}},{key:"drawEffect",value:function(){m(this.effectContext,{opacity:new v.Color(this.color).getAlpha(),inverted:this.inverted},{canvas:this.canvas})}},{key:"_setBrushStyles",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.canvas.contextTop;c(u(d.prototype),"_setBrushStyles",this).call(this,t),t.strokeStyle="black"}},{key:"needsFullRender",value:function(){return!0}},{key:"_render",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.canvas.getTopContext();c(u(d.prototype),"_render",this).call(this,t),f(this.canvas.getContext(),t,this.effectContext)}},{key:"onMouseDown",value:function(t,e){var n=this;this.eventEmitter.dispatchEvent(new CustomEvent("start",{detail:e,cancelable:!0}))&&(this.active=!0,this.eventEmitter.dispatchEvent(new CustomEvent("redraw",{detail:{type:"start"},cancelable:!0}))&&this.drawEffect(),this._disposer=this.canvas.on("after:render",(function(t){t.ctx===n.canvas.getContext()&&(n.eventEmitter.dispatchEvent(new CustomEvent("redraw",{detail:{type:"render"},cancelable:!0}))&&n.drawEffect(),n._render())})),c(u(d.prototype),"onMouseDown",this).call(this,t,e))}},{key:"onMouseMove",value:function(t,e){this.active&&this.eventEmitter.dispatchEvent(new CustomEvent("move",{detail:e,cancelable:!0}))&&c(u(d.prototype),"onMouseMove",this).call(this,t,e)}},{key:"onMouseUp",value:function(t){var e;return this.active&&c(u(d.prototype),"onMouseUp",this).call(this,t),this.active=!1,null===(e=this._disposer)||void 0===e||e.call(this),delete this._disposer,!1}},{key:"convertPointsToSVGPath",value:function(t){return c(u(d.prototype),"convertPointsToSVGPath",this).call(this,this.decimate?this.decimatePoints(t,this.decimate):t)}},{key:"createPath",value:function(t){var e=c(u(d.prototype),"createPath",this).call(this,t);return e.set(this.inverted?{globalCompositeOperation:"source-over",stroke:"white"}:{globalCompositeOperation:"destination-out",stroke:"black",opacity:new v.Color(this.color).getAlpha()}),e}},{key:"commit",value:(g=t(r().mark((function e(n){var a,i;return r().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=n.path,i=n.targets,e.t0=Map,e.next=4,Promise.all([].concat(l(i.map(function(){var e=t(r().mark((function t(e){return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.t0=e,t.next=3,x(e,a);case 3:return t.t1=t.sent,t.abrupt("return",[t.t0,t.t1]);case 5:case"end":return t.stop()}}),t)})));return function(t){return e.apply(this,arguments)}}())),l([[this.canvas.backgroundImage,this.canvas.backgroundVpt?void 0:this.canvas.viewportTransform],[this.canvas.overlayImage,this.canvas.overlayVpt?void 0:this.canvas.viewportTransform]].filter((function(t){return h(t,1)[0]})).map(function(){var e=t(r().mark((function t(e){var n,i,s;return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n=h(e,2),i=n[0],s=n[1],t.t0=i,t.next=4,b(i,s,a);case 4:return t.t1=t.sent,t.abrupt("return",[t.t0,t.t1]);case 6:case"end":return t.stop()}}),t)})));return function(t){return e.apply(this,arguments)}}()))));case 4:e.t1=e.sent,new e.t0(e.t1);case 6:case"end":return e.stop()}}),e,this)}))),function(t){return g.apply(this,arguments)})},{key:"_finalizeAndAddPath",value:function(){var t=this._points;if(t.length<2)this.eventEmitter.dispatchEvent(new CustomEvent("cancel",{cancelable:!1}));else{var e=this.createPath(this.convertPointsToSVGPath(t)),n=y(this.canvas.getObjects(),e);this.eventEmitter.dispatchEvent(new CustomEvent("end",{detail:{path:e,targets:n},cancelable:!0}))&&this.commit({path:e,targets:n}),this.canvas.clearContext(this.canvas.contextTop),this.canvas.requestRenderAll(),this._resetShadow()}}},{key:"dispose",value:function(){var t=this.effectContext.canvas;t.width=t.height=0}}]),d}(v.PencilBrush);export{P as EraserBrush,w as commitErasing,b as eraseCanvasDrawable,x as eraseObject};
1
+ import { asyncToGenerator as _asyncToGenerator, inherits as _inherits, createClass as _createClass, regeneratorRuntime as _regeneratorRuntime, classCallCheck as _classCallCheck, callSuper as _callSuper, defineProperty as _defineProperty, assertThisInitialized as _assertThisInitialized, get as _get, getPrototypeOf as _getPrototypeOf, toConsumableArray as _toConsumableArray, slicedToArray as _slicedToArray } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { erase } from '../../core/dist/src/erase.js';
3
+ import * as fabric from 'fabric';
4
+ import { Group } from 'fabric';
5
+ import { ClippingGroup } from './ClippingGroup.js';
6
+ import { draw } from './ErasingEffect.js';
7
+
8
+ function walk(objects, path) {
9
+ return objects.flatMap(function (object) {
10
+ if (!object.erasable || !object.intersectsWithObject(path)) {
11
+ return [];
12
+ } else if (object instanceof Group && object.erasable === 'deep') {
13
+ return walk(object.getObjects(), path);
14
+ } else {
15
+ return [object];
16
+ }
17
+ });
18
+ }
19
+ var assertClippingGroup = function assertClippingGroup(object) {
20
+ var curr = object.clipPath;
21
+ if (curr instanceof ClippingGroup) {
22
+ return curr;
23
+ }
24
+
25
+ // In order to support objects with stroke width, stroke uniform, shadow etc.
26
+ // we use the actual drawn size
27
+ var _object$_limitCacheSi = object._limitCacheSize(object._getCacheCanvasDimensions()),
28
+ width = _object$_limitCacheSi.width,
29
+ height = _object$_limitCacheSi.height;
30
+ var next = new ClippingGroup([], {
31
+ width: width,
32
+ height: height
33
+ });
34
+ if (curr) {
35
+ var _curr$translateToOrig = curr.translateToOriginPoint(new fabric.Point(), curr.originX, curr.originY),
36
+ x = _curr$translateToOrig.x,
37
+ y = _curr$translateToOrig.y;
38
+ curr.originX = curr.originY = 'center';
39
+ fabric.util.sendObjectToPlane(curr, undefined, fabric.util.createTranslateMatrix(x, y));
40
+ next.add(curr);
41
+ }
42
+ return object.clipPath = next;
43
+ };
44
+ function commitErasing(object, sourceInObjectPlane) {
45
+ var clipPath = assertClippingGroup(object);
46
+ clipPath.add(sourceInObjectPlane);
47
+ clipPath.set('dirty', true);
48
+ object.set('dirty', true);
49
+ }
50
+ function eraseObject(_x, _x2) {
51
+ return _eraseObject.apply(this, arguments);
52
+ }
53
+ function _eraseObject() {
54
+ _eraseObject = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(object, source) {
55
+ var clone;
56
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
57
+ while (1) switch (_context4.prev = _context4.next) {
58
+ case 0:
59
+ _context4.next = 2;
60
+ return source.clone();
61
+ case 2:
62
+ clone = _context4.sent;
63
+ fabric.util.sendObjectToPlane(clone, undefined, object.calcTransformMatrix());
64
+ commitErasing(object, clone);
65
+ return _context4.abrupt("return", clone);
66
+ case 6:
67
+ case "end":
68
+ return _context4.stop();
69
+ }
70
+ }, _callee4);
71
+ }));
72
+ return _eraseObject.apply(this, arguments);
73
+ }
74
+ function eraseCanvasDrawable(_x3, _x4, _x5) {
75
+ return _eraseCanvasDrawable.apply(this, arguments);
76
+ }
77
+ function _eraseCanvasDrawable() {
78
+ _eraseCanvasDrawable = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(object, vpt, source) {
79
+ var clone, d;
80
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
81
+ while (1) switch (_context5.prev = _context5.next) {
82
+ case 0:
83
+ _context5.next = 2;
84
+ return source.clone();
85
+ case 2:
86
+ clone = _context5.sent;
87
+ d = vpt && object.translateToOriginPoint(new fabric.Point(), object.originX, object.originY);
88
+ fabric.util.sendObjectToPlane(clone, undefined, d ? fabric.util.multiplyTransformMatrixArray([[1, 0, 0, 1, d.x, d.y],
89
+ // apply vpt from center of drawable
90
+ vpt, [1, 0, 0, 1, -d.x, -d.y], object.calcTransformMatrix()]) : object.calcTransformMatrix());
91
+ commitErasing(object, clone);
92
+ return _context5.abrupt("return", clone);
93
+ case 7:
94
+ case "end":
95
+ return _context5.stop();
96
+ }
97
+ }, _callee5);
98
+ }));
99
+ return _eraseCanvasDrawable.apply(this, arguments);
100
+ }
101
+ var setCanvasDimensions = function setCanvasDimensions(el, ctx, _ref) {
102
+ var width = _ref.width,
103
+ height = _ref.height;
104
+ var retinaScaling = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
105
+ el.width = width;
106
+ el.height = height;
107
+ if (retinaScaling > 1) {
108
+ el.setAttribute('width', (width * retinaScaling).toString());
109
+ el.setAttribute('height', (height * retinaScaling).toString());
110
+ ctx.scale(retinaScaling, retinaScaling);
111
+ }
112
+ };
113
+
114
+ /**
115
+ * Supports **selective** erasing: only erasable objects are affected by the eraser brush.
116
+ *
117
+ * Supports **{@link inverted}** erasing: the brush can "undo" erasing.
118
+ *
119
+ * Supports **alpha** erasing: setting the alpha channel of the `color` property controls the eraser intensity.
120
+ *
121
+ * In order to support selective erasing, the brush clips the entire canvas and
122
+ * masks all non-erasable objects over the erased path, see {@link draw}.
123
+ *
124
+ * If **{@link inverted}** draws all objects, erasable objects without their eraser, over the erased path.
125
+ * This achieves the desired effect of seeming to erase or undo erasing on erasable objects only.
126
+ *
127
+ * After erasing is done the `end` event {@link ErasingEndEvent} is fired, after which erasing will be committed to the tree.
128
+ * @example
129
+ * canvas = new Canvas();
130
+ * const eraser = new EraserBrush(canvas);
131
+ * canvas.freeDrawingBrush = eraser;
132
+ * canvas.isDrawingMode = true;
133
+ * eraser.on('start', (e) => {
134
+ * console.log('started erasing');
135
+ * // prevent erasing
136
+ * e.preventDefault();
137
+ * });
138
+ * eraser.on('end', (e) => {
139
+ * const { targets: erasedTargets, path } = e.detail;
140
+ * e.preventDefault(); // prevent erasing being committed to the tree
141
+ * eraser.commit({ targets: erasedTargets, path }); // commit manually since default was prevented
142
+ * });
143
+ *
144
+ * In case of performance issues trace {@link drawEffect} calls and consider preventing it from executing
145
+ * @example
146
+ * const eraser = new EraserBrush(canvas);
147
+ * eraser.on('redraw', (e) => {
148
+ * // prevent effect redraw on pointer down (e.g. useful if canvas didn't change)
149
+ * e.detail.type === 'start' && e.preventDefault());
150
+ * // prevent effect redraw after canvas has rendered (effect will become stale)
151
+ * e.detail.type === 'render' && e.preventDefault());
152
+ * });
153
+ */
154
+ var EraserBrush = /*#__PURE__*/function (_fabric$PencilBrush) {
155
+ _inherits(EraserBrush, _fabric$PencilBrush);
156
+ function EraserBrush(canvas) {
157
+ var _this;
158
+ _classCallCheck(this, EraserBrush);
159
+ _this = _callSuper(this, EraserBrush, [canvas]);
160
+ /**
161
+ * When set to `true` the brush will create a visual effect of undoing erasing
162
+ */
163
+ _defineProperty(_assertThisInitialized(_this), "inverted", false);
164
+ _defineProperty(_assertThisInitialized(_this), "active", false);
165
+ var el = document.createElement('canvas');
166
+ var ctx = el.getContext('2d');
167
+ if (!ctx) {
168
+ throw new Error('Failed to get context');
169
+ }
170
+ setCanvasDimensions(el, ctx, canvas, _this.canvas.getRetinaScaling());
171
+ _this.effectContext = ctx;
172
+ _this.eventEmitter = new EventTarget();
173
+ return _this;
174
+ }
175
+
176
+ /**
177
+ * @returns disposer make sure to call it to avoid memory leaks
178
+ */
179
+ _createClass(EraserBrush, [{
180
+ key: "on",
181
+ value: function on(type, cb, options) {
182
+ var _this2 = this;
183
+ this.eventEmitter.addEventListener(type, cb, options);
184
+ return function () {
185
+ return _this2.eventEmitter.removeEventListener(type, cb, options);
186
+ };
187
+ }
188
+ }, {
189
+ key: "drawEffect",
190
+ value: function drawEffect() {
191
+ draw(this.effectContext, {
192
+ opacity: new fabric.Color(this.color).getAlpha(),
193
+ inverted: this.inverted
194
+ }, {
195
+ canvas: this.canvas
196
+ });
197
+ }
198
+
199
+ /**
200
+ * @override
201
+ */
202
+ }, {
203
+ key: "_setBrushStyles",
204
+ value: function _setBrushStyles() {
205
+ var ctx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.canvas.contextTop;
206
+ _get(_getPrototypeOf(EraserBrush.prototype), "_setBrushStyles", this).call(this, ctx);
207
+ ctx.strokeStyle = 'black';
208
+ }
209
+
210
+ /**
211
+ * @override strictly speaking the eraser needs a full render only if it has opacity set.
212
+ * However since {@link PencilBrush} is designed for subclassing that is what we have to work with.
213
+ */
214
+ }, {
215
+ key: "needsFullRender",
216
+ value: function needsFullRender() {
217
+ return true;
218
+ }
219
+
220
+ /**
221
+ * @override erase
222
+ */
223
+ }, {
224
+ key: "_render",
225
+ value: function _render() {
226
+ var ctx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.canvas.getTopContext();
227
+ _get(_getPrototypeOf(EraserBrush.prototype), "_render", this).call(this, ctx);
228
+ erase(this.canvas.getContext(), ctx, this.effectContext);
229
+ }
230
+
231
+ /**
232
+ * @override {@link drawEffect}
233
+ */
234
+ }, {
235
+ key: "onMouseDown",
236
+ value: function onMouseDown(pointer, context) {
237
+ var _this3 = this;
238
+ if (!this.eventEmitter.dispatchEvent(new CustomEvent('start', {
239
+ detail: context,
240
+ cancelable: true
241
+ }))) {
242
+ return;
243
+ }
244
+ this.active = true;
245
+ this.eventEmitter.dispatchEvent(new CustomEvent('redraw', {
246
+ detail: {
247
+ type: 'start'
248
+ },
249
+ cancelable: true
250
+ })) && this.drawEffect();
251
+
252
+ // consider a different approach
253
+ this._disposer = this.canvas.on('after:render', function (_ref2) {
254
+ var ctx = _ref2.ctx;
255
+ if (ctx !== _this3.canvas.getContext()) {
256
+ return;
257
+ }
258
+ _this3.eventEmitter.dispatchEvent(new CustomEvent('redraw', {
259
+ detail: {
260
+ type: 'render'
261
+ },
262
+ cancelable: true
263
+ })) && _this3.drawEffect();
264
+ _this3._render();
265
+ });
266
+ _get(_getPrototypeOf(EraserBrush.prototype), "onMouseDown", this).call(this, pointer, context);
267
+ }
268
+
269
+ /**
270
+ * @override run if active
271
+ */
272
+ }, {
273
+ key: "onMouseMove",
274
+ value: function onMouseMove(pointer, context) {
275
+ this.active && this.eventEmitter.dispatchEvent(new CustomEvent('move', {
276
+ detail: context,
277
+ cancelable: true
278
+ })) && _get(_getPrototypeOf(EraserBrush.prototype), "onMouseMove", this).call(this, pointer, context);
279
+ }
280
+
281
+ /**
282
+ * @override run if active, dispose of {@link drawEffect} listener
283
+ */
284
+ }, {
285
+ key: "onMouseUp",
286
+ value: function onMouseUp(context) {
287
+ var _this$_disposer;
288
+ this.active && _get(_getPrototypeOf(EraserBrush.prototype), "onMouseUp", this).call(this, context);
289
+ this.active = false;
290
+ (_this$_disposer = this._disposer) === null || _this$_disposer === void 0 || _this$_disposer.call(this);
291
+ delete this._disposer;
292
+ return false;
293
+ }
294
+
295
+ /**
296
+ * @override {@link fabric.PencilBrush} logic
297
+ */
298
+ }, {
299
+ key: "convertPointsToSVGPath",
300
+ value: function convertPointsToSVGPath(points) {
301
+ return _get(_getPrototypeOf(EraserBrush.prototype), "convertPointsToSVGPath", this).call(this, this.decimate ? this.decimatePoints(points, this.decimate) : points);
302
+ }
303
+
304
+ /**
305
+ * @override
306
+ */
307
+ }, {
308
+ key: "createPath",
309
+ value: function createPath(pathData) {
310
+ var path = _get(_getPrototypeOf(EraserBrush.prototype), "createPath", this).call(this, pathData);
311
+ path.set(this.inverted ? {
312
+ globalCompositeOperation: 'source-over',
313
+ stroke: 'white'
314
+ } : {
315
+ globalCompositeOperation: 'destination-out',
316
+ stroke: 'black',
317
+ opacity: new fabric.Color(this.color).getAlpha()
318
+ });
319
+ return path;
320
+ }
321
+ }, {
322
+ key: "commit",
323
+ value: function () {
324
+ var _commit = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref3) {
325
+ var path, targets;
326
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
327
+ while (1) switch (_context3.prev = _context3.next) {
328
+ case 0:
329
+ path = _ref3.path, targets = _ref3.targets;
330
+ _context3.t0 = Map;
331
+ _context3.next = 4;
332
+ return Promise.all([].concat(_toConsumableArray(targets.map( /*#__PURE__*/function () {
333
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(object) {
334
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
335
+ while (1) switch (_context.prev = _context.next) {
336
+ case 0:
337
+ _context.t0 = object;
338
+ _context.next = 3;
339
+ return eraseObject(object, path);
340
+ case 3:
341
+ _context.t1 = _context.sent;
342
+ return _context.abrupt("return", [_context.t0, _context.t1]);
343
+ case 5:
344
+ case "end":
345
+ return _context.stop();
346
+ }
347
+ }, _callee);
348
+ }));
349
+ return function (_x7) {
350
+ return _ref4.apply(this, arguments);
351
+ };
352
+ }())), _toConsumableArray([[this.canvas.backgroundImage, !this.canvas.backgroundVpt ? this.canvas.viewportTransform : undefined], [this.canvas.overlayImage, !this.canvas.overlayVpt ? this.canvas.viewportTransform : undefined]].filter(function (_ref5) {
353
+ var _ref6 = _slicedToArray(_ref5, 1),
354
+ object = _ref6[0];
355
+ return object;
356
+ }).map( /*#__PURE__*/function () {
357
+ var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref7) {
358
+ var _ref9, object, vptFlag;
359
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
360
+ while (1) switch (_context2.prev = _context2.next) {
361
+ case 0:
362
+ _ref9 = _slicedToArray(_ref7, 2), object = _ref9[0], vptFlag = _ref9[1];
363
+ _context2.t0 = object;
364
+ _context2.next = 4;
365
+ return eraseCanvasDrawable(object, vptFlag, path);
366
+ case 4:
367
+ _context2.t1 = _context2.sent;
368
+ return _context2.abrupt("return", [_context2.t0, _context2.t1]);
369
+ case 6:
370
+ case "end":
371
+ return _context2.stop();
372
+ }
373
+ }, _callee2);
374
+ }));
375
+ return function (_x8) {
376
+ return _ref8.apply(this, arguments);
377
+ };
378
+ }()))));
379
+ case 4:
380
+ _context3.t1 = _context3.sent;
381
+ new _context3.t0(_context3.t1);
382
+ case 6:
383
+ case "end":
384
+ return _context3.stop();
385
+ }
386
+ }, _callee3, this);
387
+ }));
388
+ function commit(_x6) {
389
+ return _commit.apply(this, arguments);
390
+ }
391
+ return commit;
392
+ }()
393
+ /**
394
+ * @override handle events
395
+ */
396
+ }, {
397
+ key: "_finalizeAndAddPath",
398
+ value: function _finalizeAndAddPath() {
399
+ var points = this['_points'];
400
+ if (points.length < 2) {
401
+ this.eventEmitter.dispatchEvent(new CustomEvent('cancel', {
402
+ cancelable: false
403
+ }));
404
+ return;
405
+ }
406
+ var path = this.createPath(this.convertPointsToSVGPath(points));
407
+ var targets = walk(this.canvas.getObjects(), path);
408
+ this.eventEmitter.dispatchEvent(new CustomEvent('end', {
409
+ detail: {
410
+ path: path,
411
+ targets: targets
412
+ },
413
+ cancelable: true
414
+ })) && this.commit({
415
+ path: path,
416
+ targets: targets
417
+ });
418
+ this.canvas.clearContext(this.canvas.contextTop);
419
+ this.canvas.requestRenderAll();
420
+ this._resetShadow();
421
+ }
422
+ }, {
423
+ key: "dispose",
424
+ value: function dispose() {
425
+ var canvas = this.effectContext.canvas;
426
+ // prompt GC
427
+ canvas.width = canvas.height = 0;
428
+ // release ref?
429
+ // delete this.effectContext
430
+ }
431
+ }]);
432
+ return EraserBrush;
433
+ }(fabric.PencilBrush);
434
+
435
+ export { EraserBrush, commitErasing, eraseCanvasDrawable, eraseObject };
2
436
  //# sourceMappingURL=EraserBrush.js.map