From e07c5386ffde2e1b4a612612898881912e57b91a Mon Sep 17 00:00:00 2001 From: Wang Zichong Date: Mon, 26 Oct 2026 17:21:40 +0800 Subject: [PATCH] DDS: simply use 0 for blue channel for readATI2() Originally we uses getNormalZ() for the image, which treat the image as a normal map. Visual Studio simply fill the blue channel with 0 instead. Since DDS is for DirectX which is a MS stuff, align to Visual Studio might be a good idea. Also, red and green channel should be swapped. --- autotests/read/dds/bc5.png | Bin 4478 -> 3783 bytes src/imageformats/dds.cpp | 10 ++++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/autotests/read/dds/bc5.png b/autotests/read/dds/bc5.png index 31d89c9479f9d37f6d2a98df8e2984dc2a448005..c1fd4b50d4be5260690753e5cf4ab5147212d6bb 100644 GIT binary patch delta 3644 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 O002ovPDHK)LSTZ-RTJ?5 delta 4344 zcmVmt|p*kQ@~;IaDw*Ix#XjGczkN zFgh?WD$3p6k-;B-F*#H)GCDCbIx{mXFfckWFn!0Lxhq6DaA5FLhbn-L9a^QJ~$Ur!S{XAllY*wCh1v z(SoNhRNCq)l@}9BPYW$tGT@>DwUr?buOYk)phA+lbMM`MKkm$Zn>(4glbK8c`R3e{ z=WU*QpWpA^=lMRr=S@&mRQdn}!Emc;_Gx+>iVFPzUBN8S?)w0~|eCxO>0$ zTDZ`~N9Ze6(4~qVuYz8G{UH1HU9I~C0qW{R8X6P;6b1bLJycW#sjgnax^<^GeR>F= ze(KSGQ(rHCvT~)8l(#v&v{a>{;&ZOL>SJnZrqS5Ai%@6+k%+g;e5$J2Sh%pV$K=r? zRnXC+=mj+k-weM$NFeY$<>fJg!O1i>J_JBZONB-FnWDX2;ONmo1cOrm2nMGRiFon* z-y;xs37_wj?d%EBx>P+l$(2)smj zxs(*Ya;4JcOVnNDTmffJYX2LzJcKH1b$sFisI0um#*Hiac3goNm;H)5h4Nt%<9vJK^}EJ)(y^DG4tIL96RgbVYomO`#{_rW7LSQ)@ryfh zri7eSL3IywaA3z3mav+CcojeweqTf=G@Rgnj@t+_sktilPq%Tv6N!ova!5D9_^!8^e zE0d8V7&J)M!`|8SB9kZYCv@^!&UPBVZ~pyA>EqN_p)P2S+Ssm@Ru}>#(rD7M$MmibMqQHJBM51z20-yADp?$aM%7L_FBbj^Pe%f zYc~RAZhqjd+|ei$+42)W7yhL2E!2L0)#oZt*KNS+Kp0Fq+xhO#*|FnaXm2+v`}%rA z4Q4)X7e0U_4Y3B4UF`Dyc7>Fs^knh_ckp_xJ^KX<{*z6wy+~2KjQjSFrDI(y_uQYk zEy-0C^upZ3Nnv*3Uru=AjTf1J=Q2xJ%Yor+-IBQ-DPslvzU~u?|GGd7;Ib8eegd0b zf0m_>S;hEXbLP}LV+H(mw_%a|qHiFlLqiH(_FjYMo>G`G`%O#OlXaOj%4ro4k>G_u zSToeeO_f*rBAgC=Ug&c73aIhx!}sShw(6vA)5>%hG;JeXZu8%{Y7DP059@w&gL^r^ zsl4B>Q#c#(QeNRczb+Nf+`O89-)($|p=gcovF)B%FK}?v(?vifP}{d} zbXSU5?u<3Fwz-tjEO*IMQOh5gIKTOg{#HYJGLpoC-gqO#zI|hL|ERGMR5dl{zuZ|6 zzyOnC>^fSv?i4L820yib%O*)uX5r7DU(cZf_MSjL++f0lA6oot*M4g8cloOB+qaB< zbPvDz&C?7UW(-`lwhpw!r&PfB@hyDvNfuqZek9@Mo2?DN#P8Hn5;5 zxSFh!7*kDLW|Wj1OG+<_QOkuW8<#gZ|Cq;mNf;LnW5W4{SJuXVy%U!mf&jtbN?m-B zh|K2A2BptvM9eb$Xrcm6EJ%`IfQxBCUN89luNZ!8(>=Uaztnk#n!tTV0clVK@ANGet%G(P9jS%f+Hz2u(N`)G8xBL z_Y#4c_N>e^&lvJ?R8eBWY(H{`wQHTfJV$G2Fu0hWf+T_0 zJ0#=u-r@>k=1Mb7z28atYR8O@j=#%k`OKX+pYIgAcUx(F(ihOjmz|#U8SFYIn$jD$}I~@$Y;)+50cw} zS6*o&6uQz9HcUNCDma^2FJD_wy7UzlQ6x#D)|)p^OqSHCQ~kD|d}7q7gBHJN@7$h0 z?|wmCKQhOtQR^)JOSi7*BS6(WtN|cfk)#UHmJ{5^5 z$rFIPfGBod&_69xt4}Z8rch8*pYu&wl`&Z)% zfSEHln8JuiU$ew=Mv^~_+80(b#+kgTiZ5!b6 z!g~*!>)D>04c*ak%rQI~b>3z`mML5VjfX3? zG8xtbs( z2jhD4K=nOEa?kqYb&Lys!iX%(JhM4c^H^~ zsPlnX!aOqqI0?$2xc_uqP{nco+35f%g9SJrpA>xFi&7e&&i(o4aNz{%AfO%S&@Q12 z)K0X`tfFWWfubM`1~oouw759?{d{tXaQIrnVZmZ|a%`sh;?$JhzF|VD`Bsh!2!-xS zn_+K*n#Nyf1Om=GsOT){wb#PjefJoD$3(7J5HR)Mx9jeb&SFcP+^(&e?L=GlqJ8)qPNQRP zSrBNQ-Dv!o^)?_O{1q#-R(tt!kyWb{jRm=|1py3VzwTB%5~?DjC@~a80*?oOMUn6* zUX)lng0~b|zK9qTP?ad6w*px{izs`MXWp z#CQQfKt#oQKOu!tuQ#6u;Dlj+!?s!cvZ$E%he?xu*X^6@0(V$pW5kJuI|0Fi znxImNElK(yMvp$nTW>8-8Q*1R{oJ{0y8Qq`;ui7ORxsVt>_!j~Fx8o=sa_Ql>8&t- z3Ff+2rT4I+8*ccS#qaa&xA>D3Fm7BMqNt6L?%nI-);SwMRE#SPI#notGW{vCwmGLD zh7qH3p&wv8V)*B8of%DIPGKlG4$rY7|kt0!2QJfESh1AcCTz+j&$WE^yJ< zqd}KE)=?(GR*OcXr!7}^VYdY(KGwwjo12$dY(ewpP1fZrikaAgR9Ms)HvEdAvs5g| zEkyIgraT+a%(j?Zv?X?b7G##@e?Ojnny2Heh^D5U`Wmqg1(rV|vMLyM%)rhHI#u|= zic5E#CsSL{byXUzHrs+8c|@e#Huu?4Qh~s9i~pCwR)$ebKQhOcs;p}se7?3M;X@aV za9y1?e?S7D*AkxUT$+p@ z{!~RA$_|mtQqKf$EamW+W*)-(SD?Q5N3#boWYf3E`?rnb5)O z>F6+o|HTZK+GYHzIw_$aP+F>e5yxAt)y=oRk=a^1S7dB|_Lx0MVb@=O*i9Cf6b24d z@Qn>63IAJP&wQbyD+MeZ{}pZ=8AebTi6sXPl*P@uSB*Tqx@6`tjCV5PElGmaRv__ zGDgWRo*%&Oy?*B2wu-m^q}je#K9S6hzVn^FV4-evaYIGR`gZ;}YV={RbWvd283#IN$EE82z96diRcE z>vo-Rf9)8mC%oerS5vblhaxEqCj0j@*>{AO|0lUh{jY!P{z;HIsg&o%&AM zMKm^lE~cjDc}9%rdxyJ?7}3Gpxi7INcmsPvBQ0?igFE^D@**mRbpJm6XUeC8T{<}) zY|h(>+KG`MvuUKhUgX0Mm-5@+KEs6zq9r`RI?NL%@^SiVSNY$5`!5KGZ)f4c%9N+9 z<{Ek9g>`izm6gd0r#Ea^1;8D5ENA%e!mq}Esi=r@`|ZEr+G|_cy7fNCNy$E6Ti%W~ z&+D1;ix+ECq3v(wg$tst2*3Zmd_F=-`29fu&YT&*)~)wBrt$gOy0qoz0(n(H0`>Kx z{jaYVS-bXAeHZaaL^II0w1~8{OadkWaLqN^?A1H&SkB?YivT!$cpQ@C zK~c0hmUbu#3>_L{(block), sizeof(block)) != int(sizeof(block))) return QImage(); - // BC5 (ATI2) stores two BC4 blocks: the first one is the second - // normal component, the second one is the first normal component. + // BC5 (ATI2) stores two BC4 blocks: the first one is the red + // channel and the second one is the green channel. The format has + // no blue channel, so it is set to zero. bcdec_bc5(block, texel, 4 * 2); const quint32 kMax = qMin(4, height - i); @@ -983,10 +984,7 @@ static QImage readATI2(QDataStream &s, quint32 width, quint32 height) QRgb *line = reinterpret_cast(image.scanLine(i + k)); for (quint32 l = 0; l < lMax; l++) { const quint8 *pixel = texel + (k * 4 + l) * 2; - const quint8 nx = pixel[1]; - const quint8 ny = pixel[0]; - const quint8 nz = getNormalZ(nx, ny); - line[j + l] = qRgb(nx, ny, nz); + line[j + l] = qRgb(pixel[0], pixel[1], 0); } } }