UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 2.78 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/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 p}from"../../../../../../webgl/Texture.js";import{TextureDescriptor as c}from"../../../../../../webgl/TextureDescriptor.js";class l 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:p}=t.state,c=s.size*a,l=1/n,m=Math.ceil(l*c);this._readbackTexture.resize(m,m);const x=a*p[0],d=a*p[1],_=.5*m,T=.5*m,f=e(a*h.x,_,x-_-1),g=e(d-a*h.y,T,d-T-1),R=f-_,w=g-T,b=this._readbackTexture;o.bindTexture(b,0),o.gl.copyTexImage2D(b.descriptor.target,0,b.descriptor.pixelFormat,R,w,m,m,0);const y=(f+u.x*a)/x*2-1,M=(g-u.y*a)/d*2-1,k=c/x*2,j=c/d*2;this._position[0]=y,this._position[1]=M,this._position[2]=k,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 l=new c;l.internalFormat=n.RGBA,l.wrapMode=u.CLAMP_TO_EDGE,l.samplingMode=h.NEAREST,l.flipped=!0,l.preMultiplyAlpha=!i(r.src)||!e.context.driverTest.svgPremultipliesAlpha.result,this._overlayTexture=new p(o,l,r),t.width=a,t.height=a,l.pixelFormat=l.internalFormat=n.ALPHA,this._maskTexture=new p(o,l,t);const m=1/s.factor;l.pixelFormat=l.internalFormat=n.RGBA,l.width=l.height=Math.ceil(m*a),l.samplingMode=h.LINEAR,l.flipped=!1,this._readbackTexture=new p(o,l)}_destroyResources(){t(this._maskTexture),t(this._overlayTexture),t(this._readbackTexture)}}export{l as MagnifierTechnique};