/*
All material copyright Esri, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/5.0/esri/copyright.txt for details.
*/
import{simplePipelineState as e}from"../../utils.js";import{Technique as t}from"../Technique.js";import{BlendShader as r}from"../shaders/BlendShader.js";import{OpacityShader as s}from"../shaders/OpacityShader.js";import u from"../../../../../../webgl/Texture.js";import{TextureDescriptor as i}from"../../../../../../webgl/TextureDescriptor.js";class o extends t{constructor(){super(...arguments),this.type=5,this._backBufferTexture=null,this.shaders={blend:new r,opacity:new s}}shutdown(){super.shutdown(),null!==this._backBufferTexture&&(this._backBufferTexture.dispose(),this._backBufferTexture=null)}render(t,r){const{context:s,state:u,pixelRatio:i,inFadeTransition:o,painter:n}=t,{size:a}=u,c=s.getBoundFramebufferObject();let f,l;null!=c?(f=c.width,l=c.height):(f=Math.round(i*a[0]),l=Math.round(i*a[1]));const{blendMode:h}=r;if("normal"===h){const t={shader:this.shaders.opacity,uniforms:{config:{layerTexture:{texture:r.colorTexture,unit:0},opacity:r.config.opacity}},defines:null,optionalAttributes:null,useComputeBuffer:!1};return n.setPipelineState(e),void n.submitDrawMesh(s,t,n.quadMesh)}const d=this._createOrResizeTexture(t,f,l);c.copyToTexture(0,0,f,l,0,0,d);const p={color:{write:[!0,!0,!0,!0],blendMode:"custom",blendParameters:{srcRGB:1,dstRGB:0,srcAlpha:1,dstAlpha:0}},depth:!1,stencil:!1};n.setPipelineState(p);const x={backbufferTexture:{texture:d,unit:0},layerTexture:{texture:r.colorTexture,unit:1},inFadeOpacity:o?1:0,...r.config},b={shader:this.shaders.blend,uniforms:{config:x},defines:{blendMode:h},optionalAttributes:null,useComputeBuffer:!1};n.submitDrawMesh(s,b,n.quadMesh)}_createOrResizeTexture(e,t,r){const{context:s}=e;if(null!==this._backBufferTexture&&this._backBufferTexture.descriptor?.width===t&&this._backBufferTexture.descriptor?.height===r)return this._backBufferTexture;if(null===this._backBufferTexture){const e=new i(t,r);e.internalFormat=6408,e.wrapMode=33071,this._backBufferTexture=new u(s,e)}else this._backBufferTexture.resize(t,r);return this._backBufferTexture}}export{o as BlendTechnique};
