perfect-freehand
Advanced tools
Comparing version 0.5.3 to 0.5.4
@@ -1,1 +0,1 @@ | ||
var me=Object.defineProperty;var xe=e=>me(e,"__esModule",{value:!0});var ge=(e,t)=>{xe(e);for(var n in t)me(e,n,{get:t[n],enumerable:!0})};ge(exports,{default:()=>Ee,getStrokeOutlinePoints:()=>de,getStrokePoints:()=>fe});function d(e,t){return[e[0]+t[0],e[1]+t[1]]}function h(e,t){return[e[0]-t[0],e[1]-t[1]]}function W(e,t){return[t[0]-e[0],t[1]-e[1]]}function i(e,t){return[e[0]*t,e[1]*t]}function ke(e,t){return[e[0]/t,e[1]/t]}function y(e){return[e[1],-e[0]]}function le(e,t){return e[0]*t[0]+e[1]*t[1]}function Se(e){return Math.hypot(e[0],e[1])}function Pe(e){return e[0]*e[0]+e[1]*e[1]}function te(e,t){return Pe(h(e,t))}function I(e){return ke(e,Se(e))}function F(e,t){return Math.hypot(e[1]-t[1],e[0]-t[0])}function ae(e,t){return i(d(e,t),.5)}function G(e,t,n){let c=Math.sin(n),w=Math.cos(n),p=e[0]-t[0],k=e[1]-t[1],v=p*w-k*c,R=p*c+k*w;return[v+t[0],R+t[1]]}function H(e,t,n){return d(e,i(W(e,t),n))}function X(e,t){return e[0]===t[0]&&e[1]===t[1]}function be(e,t,n){return e*(1-n)+t*n}function ne(e,t,n){return Math.max(t,Math.min(n,e))}function ve(e){return Array.isArray(e[0])?e.map(([t,n,c=.5])=>[t,n,c]):e.map(({x:t,y:n,pressure:c=.5})=>[t,n,c])}function $(e,t,n,c=.5){return t?(c=ne(n(c),0,1),(t<0?be(e,e+e*ne(t,-.95,-.05),c):be(e-e*ne(t,.05,.95),e,c))/2):e/2}var{min:J,PI:Y}=Math;function fe(e,t={}){let{streamline:n=.5,last:c=!1}=t,{simulatePressure:w=!0}=t;if(e.length===0)return[];n=n/(w?3:2);let p=ve(e);p.length===1&&p.push([...d(p[0],[1,1]),p[0][2]]);let k=[],v={point:[p[0][0],p[0][1]],pressure:p[0][2],vector:[0,0],distance:0,runningLength:0};k.push(v);let R=p.length,V;for(let E=0;E<R;E++){V=p[E];let K=c&&E===R-1?V:H(v.point,V,1-n);if(X(v.point,K))continue;let M=I(h(v.point,K)),Z=F(K,v.point),B=v.runningLength+Z;v={point:K,pressure:V[2],vector:M,distance:Z,runningLength:B},k.push(v)}return k}function de(e,t={}){let{size:n=8,thinning:c=.5,smoothing:w=.5,simulatePressure:p=!0,easing:k=r=>r,start:v={},end:R={},last:V=!1}=t,{streamline:E=.5}=t;E/=2;let{cap:K=!0,taper:M=0,easing:Z=r=>r*(2-r)}=v,{cap:B=!0,taper:T=0,easing:he=r=>--r*r*r+1}=R,j=e.length;if(j===0)return[];let re=e[j-1].runningLength,f=[],S=[],z=e.slice(0,10).reduce((r,g)=>{let a=g.pressure;if(p){let o=J(1,g.distance/n),b=J(1,1-o);a=J(1,r+(b-r)*(o/4))}return(r+a)/2},e[0].pressure),P=$(n,c,k,e[j-1].pressure),ue,oe=e[0].vector,C=e[0].point,N=C,m=C,l=N,_=!0;for(let r=0;r<j-1;r++){let{pressure:g}=e[r],{point:a,vector:o,distance:b,runningLength:u}=e[r];if(r>0&&_&&u<n/2)continue;if(_&&(_=!1),c){if(p){let U=J(1,b/n),D=J(1,1-U);g=J(1,z+(D-z)*(U/4))}P=$(n,c,k,g)}else P=n/2;ue===void 0&&(ue=P);let s=u<M?Z(u/M):1,Q=re-u<T?he((re-u)/T):1;P=Math.max(.01,P*Math.min(s,Q));let O=e[r+1].vector,ee=le(o,O);if(ee<0){let U=i(y(oe),P);for(let D=0;D<1;D+=.2)l=G(d(a,U),a,Y*-D),m=G(h(a,U),a,Y*D),S.push(l),f.push(m);C=m,N=l;continue}let ce=i(y(H(O,o,ee)),P);m=h(a,ce),l=d(a,ce);let ie=r<2||ee<.25,pe=Math.pow(Math.max((u>n?n:n/2)*w,1),2);(ie||te(C,m)>pe)&&(f.push(H(C,m,E)),C=m),(ie||te(N,l)>pe)&&(S.push(H(N,l,E)),N=l),z=g,oe=o}let x=e[0],se=e[j-1],A=_||S.length<2||f.length<2;if(A&&(!(M||T)||V)){let r=0;for(let o=0;o<j;o++){let{pressure:b,runningLength:u}=e[o];if(u>n){r=$(n,c,k,b);break}}let g=h(x.point,i(y(I(W(se.point,x.point))),r||P)),a=[];for(let o=0,b=.1;o<=1;o+=b)a.push(G(g,x.point,Y*2*o));return a}let L=[],q=[];if(f.length>1&&S.length>1){l=S[1];for(let u=1;u<f.length;u++)if(!X(l,f[u])){m=f[u];break}if(K||M)if(!M&&!(T&&A)){if(!X(l,m)){let u=h(x.point,i(I(W(l,m)),F(l,m)/2));for(let s=0,Q=.1;s<=1;s+=Q){let O=G(u,x.point,Y*s);if(F(O,m)<1)break;L.push(O)}f.shift(),S.shift()}}else L.push(x.point,d(x.point,[.1,.1]));else if(!X(l,m)){let u=I(W(l,m)),s=F(l,m)/2;L.push(h(x.point,i(u,s*.95))),L.push(h(x.point,i(u,s))),L.push(d(x.point,i(u,s))),L.push(d(x.point,i(u,s*.95))),f.shift(),S.shift()}let r=f[f.length-1],g=S[S.length-1],a=ae(r,g),o=se.point,b=I(h(o,a));if(B||T)if(!T&&!(M&&A)){let u=d(o,i(y(b),P));for(let s=0,Q=.1;s<=1;s+=Q){let O=G(u,o,Y*3*s);if(F(O,g)<1)break;q.push(O)}}else q.push(o);else{let u=H(a,o,.95),s=P*.95;q.push(d(u,i(y(b),s))),q.push(d(o,i(y(b),s))),q.push(h(o,i(y(b),s))),q.push(h(u,i(y(b),s)))}}return f.concat(q,S.reverse(),L)}function ye(e,t={}){return de(fe(e,t),t)}var Ee=ye; | ||
var me=Object.defineProperty;var ke=e=>me(e,"__esModule",{value:!0});var Se=(e,t)=>{ke(e);for(var n in t)me(e,n,{get:t[n],enumerable:!0})};Se(exports,{default:()=>Me,getStroke:()=>xe,getStrokeOutlinePoints:()=>he,getStrokePoints:()=>fe});function d(e,t){return[e[0]+t[0],e[1]+t[1]]}function h(e,t){return[e[0]-t[0],e[1]-t[1]]}function U(e,t){return[t[0]-e[0],t[1]-e[1]]}function i(e,t){return[e[0]*t,e[1]*t]}function Pe(e,t){return[e[0]/t,e[1]/t]}function y(e){return[e[1],-e[0]]}function le(e,t){return e[0]*t[0]+e[1]*t[1]}function ye(e){return Math.hypot(e[0],e[1])}function Ee(e){return e[0]*e[0]+e[1]*e[1]}function te(e,t){return Ee(h(e,t))}function D(e){return Pe(e,ye(e))}function F(e,t){return Math.hypot(e[1]-t[1],e[0]-t[0])}function ae(e,t){return i(d(e,t),.5)}function G(e,t,n){let c=Math.sin(n),R=Math.cos(n),p=e[0]-t[0],k=e[1]-t[1],v=p*R-k*c,w=p*c+k*R;return[v+t[0],w+t[1]]}function H(e,t,n){return d(e,i(U(e,t),n))}function W(e,t){return e[0]===t[0]&&e[1]===t[1]}function be(e,t,n){return e*(1-n)+t*n}function ne(e,t,n){return Math.max(t,Math.min(n,e))}function ve(e){return Array.isArray(e[0])?e.map(([t,n,c=.5])=>[t,n,c]):e.map(({x:t,y:n,pressure:c=.5})=>[t,n,c])}function $(e,t,n,c=.5){return t?(c=ne(n(c),0,1),(t<0?be(e,e+e*ne(t,-.95,-.05),c):be(e-e*ne(t,.05,.95),e,c))/2):e/2}var{min:I,PI:X}=Math;function fe(e,t={}){let{streamline:n=.5}=t,{simulatePressure:c=!0,last:R=!1}=t;if(e.length===0)return[];n=n/(c?3:2);let p=ve(e);p.length===1&&p.push([...d(p[0],[1,1]),p[0][2]]);let k=[],v={point:[p[0][0],p[0][1]],pressure:p[0][2],vector:[0,0],distance:0,runningLength:0};k.push(v);let w=p.length,T;for(let E=0;E<w;E++){T=p[E];let V=R&&E===w-1?T:H(v.point,T,1-n);if(W(v.point,V))continue;let M=D(h(v.point,V)),Y=F(V,v.point),A=v.runningLength+Y;v={point:V,pressure:T[2],vector:M,distance:Y,runningLength:A},k.push(v)}return k}var de=.3;function he(e,t={}){let{size:n=8,thinning:c=.5,smoothing:R=.5,simulatePressure:p=!0,easing:k=r=>r,start:v={},end:w={},last:T=!1}=t,{streamline:E=.5}=t;E/=2;let{cap:V=!0,taper:M=0,easing:Y=r=>r*(2-r)}=v,{cap:A=!0,taper:C=0,easing:ge=r=>--r*r*r+1}=w,K=e.length;if(K===0)return[];let re=e[K-1].runningLength,f=[],S=[],B=e.slice(0,10).reduce((r,g)=>{let a=g.pressure;if(p){let o=I(1,g.distance/n),b=I(1,1-o);a=I(1,r+(b-r)*(o*de))}return(r+a)/2},e[0].pressure),P=$(n,c,k,e[K-1].pressure),ue,oe=e[0].vector,_=e[0].point,N=_,m=_,l=N,Z=!0;for(let r=0;r<K-1;r++){let{pressure:g}=e[r],{point:a,vector:o,distance:b,runningLength:u}=e[r];if(r>0&&Z&&u<n/2)continue;if(Z&&(Z=!1),c){if(p){let Q=I(1,b/n),j=I(1,1-Q);g=I(1,B+(j-B)*(Q*de))}P=$(n,c,k,g)}else P=n/2;ue===void 0&&(ue=P);let s=u<M?Y(u/M):1,J=re-u<C?ge((re-u)/C):1;P=Math.max(.01,P*Math.min(s,J));let O=e[r+1].vector,ee=le(o,O);if(ee<0){let Q=i(y(oe),P);for(let j=0;j<1;j+=.2)l=G(d(a,Q),a,X*-j),m=G(h(a,Q),a,X*j),S.push(l),f.push(m);_=m,N=l;continue}let ce=i(y(H(O,o,ee)),P);m=h(a,ce),l=d(a,ce);let ie=r<2||ee<.25,pe=Math.pow(Math.max((u>n?n:n/2)*R,1),2);(ie||te(_,m)>pe)&&(f.push(H(_,m,E)),_=m),(ie||te(N,l)>pe)&&(S.push(H(N,l,E)),N=l),B=g,oe=o}let x=e[0],se=e[K-1],z=Z||S.length<2||f.length<2;if(z&&(!(M||C)||T)){let r=0;for(let o=0;o<K;o++){let{pressure:b,runningLength:u}=e[o];if(u>n){r=$(n,c,k,b);break}}let g=h(x.point,i(y(D(U(se.point,x.point))),r||P)),a=[];for(let o=0,b=.1;o<=1;o+=b)a.push(G(g,x.point,X*2*o));return a}let L=[],q=[];if(f.length>1&&S.length>1){l=S[1];for(let u=1;u<f.length;u++)if(!W(l,f[u])){m=f[u];break}if(V||M)if(!M&&!(C&&z)){if(!W(l,m)){let u=h(x.point,i(D(U(l,m)),F(l,m)/2));for(let s=0,J=.1;s<=1;s+=J){let O=G(u,x.point,X*s);if(F(O,m)<1)break;L.push(O)}f.shift(),S.shift()}}else L.push(x.point,d(x.point,[.1,.1]));else if(!W(l,m)){let u=D(U(l,m)),s=F(l,m)/2;L.push(h(x.point,i(u,s*.95))),L.push(h(x.point,i(u,s))),L.push(d(x.point,i(u,s))),L.push(d(x.point,i(u,s*.95))),f.shift(),S.shift()}let r=f[f.length-1],g=S[S.length-1],a=ae(r,g),o=se.point,b=D(h(o,a));if(A||C)if(!C&&!(M&&z)){let u=d(o,i(y(b),P));for(let s=0,J=.1;s<=1;s+=J){let O=G(u,o,X*3*s);if(F(O,g)<1)break;q.push(O)}}else q.push(o);else{let u=H(a,o,.95),s=P*.95;q.push(d(u,i(y(b),s))),q.push(d(o,i(y(b),s))),q.push(h(o,i(y(b),s))),q.push(h(u,i(y(b),s)))}}return f.concat(q,S.reverse(),L)}function xe(e,t={}){return he(fe(e,t),t)}var Me=xe; |
@@ -85,4 +85,4 @@ // src/vec.ts | ||
function getStrokePoints(points, options = {}) { | ||
let { streamline = 0.5, last: isComplete = false } = options; | ||
const { simulatePressure = true } = options; | ||
let { streamline = 0.5 } = options; | ||
const { simulatePressure = true, last: isComplete = false } = options; | ||
if (points.length === 0) | ||
@@ -124,2 +124,3 @@ return []; | ||
} | ||
var RATE_OF_CHANGE = 0.3; | ||
function getStrokeOutlinePoints(points, options = {}) { | ||
@@ -159,3 +160,3 @@ const { | ||
const rp = min(1, 1 - sp); | ||
pressure = min(1, acc + (rp - acc) * (sp / 4)); | ||
pressure = min(1, acc + (rp - acc) * (sp * RATE_OF_CHANGE)); | ||
} | ||
@@ -184,3 +185,3 @@ return (acc + pressure) / 2; | ||
const rp = min(1, 1 - sp); | ||
pressure = min(1, prevPressure + (rp - prevPressure) * (sp / 4)); | ||
pressure = min(1, prevPressure + (rp - prevPressure) * (sp * RATE_OF_CHANGE)); | ||
} | ||
@@ -318,4 +319,5 @@ radius = getStrokeRadius(size, thinning, easing, pressure); | ||
src_default as default, | ||
getStroke, | ||
getStrokeOutlinePoints, | ||
getStrokePoints | ||
}; |
@@ -50,2 +50,3 @@ import type { StrokeOptions, StrokePoint } from './types'; | ||
export default getStroke; | ||
export { getStroke }; | ||
export { StrokeOptions }; |
{ | ||
"version": "0.5.3", | ||
"version": "0.5.4", | ||
"name": "perfect-freehand", | ||
@@ -64,3 +64,3 @@ "private": false, | ||
}, | ||
"gitHead": "d2a334f923a58ffa869060b5ce80281f18af919d" | ||
"gitHead": "b52b4d22b7b12fbfc5cff300c7416ca7786aba15" | ||
} |
/* eslint-disable */ | ||
const fs = require('fs') | ||
const esbuild = require('esbuild') | ||
const { gzip } = require('zlib') | ||
@@ -8,34 +9,42 @@ const name = process.env.npm_package_name || '' | ||
async function main() { | ||
try { | ||
esbuild.buildSync({ | ||
entryPoints: ['./src/index.ts'], | ||
outdir: 'dist/cjs', | ||
minify: true, | ||
bundle: true, | ||
format: 'cjs', | ||
target: 'es6', | ||
tsconfig: './tsconfig.build.json', | ||
}) | ||
await esbuild.build({ | ||
entryPoints: ['./src/index.ts'], | ||
outdir: 'dist/cjs', | ||
minify: true, | ||
bundle: true, | ||
format: 'cjs', | ||
target: 'es6', | ||
tsconfig: './tsconfig.build.json', | ||
}) | ||
esbuild.buildSync({ | ||
entryPoints: ['./src/index.ts'], | ||
outdir: 'dist/esm', | ||
minify: true, | ||
bundle: true, | ||
format: 'esm', | ||
target: 'es6', | ||
tsconfig: './tsconfig.build.json', | ||
}) | ||
const esmResult = await esbuild.build({ | ||
entryPoints: ['./src/index.ts'], | ||
outdir: 'dist/esm', | ||
minify: true, | ||
bundle: true, | ||
format: 'esm', | ||
target: 'es6', | ||
tsconfig: './tsconfig.build.json', | ||
metafile: true, | ||
}) | ||
fs.copyFile('./README.md', './dist/README.md', (err) => { | ||
if (err) throw err | ||
let esmSize = 0 | ||
Object.values(esmResult.metafile.outputs).forEach((output) => { | ||
esmSize += output.bytes | ||
}) | ||
fs.readFile('./dist/esm/index.js', (_err, data) => { | ||
gzip(data, (_err, result) => { | ||
console.log( | ||
`✔ ${name}: Built package. ${(esmSize / 1000).toFixed(2)}kb (${( | ||
result.length / 1000 | ||
).toFixed(2)}kb minified)` | ||
) | ||
}) | ||
console.log(`✔ ${name}: Built package.`) | ||
} catch (e) { | ||
console.log(`× ${name}: Build failed due to an error.`) | ||
console.log(e) | ||
} | ||
}) | ||
} | ||
main() | ||
main().catch((e) => { | ||
console.log(`× ${name}: Build failed due to an error.`) | ||
console.log(e) | ||
}) |
@@ -22,3 +22,3 @@ /* eslint-disable */ | ||
} | ||
console.log(`✔ ${name}: Rebuilt.`) | ||
console.log(`✔ ${name}: Rebuilt perfect-freehand.`) | ||
}, | ||
@@ -25,0 +25,0 @@ }, |
@@ -18,4 +18,4 @@ import { toPointsArray, getStrokeRadius } from './utils' | ||
): StrokePoint[] { | ||
let { streamline = 0.5, last: isComplete = false } = options | ||
const { simulatePressure = true } = options | ||
let { streamline = 0.5 } = options | ||
const { simulatePressure = true, last: isComplete = false } = options | ||
@@ -94,2 +94,4 @@ // If we don't have any points, return an empty array. | ||
const RATE_OF_CHANGE = 0.3 | ||
/** | ||
@@ -160,5 +162,8 @@ * ## getStrokeOutlinePoints | ||
if (simulatePressure) { | ||
// Speed of change - how fast should the the pressure changing? | ||
const sp = min(1, curr.distance / size) | ||
// Rate of change - how much of a change is there? | ||
const rp = min(1, 1 - sp) | ||
pressure = min(1, acc + (rp - acc) * (sp / 4)) | ||
// Accelerate the pressure | ||
pressure = min(1, acc + (rp - acc) * (sp * RATE_OF_CHANGE)) | ||
} | ||
@@ -220,3 +225,6 @@ | ||
const rp = min(1, 1 - sp) | ||
pressure = min(1, prevPressure + (rp - prevPressure) * (sp / 4)) | ||
pressure = min( | ||
1, | ||
prevPressure + (rp - prevPressure) * (sp * RATE_OF_CHANGE) | ||
) | ||
} | ||
@@ -507,2 +515,3 @@ | ||
export default getStroke | ||
export { getStroke } | ||
export { StrokeOptions } |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1448
91305