From 5b8dde19a96899c6c35d82de35244a7951c53e35 Mon Sep 17 00:00:00 2001 From: DEREFERENC3D Date: Sat, 10 May 2025 13:34:16 +0200 Subject: [PATCH] patterns: Added definition for the OpenRGB profile format (#387) patterns: Add definition for the OpenRGB profile format (up to version 5) --- README.md | 1 + patterns/orp.hexpat | 134 ++++++++++++++++++++++++ tests/patterns/test_data/orp.hexpat.orp | Bin 0 -> 6320 bytes 3 files changed, 135 insertions(+) create mode 100644 patterns/orp.hexpat create mode 100755 tests/patterns/test_data/orp.hexpat.orp diff --git a/README.md b/README.md index 323019d..a284b3d 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | NTAG | | [`patterns/ntag.hexpat`](patterns/ntag.hexpat) | NTAG213/NTAG215/NTAG216, NFC Forum Type 2 Tag compliant IC | | NTFS | | [`patterns/ntfs.hexpat`](patterns/ntfs.hexpat) | NTFS (NT File System) | | OGG | `audio/ogg` | [`patterns/ogg.hexpat`](patterns/ogg.hexpat) | OGG Audio format | +| ORP / ORS | | [`patterns/orp.hexpat`](patterns/orp.hexpat) | OpenRGB profile format | | PAK | | [`patterns/xgspak.hexpat`](patterns/xgspak.hexpat) | Exient XGS Engine Pak files | | PCAP | `application/vnd.tcpdump.pcap` | [`patterns/pcap.hexpat`](patterns/pcap.hexpat) | pcap header and packets | | PcapNG | `application/vnd.tcpdump.pcap` | [`patterns/pcapng.hexpat`](patterns/pcapng.hexpat) | pcapng header and packets | diff --git a/patterns/orp.hexpat b/patterns/orp.hexpat new file mode 100644 index 0000000..33b994a --- /dev/null +++ b/patterns/orp.hexpat @@ -0,0 +1,134 @@ +#pragma description OpenRGB Profile + +#pragma magic [ 4F 50 45 4E 52 47 42 5F 50 52 4F 46 49 4C 45 00 ] @ 0x00 + +import type.magic; +import std.mem; + +using Controller; + +struct Profile { + type::Magic<"OPENRGB_PROFILE\x00"> signature; + u32 version; + Controller controllers[while(!std::mem::eof())]; +}; + +Profile profile @ 0x00; + +using Mode; +using Zone; +using led; +using RGBColor; +using _LedAltName; +struct Controller { + u32 size; + s32 device_type; + u16 name_len; + char name[name_len]; + u16 vendor_len; + char vendor[vendor_len]; + u16 description_len; + char description[description_len]; + if (parent.version >= 1) { + u16 version_len; + char version[version_len]; + } + u16 serial_len; + char serial[serial_len]; + u16 location_len; + char location[location_len]; + u16 num_modes; + u32 active_mode; + Mode modes[num_modes]; + u16 num_zones; + Zone zones[num_zones]; + u16 num_leds; + led leds[num_leds]; + u16 num_colors; + RGBColor colors[num_colors]; + if (parent.version >= 5) { + u16 num_led_alt_names; + _LedAltName led_alt_names[num_led_alt_names]; + u32 flags; + } +}; + +struct Mode { + u16 name_len; + char name[name_len]; + u32 value; + u32 flags; + u32 speed_min; + u32 speed_max; + if (parent.parent.version >= 3) { + u32 brightness_min; + u32 brightness_max; + } + u32 colors_min; + u32 colors_max; + u32 speed; + if (parent.parent.version >= 3) { + u32 brightness; + } + u32 direction; + u32 color_mode; + u16 colors_len; + RGBColor colors[colors_len]; +}; + +using zone_type = s32; + +using matrix_map_type; +using segment; +struct Zone { + u16 name_len; + char name[name_len]; + zone_type type; + u32 leds_min; + u32 leds_max; + u32 leds_count; + u16 matrix_len; + matrix_map_type matrix[matrix_len]; + if (parent.parent.version >= 4) { + u16 segments_len; + segment segments[segments_len]; + } + if (parent.parent.version >= 5) { + u32 flags; + } +}; + +struct led { + u16 name_len; + char name[name_len]; + u32 value; +}; + +struct RGBColor { + u8 red [[color("FF0000")]]; + u8 green [[color("00FF00")]]; + u8 blue [[color("0000FF")]]; + u8 alpha; +} [[ + color(std::format("{:02X}{:02X}{:02X}{:02X}", red, green, blue, alpha)), + hex::inline_visualize("color", red, green, blue, alpha) +]]; + +struct _LedAltName { + u16 name_len; + char name[name_len]; +}; + +struct matrix_map_type { + u32 height; + u32 width; + u32 map[width * height]; +}; + +struct segment { + u16 name_len; + char name[name_len]; + zone_type type; + u32 start_idx; + u32 leds_count; +}; diff --git a/tests/patterns/test_data/orp.hexpat.orp b/tests/patterns/test_data/orp.hexpat.orp new file mode 100755 index 0000000000000000000000000000000000000000..a0db0b0a0be946aee2b48e8d3fb91d8ac0517e3d GIT binary patch literal 6320 zcmcIoO>7fK6n@Y+AtulSXh=(2O@9F?A@;7FAIgCwPDnz69Xk-zs;buUCSGB$)Afcl zN|Aa;NK_m+aDWSl0~ZdQ;KHRvT;bMATsZVb4~Pq@-1la@_R9OHvWHGG`}58F`)1z! ztkapvGucz)KV-7$shPP+hycLxT>v}qeh^Mu_G;Cw*kWqk*%YZ%HYrdTIvWiTYdk8M zanq=}gIUuySB-*6Dv80QNM*<7MasNrEt_N+|38NrZQ{5XESMJuEp2%q)-Q}g!7-~< zvnsxe{WKK+9`-{AM$rK&%Q2T-=*E{AR(~n@U+_6of2Z(CHRl?xwJcw}Ci#LFQYA4Z z+Em>su^L`?LDsPBd}Tw*e1OOatX}cE{t!X3Pr9mfLT(L%cGkz zy#+KF^~~a({F0yDbKVl^}UU!f_JrmZBRocV5>YhyP5_V5&(>BW3y={n7n17)mPtLF3kB0nVMk&H= zh1m|dl2tHeTAo!Zq$vw|@HzrBwlM&N?F5PtY8i|YEx1L~fe1!HQA*!IXqL>iisM2ABls^zUa%B^BCy@=AV(2cvg`sxu&=}PNH{j_Fi|O+t{i#J ziML4?=CFER6&5C;+acpv z)iO|MRNuA8`sXK#Vc7v)GC+|lRa_C5>s1%xUX?=feZOC>U(8LWP@D?Wph-JSgDx|W zX-LQwlxaxHrIBeEk~zXO49h9UG>pg$V;V-~yg9%SjLCH2TH-PnxE4(gXqU_p8pQ2Z zwOQo5Wv9YdFrS+d^JAyPx5J|`v6!A8n;u&_EtY1cX2g;C+`w>ZG=3C22gTqECA?Y1 zom$LMrq+)N;z)cXIgsCU&7-*ak7WkuQX+P2SPY8zu_WvPGNNg5EvChWao$bOr0NHX zqE&E=jUl<~`VJ5@QG^OmUTJId@2tKinF7881g=sLql>S!s(SBAtPRpDD?VxU$hq|N zXo;hM)TWFlFPU!fx>uT4R6J>VrY7%QiQ%GGGO9&VCUf^gDMvx}zD?S+goSh60rRG7 zRvek9;T-SA-KJD=M3y|ikDhHgzc*$}#zhmq z6vF0O^K4B!e7Ml}c;|8xv28}2T%_ywo-K1u|y;-f54Y#*CBGoD^j+bMxhuo68wfptQ5GB=q$H<_w0 zk?ORw52l=o?TR&=hb2*U9cxXt(=tK>Or>dB?XZOXja7Zfywh|PCXA{nRt&q^Fi9UI zRGKFBMmS{hm~4%_E82rFkvS`-3|qv-fUr%&5$<~4Y}%&-#QuhmhC*elP$Q7=RVU0IWC$ zU_~+j^DH%~bTWsic&h!&i)1N{$c?N1lbrwyqXp%*TSag_0 z)%QYc45L!E$+^xV#=~(QR`dc!6u$th2nJxqFaRrx0a$Siz=~u5=2_z8q`_*H#>vUT zJWHIMtTfLOCnqb-v&6~CO7kpna&po*Ia!!zsq-v#o~6#S)OnUV&r;`E>O4!GXPMwx zCU}+!o@Ih(nc!I_c$Nvp^1S@Pk$!Xx)}ImkziZI1{@Wsa^G6=0|Ji~Qe=bAf_eJP` zFb#(fABLw-pF%d9h0B*O!@|M>+`W4j9zJ{s&z?Pl-riogb?X+~xpN2l`ubpNYYX1I zc>_0Y+<>=l-@@zHuR#a_`FtK8J$eMUZ{LP;xeT+jv(VGi16QtGfoL=e*REZYa_Mv$ z*4Eafj~6dqz~je{;oiM_U>F8my?PZUCMKX*ECRJrxq0&@T)%!D+S=Nrzn3px!t>|P Jv4u`Y{{s9K{A2(C literal 0 HcmV?d00001