UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 2.85 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import{clamp as e}from"../../../../../../../core/mathUtils.js";import{disposeMaybe as t}from"../../../../../../../core/maybe.js";import{isSVG as i}from"../../../../../../../core/urlUtils.js";import{simplePipelineState as r}from"../../utils.js";import{Technique as s}from"../Technique.js";import{TechniqueType as o}from"../TechniqueType.js";import{MagnifierShader as a}from"../shaders/MagnifierShader.js";import{PixelFormat as n,TextureWrapMode as u,TextureSamplingMode as h}from"../../../../../../webgl/enums.js";import{Texture as l}from"../../../../../../webgl/Texture.js";import{TextureDescriptor as c}from"../../../../../../webgl/TextureDescriptor.js";class p extends s{constructor(){super(...arguments),this.type=o.Magnifier,this._resourcePixelRatio=1,this._position=[0,0,0,0],this.shaders={magnifier:new a}}updateResources(t,i,r,s){t.pixelRatio!==this._resourcePixelRatio&&this._destroyResources(),this._readbackTexture||this._initializeResources(t,i,r,s);const{context:o,pixelRatio:a}=t,{factor:n,offset:u,position:h}=s,{size:l}=t.state,c=s.size*a,p=1/n,x=Math.ceil(p*c);this._readbackTexture.resize(x,x);const m=a*l[0],d=a*l[1],_=.5*x,T=.5*x,f=e(a*h.x,_,m-_-1),g=e(d-a*h.y,T,d-T-1),R=f-_,b=g-T,w=this._readbackTexture;o.bindTexture(w,0),o.gl.copyTexImage2D(w.descriptor.target,0,w.descriptor.pixelFormat,R,b,x,x,0);const y=(f+u.x*a)/m*2-1,k=(g-u.y*a)/d*2-1,M=c/m*2,j=c/d*2;this._position[0]=y,this._position[1]=k,this._position[2]=M,this._position[3]=j}render(e,t){const{context:i,painter:s}=e;s.setPipelineState(r);const o={readbackTexture:{texture:this._readbackTexture,unit:0},maskTexture:{texture:this._maskTexture,unit:7},overlayTexture:{texture:this._overlayTexture,unit:6},drawPos:this._position,...t};s.submitDrawMesh(i,{shader:this.shaders.magnifier,uniforms:{config:o},defines:null,optionalAttributes:null,useComputeBuffer:!1},s.quadMesh)}shutdown(){this._destroyResources()}_initializeResources(e,t,r,s){const o=e.context;this._resourcePixelRatio=e.pixelRatio;const a=Math.ceil(s.size*e.pixelRatio);r.width=a,r.height=a;const p=new c;p.internalFormat=n.RGBA,p.wrapMode=u.CLAMP_TO_EDGE,p.samplingMode=h.NEAREST,p.flipped=!0,p.preMultiplyAlpha=!i(r.src)||!e.context.driverTest.svgPremultipliesAlpha.result,this._overlayTexture=new l(o,p,r),t.width=a,t.height=a,p.pixelFormat=p.internalFormat=n.ALPHA,this._maskTexture=new l(o,p,t);const x=1/s.factor;p.pixelFormat=p.internalFormat=n.RGBA,p.width=p.height=Math.ceil(x*a),p.samplingMode=h.LINEAR,p.flipped=!1,this._readbackTexture=new l(o,p)}_destroyResources(){t(this._maskTexture),t(this._overlayTexture),t(this._readbackTexture),this._maskTexture=null,this._overlayTexture=null,this._readbackTexture=null}}export{p as MagnifierTechnique};