diff --git a/gen/mini/catwhale/swim.js b/gen/mini/catwhale/swim.js index b17f326..192f242 100644 --- a/gen/mini/catwhale/swim.js +++ b/gen/mini/catwhale/swim.js @@ -1,6 +1,6 @@ // cat-whale drifting along: one solid ink shape, it bobs, flicks its tail, twitches an ear, puffs a spout and blinks const{sin,cos,PI,min,max}=Math,T=2*PI -export const frames=24,delay=85,rim=3 +export const frames=24,delay=85,rim=3,invert=true export default(c,t)=>{ const s=sin(T*t),k=sin(T*t-1.4),p=t/.45,tw=t>.6&&t<.68?.3:0,bl=t>.82&&t<.9,tx=46+4*k,ty=92-5*k c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/cloudsheep/rain.js b/gen/mini/cloudsheep/rain.js index 26deb5a..f675502 100644 --- a/gen/mini/cloudsheep/rain.js +++ b/gen/mini/cloudsheep/rain.js @@ -1,6 +1,6 @@ // sheep whose body is a little rain cloud: it floats and bobs, the puffs breathe, tiny legs dangle, raindrops fall from underneath const{sin,PI,min}=Math,T=2*PI -export const frames=24,delay=80,rim=3 +export const frames=24,delay=80,rim=3,invert=true const P=[[78,112,28],[106,90,32],[142,88,32],[170,108,26],[96,130,28],[132,132,30],[160,128,24],[62,130,20]] export default(c,t)=>{ const y=5*sin(T*t),bl=t>.5&&t<.56 diff --git a/gen/mini/dandelion/drift.js b/gen/mini/dandelion/drift.js index 603430f..c05d9e4 100644 --- a/gen/mini/dandelion/drift.js +++ b/gen/mini/dandelion/drift.js @@ -1,6 +1,6 @@ // lion whose mane is dandelion fluff: three seeds blow off and drift away, new ones grow back in their place const{sin,cos,PI,min,max}=Math,T=2*PI -export const frames=24,delay=85,rim=3 +export const frames=24,delay=85,rim=3,invert=true const N=18,F=[1,2,3] const seed=c=>{c.beginPath();c.moveTo(0,0);c.lineTo(24,0);for(let j=-2;j<=2;j++)c.moveTo(24,0),c.lineTo(24+10*cos(j*.42),10*sin(j*.42));c.stroke()} export default(c,t)=>{ diff --git a/gen/mini/heron/stand.js b/gen/mini/heron/stand.js index 171916e..276af65 100644 --- a/gen/mini/heron/stand.js +++ b/gen/mini/heron/stand.js @@ -1,6 +1,6 @@ // heron standing on one leg: S-curved neck and long beak, it tilts its head, the plume feathers sway, it blinks const{sin,PI}=Math,T=2*PI -export const frames=24,delay=85,rim=3 +export const frames=24,delay=85,rim=3,invert=true export default(c,t)=>{ const hd=t>.25&&t<.65?.18*sin(PI*(t-.25)/.4):0,br=sin(T*t),pl=.08*sin(T*t-1),bl=t>.8&&t<.86 c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/kitsune/tails.js b/gen/mini/kitsune/tails.js index 6961fb2..0ed7cbe 100644 --- a/gen/mini/kitsune/tails.js +++ b/gen/mini/kitsune/tails.js @@ -1,7 +1,7 @@ // fox spirit sitting side-on, three white-tipped tails fanned out behind it swaying one after another, // a fox-fire flame flickering beside its nose, an ear twitches and it blinks const{sin,cos,PI}=Math,T=2*PI -export const frames=24,delay=80,rim=3 +export const frames=24,delay=80,rim=3,invert=true export default(c,t)=>{ const bl=t>.7&&t<.77,tw=t>.36&&t<.44?.3:0,hr=.04*sin(T*t),f=k=>3*sin(T*t*2+k) c.fillStyle=c.strokeStyle='#111';c.lineWidth=6;c.translate(122,218);c.scale(.88,.88);c.translate(-138,-218) diff --git a/gen/mini/moonowl/blink.js b/gen/mini/moonowl/blink.js index 693edc8..0f1cabe 100644 --- a/gen/mini/moonowl/blink.js +++ b/gen/mini/moonowl/blink.js @@ -1,6 +1,6 @@ // owl nestled in a crescent moon: the moon's curve is its back and left wing, the lower tip is the perch it grips; big ringed eyes blink, the head tilts, a star twinkles const{sin,cos,PI,atan2,sqrt,hypot}=Math,T=2*PI -export const frames=24,delay=85,rim=3 +export const frames=24,delay=85,rim=3,invert=true // crescent edges are circles through tips B and A, bulging s px toward the lower left const B=[84,60],A=[204,214],M=[(B[0]+A[0])/2,(B[1]+A[1])/2],L=hypot(A[0]-B[0],A[1]-B[1]),n=[(B[1]-A[1])/L,(A[0]-B[0])/L] const circ=s=>{const r=(L*L/4+s*s)/(2*s);return[M[0]-(r-s)*n[0],M[1]-(r-s)*n[1],r]} diff --git a/gen/mini/narwhal/twirl.js b/gen/mini/narwhal/twirl.js index d839c9a..695be06 100644 --- a/gen/mini/narwhal/twirl.js +++ b/gen/mini/narwhal/twirl.js @@ -1,6 +1,6 @@ // narwhal swimming along: bobs, flicks its tail, and the white spiral on its long tusk keeps twirling toward the tip const{sin,cos,PI}=Math,T=2*PI -export const frames=24,delay=80,rim=3 +export const frames=24,delay=80,rim=3,invert=true export default(c,t)=>{ const s=sin(T*t),k=sin(T*t-1.4),bl=t>.8&&t<.86 c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/phoenix/rise.js b/gen/mini/phoenix/rise.js index 189fdaa..ed454c4 100644 --- a/gen/mini/phoenix/rise.js +++ b/gen/mini/phoenix/rise.js @@ -1,6 +1,6 @@ // phoenix rising: big wingbeats lift it, the flame crest and tail feathers flicker const{sin,PI}=Math,T=2*PI -export const frames=24,delay=70,rim=3 +export const frames=24,delay=70,rim=3,invert=true export default(c,t)=>{ const f=sin(T*t) c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/pufferfish/puff.js b/gen/mini/pufferfish/puff.js index cd96378..bb0f2a0 100644 --- a/gen/mini/pufferfish/puff.js +++ b/gen/mini/pufferfish/puff.js @@ -1,6 +1,6 @@ // pufferfish: rests, puffs up into a round spiky ball with a surprised look, wobbles, then lets the air out const{sin,cos,PI,abs,hypot}=Math,T=2*PI -export const frames=24,delay=80,rim=3 +export const frames=24,delay=80,rim=3,invert=true const sm=x=>x<0?0:x>1?1:x*x*(3-2*x) export default(c,t)=>{ const g=sm((t-.1)/.25)-sm((t-.6)/.25),cx=134,cy=128+4*sin(T*t),rx=56+24*g+2*g*sin(T*t*4),ry=42+38*g,bl=t>.9&&t<.96 diff --git a/gen/mini/seahorse/sway.js b/gen/mini/seahorse/sway.js index 9c96aed..101e973 100644 --- a/gen/mini/seahorse/sway.js +++ b/gen/mini/seahorse/sway.js @@ -1,6 +1,6 @@ // seahorse standing upright in the current: sways side to side, its dorsal fin flutters, tail curled under, blinks const{sin,cos,PI}=Math,T=2*PI -export const frames=24,delay=85,rim=3 +export const frames=24,delay=85,rim=3,invert=true export default(c,t)=>{ const s=sin(T*t),bl=t>.78&&t<.84,f=1+.18*sin(T*t*4) c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/starfish/wave.js b/gen/mini/starfish/wave.js index 08e5f34..c0e3d72 100644 --- a/gen/mini/starfish/wave.js +++ b/gen/mini/starfish/wave.js @@ -1,6 +1,6 @@ // starfish sitting on its two bottom arms, waving hello with its upper right arm, smiling and blinking const{sin,cos,PI}=Math,T=2*PI -export const frames=24,delay=80,rim=3 +export const frames=24,delay=80,rim=3,invert=true export default(c,t)=>{ const cx=128,cy=134+2*sin(T*t*2),bl=t>.7&&t<.76,wv=.5+.5*sin(T*t*2) c.fillStyle='#111' diff --git a/gen/mini/swan/glide.js b/gen/mini/swan/glide.js index 2f3a68f..bfc1a67 100644 --- a/gen/mini/swan/glide.js +++ b/gen/mini/swan/glide.js @@ -1,6 +1,6 @@ // swan gliding on still water: the neck sways and the head dips, ripples slide back under it, a blink const{sin,cos,PI}=Math,T=2*PI -export const frames=24,delay=90,rim=3 +export const frames=24,delay=90,rim=3,invert=true export default(c,t)=>{ const s=sin(T*t),hx=172+5*s,hy=70+4*cos(T*t),bl=t>.55&&t<.62 c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/teadragon/steam.js b/gen/mini/teadragon/steam.js index 2309d9b..9157c44 100644 --- a/gen/mini/teadragon/steam.js +++ b/gen/mini/teadragon/steam.js @@ -1,6 +1,6 @@ // teapot dragon: the spout is its neck and head, the handle is its arrow-tipped tail; steam puffs from its snout and the lid rattles up const{sin,PI,min}=Math,T=2*PI -export const frames=24,delay=85,rim=3 +export const frames=24,delay=85,rim=3,invert=true export default(c,t)=>{ const lh=t>.4&&t<.6?sin(PI*(t-.4)/.2):0,bl=t>.82&&t<.88 c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/turtlehouse/smoke.js b/gen/mini/turtlehouse/smoke.js index b7f5531..bb15a52 100644 --- a/gen/mini/turtlehouse/smoke.js +++ b/gen/mini/turtlehouse/smoke.js @@ -1,6 +1,6 @@ // turtle that carries a little cottage as its shell: it plods in place, the chimney puffs smoke, window and door cut out in white const{sin,PI,max,min}=Math,T=2*PI -export const frames=24,delay=90,rim=3 +export const frames=24,delay=90,rim=3,invert=true export default(c,t)=>{ const b=1.5*sin(2*T*t),bl=t>.8&&t<.86 c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/wisp/float.js b/gen/mini/wisp/float.js index 9197154..9a947d3 100644 --- a/gen/mini/wisp/float.js +++ b/gen/mini/wisp/float.js @@ -1,6 +1,6 @@ // will-o-wisp floating: a round flame spirit bobbing and tilting, its flame tips flicker, embers drift up beside it, it blinks const{sin,PI}=Math,T=2*PI -export const frames=24,delay=80,rim=3 +export const frames=24,delay=80,rim=3,invert=true export default(c,t)=>{ const bl=t>.4&&t<.46,Mx=128+6*sin(T*t*2),My=40+4*sin(T*t*3),R=4*sin(T*t*2+1),L=4*sin(T*t*2+2.5) c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/gen/mini/yeti/wave.js b/gen/mini/yeti/wave.js index 7c3d31e..742e779 100644 --- a/gen/mini/yeti/wave.js +++ b/gen/mini/yeti/wave.js @@ -1,6 +1,6 @@ // yeti waving hello: shaggy spiky fur all round, one arm waving, a big open smile and a blink const{sin,cos,PI}=Math,T=2*PI -export const frames=24,delay=80,rim=3 +export const frames=24,delay=80,rim=3,invert=true export default(c,t)=>{ const bl=t>.6&&t<.66,br=sin(T*t),a=-2.65+.28*sin(T*t*2) c.fillStyle=c.strokeStyle='#111';c.lineWidth=6 diff --git a/public/catwhale/swim.gif b/public/catwhale/swim.gif index 97adca2..4126a2d 100644 Binary files a/public/catwhale/swim.gif and b/public/catwhale/swim.gif differ diff --git a/public/catwhale/swim.webp b/public/catwhale/swim.webp index 0f011bd..402deac 100644 Binary files a/public/catwhale/swim.webp and b/public/catwhale/swim.webp differ diff --git a/public/cloudsheep/rain.gif b/public/cloudsheep/rain.gif index bc2c2a5..b2e71c1 100644 Binary files a/public/cloudsheep/rain.gif and b/public/cloudsheep/rain.gif differ diff --git a/public/cloudsheep/rain.webp b/public/cloudsheep/rain.webp index 5a13e5b..d0df290 100644 Binary files a/public/cloudsheep/rain.webp and b/public/cloudsheep/rain.webp differ diff --git a/public/dandelion/drift.gif b/public/dandelion/drift.gif index 48747bb..3acfd99 100644 Binary files a/public/dandelion/drift.gif and b/public/dandelion/drift.gif differ diff --git a/public/dandelion/drift.webp b/public/dandelion/drift.webp index d84fb9d..dce8c2d 100644 Binary files a/public/dandelion/drift.webp and b/public/dandelion/drift.webp differ diff --git a/public/heron/stand.gif b/public/heron/stand.gif index 397f173..6535a0d 100644 Binary files a/public/heron/stand.gif and b/public/heron/stand.gif differ diff --git a/public/heron/stand.webp b/public/heron/stand.webp index e9cf180..4b8a574 100644 Binary files a/public/heron/stand.webp and b/public/heron/stand.webp differ diff --git a/public/kitsune/tails.gif b/public/kitsune/tails.gif index 25b62e1..964c019 100644 Binary files a/public/kitsune/tails.gif and b/public/kitsune/tails.gif differ diff --git a/public/kitsune/tails.webp b/public/kitsune/tails.webp index ade4f75..d851b74 100644 Binary files a/public/kitsune/tails.webp and b/public/kitsune/tails.webp differ diff --git a/public/moonowl/blink.gif b/public/moonowl/blink.gif index 21c99fa..8d537a3 100644 Binary files a/public/moonowl/blink.gif and b/public/moonowl/blink.gif differ diff --git a/public/moonowl/blink.webp b/public/moonowl/blink.webp index 56a832a..340951e 100644 Binary files a/public/moonowl/blink.webp and b/public/moonowl/blink.webp differ diff --git a/public/narwhal/twirl.gif b/public/narwhal/twirl.gif index 6459709..67b2fdf 100644 Binary files a/public/narwhal/twirl.gif and b/public/narwhal/twirl.gif differ diff --git a/public/narwhal/twirl.webp b/public/narwhal/twirl.webp index 80b86af..598204e 100644 Binary files a/public/narwhal/twirl.webp and b/public/narwhal/twirl.webp differ diff --git a/public/phoenix/rise.gif b/public/phoenix/rise.gif index 1c59869..795c0ec 100644 Binary files a/public/phoenix/rise.gif and b/public/phoenix/rise.gif differ diff --git a/public/phoenix/rise.webp b/public/phoenix/rise.webp index c71b9d6..f29f4b1 100644 Binary files a/public/phoenix/rise.webp and b/public/phoenix/rise.webp differ diff --git a/public/pufferfish/puff.gif b/public/pufferfish/puff.gif index 8307c73..13d00da 100644 Binary files a/public/pufferfish/puff.gif and b/public/pufferfish/puff.gif differ diff --git a/public/pufferfish/puff.webp b/public/pufferfish/puff.webp index ab20dc3..1fb77fe 100644 Binary files a/public/pufferfish/puff.webp and b/public/pufferfish/puff.webp differ diff --git a/public/seahorse/sway.gif b/public/seahorse/sway.gif index 78f4ae4..0c46d3e 100644 Binary files a/public/seahorse/sway.gif and b/public/seahorse/sway.gif differ diff --git a/public/seahorse/sway.webp b/public/seahorse/sway.webp index 7fc2f84..172b38b 100644 Binary files a/public/seahorse/sway.webp and b/public/seahorse/sway.webp differ diff --git a/public/starfish/wave.gif b/public/starfish/wave.gif index 9d84f69..19dc4c7 100644 Binary files a/public/starfish/wave.gif and b/public/starfish/wave.gif differ diff --git a/public/starfish/wave.webp b/public/starfish/wave.webp index 4d8d3db..3d5df74 100644 Binary files a/public/starfish/wave.webp and b/public/starfish/wave.webp differ diff --git a/public/swan/glide.gif b/public/swan/glide.gif index 2f90b60..62aa8fe 100644 Binary files a/public/swan/glide.gif and b/public/swan/glide.gif differ diff --git a/public/swan/glide.webp b/public/swan/glide.webp index 8b63adb..4420211 100644 Binary files a/public/swan/glide.webp and b/public/swan/glide.webp differ diff --git a/public/teadragon/steam.gif b/public/teadragon/steam.gif index f117f6e..cbe38aa 100644 Binary files a/public/teadragon/steam.gif and b/public/teadragon/steam.gif differ diff --git a/public/teadragon/steam.webp b/public/teadragon/steam.webp index cd062ea..3c6f644 100644 Binary files a/public/teadragon/steam.webp and b/public/teadragon/steam.webp differ diff --git a/public/turtlehouse/smoke.gif b/public/turtlehouse/smoke.gif index e54b02a..d9a8379 100644 Binary files a/public/turtlehouse/smoke.gif and b/public/turtlehouse/smoke.gif differ diff --git a/public/turtlehouse/smoke.webp b/public/turtlehouse/smoke.webp index b2cd17c..b1b6cad 100644 Binary files a/public/turtlehouse/smoke.webp and b/public/turtlehouse/smoke.webp differ diff --git a/public/wisp/float.gif b/public/wisp/float.gif index bb99101..c32f571 100644 Binary files a/public/wisp/float.gif and b/public/wisp/float.gif differ diff --git a/public/wisp/float.webp b/public/wisp/float.webp index 998a5d2..f85088c 100644 Binary files a/public/wisp/float.webp and b/public/wisp/float.webp differ diff --git a/public/yeti/wave.gif b/public/yeti/wave.gif index cfb7dd5..ddba91d 100644 Binary files a/public/yeti/wave.gif and b/public/yeti/wave.gif differ diff --git a/public/yeti/wave.webp b/public/yeti/wave.webp index 2942971..2ea73cc 100644 Binary files a/public/yeti/wave.webp and b/public/yeti/wave.webp differ diff --git a/scripts/gen.js b/scripts/gen.js index 9887b71..81e9ab4 100644 --- a/scripts/gen.js +++ b/scripts/gen.js @@ -3,6 +3,7 @@ // npm run gen renders only what's missing (published files never change by accident) // npm run gen -- cat/blink renders only the named ones, even if they already exist // a file can export rim= to get a white sticker border, so black ink still shows on a black page +// and invert=true to swap ink and paper (#111 <-> #fff), turning a black silhouette with a white rim into a white one with a dark rim import{createCanvas}from'@napi-rs/canvas' import sharp from'sharp' import{readdirSync as rd,existsSync as ex,mkdirSync as mk,statSync as st}from'fs' @@ -16,9 +17,9 @@ if(dup)throw Error(`${dup} is in more than one section`) for(const[k,f]of files.entries()){ const id=ids[k],o=`public/${id}` if(redo.length?!redo.includes(id):ex(o+'.webp')&&ex(o+'.gif'))continue - const{default:draw,frames=16,delay=80,rim=0}=await import(url(resolve(f))) + const{default:draw,frames=16,delay=80,rim=0,invert=false}=await import(url(resolve(f))) const px=[...Array(frames)].map((_,i)=>{ - const c=createCanvas(S,S).getContext('2d') + let c=createCanvas(S,S).getContext('2d') Object.assign(c,{lineWidth:7,lineCap:'round',lineJoin:'round',strokeStyle:'#111',fillStyle:'#fff'}) draw(c,i/frames,i) if(rim){ @@ -26,9 +27,12 @@ for(const[k,f]of files.entries()){ const r=createCanvas(S,S).getContext('2d') for(let d=1;d<=rim;d++)for(let a=0;a<24;a++)r.drawImage(c.canvas,d*Math.cos(a*Math.PI/12),d*Math.sin(a*Math.PI/12)) r.globalCompositeOperation='source-in';r.fillStyle='#fff';r.fillRect(0,0,S,S) - r.globalCompositeOperation='source-over';r.drawImage(c.canvas,0,0);return Buffer.from(r.getImageData(0,0,S,S).data.buffer) + r.globalCompositeOperation='source-over';r.drawImage(c.canvas,0,0);c=r } - return Buffer.from(c.getImageData(0,0,S,S).data.buffer) + const b=Buffer.from(c.getImageData(0,0,S,S).data.buffer) + // 17 and 255 trade places, the antialiased grays in between flip along, alpha is untouched + if(invert)for(let j=0;jsharp(Buffer.concat(px),{raw:{width:S,height:S*frames,channels:4,pageHeight:S}})