From aa952c29e69826e8aa518d60bedca2ffa60099ed Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Tue, 5 Jan 2021 22:42:12 -0800 Subject: [PATCH] Handle ani frames in odd place --- .../__snapshots__/parser.test.ts.snap | 23 ++++++++++++++++-- .../AfterShock_Digital_2003/close.cur | Bin 0 -> 20496 bytes .../ani-cursor/src/__tests__/parser.test.ts | 6 +++++ packages/ani-cursor/src/parser.ts | 14 ++++++++++- 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 packages/ani-cursor/src/__tests__/fixtures/AfterShock_Digital_2003/close.cur diff --git a/packages/ani-cursor/src/__tests__/__snapshots__/parser.test.ts.snap b/packages/ani-cursor/src/__tests__/__snapshots__/parser.test.ts.snap index f611b6bc..fecfcc79 100644 --- a/packages/ani-cursor/src/__tests__/__snapshots__/parser.test.ts.snap +++ b/packages/ani-cursor/src/__tests__/__snapshots__/parser.test.ts.snap @@ -1,8 +1,27 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`AfterShock_Digital_2003.wsz close.cur 1`] = ` +" + @keyframes ani-cursor-3 { + 0% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } +6.25%, 93.75% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } +12.5%, 87.5% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } +18.75%, 81.25% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } +25%, 75% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } +31.25%, 68.75% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } +37.5%, 62.5% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } +43.75%, 56.25% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } +50% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACA...), auto; } + } + #example:hover { + animation: ani-cursor-3 2666.666666666667ms step-end infinite; + } + " +`; + exports[`Edge cases piano.ani 1`] = ` " - @keyframes ani-cursor-3 { + @keyframes ani-cursor-4 { 0% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; } 20% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; } 40% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; } @@ -10,7 +29,7 @@ exports[`Edge cases piano.ani 1`] = ` 80% { cursor: url(data:image/x-win-bitmap;base64,AAACAAEAICAAAA0ACQDoAgAAFgAAACgAAAAgAAAAQAAAAAEABA...), auto; } } #example:hover { - animation: ani-cursor-3 1250ms step-end infinite; + animation: ani-cursor-4 1250ms step-end infinite; } " `; diff --git a/packages/ani-cursor/src/__tests__/fixtures/AfterShock_Digital_2003/close.cur b/packages/ani-cursor/src/__tests__/fixtures/AfterShock_Digital_2003/close.cur new file mode 100644 index 0000000000000000000000000000000000000000..f246fa3e84c37e262b1edaab7b6ae0d04c022348 GIT binary patch literal 20496 zcmeI4KWtk?9LIm50T+s})k=uLB5z{DwPZ!IwYcjM3f}B0WwtN z#tcYwiRFR8140=y-Vh;=5mN?+3`At~cw+=e=JR|0lY1{Fw2r7$_0IYE-F<#{_dCDT z?|plBFL$PI-4fD`o404?mzNgbA+Po-R>G2=UF0~1y@p-DYV&Ig*L!7UquRrTuM+J? zllK1-ru~m&FJrG@1x(}XQOnBJul2OPwyREmGJB2V^vtc>(>LzSzEA#UZGlnVPrhAR zTTEu>zgS3a&wQMG@ZN_>^e4+7<) zxhc*$+1uNbgM$NUx7*^qm*eAOX*Qd(v$G@n`}=ZqbR^|URVwAGl&ck~RLfE=SEO1g zOLF&t+0`R+{3R{AIaqG_fj&%H^eu@H^eu@H^he7hw)ORZ!x_A$lJ>7XoDc!^Mn%k_ z?K_8cQrcu_{LbO-ZZC%RuPM_%{{9fOqcjDduSowv{S!|&myRzFgL0kW2gOs_dN`O< zUOsYt2n^7FxPzJ_Ww{27ls1mJh^Vb&lh|9BURo~p^2*eAES)hTT)+xg5u3oKunjD# zn5bf+iis*lbxc$-BVEE@xJDzYm@9=VeHAl~Mi>uo%zBp&Rm?cjo&Z-c_=_8Ap3Bz{ye=lFMwkQgaN6%*%T_`kS`b1`u)CeFp2;{qI;KJ^(GQN9Ba1S#k=dQkXso=3*%A^2+*yxfq>n+09JFC<%fNYah(TXzlD&4kVb1VSOgIVAS=8 zL+F37-cj41;qHzv*Cs5!s49jT9Qk{!Bag6;urfA|z23_!Qy=x>ic;Jc!@dmmv&4Nd zabHY-<4oKa6W&H*{#<7ut71-fr7C7H7sHy5F8+kIvMMH(899GOBdAQt`9l>mtbM3r zx-umjKU6WHr<+ezPG$(%I#I=pwxXmeM(w)`9l3_RjlF`s(aS5_=+=oUCaRdIV&d-J z?9P{{VzM`)SUSfUcoG#e*cUS-PEN(B%*oWs&sAvsFlFarbhm4EKWnNofZ0|jJ)|mS zuzmN0_j6Ij^v}f5<46*QMhKLyiXkIYg^o;M1+3W1Pr=nky{KZMiis*Fs+g!^hF*dr zJpUPZ5*0IeMrla6yo$+J$*UOI%GSuMn5ct+`zx7+>|a)PX6o#^BX|)R zBc%;mWmOF2!XKy@juY4vMy04?;@^uw#l^oD6aQXJ?pf-%qBO$gIyM=82A;W!$qgf_ SnA{1;6`v~=gKBw774r{Ao2R@0 literal 0 HcmV?d00001 diff --git a/packages/ani-cursor/src/__tests__/parser.test.ts b/packages/ani-cursor/src/__tests__/parser.test.ts index 69ba3ab2..8e2b1034 100644 --- a/packages/ani-cursor/src/__tests__/parser.test.ts +++ b/packages/ani-cursor/src/__tests__/parser.test.ts @@ -32,6 +32,12 @@ describe("Green Dimension v2.wsz", () => { }); }); +describe("AfterShock_Digital_2003.wsz", () => { + test("close.cur", async () => { + expect(readPathCss("AfterShock_Digital_2003/close.cur")).toMatchSnapshot(); + }); +}); + describe("Edge cases", () => { test("piano.ani", async () => { expect(readPathCss("piano.ani")).toMatchSnapshot(); diff --git a/packages/ani-cursor/src/parser.ts b/packages/ani-cursor/src/parser.ts index 4856035b..eef27273 100644 --- a/packages/ani-cursor/src/parser.ts +++ b/packages/ani-cursor/src/parser.ts @@ -86,7 +86,7 @@ export function parseAni(arr: Uint8Array): ParsedAni { throw new Error("Did not find fram LIST"); } - const images = imageChunk.subChunks.slice(0, metadata.nFrames).map((c) => { + let images = imageChunk.subChunks.slice(0, metadata.nFrames).map((c) => { if (c.chunkId !== "icon") { throw new Error(`Unexpected chunk type in fram: ${c.chunkId}`); } @@ -106,6 +106,18 @@ export function parseAni(arr: Uint8Array): ParsedAni { case "IART": artist = unpackString(arr, c.chunkData.start, c.chunkData.end); break; + case "LIST": + // Some cursors with an artist of "Created with Take ONE 3.5 (unregisterred version)" seem to have their frames here for some reason? + if (c.format === "fram") { + images = c.subChunks.slice(0, metadata.nFrames).map((c) => { + if (c.chunkId !== "icon") { + throw new Error(`Unexpected chunk type in fram: ${c.chunkId}`); + } + return arr.slice(c.chunkData.start, c.chunkData.end); + }); + } + break; + default: // Unexpected subchunk }