From d4045b76c34f54ec21a2eaebcd529b58ccadca83 Mon Sep 17 00:00:00 2001 From: Pascal Date: Mon, 16 Jan 2023 12:07:11 +0100 Subject: [PATCH] patterns/pif: Add PIF image pattern (#76) * Added PIF pattern * tests/patterns: Added test file for pif pattern * Added pif pattern to list * Delete pif.hexpat.pif * patterns: Added pif image format pattern --- README.md | 1 + patterns/pif.hexpat | 76 ++++++++++++++++++++++++ tests/patterns/test_data/pif.hexpat.pif | Bin 0 -> 2495 bytes 3 files changed, 77 insertions(+) create mode 100644 patterns/pif.hexpat create mode 100644 tests/patterns/test_data/pif.hexpat.pif diff --git a/README.md b/README.md index a538f2d..7387742 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ Hex patterns, include patterns and magic files for the use with the ImHex Hex Ed | CCHVA | | [`patterns/cchva.hexpat`](patterns/cchva.hexpat) | Command and Conquer Voxel Animation | | CCVXL | | [`patterns/ccvxl.hexpat`](patterns/ccvxl.hexpat) | Command and Conquer Voxel Model | | CCPAL | | [`patterns/ccpal.hexpat`](patterns/ccpal.hexpat) | Command and Conquer Voxel Palette | +| PIF | `image/pif` | [`patterns/pif.hexpat`](patterns/pif.hexpat) | PIF Image Format | ### Scripts diff --git a/patterns/pif.hexpat b/patterns/pif.hexpat new file mode 100644 index 0000000..324e291 --- /dev/null +++ b/patterns/pif.hexpat @@ -0,0 +1,76 @@ +/* PIF - Portable Image Format + * + * Basic decoder for the PIF file structure + * https://github.com/gfcwfzkm/PIF-Image-Format + */ + +#pragma MIME image/pif +#pragma endian little + +enum imageType_t : u16 { + RGB888 = 0x433C, + RGB565 = 0xE5C5, + RGB332 = 0x1E53, + RGB16C = 0xB895, + BLWH = 0x7DAA, + IND24 = 0x4952, + IND16 = 0x4947, + IND8 = 0x4942 +}; + +enum compression_t : u16 { + NO_COMPRESSION = 0, + RLE_COMPRESSION = 0x7DDE +}; + +struct PIFFileHeader { + char Signature[4]; + u32 FileSize; + u32 ImageOffset; +}; + +struct PIFInfoHeader { + imageType_t ImageType; + u16 BitsPerPixel; + u16 ImageWidth; + u16 ImageHeight; + u32 ImageSize; + u16 ColorTableSize; + compression_t Compression; +}; + +struct PIF { + PIFFileHeader PIF_FileHeader; + PIFInfoHeader PIF_ImageHeader; + + if (PIF_ImageHeader.ImageType == imageType_t::IND24) + { + u24 ColorTable[PIF_ImageHeader.ColorTableSize/3]; + } + else if (PIF_ImageHeader.ImageType == imageType_t::IND16) + { + u16 ColorTable[PIF_ImageHeader.ColorTableSize/2]; + } + else if (PIF_ImageHeader.ImageType == imageType_t::IND8) + { + u8 ColorTable[PIF_ImageHeader.ColorTableSize]; + } + + if ((PIF_ImageHeader.ImageType == imageType_t::RGB888) || + (PIF_ImageHeader.ImageType == imageType_t::IND24)) + { + u24 ImageData[(PIF_FileHeader.FileSize - PIF_FileHeader.ImageOffset)/3]; + } + else if ((PIF_ImageHeader.ImageType == imageType_t::RGB565) || + (PIF_ImageHeader.ImageType == imageType_t::IND16)) + { + u16 ImageData[(PIF_FileHeader.FileSize - PIF_FileHeader.ImageOffset)/2]; + } + else if ((PIF_ImageHeader.ImageType == imageType_t::RGB332) || + (PIF_ImageHeader.ImageType == imageType_t::IND8)) + { + u8 ImageData[(PIF_FileHeader.FileSize - PIF_FileHeader.ImageOffset)/1]; + } +}; + +PIF pif @ 0x00; diff --git a/tests/patterns/test_data/pif.hexpat.pif b/tests/patterns/test_data/pif.hexpat.pif new file mode 100644 index 0000000000000000000000000000000000000000..ea8b0e90fb87a4e62ff5bbbacb2763bdf183e2cd GIT binary patch literal 2495 zcmd6p&u-K(5XOyn<7~^t+ZKr}T$$T)NT*iDM5Ni6fWY6Nne!1kb?} zAn_I)d5=ns%{ODG$^I!I!~w0eisv`qcs#Zzxx9ETzU>I{R0#3nVjw=?_X%Sye!TPk z@yD+(UzgvD&rgc%%lN(M{|@z&XTHx+Jsv0gBI?n7#N=oSh@wK8z7Vxsh8{VHptp`^fY&nZV$r~ zZ5C8(`@6}cxv{6FlsFKypX&}zm+37cr!HP6H}fJ?tuPeh|4i(h2hLYSW(D$=y@0e_U+0xv#kPUWkoCU zd2pdnsLhP_Qd(7cwT(5}&N@aBI$fVhn)cbC;}u;%NZp*{N}JGQ6tBQ0x3jIVhSKFo z&DAW#^`AkB>XL;R#c!Epq^f4V%C65XGPAS5lgiI!O>2cZVP{;0bDOeSqV>c&ROEGw z8ePp>)P~@-ARM)`j)o8&Lpw`j%oW5PEutn5dZ?ypv)ST161#l=mi)@B!g>L8I$Ms|o6sI9;bP*g9Bj0@QfH1z?Fg zV=aaHLx49_%nE{K7wLEQ=Bi%ErL5%^4KdZXUxqn)_R2rl8KXaj8|ALBGR&P%&`#)n zMnjXEa>54xb_55PV;I^}7;74H@7OxVM@t`jJ>k}Z^052A7^9!i&5rRNTJ(?GF?E+o eZ;Wm-i7h1hAL8;;JIZNe@1xlsn(ia)jra-n@CB*> literal 0 HcmV?d00001