From 4e8aec1935f2a415616ce56c68cb0200eb3889b1 Mon Sep 17 00:00:00 2001 From: Lukas Cone Date: Sun, 13 Feb 2022 01:05:44 +0100 Subject: [PATCH] patterns: Add TGA pattern (#29) --- README.md | 1 + patterns/tga.hexpat | 79 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 patterns/tga.hexpat diff --git a/README.md b/README.md index 7a6db02..4fa2cd6 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Hex patterns, include patterns and magic files for the use with the ImHex Hex Ed | ICO | | `patterns/ico.hexpat` | Icon (.ico) or Cursor (.cur) files | | PNG | `image/png` | `patterns/png.hexpat` | PNG image files | | DDS | `image/vnd-ms.dds` | `patterns/dds.hexpat` | DirectDraw Surface | +| TGA | `image/tga` | `patterns/tga.hexpat` | Truevision TGA/TARGA image | ### Scripts diff --git a/patterns/tga.hexpat b/patterns/tga.hexpat new file mode 100644 index 0000000..36de4a8 --- /dev/null +++ b/patterns/tga.hexpat @@ -0,0 +1,79 @@ +#pragma MIME image/tga +#pragma endian little + +#include + +struct ColorMapSpec { + u16 entryIndex; + u16 entryLength; + u8 bpp; +} [[static]]; + +bitfield ImageDesc { + alphaDepth : 4; + orderRightToLeft : 1; + orderTopToBottom : 1; + padding : 2; +}; + +struct ImageSpec { + u16 xOrigin; + u16 yOrigin; + u16 width; + u16 height; + u8 depth; + ImageDesc imageDesc; +} [[static]]; + +enum ColorMapType : u8 { + None, + ColorPalette, +}; + +enum ImageType : u8 { + NoData, + UncompressedColorMapped, + UncompressedRGB, + UncompressedGreyscale, + RLEColorMapped = 9, + RLERGB, + RLEGreyscale, + // huffman + delta + rle + CompressedColorMapped = 32, + // huffman + delta + rle, 4-pass quadtree-type + CompressedColorMapped4Pass, +}; + +fn GetImageDataSize(ImageSpec imSpec) { + return imSpec.height * imSpec.width * (imSpec.depth / 8); +}; + +fn GetColorMapDataSize(ColorMapSpec cmSpec) { + return cmSpec.entryLength * (cmSpec.bpp / 8); +}; + +struct Header { + u8 idLength; + ColorMapType colorMapType; + ImageType imageType; + ColorMapSpec colorMapSpec; + ImageSpec imageSpec; + char imageId[idLength]; + + if (colorMapType == ColorMapType::ColorPalette) { + u8 colorMapData[GetColorMapDataSize(colorMapSpec)]; + } + + u8 imageData[GetImageDataSize(imageSpec)]; +}; + +struct Footer { + u32 extensionOffset; + u32 developerDirectoryOffset; + char signature[0x10]; + char dot; + char null; +}; + +Header header @ 0x0; +Footer footer @ std::mem::size() - 0x1A;