From 3c2fed22e4dea9930de40f4ece3f1fd61b731dd3 Mon Sep 17 00:00:00 2001 From: Benjamin Gilbert Date: Sun, 19 May 2024 09:58:03 -0500 Subject: [PATCH] patterns: Add Windows animated cursor (#242) * patterns: Add Windows animated cursor * Added readme entry * Added mime type to readme --------- Co-authored-by: Nik --- README.md | 1 + patterns/ani.hexpat | 66 ++++++++++++++++++++++++ tests/patterns/test_data/ani.hexpat.ani | Bin 0 -> 55868 bytes 3 files changed, 67 insertions(+) create mode 100644 patterns/ani.hexpat create mode 100644 tests/patterns/test_data/ani.hexpat.ani diff --git a/README.md b/README.md index 4674d18..62172db 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | 3DS | | [`patterns/3ds.hexpat`](patterns/3ds.hexpat) | Autodesk 3DS Max Model file | | 7Z | | [`patterns/7z.hexpat`](patterns/7z.hexpat) | 7z File Format | | AFE2 | | [`patterns/afe2.hexpat`](patterns/afe2.hexpat) | Nintendo Switch Atmosphère CFW Fatal Error log | +| ANI | `application/x-navi-animation` | [`patterns/ani.hexpat`](patterns/ani.hexpat) | Windows Animated Cursor file | | AR | `application/x-archive` | [`patterns/ar.hexpat`](patterns/ar.hexpat) | Static library archive files | | ARIA2 | | [`patterns/aria2.hexpat`](patterns/aria2.hexpat) | ARIA2 Download Manager Control files | | ARM VTOR | | [`patterns/arm_cm_vtor.hexpat`](patterns/arm_cm_vtor.hexpat) | ARM Cortex M Vector Table Layout | diff --git a/patterns/ani.hexpat b/patterns/ani.hexpat new file mode 100644 index 0000000..f23ff75 --- /dev/null +++ b/patterns/ani.hexpat @@ -0,0 +1,66 @@ +#pragma description Windows animated cursor +#pragma MIME application/x-navi-animation +#pragma endian little + +import std.io; +import std.mem; + +bitfield HeaderFlags { + icon : 1; + sequence : 1; + padding: 30; +}; + +struct anih { + u32 struct_size; + u32 stored_frames; + u32 animation_steps; + u32 w; + u32 h; + u32 bits; + u32 planes; + u32 default_jiffies; + HeaderFlags flags; +}; + +struct rate { + u32 jiffies[parent.size / 4]; +}; + +struct seq { + u32 index[parent.size / 4]; +}; + +struct RiffChunk { + char signature[4]; + u32 size; + if (signature == "RIFF" || signature == "LIST") { + char type[4]; + RiffChunk chunks[while($ - addressof(type) < size)]; + } else if (signature[0] == 'I' && parent.type == "INFO") { + char info[size]; + } else if (signature == "anih") { + anih anih [[inline]]; + } else if (signature == "rate") { + rate rate [[inline]]; + } else if (signature == "seq ") { + seq seq [[inline]]; + } else { + std::mem::Bytes data; + } + padding[size % 2]; +} [[format_read("read_chunk")]]; + +fn read_chunk(RiffChunk chunk) { + if (chunk.signature == "RIFF" || chunk.signature == "LIST") { + return std::format("{}<{}> ({})", chunk.signature, chunk.type, chunk.size); + } else { + str ret = std::format("{} ({})", chunk.signature, chunk.size); + try { + ret += std::format(" \"{}\"", chunk.info); + } catch {} + return ret; + } +}; + +RiffChunk riff @ 0; diff --git a/tests/patterns/test_data/ani.hexpat.ani b/tests/patterns/test_data/ani.hexpat.ani new file mode 100644 index 0000000000000000000000000000000000000000..1dc061b1218e431b1e061fec630bb935d3751978 GIT binary patch literal 55868 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 AV*mgE literal 0 HcmV?d00001