vxe-pc-ui
Version:
A vue based PC component library
1 lines • 2.81 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0}),exports.getContentUrl=getContentUrl;var _xeUtils=_interopRequireDefault(require("xe-utils")),_dom=require("../../ui/src/dom");function _interopRequireDefault(t){return t&&t.__esModule?t:{default:t}}let canvasEl=null,fontEl=null;const fontCacheMaps={};function getMarkCanvas(){return canvasEl||((canvasEl=document.createElement("canvas")).style.position="absolute",canvasEl.style.top="0",canvasEl.style.left="0"),canvasEl}function removeMarkElement(t){var e;t&&(e=t.parentNode)&&e.removeChild(t)}function calcFontWH(t,e){var n=e+"_"+t;return fontCacheMaps[n]||((fontEl=fontEl||document.createElement("span")).parentNode||document.body.append(fontEl),fontEl.textContent=t,fontEl.style.fontSize=(0,_dom.toCssUnit)(e),t=fontEl.offsetWidth,e=fontEl.offsetHeight,fontCacheMaps[n]={width:t,height:e}),fontCacheMaps[n]}function calcContentWH(t){let e=0,n=0;return t.forEach(t=>{e=Math.max(t.width,e),n=Math.max(t.height,n)}),{contentWidth:e,contentHeight:n}}function calcCanvasWH(t,e){var e=e["gap"],[e=0,n=0]=e?_xeUtils.default.isArray(e)?e:[e,e]:[];return{canvasWidth:t+_xeUtils.default.toNumber(e),canvasHeight:t+_xeUtils.default.toNumber(n)}}function getFontConf(t,e,n){return(t.font?t.font[e]:"")||(n.font?n.font[e]:"")}function createMarkFont(t,e,n){var o=n["offset"],a=_xeUtils.default.toValueString(t.textContent),n=_xeUtils.default.toNumber(getFontConf(t,"fontSize",n)||e)||14,[e=0,o=0]=o?_xeUtils.default.isArray(o)?o:[o,o]:[],{width:r,height:l}=calcFontWH(a,n);return{text:a,fontSize:n,font:t.font,width:r+_xeUtils.default.toNumber(e),height:l+_xeUtils.default.toNumber(o)}}function drayFont(t,e,n){var o=getFontConf(e,"fontWeight",n);t.fillStyle=""+(getFontConf(e,"color",n)||"rgba(0, 0, 0, 0.15)"),t.font=[getFontConf(e,"fontStyle",n)||"normal","bold"===o||"bolder"===o?"bold":"",(0,_dom.toCssUnit)(e.fontSize),getFontConf(e,"fontFamily",n)||"sans-serif"].join(" ")}function getContentUrl(t,e,n){const c=Object.assign({},n);n=c.rotate;const u=_xeUtils.default.toNumber(n),d=(_xeUtils.default.isArray(t)?t:[t]).map(t=>t?t.textContent?createMarkFont(t,e,c):createMarkFont({textContent:""+t},e,c):createMarkFont({textContent:""},e,c));return removeMarkElement(fontEl),new Promise(t=>{var e=getMarkCanvas();e.parentNode||document.body.append(e);const o=e.getContext("2d");if(o&&d.length){const{contentWidth:l,contentHeight:i}=calcContentWH(d);var{canvasWidth:a,canvasHeight:r}=calcCanvasWH(l,c);e.width=a,e.height=r;const s=(a-l)/2,f=(r-i)/2;a=s+l/2,r=f+i/2;o.save(),o.translate(a,r),o.rotate(u*Math.PI/180),o.translate(-a,-r);let n=0;d.forEach(t=>{var e=getFontConf(t,"align",c);drayFont(o,t,c),o.fillText(t.text,s+("center"===e?(l-t.width)/2:0),f+(i+i)/2+n,l),n+=t.height}),o.restore(),t(e.toDataURL())}else t("");removeMarkElement(e)})}