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 00000000..f246fa3e Binary files /dev/null and b/packages/ani-cursor/src/__tests__/fixtures/AfterShock_Digital_2003/close.cur differ 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 }