@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 3.63 kB
JavaScript
import o from"../../../../../../core/Logger.js";import{TEXTURE_BINDING_HIGHLIGHT_1 as i}from"../../definitions.js";import{HIGHLIGHT_SIZING as t,SHADE_TEXTURE_SIZE as e,SIGMA as l}from"./parameters.js";import{TextureType as r,PixelFormat as n,PixelType as h,TextureWrapMode as a,TextureSamplingMode as s}from"../../../../../webgl/enums.js";import{Texture as d}from"../../../../../webgl/Texture.js";const u=o.getLogger("esri.views.2d.engine.webgl.painter.highlight.HighlightGradient");function C(o,i){i.fillColor[0]=o.color.r/255,i.fillColor[1]=o.color.g/255,i.fillColor[2]=o.color.b/255,i.fillColor[3]=o.color.a,o.haloColor?(i.outlineColor[0]=o.haloColor.r/255,i.outlineColor[1]=o.haloColor.g/255,i.outlineColor[2]=o.haloColor.b/255,i.outlineColor[3]=o.haloColor.a):(i.outlineColor[0]=i.fillColor[0],i.outlineColor[1]=i.fillColor[1],i.outlineColor[2]=i.fillColor[2],i.outlineColor[3]=i.fillColor[3]),i.fillColor[3]*=o.fillOpacity,i.outlineColor[3]*=o.haloOpacity,i.fillColor[0]*=i.fillColor[3],i.fillColor[1]*=i.fillColor[3],i.fillColor[2]*=i.fillColor[3],i.outlineColor[0]*=i.outlineColor[3],i.outlineColor[1]*=i.outlineColor[3],i.outlineColor[2]*=i.outlineColor[3],i.outlineWidth=t.outlineWidth,i.outerHaloWidth=t.outerHaloWidth,i.innerHaloWidth=t.innerHaloWidth,i.outlinePosition=t.outlinePosition}const g=[0,0,0,0];class f{constructor(){this._convertedHighlightOptions={fillColor:[.2*.75,.6*.75,.675,.75],outlineColor:[.2*.9,.54,.81,.9],outlinePosition:t.outlinePosition,outlineWidth:t.outlineWidth,innerHaloWidth:t.innerHaloWidth,outerHaloWidth:t.outerHaloWidth},this._shadeTexChanged=!0,this._texelData=new Uint8Array(4*e),this._minMaxDistance=[0,0]}setHighlightOptions(o){const i=this._convertedHighlightOptions;C(o,i);const t=i.outlinePosition-i.outlineWidth/2-i.outerHaloWidth,r=i.outlinePosition-i.outlineWidth/2,n=i.outlinePosition+i.outlineWidth/2,h=i.outlinePosition+i.outlineWidth/2+i.innerHaloWidth,a=Math.sqrt(Math.PI/2)*l,s=Math.abs(t)>a?Math.round(10*(Math.abs(t)-a))/10:0,d=Math.abs(h)>a?Math.round(10*(Math.abs(h)-a))/10:0;let f;s&&!d?u.error("The outer rim of the highlight is "+s+"px away from the edge of the feature; consider reducing some width values or shifting the outline position towards positive values (inwards)."):!s&&d?u.error("The inner rim of the highlight is "+d+"px away from the edge of the feature; consider reducing some width values or shifting the outline position towards negative values (outwards)."):s&&d&&u.error("The highlight is "+Math.max(s,d)+"px away from the edge of the feature; consider reducing some width values.");const c=[void 0,void 0,void 0,void 0];function m(o,i,t){c[0]=(1-t)*o[0]+t*i[0],c[1]=(1-t)*o[1]+t*i[1],c[2]=(1-t)*o[2]+t*i[2],c[3]=(1-t)*o[3]+t*i[3]}const{_texelData:p}=this;for(let l=0;l<e;++l)f=t+l/(e-1)*(h-t),f<t?(c[4*l+0]=0,c[4*l+1]=0,c[4*l+2]=0,c[4*l+3]=0):f<r?m(g,i.outlineColor,(f-t)/(r-t)):f<n?[c[0],c[1],c[2],c[3]]=i.outlineColor:f<h?m(i.outlineColor,i.fillColor,(f-n)/(h-n)):[c[4*l+0],c[4*l+1],c[4*l+2],c[4*l+3]]=i.fillColor,p[4*l+0]=255*c[0],p[4*l+1]=255*c[1],p[4*l+2]=255*c[2],p[4*l+3]=255*c[3];this._minMaxDistance[0]=t,this._minMaxDistance[1]=h,this._shadeTexChanged=!0}applyHighlightOptions(o,t){this._shadeTex||(this._shadeTex=new d(o,{target:r.TEXTURE_2D,pixelFormat:n.RGBA,dataType:h.UNSIGNED_BYTE,wrapMode:a.CLAMP_TO_EDGE,width:e,height:1,samplingMode:s.LINEAR})),this._shadeTexChanged&&(this._shadeTex.updateData(0,0,0,e,1,this._texelData),this._shadeTexChanged=!1),o.bindTexture(this._shadeTex,i),t.setUniform2fv("u_minMaxDistance",this._minMaxDistance)}destroy(){this._shadeTex?.dispose(),this._shadeTex=null}}export{f as default};