From d91c7dd912cb34d7c7648ccd35d6035c3484fa7b Mon Sep 17 00:00:00 2001 From: Mirco Miranda Date: Thu, 12 Dec 2024 22:07:07 +0000 Subject: [PATCH] DDS: multiple FP improvements - Use of native qfloat16 format - FP16 and FP32 HDR images are preserved and sRGB Linear profile is set - Images are always saved as 8-bit so, if valid profile is present the image is converted to sRGB - It also fixes (left image) a problem (right image) with HDR images: ![_DF316651-18AF-498F-8689-B3613F8C9D45_](/uploads/f5deb9bff6d22dae94ecf7942d8fd806/_DF316651-18AF-498F-8689-B3613F8C9D45_.png){width=281 height=157}![_AF65379D-E6A5-4007-863D-7B60EDFB7383_](/uploads/92460f2dabbb763061f6e6143bc36719/_AF65379D-E6A5-4007-863D-7B60EDFB7383_.png){width=271 height=169} --- autotests/read/dds/rgba_f16.png | Bin 4661 -> 4442 bytes autotests/read/dds/rgba_f32.png | Bin 4682 -> 4443 bytes .../write/format/dds/Format_CMYK8888.dds | Bin 36992 -> 36992 bytes .../write/format/dds/Format_RGBA16FPx4.dds | Bin 36992 -> 36992 bytes src/imageformats/dds.cpp | 104 ++++++++++-------- 5 files changed, 61 insertions(+), 43 deletions(-) diff --git a/autotests/read/dds/rgba_f16.png b/autotests/read/dds/rgba_f16.png index 5773bb4d099d0f7915ce699e8c0d7672aa561e8e..b21018f9ee891b3475ffab9b53469e29e721e005 100644 GIT binary patch literal 4442 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 literal 4661 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 diff --git a/autotests/read/dds/rgba_f32.png b/autotests/read/dds/rgba_f32.png index c6b1502bc8e4b04ecc0caf78b0d0a2edab5fc38b..3a526c133192600422eada704cc4c0053039046e 100644 GIT binary patch literal 4443 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 literal 4682 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 M07*qoM6N<$g22!i^#A|> diff --git a/autotests/write/format/dds/Format_CMYK8888.dds b/autotests/write/format/dds/Format_CMYK8888.dds index 63f9cdf79324eade59e3a275585b3749957912d9..6c5e463b0545010b88c5fda66d2cb70739cde68b 100644 GIT binary patch literal 36992 zcmeI5Yj9Q7703D3ul?LwhiMB5c@UDQh$T#@2*g2xh(xQlDo#7KwWCg}oz^Pg0P;vk z$O96>BSpV z8AII&wsC0_NY}t6O4a$Y&9nvnA-(~h5P={cf_%UnFkKgcJ-GysIqE#hvgNB|+O@Xt z-FJxk2QImj-rm?kmDP1o=j7*n)>c&0)@`p5$KtK$=t(LouZ}wo^6)dRAAe+yda~jt z5{LQp_MW5i$_*Z)MB?E5MVB}$SFNS4o)h%8GtQQV9c=c-5?_|7wj*=YQ$4O4zw^jZ zx_If`l+RZkS6H+CgAe~2vj#SQ>5DR6e`Jn&ym1ooU$v%!1_mw@*A_RLWRAMYKN7#XUFC*jX z;wQ>Sjg_i67cO3*HKi5Cd>c;u4=sDfT~(FMNaoMyzPoKNb(g)MU4!Amzpt^D`db=C zC4XLnp7NLI;}cymYcL%6UutWj6E!Q`b4yhnkZbCC#pn8eVCnDZ^Ygt?YcLf4e(r@# z_1{hOI9^Vk>Lp#f>F8tm@jW7N-{wjO!W7`VwN>Rc_Z=XdH?G_|JAMm zb3iVlW6q;)@>lb}q3va=YI@eiEHP2K2Q)9EG5>kqGgq&m#*?RG*1*IQnWJvTbU zQ~9gE3ivzqUbu@y{;XGZ9&y*e#M6|YCV%FC{A_y^`yl@#>!9*~YDXg#m9BI#%Nn7K zm;Z@#`)KiodjtLsIOHh0%AfZSUI;xuAU-JL;lJAXzwOrcr7`S-{5R)6^PgW??koTO z+zT;lU9+vD?$~H}|JBV)m;Y=tZO9yT_Q&hwm6c`mYGbpOeUSh5{1^T^ns!AoWxmK9 zb(R0Q^B3K|y4(-=`{Uo=e<@-9O|S0`_`@^dYJN(su+<;_-FIDmL)02z&ZCa;_wGOB z{oXvt|HyN~!W^ZIKl}0TkI^5QqmKMP{^V1yPr!d@{2R74c`SJyROZaxw%PdW`eA%O z`mCa2il<>N`O!`HT_(G3PBxn@|84zr$9O)SM~+3UmyN$}{(hLFPdx0|S2w23X5wtJ z>$r$bH;#?J_!5{gnD?UF_=}Iobyc-d_y4#S zJVaGZeZW73{0|=Lw(?)LBJ`}jtQSjL{Xsv`aZUZ`BdPw#98t!T|NYKquS`sM*)gu@ z0sqJaAxu!l!@uwBK)~Pd9I*U9Z``yk;2(bGit`b3llRr!j5q&VceQ&lCALV8-@5CKm@$I1VU?*Y$s7>{WW`=BxDJ53W+l_pj1|?|nw|Z~7bEd-F$BJoXCB`QZh+`^SA$ zH0~759N$fMr5&K@X>C-P-b~Zd8)#~J9o><>jwYwAqFd9JQvUcqQQo*`Xwvv6DQCi? zG%;%-WoH#rcIGU~%q(WIAf8Bg-{Lz2lLg;tvCiZMkM*TPQ|Io?*cWKU#2HgCgJ?^BN|1;7$Ec`?H zpF5uU|Jup_$0#S$$^Xo`5&judz5G}CCp-UzgvIWz537mr+D>W>W|ca&i@eq?97=??ScB^@{g|n!-aoKYnzwT zgYj<$UtWWu@|XOdcQeSCJ-dV|XDp=h z!uzOn>O5LCc@C|}pG`04&7c?a3h9q|)9C5Esq|#t6nY}}HhLuIR$4eQpNg~cs3;?s z?sV>Rre#c`+cR_MmW+v%laWK&8QGLMA={}#S(Kih>D>Qh4!ipwWR5zsl$!JHH~;o@ z8-MXf8N+`8^MBOkUl-=T{_dYq^{fY6{%Z>tX!$=6{1@d;ria7)=ehjz!u)e-O6DYo ze-2G@`A-D?SxM)Q^Avrs_uqZ{4|^=R4>Cs``InW~5I?ia{zKw_|DtgIhxkY3|Evci z`Cm}%hxkkW=Q{a6iSj-EnE%6r|JifV&yyo_)R8}PKk?R?q4T%Z zpK$(%>Q6DPbn4G?ul`J@Q2sOj+r9czGBJ;$`E&h|{GaI5pGf|5?MZh1k(@_q%m0S$ z(VurbfumpJtw`4>3v15@1k zpX1d3X#T0F|Hxf*8-F$T?`VJ1s|Mur!alRY+viJKKKYaY$ z3t`>=^!?^-GBcdrLq+ienz^M$}u^%X%qfmTzcPQ&oTyl;W!CR?^w8cvm&WiHhA5Fa>ZbTA|CgRPL}$7_Wq0j*rJBQV z253*!_m*&!1;JR=FjHeX9BMn((%BckJ^j zH%k6jtXofSyxE~;f35h}Zrnn9l^lyGem=>pb&c~=Y7R=Z=CGe_)72lg z-MO^hZSzWZP{sb!-o7bTveqTl_1|>5w~~rxdU{)jtMk5&z2v_smdTFmB>G_d zc^!&YY^Ao|EAAR_Z0U<~B=N`d7M)oyY3-&b>YQfU;8=wFF`Rn1&=VE`+ z{l*#0ADN?`toVb)sjRM}%U9m_>e68TG9Qu2^sioDPiNllqvqBXN-80zY&b*sq^RK$*>>p>~Z5<>v8$~kvZzgm{+2FDy!<~&AkWRzb7Zp|0eT% zHf?#8&YrzMT|Fnf&p0GAKIV<+rufJlb(8<~uybADjX$s1?J(oI%=b}ZU%9Hxs~4>E z=Qerczq$R|>$~XS;cn;tx1ad)JiG}Ll-J9yGIvkVc|kksa$J?@gSzS``{;wZ99Jd! zpsxDKKKh_8$5n|wsH=Xmk3Oi&aaE!Z>Z+gYqYvtGT$Sj9y6PwU=!3c(S0(zOuKLM7 z`k*eyRf#^RtA4VNKB&uaRiY2-s-Ntm59)GUmFR=I>L>f?gSs47CHkPQ`pG`}pf1N% Vi9V>SezK1~sLOFxq7Ulm_kT`C>t+A| literal 36992 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 delta 1405 zcmaJ>PiWI%6mQzaHniCqmtdn&IxJh&iqSd$up%A`dhk%OI3^XVPN`Uw$%;;`WLE5y zqRrlr9eU_+2Pqy3&qHt9afb;C9z4ko9(UNmqfoyrX`1wprQyBb@BMz{eecWnDa%e} z*;!IlS!(-3n3C0@BWt{4w*gXOGT^&LZ*_#$li#F82q$PwxIC-lR6Tya^Sq43K$H=^pwT& z(8Xpd9lWHcG%khWT8e|ilO%?5aU@A%2>C-=3}WeUYA5<5QzQnkcr?8eeaAA?fW!X7 zf;>&}cFy4-dpk}R7QoPnL>J3wmhxIG=pM^bZiB%5so55Aow0!Y*&O9DWLr>kN*EeX zQZB+^KAO`L*SXxF&RlLXSBxZ|FzlqeU!*%?zuL4x;jUAamofn95M9z@zV$Hb)6dx3#%S=)a@K(p_!dWd3P=9~SRvF^qxxnxC9S z8p|1D_ZXBO7%7XDhsI8G7@RitU&NJ1QQaot$jq3LsxpJ0vk?=q7(1Dx9|8e`cEuc;3zQ Ou<9ZXmfk1q3gI8u6p%mw diff --git a/src/imageformats/dds.cpp b/src/imageformats/dds.cpp index efff7ba..0e928f9 100644 --- a/src/imageformats/dds.cpp +++ b/src/imageformats/dds.cpp @@ -11,6 +11,7 @@ #include "dds_p.h" #include "util_p.h" +#include #include #include @@ -826,19 +827,15 @@ static QImage readUnsignedImage(QDataStream &s, const DDSHeader &dds, quint32 wi return image; } -static double readFloat16(QDataStream &s) +static qfloat16 readFloat16(QDataStream &s) { - quint16 value; - s >> value; + qfloat16 f16; - double sign = (value & 0x8000) == 0x8000 ? -1.0 : 1.0; - qint8 exp = (value & 0x7C00) >> 10; - quint16 fraction = value & 0x3FF; + quint16 rawData; + s >> rawData; + memcpy(&f16, &rawData, sizeof(rawData)); - if (exp == 0) - return sign * std::pow(2.0, -14.0) * fraction / 1024.0; - else - return sign * std::pow(2.0, exp - 15) * (1 + fraction / 1024.0); + return f16; } static inline float readFloat32(QDataStream &s) @@ -855,128 +852,139 @@ static inline float readFloat32(QDataStream &s) static QImage readR16F(QDataStream &s, const quint32 width, const quint32 height) { - QImage image = imageAlloc(width, height, QImage::Format_RGB32); + QImage image = imageAlloc(width, height, QImage::Format_RGBX16FPx4); if (image.isNull()) { return image; } for (quint32 y = 0; y < height; y++) { - QRgb *line = reinterpret_cast(image.scanLine(y)); + qfloat16 *line = reinterpret_cast(image.scanLine(y)); for (quint32 x = 0; x < width; x++) { - quint8 r = readFloat16(s) * 255; - line[x] = qRgba(r, 0, 0, 0); + line[x * 4] = readFloat16(s); + line[x * 4 + 1] = 0; + line[x * 4 + 2] = 0; + line[x * 4 + 3] = 1; if (s.status() != QDataStream::Ok) return QImage(); } } + image.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); return image; } static QImage readRG16F(QDataStream &s, const quint32 width, const quint32 height) { - QImage image = imageAlloc(width, height, QImage::Format_RGB32); + QImage image = imageAlloc(width, height, QImage::Format_RGBX16FPx4); if (image.isNull()) { return image; } for (quint32 y = 0; y < height; y++) { - QRgb *line = reinterpret_cast(image.scanLine(y)); + qfloat16 *line = reinterpret_cast(image.scanLine(y)); for (quint32 x = 0; x < width; x++) { - quint8 r = readFloat16(s) * 255; - quint8 g = readFloat16(s) * 255; - line[x] = qRgba(r, g, 0, 0); + line[x * 4] = readFloat16(s); + line[x * 4 + 1] = readFloat16(s); + line[x * 4 + 2] = 0; + line[x * 4 + 3] = 1; if (s.status() != QDataStream::Ok) return QImage(); } } + image.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); return image; } static QImage readARGB16F(QDataStream &s, const quint32 width, const quint32 height) { - QImage image = imageAlloc(width, height, QImage::Format_ARGB32); + QImage image = imageAlloc(width, height, QImage::Format_RGBA16FPx4); if (image.isNull()) { return image; } for (quint32 y = 0; y < height; y++) { - QRgb *line = reinterpret_cast(image.scanLine(y)); + qfloat16 *line = reinterpret_cast(image.scanLine(y)); for (quint32 x = 0; x < width; x++) { - quint8 colors[ColorCount]; - for (int c = 0; c < ColorCount; ++c) - colors[c] = readFloat16(s) * 255; - - line[x] = qRgba(colors[Red], colors[Green], colors[Blue], colors[Alpha]); + line[x * 4] = readFloat16(s); + line[x * 4 + 1] = readFloat16(s); + line[x * 4 + 2] = readFloat16(s); + line[x * 4 + 3] = readFloat16(s); if (s.status() != QDataStream::Ok) return QImage(); } } + image.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); return image; } static QImage readR32F(QDataStream &s, const quint32 width, const quint32 height) { - QImage image = imageAlloc(width, height, QImage::Format_RGB32); + QImage image = imageAlloc(width, height, QImage::Format_RGBX32FPx4); if (image.isNull()) { return image; } for (quint32 y = 0; y < height; y++) { - QRgb *line = reinterpret_cast(image.scanLine(y)); + float *line = reinterpret_cast(image.scanLine(y)); for (quint32 x = 0; x < width; x++) { - quint8 r = readFloat32(s) * 255; - line[x] = qRgba(r, 0, 0, 0); + line[x * 4] = readFloat32(s); + line[x * 4 + 1] = 0; + line[x * 4 + 2] = 0; + line[x * 4 + 3] = 1; if (s.status() != QDataStream::Ok) return QImage(); } } + image.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); return image; } static QImage readRG32F(QDataStream &s, const quint32 width, const quint32 height) { - QImage image = imageAlloc(width, height, QImage::Format_RGB32); + QImage image = imageAlloc(width, height, QImage::Format_RGBX32FPx4); if (image.isNull()) { return image; } for (quint32 y = 0; y < height; y++) { - QRgb *line = reinterpret_cast(image.scanLine(y)); + float *line = reinterpret_cast(image.scanLine(y)); for (quint32 x = 0; x < width; x++) { - quint8 r = readFloat32(s) * 255; - quint8 g = readFloat32(s) * 255; - line[x] = qRgba(r, g, 0, 0); + line[x * 4] = readFloat32(s); + line[x * 4 + 1] = readFloat32(s); + line[x * 4 + 2] = 0; + line[x * 4 + 3] = 1; if (s.status() != QDataStream::Ok) return QImage(); } } + image.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); return image; } static QImage readARGB32F(QDataStream &s, const quint32 width, const quint32 height) { - QImage image = imageAlloc(width, height, QImage::Format_ARGB32); + QImage image = imageAlloc(width, height, QImage::Format_RGBA32FPx4); if (image.isNull()) { return image; } for (quint32 y = 0; y < height; y++) { - QRgb *line = reinterpret_cast(image.scanLine(y)); + float *line = reinterpret_cast(image.scanLine(y)); for (quint32 x = 0; x < width; x++) { - quint8 colors[ColorCount]; - for (int c = 0; c < ColorCount; ++c) - colors[c] = readFloat32(s) * 255; - line[x] = qRgba(colors[Red], colors[Green], colors[Blue], colors[Alpha]); + line[x * 4] = readFloat32(s); + line[x * 4 + 1] = readFloat32(s); + line[x * 4 + 2] = readFloat32(s); + line[x * 4 + 3] = readFloat32(s); if (s.status() != QDataStream::Ok) return QImage(); } } + image.setColorSpace(QColorSpace(QColorSpace::SRgbLinear)); return image; } @@ -1627,10 +1635,17 @@ static QImage readCubeMap(QDataStream &s, const DDSHeader &dds, const int fmt) if (!(dds.caps2 & faceFlags[i])) continue; // Skip face. - const QImage face = readLayer(s, dds, fmt, dds.width, dds.height); + QImage face = readLayer(s, dds, fmt, dds.width, dds.height); if (face.isNull()) { return {}; } + face.convertTo(format); + if (face.isNull()) { + return {}; + } + if (face.colorSpace().isValid()) { + image.setColorSpace(face.colorSpace()); + } // Compute face offsets. int offset_x = faceOffsets[i].x * dds.width; @@ -1728,7 +1743,10 @@ bool QDDSHandler::write(const QImage &outImage) return false; } - const QImage image = outImage.convertToFormat(QImage::Format_ARGB32); + QImage image = outImage; + if(image.colorSpace().isValid()) + image = image.convertedToColorSpace(QColorSpace(QColorSpace::SRgb)); + image.convertTo(QImage::Format_ARGB32); if (image.isNull()) { return false; }