thematic-earth
Version:
HTML-based, whole-Earth thematic maps using locally hosted data layers
2 lines • 2.23 kB
JavaScript
/* Copyright (c) 2023 Read Write Tools. Legal use subject to the Thematic Earth Software License Agreement. */
import BoundingBox from'../graphics/bounding-box.class.js';import expect from'../dev/expect.js';export function draw(e,t,a,n,o,r,l){if(expect(e,'HTMLCanvasElement'),expect(t,'CanvasParams'),expect(a,'Number'),expect(n,'Number'),expect(o,'String'),expect(r,'String'),expect(l,'String'),t.isVisible()&&''!=o){var s=t.scaleLabelsCoefficient(),i=prepareContext(e,t,o,s);expect(i,'CanvasRenderingContext2D');var f=t.safeColorOrNone('label-shadow-color');if('none'!=f){i.shadowColor=f,i.shadowOffsetX=t.safeNumber('label-shadow-offset-x')*s,i.shadowOffsetY=t.safeNumber('label-shadow-offset-y')*s;var x=t.safeNumberOrNone('label-shadow-blur');i.shadowBlur='none'!=x&&x>0?x*s:0}else i.shadowColor='#00000000';i.textAlign=r,i.textBaseline=l;var c=t.safeColorOrNone('label-fill-color');'none'!=c&&(i.fillStyle=c,i.fillText(o,a,n));var p=t.safeColorOrNone('label-stroke-color'),u=t.safeNumberOrNone('label-stroke-width');'none'!=p&&'none'!=u&&0!=u&&(i.strokeStyle=p,i.lineWidth=u*s,i.strokeText(o,a,n)),i.shadowColor='#00000000'}}export function computeTextMetrics(e,t,a){if(expect(e,'HTMLCanvasElement'),expect(t,'CanvasParams'),expect(a,'String'),''==a)return new BoundingBox;var n=t.scaleLabelsCoefficient(),o=prepareContext(e,t,a,n);expect(o,'CanvasRenderingContext2D'),o.textAlign='left',o.textBaseline='top';var r=o.measureText(a),l=r.actualBoundingBoxLeft,s=r.actualBoundingBoxRight,i=r.actualBoundingBoxAscent,f=-1*r.actualBoundingBoxDescent;return new BoundingBox(l,s,i,f)}function prepareContext(e,t,a,n){expect(e,'HTMLCanvasElement'),expect(t,'CanvasParams'),expect(a,'String');var o=t.safeNumber('label-letter-spacing');e.style.letterSpacing=`${o}px`;var r=t.safeNumber('label-word-spacing');e.style.wordSpacing=`${r}px`;var l=e.getContext('2d'),s=[];s.push(t.safeString('label-font-style')),s.push(t.safeString('label-font-weight'));var i=t.safeNumber('label-font-size')*n;s.push(`${i}px`);var f=t.safeString('label-font-family');-1==f.indexOf(' ')?s.push(f):s.push(`"${f}"`);var x=s.join(' ');return l.font=x,l.fontStretch=t.safeString('label-font-stretch'),l.fontVariantCaps=t.safeString('label-font-variant'),l}