16 lines
5.8 KiB
JavaScript
16 lines
5.8 KiB
JavaScript
/*! *****************************************************************************
|
||
Copyright (c) Microsoft Corporation.
|
||
|
||
Permission to use, copy, modify, and/or distribute this software for any
|
||
purpose with or without fee is hereby granted.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||
PERFORMANCE OF THIS SOFTWARE.
|
||
***************************************************************************** */
|
||
var t,e=function(){return(e=Object.assign||function(t){for(var e,n=1,i=arguments.length;n<i;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}).apply(this,arguments)};!function(t){t.center="center",t.start="start",t.end="end",t.left="left",t.right="right",t.justify="justify"}(t||(t={}));var n={color:"#000000",fontFamily:"serif",fontWeight:"normal",fontSize:16,rtl:!1,margin:0,marginCollapse:!0,noHeadMargin:!1,textIndent:0,textAlign:"justify",textAlignLast:"start"},i=e(e({},n),{viewWidth:300,viewHeight:150,lineStartProhibitedMarks:"、,,..。::;;!!??'\"」』”’)]})】〗〕]}》〉–~~—·.‧•・//",lineEndProhibitedMarks:"「『“‘([{(【〖〔[〔《〈//",unbreakableRule:/──|……|[\w\d]+/,fragments:null});function r(r){var a=devicePixelRatio||1,l=e(e({},n),r||Object());if(l.textIndent=(0|l.textIndent)*a,l.fontSize>0?l.fontSize*=a:l.fontSize=i.fontSize*a,l.lineHeight>0?l.lineHeight*=a:l.lineHeight=1.5*l.fontSize,l.textAlign in t||(l.textAlign=t.start),"object"==typeof l.margin&&null!==l)for(var o=0,s=["left","right","top","bottom"];o<s.length;o++){var f=s[o];l.margin[f]=(0|l.margin[f])*a}else{var g=l.margin*a;l.margin={left:g,right:g,top:g,bottom:g}}return l}function a(t,n){t.margin;var i=function(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(t);r<i.length;r++)e.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(t,i[r])&&(n[i[r]]=t[i[r]])}return n}(t,["margin"]),a=e(e({},i),n);return a.text=a.text||"",a.text=a.text.replace("\r\n","\n").replace("\r","\n"),(a=r(a)).trim&&(a.text=a.text.trim()),a}var l=document.createElement("canvas").getContext("2d");function o(t){var n,o,s,f,g=function(t){var n=devicePixelRatio,a=e(e({},i),r(t));return a.canvasWidth=t.canvasWidth||a.viewWidth*n,a.canvasHeight=t.canvasHeight||a.viewHeight*n,a}(t||{}),h=[],c=g.margin,u=g.canvasWidth-1-c.right,v=g.canvasHeight-1-c.bottom,x={x:0,y:0},d=0,m=0,p=0,y=!1;function b(){if(!o)return"";var t=o.codePointAt(d);if(void 0===t)return"";var e=String.fromCodePoint(t).length;return o.slice(d,d+e)}function w(){f&&O(),f={options:g,lines:[]},s=null,l.clearRect(0,0,l.canvas.width,l.canvas.height),x={x:c.left,y:c.top}}function j(){var t=n;(f||w(),A(),0===f.lines.length)?x={x:c.left+t.margin.left,y:c.top}:v-(x.y+t.lineHeight)<t.lineHeight?(w(),x={x:c.left+t.margin.left,y:c.top}):(x.x=c.left+t.margin.left,x.y+=t.lineHeight);s={chars:[],isLastLine:!1,fragmentOptions:t,offset:e({},x)}}function A(){s&&(f.lines.push(s),s=null)}function H(){s&&(s.isLastLine=!0),A()}function O(){f&&(s&&A(),h.push(f),f=null)}for(var S=0,P=g.fragments||[];S<P.length;S++){var L=P[S];for(H(),L=n=a(t,L),l.font=L.fontWeight+" "+L.fontSize+"px "+L.fontFamily,j(),0===f.lines.length&&(p=0),L.marginCollapse&&y?p=Math.max(L.margin.top,p):p+=L.margin.top,f.lines.length>0&&(x.y+p+L.lineHeight>v+1?(s=null,O(),j()):x.y+=p),0!==f.lines.length||L.noHeadMargin||(x.y=c.top+L.margin.top),L.textIndent>0&&(x.x+=L.textIndent),s.offset.x=x.x,s.offset.y=x.y,m=u-L.margin.right,o=L.text,d=0;d<o.length;){var W=b(),M=W.length,z=l.measureText(W).width,k=m+1-x.x;if("\n"===W)H(),j(),W=null,z=0;else if(k<z){for(var I=W,R=void 0,T=d,C=s.chars.length-1;C>=0;--C){if(R=s.chars[C],!g.lineStartProhibitedMarks.includes(I)&&!g.lineEndProhibitedMarks.includes(R)&&!g.unbreakableRule.test(R+I)){M=(W=I).length,z=l.measureText(W).width,d=T,s.chars=s.chars.slice(0,C+1);break}T-=I.length,I=R}j()}W&&s.chars.push(W),x.x+=z,d+=M}p=L.margin.bottom,y=L.marginCollapse}return H(),O(),h}function s(e,n,i){if(i){var r=i.fragmentOptions,a=r.rtl?i.chars.slice(0).reverse():i.chars,l=n.margin,o=r.margin;!function(t,e,n){var i=e;if(i){t.font=i.fontWeight+" "+i.fontSize+"px "+i.fontFamily,t.fillStyle=i.color,t.direction="ltr";var r=i.textAlign;n.isLastLine&&"justify"===i.textAlign&&(r=i.textAlignLast),"start"===r?t.textAlign=i.rtl?"right":"left":"end"===r?t.textAlign=i.rtl?"left":"right":["center","left","right"].includes(r)?t.textAlign=r:t.textAlign="left",t.textBaseline="middle"}}(e,r,i);var s=i.offset,f=s.x,g=s.y,h=r.textAlign===t.justify,c=f-l.left-r.margin.left;if(g+=r.lineHeight/2,h&&i.isLastLine&&r.textAlignLast!==t.justify&&(h=!1),h){var u=e.measureText(a.join("")).width,v=(n.canvasWidth-u-l.left-l.right-o.left-o.right-c)/(a.length-1);r.rtl&&(f-=c);for(var x=0;x<a.length;++x)e.fillText(a[x],Math.round(f),g),f+=e.measureText(a[x]).width+v}else"center"===e.textAlign?f=e.canvas.width/2:"right"===e.textAlign&&(f=n.canvasWidth-l.right-r.margin.right-c),e.fillText(a.join(""),f,g);i=null}}function f(t,e,n){if(!t)throw Error("error: text-frame - must provide drawing context!");if(e){var i=Math.round(e.options.canvasWidth),r=Math.round(e.options.canvasHeight);(n||t.canvas.width!==i||t.canvas.height!==r)&&(t.canvas.width=i,t.canvas.height=r);for(var a=0,l=e.lines;a<l.length;a++){var o=l[a];s(t,e.options,o)}}else t.clearRect(0,0,t.canvas.width,t.canvas.height)}export{o as computeTextFrames,f as renderFrame};
|