From a4a14309bed9ad88d5f1e1e20364671252261c46 Mon Sep 17 00:00:00 2001 From: Max1Truc <26603929+Max1Truc@users.noreply.github.com> Date: Mon, 9 Jan 2023 07:29:33 +0100 Subject: [PATCH] patterns/qoi: Added QOI pattern (#71) For more information on QOI: https://qoiformat.org/ --- README.md | 1 + patterns/qoi.hexpat | 98 ++++++++++++++++++++++++ tests/patterns/test_data/qoi.hexpat.qoi | Bin 0 -> 9715 bytes 3 files changed, 99 insertions(+) create mode 100644 patterns/qoi.hexpat create mode 100644 tests/patterns/test_data/qoi.hexpat.qoi diff --git a/README.md b/README.md index 9a60708..00ad5af 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 | ARM VTOR | | [`patterns/arm_cm_vtor.hexpat`](patterns/arm_cm_vtor.hexpat) | ARM Cortex M Vector Table Layout | | ICO | | [`patterns/ico.hexpat`](patterns/ico.hexpat) | Icon (.ico) or Cursor (.cur) files | | PNG | `image/png` | [`patterns/png.hexpat`](patterns/png.hexpat) | PNG image files | +| QOI | `image/qoi` | [`patterns/qoi.hexpat`](patterns/qoi.hexpat) | QOI image files | | DDS | `image/vnd-ms.dds` | [`patterns/dds.hexpat`](patterns/dds.hexpat) | DirectDraw Surface | | TGA | `image/tga` | [`patterns/tga.hexpat`](patterns/tga.hexpat) | Truevision TGA/TARGA image | | ISO | | [`patterns/iso.hexpat`](patterns/iso.hexpat) | ISO 9660 file system | diff --git a/patterns/qoi.hexpat b/patterns/qoi.hexpat new file mode 100644 index 0000000..377ba31 --- /dev/null +++ b/patterns/qoi.hexpat @@ -0,0 +1,98 @@ +#pragma MIME image/qoi +#pragma endian big + +#include + +namespace qoi { + +enum channels_t : u8 { + RGB = 3, + RGBA = 4 +}; + +enum color_space_t : u8 { + sRGB = 0, + linear = 1 +}; + +struct header_t { + char magic[4]; + u32 width; + u32 height; + channels_t channels; + color_space_t color_space; +}; + +enum tags_t : u8 { + index = 0b00000000 ... 0b00111111, + diff = 0b01000000 ... 0b01111111, + luma = 0b10000000 ... 0b10111111, + run = 0b11000000 ... 0b11111101, + rgb = 0b11111110, + rgba = 0b11111111, +}; + +bitfield op_index { + tag: 2; + index: 6; +} [[color("0000FF")]]; + +bitfield op_diff { + tag: 2; + dr: 2; + dg: 2; + db: 2; +} [[color("FFFFFF")]]; + +bitfield op_luma { + tag: 2; + diff_green: 6; + dr_dg: 4; + db_dg: 4; +} [[color("FFFF00")]]; + +bitfield op_run { + tag: 2; + run_length: 6; +} [[color("00FF00")]]; + +struct op_rgb { + u8 tag; + u8 red; + u8 green; + u8 blue; +} [[color("FF7700")]]; + +struct op_rgba { + u8 tag; + u8 red; + u8 green; + u8 blue; + u8 alpha; +} [[color("FF0000")]]; + +u8 op_type; +fn get_op_type() { + op_type = std::mem::read_unsigned($, 1); + if (op_type < tags_t::rgb) + op_type &= 0b11000000; +}; + +struct op_t { + qoi::get_op_type(); + if (op_type == tags_t::index) op_index; + else if (op_type == tags_t::diff) op_diff; + else if (op_type == tags_t::luma) op_luma; + else if (op_type == tags_t::run) op_run; + else if (op_type == tags_t::rgb) op_rgb; + else if (op_type == tags_t::rgba) op_rgba; +}; + +struct file_t { + header_t header; + op_t data[while(!std::mem::eof())]; +}; + +} // namespace qoi + +qoi::file_t qoi_picture @ 0x0; diff --git a/tests/patterns/test_data/qoi.hexpat.qoi b/tests/patterns/test_data/qoi.hexpat.qoi new file mode 100644 index 0000000000000000000000000000000000000000..085d31708d366aba82a6df2c4a297ebe83a0bf95 GIT binary patch literal 9715 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ℜ_!jXMNo#^ zXWXOgkx(9{n4&Hpi!3-vPoWTu!FD`k&Gma6nk;cxHDLaBfRiLTSmKy160sb;(ne9* zm}7IW^*Nm!wHD{4`Qw%*6uEme24Z3ivX4dNAEy#H2eB43z!_R*l%KI8$)+=U!O)w4 zRJcfVwtCmKv@Zf==*nph$+9|Fc=j<4p;WL>BsU?5LtIP}@Or;lwQTWzk3WGijt z+WMx=?w&TbJh4gVoRgWq@@0cjzr$Z-$)S|F(x-zO0m^bPwaIm!&qC+1CB(Y!9?U0B z!7*@hb-j3E{!9$gqq^?%r8tw>=o>1xhb@iYPpsr}uz1x|Ho+OKH5|<`+{Vo# zSS7!e*lIt^a_cX$t5RWUxpi!g*Mf|}w~X~Ky^ae5&uLcF`07bkY;^Zphz*trs|`M&HMvGvY=K?>%8{1PgC+37P@0s>MnMk7*97QuNa+r~ z0Dt4nH$6MXj0f(pvW8l%VO;v1{i}#N{)+FpbZy#?oBUa?*kQ zuK2<|R%E@yvhcDr^5f@K<`X5i4=)>@-J? z@XUQ?u;8j9uVZnggm)`^Pt-r{$1O>C9l3K-F$+& zXWnOpPu#*4nsc>L{9O8;zQM#>244Q5082O_|Eji2g%dN7hKs4Dh8?^G=+US<-^&X3 z-vkI3WVop?k0V(hN@FQ}HhclYl4>sgjV3JVlKq8@@b(HqtCprYTQlqT4z~@D2BMp_ zqxU$=-;bLbx^LSNA>MO7z=U@r{LdY9^BiQ5MQ8~mmcr>qyHlNwp6&^ljRtl1ZL)L?BqW_e;? zJLdA=aD<3oNS`eI`j@#9Fc%iJsfgyuLUA`K9dnG0FK|PY z@0^(XM@gHDw{dJrvv38(?=dzNb;xYp7OGzeJTD43Nu_JlD;kGKNM4=^H#2#A`ArC2 zG<|0OENF7>UAmmXJa~Ca*w#NKun?1lWgew{;iA%Og!xNW*`ro9;VpQ0^zUYyrF3Gp zxbIRvvriy1RqV`sE`ABI3G>WBL!kyJ+Vf^=AvQ-IZ7`U`UmAG=Eeqdy<51O^Du_SR z7Dd;tSWxwg+@->HTFeoqbfPnz-l; zeP)F^ge5#5us5!trJAixZ)UDu~*MG{$tYMKQboi+mx6)3=>!#otW88wH&M< z)aveGmRxoAJ(g5)=6&qbr$10`Xlzr-sSkf*n~I>gQ4^%=>Gs6Vd3Zi literal 0 HcmV?d00001