From 503b3eee2b3ed599310e1e6e41e74398f53a6303 Mon Sep 17 00:00:00 2001 From: Fred Fonkle Date: Tue, 2 Mar 2021 22:28:09 +0100 Subject: [PATCH] Fix Non-square Radiance/RGBE/.hdr images failing to load The HDR QImageIOHandler plugin only supports the default image orientation (-Y +X) in .hdr files. It mixes up the width and height however, resulting in non-square images not loading. This fix adds a check for the standard image orientation in the file and returns false (with error message) if that fails. If it succeeds, it takes the height from the -Y component, and the width from the +X component, resulting in successful loading of the image. Add autotest images for landscape and portrait HDR (Radiance RGBE) loader BUGS: 433877 --- autotests/read/hdr/rgb-landscape.hdr | Bin 0 -> 8253 bytes autotests/read/hdr/rgb-landscape.png | Bin 0 -> 1219 bytes autotests/read/hdr/rgb-portrait.hdr | Bin 0 -> 8253 bytes autotests/read/hdr/rgb-portrait.png | Bin 0 -> 1165 bytes src/imageformats/hdr.cpp | 11 +++++++++-- 5 files changed, 9 insertions(+), 2 deletions(-) create mode 100755 autotests/read/hdr/rgb-landscape.hdr create mode 100755 autotests/read/hdr/rgb-landscape.png create mode 100755 autotests/read/hdr/rgb-portrait.hdr create mode 100644 autotests/read/hdr/rgb-portrait.png diff --git a/autotests/read/hdr/rgb-landscape.hdr b/autotests/read/hdr/rgb-landscape.hdr new file mode 100755 index 0000000000000000000000000000000000000000..a246f872c79ecfe0f426723b1735d39c527bf015 GIT binary patch literal 8253 zcmeI0e@L507{^!b+Ad{X-K6cten{I*S?AWObIz)*^+(szS%}rP=;m5xJ6GA%xR%(M z`@Rl~I98-0=|tirn-nP&kycV9_(xZYv!MhRUP4$1A-ud~WZ@-y*-LoG?oxz7Wx`@!zZAF8aYsxj3ctvz(%F<$&D|;bISjL{f*W$6&=dp$BJ$ zm@XoaQV`UW=)@O-MEzJ)Mkp*IE-ga$OHh0fhzk3jAAUtaL`fp9MrbP|LE~~tghYRD z`H;w36x=te-fEm1=dAN(0pr{v=xCIsdEtL)brXj4 zr%)xm4O3(kYf}&PH%)y@_GSN0)~}6V>n0Zlw%O2M(ujh46?nsK#>P%B-uvTM(%`B> z%}_o1oX_DkZ#7IF9~y$mRrT}W|26-5CIV=SUd6NyoWp+Mwl)T9auJ79NA>{82pguPY&qxxzbpNDl zDDB5e`-y2fR9%Cnr=aU9dT1XpeP!*-=Pz&m@;Fv&{V@%Bu0>?rbRzr8J$!eM&eaNg zdbNK3>F2!pK6*Cpj&ve7kcXmBBjywz?64blkK)ajln^j*5Bt7%!|t+9r8)5Ez2@JD@#ahP{5zlP!Uq}sXnEQJ&(}-PRC-x3NI!4B z>X)%tb_(9tU&3OJ8Bxa)bOZJC<|~qj!M<9w{oG9kELBK&eRTgDllv^kc=H2^2o6kq zjNFMl>>odaKs;(#?lb*-`F0_u%)v3g4I|ew@YUTM$QoULgZ4g6G`@VhO^AoC;kWry z#9Zni@`Di)ll{i&=gp_{@AC$cvwaS0)&;S3`yI^A$HD%;8IuFN`4ArXlGsx`i9Jo1 z$?nSzLR>RYG|jLa;LVSSQT#ae4e4?{Lq5B;nOGc+h$)g``g!veIf5Z;BW&~K#CE@e zTp2zAC1Kndz?(18w~+?Xi49?E+8TmRu$VFXAN2j1GoQX=x601+dmnrAV?KM^HcUTf zeljItYN;L_Q|r^ld=@iGKW~0Qm0+7bgT3Fk5@yV2F{AYJ=F4#nt(FCB+;k^x%x5v9 t^z-K1Y!KYHH8dViq>cG3W|V&3e5R9)!D4x6MrvQ4W8VDbas1!gKLN+iz}Wx* literal 0 HcmV?d00001 diff --git a/autotests/read/hdr/rgb-landscape.png b/autotests/read/hdr/rgb-landscape.png new file mode 100755 index 0000000000000000000000000000000000000000..1da6ff1013a337793f1d8f1db37ecc09eb36d09c GIT binary patch literal 1219 zcmV;!1U&nRP)&}ae{ zwIQ($t$LwcX#7Y`FTK%wP5ck47mZ1)Vu>}{6b%JzOM=yybPHCHJQx$&GXDT?|UYvq);f}|19!v8`!ScwX1v{*$lEUG%+fYWr9rF zu&G83A%rI>PA_G{>4dJ@`Gj4qP3rnxZ<2_Hp7zKf600V4UWTfPFo?%NBw^E=io|Ev z=!-#2j2Sa!(}|u_`*!>YXjfNSepXM4uH|yf)L-$`p1pBLp6c<0JJ0o;FOLjm^$SN}EFG5}5pN{7c>U|n=t5&S|D8WR>9Dtcx)4vXvo`{*f1FS5 zR6~3!mu#;WtGV?6#pAQsC?hW{X;mvm!bJ)@Wo=ncWC;KivcmF%j!^iW*wXlZ+sx7E z?9f~&TUVKNu;Fw^yYSnCnra2NN+^R@=xbW>0poDtn1`zw39`d%eRTGJr|qp~L&d$X&dOC(Y)dffK1fXmTm z7Zq-U@8a=G*4k(;w_0R5F>PnT0tQG1Y#dnwsrWSi`P=HHaBdePoH*(18jv^%c_5X8 zRxl)1XFyow(gbNkkO|pb#6{w-FCmTt$3X%Cq=$DHfCFT3fOON99eyu3s|1$j{6{*R z2EY1%%s~bL_=hwJkhbW|MdJUn2DXx}#7mz$<4a$Z{ZF`^AF-StU?|5Hl~22oRV5QI zp9ysz_Zb+j;?|(}Hup zG~SDR7Z~o*!>DDNPa7c5B9L*Po00d_X|JfFr(p3EnC8<4h^g*tQ?GN;#c55M`|D|U zPT*;W7MD-!!cMf~RilI%F;aW0Z3itizb!s>8+E9ohwcnU>iXH(yU!Sex44K+^J$+8 ziPCUG{mP!`@b2cY*Jkx{;kvQ zZ!dKmK3pKpEOwYTYcan-B|Y$a(AzXp!UtVVS1*o7b)9Y;t<3W&Yk)CWx1%!bYB^Ej z`*`x!L@J*(`LV6$({>>zAM13VonpofTS+1zX<*)?&BobXg5+w@ ziC`GpaBC%>b_SA)V`AWiYhp71SI&1#vdbo|TFj^3@(3y%@Xt>GsA%+Af1YHPPa8ls zR-RwJAT9m^;6PcGth@*!nR03|pZZrKhrpb3=&LpWWdqJbO^-2oMdj1F&@#%s%Wp+T z-T-i~k=G6?TOXa6k!e2l->8l6?|m|MI}M<}SG3!BvsNwUuOF*CQksTn6aW+j!scU> hZOa`0F#`NI^*746s$Rk6w*LSC002ovPDHLkV1kj0Pv8Im literal 0 HcmV?d00001 diff --git a/autotests/read/hdr/rgb-portrait.hdr b/autotests/read/hdr/rgb-portrait.hdr new file mode 100755 index 0000000000000000000000000000000000000000..d22b12df64ce3b9af6503052426f457b2d767421 GIT binary patch literal 8253 zcmeH~ZAe>J7{^!b+Ad{X-K2G6FQM(G%(?kC*ZJ03U%Hk~A*r^an^UIFRW>zUOEl*E zucJjeR-__nMdBozh!l!QD-j8P=!!Ti5?r{1un@wK> z@Ngdh!v%94|nC(r1rY78Hjoh`}B&1&hm z*woY6+SJqD(yG&C)$0rL^_l1OdAT|OoMxLjuv)?O^@5AW6o^U~W?bNU(awbx9^Qlm zpAthizTpJwheIO#0Ui-y1&T+2vcx`a+lDQ{AH9i7oiWcg=N5VxZuei<#!VI*7+$nGC6nz-uy3c?L;l| zmy1!lR*KABKmyIp@WsXBKyO7nXS&Mg<2tLqRxcZEaTr{WLGVW^fUS)?b3vN-t-n z){j2UjDD_%`mFxe*Q4kv^dswt7sm7eTq7~`)BR)T*hylO;N=PAEmHNH&yp10v$c#Dz| zsD2Ug#Sy^Try4&V;&Izpg_(>?y8r6rp5@pZ z4dTSa=SZK(!13`mcq1Xza!(h^g{1}97Sk{?m4xpe=po8<{VMG}tQIcfpTeJu&BRb> zBjVZ!35y=}_;mg5RUh<+7O-QN4+jt3$J}BB?Ek4&4%XZ;3`d`!kn*M)sFV*zFrvEklujzkH|7-eR)Bl?O*Yv-p|26&pef_pP)9;J+oasMX6&v|v#mSS{^oL#Q zQhUv%aK!U0`_r$xt5f8I*W7)5k|;b3$mcLUjuW5hi~A=0gCngZx?+;=qfN_ZiZCac zd-;wpT%k!lDZ66+SYi3v*FEv2mZq#7VG#Yyn2mmROSkVNuWtbX$-K+1O+N90!hr z1OiBFe;9xRWN?6V!;>F-FFdb?Ru+PXy4^OvzCh+6g8=;6ZW16pI{6!W@NY8JWW{r* z0{VG5_=MN}5z7SuhQ>&H(P}g4mrq6dj`|LNxfH-W1C!E73lQ!&-QW0kENOM49ywe^ zZ=^jUNz?{9&Y@yfa4%LQ2VnJr;Y!=+0Tzo;&Unii@$okR+->2F{pv$clg$7qPJU?M$;2%kz|erGIC)CrKhKtu zG7QAy0HCT6gi@;?1Mqm-^5=UwAC&V!IUkhs0fox>VABBQd{9c|d{9#5d{A2Dd{9#5 fd_bfBX+HQH6z#LR$&p^~00000NkvXXu0mjf5idDt literal 0 HcmV?d00001 diff --git a/src/imageformats/hdr.cpp b/src/imageformats/hdr.cpp index cf468c0..1a686bb 100644 --- a/src/imageformats/hdr.cpp +++ b/src/imageformats/hdr.cpp @@ -227,8 +227,15 @@ bool HDRHandler::read(QImage *outImage) qCDebug(HDRPLUGIN) << "Invalid HDR file, the first line after the header didn't have the expected format:" << line; return false; } - const int width = match.captured(2).toInt(); - const int height = match.captured(4).toInt(); + + if ( (match.captured(1).at(1) != u'Y') || + (match.captured(3).at(1) != u'X') ) { + qCDebug(HDRPLUGIN) << "Unsupported image orientation in HDR file."; + return false; + } + + const int width = match.captured(4).toInt(); + const int height = match.captured(2).toInt(); QDataStream s(device());