UNPKG

thematic-earth

Version:

HTML-based, whole-Earth thematic maps using locally hosted data layers

2 lines 2.73 kB
/* Copyright (c) 2023 Read Write Tools. Legal use subject to the Thematic Earth Software License Agreement. */ import*as Color from'../graphics/color.js';import expect from'../dev/expect.js';const degreesToRadians=Math.PI/180;export function draw(e,a,r,t){if(expect(e,'CanvasRenderingContext2D'),expect(a,['PatternCache','null']),expect(r,'CanvasParams'),expect(t,'Array'),!r.isVisible())return;if(0==r.displayStrokes())return;let n=r.wantsStroke(),s=r.wantsOverStroke(),o=r.wantsSymbolBrush(),i=r.wantsHatchBrush(),c=r.wantsCrosshatchBrush();if(1==(n||s||o||i||c)){var l=r.scaleStrokesCoefficient();if(definePath(e,t),n&&applyStroke(e,r,l,'stroke-width','stroke-color','stroke-type'),s&&applyStroke(e,r,l,'over-stroke-width','over-stroke-color','over-stroke-type'),o||i||c){let t=r.safeArray('stroke-brush');expect(t,'Array');var p=r.scaleSymbolsCoefficient();for(let n=0;n<t.length;n++)applyBrush(e,t[n],a,r,l,p)}}}export function definePath(e,a){var r=!1,t=!1;e.beginPath();for(var n=0;n<a.length;n++){var s=a[n];1==(t=s.isOnNearSide)&&0==r?e.moveTo(s.canvasX,s.canvasY):1==t&&1==r&&e.lineTo(s.canvasX,s.canvasY),r=s.isOnNearSide}}export function applyStroke(e,a,r,t,n,s){expect(e,'CanvasRenderingContext2D'),expect(a,'CanvasParams'),expect(r,'Number'),expect(t,'String'),expect(n,'String'),expect(s,'String');var o=a.safeNumberOrNone(t);if('none'!=o&&0!=o){var i=a.safeColorOrNone(n);if('none'!=i){var c=o*r;e.lineWidth=c;var l=a.getTransparency();e.strokeStyle=Color.computeColorPlusTransparency(i,l);var p=determineLineDashArray(a.safeString(s),c);e.setLineDash(p),e.lineCap='butt',e.lineJoin='round',e.stroke(),e.setLineDash([])}}}export function determineLineDashArray(e,a){expect(e,'String'),expect(a,'Number');var r=[];switch(e){case'solid':default:break;case'dots':r=magnify(a,[1,1]);break;case'short-dash':r=magnify(a,[2,1]);break;case'dash':r=magnify(a,[3,1]);break;case'long-dash':r=magnify(a,[4,1]);break;case'dot-dash':r=magnify(a,[3,1,1,1]);break;case'dot-dot-dash':r=magnify(a,[3,1,1,1,1,1]);break;case'dot-dot-dot-dash':r=magnify(a,[3,1,1,1,1,1,1,1]);break;case'dot-dash-dot':r=magnify(a,[1,1,2,1,1,2]);break;case'spaced-ticks':r=[1,15]}return r}function magnify(e,a){return a.map((a=>Math.round(a*e)))}export function applyBrush(e,a,r,t,n,s){if(expect(e,'CanvasRenderingContext2D'),expect(a,'String'),expect(r,['PatternCache','null']),expect(t,'CanvasParams'),expect(n,'Number'),null!=r&&'none'!=a&&('symbol'==a||'hatch'==a||'crosshatch'==a)){var o=Math.ceil(n);if(0!=o){var i=Math.ceil(s);if(0!=i){var c=t.makeBrushKey(a,o,i);if(r.has(c))e.strokeStyle=r.get(c);else{var l=r.buildDOMCanvasPattern(e,c,'brush',a,t,o,i);if(null==l)return;e.strokeStyle=l}e.lineWidth=t.safeNumber(`sb-${a}-thickness`)*n,e.stroke()}}}}