UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

2 lines 6.8 kB
import{config as e}from"../../config.min.mjs";import{cache as t}from"../../cache.min.mjs";import{PiBy180 as n,halfPI as r}from"../../constants.min.mjs";import{cos as i}from"../misc/cos.min.mjs";import{sin as a}from"../misc/sin.min.mjs";import{Point as o}from"../../Point.min.mjs";import{multiplyTransformMatrices as s,transformPoint as c}from"../misc/matrix.min.mjs";import{toFixed as l}from"../misc/toFixed.min.mjs";import{reNum as u}from"../../parser/constants.min.mjs";import{reArcCommandPoints as d,rePathCommand as f}from"./regex.min.mjs";const p={m:`l`,M:`L`},m=(e,t,n,r,o,s,c,l,u,d,f)=>{let p=i(e),m=a(e),h=i(t),g=a(t),_=n*o*h-r*s*g+c,v=r*o*h+n*s*g+l;return[`C`,d+u*(-n*o*m-r*s*p),f+u*(-r*o*m+n*s*p),_+u*(n*o*g+r*s*h),v+u*(r*o*g-n*s*h),_,v]},h=(e,t,n,r)=>{let i=Math.atan2(t,e),a=Math.atan2(r,n);return a>=i?a-i:2*Math.PI-(i-a)};function g(n,r,i,a,s,c,l,u){let d;if(e.cachesBoundsOfCurve&&(d=[...arguments].join(),t.boundsOfCurveCache[d]))return t.boundsOfCurveCache[d];let f=Math.sqrt,p=Math.abs,m=[],h=[[0,0],[0,0]],g=6*n-12*i+6*s,_=-3*n+9*i-9*s+3*l,v=3*i-3*n;for(let e=0;e<2;++e){if(e>0&&(g=6*r-12*a+6*c,_=-3*r+9*a-9*c+3*u,v=3*a-3*r),p(_)<1e-12){if(p(g)<1e-12)continue;let e=-v/g;0<e&&e<1&&m.push(e);continue}let t=g*g-4*v*_;if(t<0)continue;let n=f(t),i=(-g+n)/(2*_);0<i&&i<1&&m.push(i);let o=(-g-n)/(2*_);0<o&&o<1&&m.push(o)}let y=m.length,x=y,S=b(n,r,i,a,s,c,l,u);for(;y--;){let{x:e,y:t}=S(m[y]);h[0][y]=e,h[1][y]=t}h[0][x]=n,h[1][x]=r,h[0][x+1]=l,h[1][x+1]=u;let C=[new o(Math.min(...h[0]),Math.min(...h[1])),new o(Math.max(...h[0]),Math.max(...h[1]))];return e.cachesBoundsOfCurve&&(t.boundsOfCurveCache[d]=C),C}const _=(e,t,[r,o,s,c,l,u,d,f])=>{let p=((e,t,r,o,s,c,l)=>{if(r===0||o===0)return[];let u=0,d=0,f=0,p=Math.PI,g=l*n,_=a(g),v=i(g),y=.5*(-v*e-_*t),b=.5*(-v*t+_*e),x=r**2,S=o**2,C=b**2,w=y**2,T=x*S-x*C-S*w,E=Math.abs(r),D=Math.abs(o);if(T<0){let e=Math.sqrt(1-T/(x*S));E*=e,D*=e}else f=(s===c?-1:1)*Math.sqrt(T/(x*C+S*w));let O=f*E*b/D,k=-f*D*y/E,A=v*O-_*k+.5*e,j=_*O+v*k+.5*t,M=h(1,0,(y-O)/E,(b-k)/D),N=h((y-O)/E,(b-k)/D,(-y-O)/E,(-b-k)/D);c===0&&N>0?N-=2*p:c===1&&N<0&&(N+=2*p);let P=Math.ceil(Math.abs(N/p*2)),F=[],I=N/P,L=8/3*Math.sin(I/4)*Math.sin(I/4)/Math.sin(I/2),R=M+I;for(let e=0;e<P;e++)F[e]=m(M,R,v,_,E,D,A,j,L,u,d),u=F[e][5],d=F[e][6],M=R,R+=I;return F})(d-e,f-t,o,s,l,u,c);for(let n=0,r=p.length;n<r;n++)p[n][1]+=e,p[n][2]+=t,p[n][3]+=e,p[n][4]+=t,p[n][5]+=e,p[n][6]+=t;return p},v=e=>{let t=0,n=0,r=0,i=0,a=[],o,s=0,c=0;for(let l of e){let e=[...l],u;switch(e[0]){case`l`:e[1]+=t,e[2]+=n;case`L`:t=e[1],n=e[2],u=[`L`,t,n];break;case`h`:e[1]+=t;case`H`:t=e[1],u=[`L`,t,n];break;case`v`:e[1]+=n;case`V`:n=e[1],u=[`L`,t,n];break;case`m`:e[1]+=t,e[2]+=n;case`M`:t=e[1],n=e[2],r=e[1],i=e[2],u=[`M`,t,n];break;case`c`:e[1]+=t,e[2]+=n,e[3]+=t,e[4]+=n,e[5]+=t,e[6]+=n;case`C`:s=e[3],c=e[4],t=e[5],n=e[6],u=[`C`,e[1],e[2],s,c,t,n];break;case`s`:e[1]+=t,e[2]+=n,e[3]+=t,e[4]+=n;case`S`:o===`C`?(s=2*t-s,c=2*n-c):(s=t,c=n),t=e[3],n=e[4],u=[`C`,s,c,e[1],e[2],t,n],s=u[3],c=u[4];break;case`q`:e[1]+=t,e[2]+=n,e[3]+=t,e[4]+=n;case`Q`:s=e[1],c=e[2],t=e[3],n=e[4],u=[`Q`,s,c,t,n];break;case`t`:e[1]+=t,e[2]+=n;case`T`:o===`Q`?(s=2*t-s,c=2*n-c):(s=t,c=n),t=e[1],n=e[2],u=[`Q`,s,c,t,n];break;case`a`:e[6]+=t,e[7]+=n;case`A`:_(t,n,e).forEach(e=>a.push(e)),t=e[6],n=e[7];break;case`z`:case`Z`:t=r,n=i,u=[`Z`]}u?(a.push(u),o=u[0]):o=``}return a},y=(e,t,n,r)=>Math.sqrt((n-e)**2+(r-t)**2),b=(e,t,n,r,i,a,s,c)=>l=>{let u=l**3,d=(e=>3*e**2*(1-e))(l),f=(e=>3*e*(1-e)**2)(l),p=(e=>(1-e)**3)(l);return new o(s*u+i*d+n*f+e*p,c*u+a*d+r*f+t*p)},x=e=>e**2,S=e=>2*e*(1-e),C=e=>(1-e)**2,w=(e,t,n,r,i,a,o,s)=>c=>{let l=x(c),u=S(c),d=C(c),f=3*(d*(n-e)+u*(i-n)+l*(o-i)),p=3*(d*(r-t)+u*(a-r)+l*(s-a));return Math.atan2(p,f)},T=(e,t,n,r,i,a)=>s=>{let c=x(s),l=S(s),u=C(s);return new o(i*c+n*l+e*u,a*c+r*l+t*u)},E=(e,t,n,r,i,a)=>o=>{let s=1-o,c=2*(s*(n-e)+o*(i-n)),l=2*(s*(r-t)+o*(a-r));return Math.atan2(l,c)},D=(e,t,n)=>{let r=new o(t,n),i=0;for(let t=1;t<=100;t+=1){let n=e(t/100);i+=y(r.x,r.y,n.x,n.y),r=n}return i},O=(e,t)=>{let n,r=0,i=0,a={x:e.x,y:e.y},o={...a},s=.01,c=0,l=e.iterator,u=e.angleFinder;for(;i<t&&s>1e-4;)o=l(r),c=r,n=y(a.x,a.y,o.x,o.y),n+i>t?(r-=s,s/=2):(a=o,r+=s,i+=n);return{...o,angle:u(c)}},k=e=>{let t,n,r=0,i=0,a=0,o=0,s=0,c=[];for(let l of e){let e={x:i,y:a,command:l[0],length:0};switch(l[0]){case`M`:n=e,n.x=o=i=l[1],n.y=s=a=l[2];break;case`L`:n=e,n.length=y(i,a,l[1],l[2]),i=l[1],a=l[2];break;case`C`:t=b(i,a,l[1],l[2],l[3],l[4],l[5],l[6]),n=e,n.iterator=t,n.angleFinder=w(i,a,l[1],l[2],l[3],l[4],l[5],l[6]),n.length=D(t,i,a),i=l[5],a=l[6];break;case`Q`:t=T(i,a,l[1],l[2],l[3],l[4]),n=e,n.iterator=t,n.angleFinder=E(i,a,l[1],l[2],l[3],l[4]),n.length=D(t,i,a),i=l[3],a=l[4];break;case`Z`:n=e,n.destX=o,n.destY=s,n.length=y(i,a,o,s),i=o,a=s}r+=n.length,c.push(n)}return c.push({length:r,x:i,y:a}),c},A=(e,t,n=k(e))=>{let r=0;for(;t-n[r].length>0&&r<n.length-2;)t-=n[r].length,r++;let i=n[r],a=t/i.length,s=e[r];switch(i.command){case`M`:return{x:i.x,y:i.y,angle:0};case`Z`:return{...new o(i.x,i.y).lerp(new o(i.destX,i.destY),a),angle:Math.atan2(i.destY-i.y,i.destX-i.x)};case`L`:return{...new o(i.x,i.y).lerp(new o(s[1],s[2]),a),angle:Math.atan2(s[2]-i.y,s[1]-i.x)};case`C`:case`Q`:return O(i,t)}},j=new RegExp(f,`gi`),M=new RegExp(d,`g`),N=new RegExp(u,`gi`),P={m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7},F=e=>{var t;let n=[],r=(t=e.match(j))==null?[]:t;for(let e of r){let t=e[0];if(t===`z`||t===`Z`){n.push([t]);continue}let r=P[t.toLowerCase()],i=[];if(t===`a`||t===`A`){M.lastIndex=0;for(let t=null;t=M.exec(e);)i.push(...t.slice(1))}else i=e.match(N)||[];for(let e=0;e<i.length;e+=r){let a=Array(r),o=p[t];a[0]=e>0&&o?o:t;for(let t=0;t<r;t++)a[t+1]=parseFloat(i[e+t]);n.push(a)}}return n},I=(e,t=0)=>{let n=new o(e[0]),r=new o(e[1]),i=1,a=0,s=[],c=e.length,l=c>2,u;for(l&&(i=e[2].x<r.x?-1:e[2].x===r.x?0:1,a=e[2].y<r.y?-1:e[2].y===r.y?0:1),s.push([`M`,n.x-i*t,n.y-a*t]),u=1;u<c;u++){if(!n.eq(r)){let e=n.midPointFrom(r);s.push([`Q`,n.x,n.y,e.x,e.y])}n=e[u],u+1<e.length&&(r=e[u+1])}return l&&(i=n.x>e[u-2].x?1:n.x===e[u-2].x?0:-1,a=n.y>e[u-2].y?1:n.y===e[u-2].y?0:-1),s.push([`L`,n.x+i*t,n.y+a*t]),s},L=(e,t,n)=>(n&&(t=s(t,[1,0,0,1,-n.x,-n.y])),e.map(e=>{let n=[...e];for(let r=1;r<e.length-1;r+=2){let{x:i,y:a}=c({x:e[r],y:e[r+1]},t);n[r]=i,n[r+1]=a}return n})),R=(e,t)=>{let n=2*Math.PI/e,s=-r;e%2==0&&(s+=n/2);let c=Array(e+1);for(let r=0;r<e;r++){let e=r*n+s,{x:l,y:u}=new o(i(e),a(e)).scalarMultiply(t);c[r]=[r===0?`M`:`L`,l,u]}return c[e]=[`Z`],c},z=(e,t)=>e.map(e=>e.map((e,n)=>n===0||t===void 0?e:l(e,t)).join(` `)).join(` `);export{g as getBoundsOfCurve,k as getPathSegmentsInfo,A as getPointOnPath,R as getRegularPolygonPath,I as getSmoothPathFromPoints,z as joinPath,v as makePathSimpler,F as parsePath,L as transformPath}; //# sourceMappingURL=index.min.mjs.map