fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
3 lines (2 loc) • 3.43 kB
JavaScript
import{defineProperty as e}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as t}from"../config.min.mjs";import{createCanvasElement as i}from"../util/misc/dom.min.mjs";class r{constructor(){let{tileSize:i=t.textureSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),e(this,"resources",{}),this.tileSize=i,this.setupGLContext(i,i),this.captureGPUInfo()}setupGLContext(e,t){this.dispose(),this.createWebGLCanvas(e,t)}createWebGLCanvas(e,t){const r=i();r.width=e,r.height=t;const a=r.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});a&&(a.clearColor(0,0,0,0),this.canvas=r,this.gl=a)}applyFilters(e,t,i,r,a,s){const n=this.gl,h=a.getContext("2d");if(!n||!h)return;let o;s&&(o=this.getCachedTexture(s,t));const c={originalWidth:t.width||t.originalWidth||0,originalHeight:t.height||t.originalHeight||0,sourceWidth:i,sourceHeight:r,destinationWidth:i,destinationHeight:r,context:n,sourceTexture:this.createTexture(n,i,r,o?void 0:t),targetTexture:this.createTexture(n,i,r),originalTexture:o||this.createTexture(n,i,r,o?void 0:t),passes:e.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:a},u=n.createFramebuffer();return n.bindFramebuffer(n.FRAMEBUFFER,u),e.forEach((e=>{e&&e.applyTo(c)})),function(e){const t=e.targetCanvas,i=t.width,r=t.height,a=e.destinationWidth,s=e.destinationHeight;i===a&&r===s||(t.width=a,t.height=s)}(c),this.copyGLTo2D(n,c),n.bindTexture(n.TEXTURE_2D,null),n.deleteTexture(c.sourceTexture),n.deleteTexture(c.targetTexture),n.deleteFramebuffer(u),h.setTransform(1,0,0,1,0,0),c}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(e,t,i,r,a){const{NEAREST:s,TEXTURE_2D:n,RGBA:h,UNSIGNED_BYTE:o,CLAMP_TO_EDGE:c,TEXTURE_MAG_FILTER:u,TEXTURE_MIN_FILTER:g,TEXTURE_WRAP_S:l,TEXTURE_WRAP_T:d}=e,T=e.createTexture();return e.bindTexture(n,T),e.texParameteri(n,u,a||s),e.texParameteri(n,g,a||s),e.texParameteri(n,l,c),e.texParameteri(n,d,c),r?e.texImage2D(n,0,h,h,o,r):e.texImage2D(n,0,h,t,i,0,h,o,null),T}getCachedTexture(e,t,i){const{textureCache:r}=this;if(r[e])return r[e];{const a=this.createTexture(this.gl,t.width,t.height,t,i);return a&&(r[e]=a),a}}evictCachesForKey(e){this.textureCache[e]&&(this.gl.deleteTexture(this.textureCache[e]),delete this.textureCache[e])}copyGLTo2D(e,t){const i=e.canvas,r=t.targetCanvas,a=r.getContext("2d");if(!a)return;a.translate(0,r.height),a.scale(1,-1);const s=i.height-r.height;a.drawImage(i,0,s,r.width,r.height,0,0,r.width,r.height)}copyGLTo2DPutImageData(e,t){const i=t.targetCanvas.getContext("2d"),r=t.destinationWidth,a=t.destinationHeight,s=r*a*4;if(!i)return;const n=new Uint8Array(this.imageBuffer,0,s),h=new Uint8ClampedArray(this.imageBuffer,0,s);e.readPixels(0,0,r,a,e.RGBA,e.UNSIGNED_BYTE,n);const o=new ImageData(h,r,a);i.putImageData(o,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;const e=this.gl,t={renderer:"",vendor:""};if(!e)return t;const i=e.getExtension("WEBGL_debug_renderer_info");if(i){const r=e.getParameter(i.UNMASKED_RENDERER_WEBGL),a=e.getParameter(i.UNMASKED_VENDOR_WEBGL);r&&(t.renderer=r.toLowerCase()),a&&(t.vendor=a.toLowerCase())}return this.gpuInfo=t,t}}export{r as WebGLFilterBackend};
//# sourceMappingURL=WebGLFilterBackend.min.mjs.map