Skip to content

Commit

Permalink
patterns: Add veado pattern (#339)
Browse files Browse the repository at this point in the history
* Add veado pattern

* Add veado to README

* Add veado example file
  • Loading branch information
bake authored Jan 13, 2025
1 parent fdc4a87 commit bf56d4f
Show file tree
Hide file tree
Showing 3 changed files with 183 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi
| UF2 | | [`patterns/uf2.hexpat`](patterns/uf2.hexpat) | [USB Flashing Format](https://github.com/microsoft/uf2) |
| VBMeta | | [`patterns/vbmeta.hexpat`](patterns/vbmeta.hexpat) | Android VBMeta image |
| VDF | | [`patterns/vdf.hexpat`](patterns/vdf.hexpat) | Binary Value Data Format (.vdf) files |
| VEADO | | [`patterns/veado.hexpat`](patterns/veado.hexpat) | veadotube mini avatar file |
| VGM | | [`patterns/vgm.hexpat`](patterns/vgm.hexpat) | VGM (Video Game Music) sound log |
| VHDX | | [`patterns/vhdx.hexpat`](patterns/vhdx.hexpat) | Microsoft Hyper-V Virtual Hard Disk format |
| WAV | `audio/x-wav` | [`patterns/wav.hexpat`](patterns/wav.hexpat) | RIFF header, WAVE header, PCM header |
Expand Down
182 changes: 182 additions & 0 deletions patterns/veado.hexpat
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
#pragma author bake
#pragma description veadotube mini avatar file

import std.mem;
import std.io;

struct varint {
u8 value;
};

struct String {
varint length;
char string[length.value];
};

struct Header {
char magic[9];
};

struct Meta {
String software;
String credits;
String description;
};

enum EffectFlag : u8 {
Active = 0x1,
UsePreset = 0x2,
UsePresetChunk = 0x4,
};

struct Effect {
String effect_id;
EffectFlag flag;
if (u8(flag) & EffectFlag::UsePresetChunk) {
u32 chunk_id;
}
if (u8(flag) & EffectFlag::UsePreset) {
String preset_id;
}
varint num_values;
double values[num_values.value];
};

struct Effects {
varint num_effects;
Effect effects[num_effects.value];
};

enum StateFlag : u32 {
Pixelated = 0x1,
Blink = 0x2,
Start = 0x4,
};

struct Signal {
String source;
String name;
};

enum ShortcutMode : char {
Press = "PRES",
Release = "RLSE",
WhilePressed = "PRED",
};

struct Msta {
String name;
StateFlag state;
u32 thumbnail_closed_mouth;
u32 thumbnail_open_mouth;
u32 thumbnail_blinking_closed_mouth;
u32 thumbnail_blinking_open_mouth;
u32 closed_mouth;
u32 open_mouth;
u32 blinking_closed_mouth;
u32 blinking_open_mouth;
double blink_duration;
double min_blink_interval;
double max_blink_interval;
Effects closed_mouth_effects;
Effects open_mouth_effects;
Effects on_open_mouth_effects;
Effects on_close_mouth_effects;
varint num_signals;
Signal signals[num_signals.value];
char shortcut_mode[4];
};

struct AsfdMetadata {
char type[4];
varint num_metadata;
u8 metadata[num_metadata.value];
};

struct AsfdEntry {
String entry_name;
u32 chunk_id;
varint num_metadata;
AsfdMetadata metadata[num_metadata.value];
};

struct Asfd {
char root_code[4];
AsfdEntry entries[];
};

struct Thmb {};

struct AimgFrame {
u32 chunk_id;
s32 offset_x;
s32 offset_y;
double duration;
};

struct Aimg {
u32 width;
u32 height;
varint num_frames;
if (num_frames.value > 1) {
varint num_loops;
}
AimgFrame frames[num_frames.value];
};

struct Abmp {
u32 width;
u32 height;
char format[4];
u32 num_as;
u32 num_rs;
u32 num_gs;
u32 num_bs;
if (format == "VDD." && num_as < 0xffffff00) {
u32 _as[num_as];
}
if (format == "VDD." && num_rs < 0xffffff00) {
u32 _rs[num_rs];
}
if (format == "VDD." && num_gs < 0xffffff00) {
u32 _gs[num_gs];
}
if (format == "VDD." && num_bs < 0xffffff00) {
u32 _bs[num_bs];
}
if (format == "RAW.") {
u32 data[];
}
};

struct Chunk {
u32 id;
char type[4];
u32 length;
if (type == "META") {
Meta meta;
} else if (type == "MLST") {
u32 chunk_ids[length / 4];
} else if (type == "MSTA") {
Msta msta;
} else if (type == "ASFD") {
u64 startAddress = $;
Asfd asfd;
AsfdEntry entries[while ($ - startAddress < length)];
} else if (type == "THMB") {
Thmb thmb;
padding[length];
} else if (type == "AIMG") {
Aimg aimg;
} else if (type == "ABMP") {
Abmp abmp;
padding[length - sizeof(abmp)];
} else {
std::print("unknown type {}", type);
padding[length];
break;
}
};

Header header @0x00;
Chunk data[while (!std::mem::eof())] @$;
Binary file added tests/patterns/test_data/veado.hexpat.veado
Binary file not shown.

0 comments on commit bf56d4f

Please sign in to comment.