From f91638c461852101df6e50b73f642b644d769bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 8 Nov 2024 11:50:07 +0100 Subject: [PATCH] AnyImageImporter: recognize also the other Radiance HDR file signature. --- doc/changelog.dox | 2 ++ .../AnyImageImporter/AnyImageImporter.cpp | 12 ++++++++++-- .../Test/AnyImageImporterTest.cpp | 2 ++ .../AnyImageImporter/Test/CMakeLists.txt | 2 ++ .../AnyImageImporter/Test/rgb.2.hdr | Bin 0 -> 1919 bytes 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 src/MagnumPlugins/AnyImageImporter/Test/rgb.2.hdr diff --git a/doc/changelog.dox b/doc/changelog.dox index f4c48821a..641b2e1b7 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -944,6 +944,8 @@ See also: - Recognizing BMP and TIFF file header magic in @relativeref{Trade,AnyImageImporter} - Recognizing ASTC and WebP files and data in @relativeref{Trade,AnyImageImporter} +- Recognizing also a second variant of Radiance HDR file headers in + @relativeref{Trade,AnyImageImporter} (see [mosra/magnum#652](https://github.com/mosra/magnum/issues/652)) - Recognizing KTX2 files and data in @relativeref{Trade,AnyImageImporter} and @relativeref{Trade,AnyImageConverter} (see also [mosra/magnum#529](https://github.com/mosra/magnum/pull/529)) diff --git a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp index e0bf814cd..673b1fc34 100644 --- a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp +++ b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp @@ -215,8 +215,16 @@ void AnyImageImporter::doOpenData(Containers::Array&& data, DataFlags) { /* http://www.openexr.com/openexrfilelayout.pdf */ else if(dataString.hasPrefix("\x76\x2f\x31\x01"_s)) plugin = "OpenExrImporter"_s; - /* https://en.wikipedia.org/wiki/Radiance_(software)#HDR_image_format */ - else if(dataString.hasPrefix("#?RADIANCE"_s)) + /* https://en.wikipedia.org/wiki/Radiance_(software)#HDR_image_format and + https://en.wikipedia.org/wiki/RGBE_image_format which lists also the \n + at the end. There's also a RGBE signature that isn't mentioned on + Wikipedia, at https://paulbourke.net/dataformats/pic/ or used by the + file utility https://github.com/file/file/blob/0fa2c8c3e64c372d038d46969bafaaa09a13a87b/magic/Magdir/images#L2755-L2759 + but is used by https://www.graphics.cornell.edu/~bjw/rgbe/rgbe.c which + is subsequently derived from in e.g. https://github.com/kopaka1822/ImageViewer/blob/5ec358cf5c3f818c0cc4c363f5ec0c61aa99d372/dependencies/hdr/rgbe.h#L210 + and stb_image recognizes that as well. */ + else if(dataString.hasPrefix("#?RADIANCE\n"_s) || + dataString.hasPrefix("#?RGBE\n"_s)) plugin = "HdrImporter"_s; /* https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure */ else if(dataString.hasPrefix("\xff\xd8\xff"_s)) diff --git a/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp b/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp index 20251d3de..52816d70c 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp +++ b/src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp @@ -102,6 +102,7 @@ constexpr struct { {"JPEG2000", "image.jp2", false, "Jpeg2000Importer"}, {"HDR", "rgb.hdr", false, "HdrImporter"}, {"HDR data", "rgb.hdr", true, "HdrImporter"}, + {"HDR data, different signature", "rgb.2.hdr", true, "HdrImporter"}, {"ICO", "pngs.ico", false, "IcoImporter"}, {"DDS", "rgba_dxt1.dds", false, "DdsImporter"}, {"DDS data", "rgba_dxt1.dds", true, "DdsImporter"}, @@ -159,6 +160,7 @@ const struct { {"just one byte", "\x33"_s, "33"}, {"just one zero byte", "\x00"_s, "00"}, {"DDS, but no space", "DDS!"_s, "44445321"}, + {"HDR, but without the trailing newline", "#?RADIANCE."_s, "233f5241"}, {"TIFF, but too short", "II\x2a"_s, "49492a"}, {"TIFF, but no zero byte", "MM\xff\x2a"_s, "4d4dff2a"}, {"KTX, but wrong version", "\xabKTX 30\xbb\r\n\x1a\n"_s, "ab4b5458"}, diff --git a/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt index eec68ce62..bbef10477 100644 --- a/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt @@ -67,6 +67,8 @@ corrade_add_test(AnyImageImporterTest AnyImageImporterTest.cpp rgb.basis rgb.bmp rgb.hdr + # Created using https://github.com/kopaka1822/ImageViewer/ + rgb.2.hdr rgb.png rgb.tga rgba_dxt1.dds diff --git a/src/MagnumPlugins/AnyImageImporter/Test/rgb.2.hdr b/src/MagnumPlugins/AnyImageImporter/Test/rgb.2.hdr new file mode 100644 index 0000000000000000000000000000000000000000..d1a9dc535f3d20cb83246864dad5f2ecec1e1e8d GIT binary patch literal 1919 zcmYL}drVvR6~~vPT{SfIk4ckOX_KzhE>o#67(xRH5JG^&_Pw^j2ET3a+ZY!Jga+(; z?R$N%9~dVF+q?-c8{6Ojro}KwXn@g>E=!ZqB+yW8$)cpw2FZj(v!$cEz^3UZopb*C zobx^B_kH(N@!7nBghEy^befx;mYO8j)yd9Rs$}Oia#cb?k^rE72zMlc~uR3IzZ`5CS1+FEK!n$zrkC?4lxe5u2=-5Cj2( zLqmaJFgP?gI7F7g;BY7$9*IQ4;n47KAUHJCkM3ar3MDBinUX{%5=BirmT@90D=RxY zEA#lVRB8%^Vq+1^pR?FST%JH&R<2OU%OpZx35VnWk&)5SXmn&G914ZPBV&{Cx%nFl z3k&me@yYS%Xe4|EK2GI<`8g*tG6Aijs;0KKrm9k_QYdxRMkj+S zlF39|&*`Gvsgd>R7+8RrV}kcI|J0aK)F zXma;P8nr@Jp{21A0dSYMqr0oU)rG&_{>Lla(>Hl@eVuoEIo9vNzyEG$w+X{hJ9Zc` z6J)W!Dr&lKJWh_6o|>FQNzE)ceKwzq=@oogX<=q+G9?AzNj);TUZ<4uIV>heq!TM8 zRVyynMHJDCi&^YqAoNM+(RXiser+<;8PvBueesHLcnnc_)9(UPM7^t4 zJIBTrAF1yGUv5s@;`enMf9cW(?znd?v8nOzA|E@tFTc>J+Bd7e0Iqz!bY@^7d-ahF z2otpa44S~$&2bb}7#?7V;d^Z3ZP;Q#5R=(#v6wLv*}>be$%vSYM%aw(39&DOdST9v z1}w1uv+-Zm%Wbj&#Yk_Hcdm}gZm4IJHP-WD#d3S+^qYG_uHS6 zLXc>LOhyuZ1UAEa@c<8~a<60S17l!r0go#XNfdI0hV(D;DMjL9osbJO8|F$^>XmRs zxmjCPd!ezR(QIji8_hy@(aw7e1>*T2un&(Xu&q4!5L4AQ6&=!GgsALH1&FePN|CV5Wo>%|Le|h>)r9|k1w}(bPogug2REqzHm=(o9EKD z{oapZQezmwN#+q4G3`@pM3l7j4|!lIyO0TSiiJ*xrKFW7Sp2Wg5hUn5<$p4Pr6qAcM|e(Q#8H(AR&}>FRZ0tuaxVoHS&$ zlC))sL@E-9%0B!2zFh{e?eYw@+aJiihr_G8t;oHv_50Tr%{;w?V zZ|~}AX{FKVOgf9n0M9X4G&%#MGZ-L^?!V*$`mc_E8jFkx1tO_fA(u);QiVt&k%&pp z7KlEHhJk0>+y8vExr16ToN&ABO}Nud*ll*gO5hgj?#{LyZu{RF=`D;_MhmHBD--1C z8IXrghuBaP3G;v;n?VNzW5NmHgiNB0kuX>+85atr<Lfz9#VI pT^rUsY9)42)b1o+lfJb};0_c`*!w8tBag?19D)ht&Hb7{{sTqNaYz6F literal 0 HcmV?d00001