From c38a1a02488490451abaeaaa2bc815959243b84c Mon Sep 17 00:00:00 2001 From: Mirco Miranda Date: Wed, 6 Nov 2024 21:12:05 +0000 Subject: [PATCH] PFM: extended to half float format The Portable HalfMap is a format supported by ImageMagick. The test cases was generated by converting pfm to phm using ImageMagick: `convert image.pfm image.phm`. --- .gitattributes | 2 + README.md | 2 +- autotests/read/pfm/testcard_gray_half.phm | Bin 0 -> 131088 bytes autotests/read/pfm/testcard_gray_half.png | Bin 0 -> 17634 bytes autotests/read/pfm/testcard_rgb_half.phm | Bin 0 -> 393232 bytes autotests/read/pfm/testcard_rgb_half.png | Bin 0 -> 11437 bytes src/imageformats/pfm.cpp | 83 +++++++++++++++------- src/imageformats/pfm.json | 4 +- 8 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 autotests/read/pfm/testcard_gray_half.phm create mode 100644 autotests/read/pfm/testcard_gray_half.png create mode 100644 autotests/read/pfm/testcard_rgb_half.phm create mode 100644 autotests/read/pfm/testcard_rgb_half.png diff --git a/.gitattributes b/.gitattributes index 4ddaa1c..d13bdd5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11,3 +11,5 @@ autotests/read/hdr/fake_earth.hdr binary autotests/read/hdr/rgb.hdr binary autotests/read/hdr/rgb-landscape.hdr binary autotests/read/hdr/rgb-portrait.hdr binary +autotests/read/pfm/testcard_gray_half.phm binary +autotests/read/pfm/testcard_rgb_half.phm binary diff --git a/README.md b/README.md index 201d2ae..552e72d 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ The following image formats have read-only support: - Krita (kra) - OpenRaster (ora) - Pixar raster (pxr) -- Portable FloatMap (pfm) +- Portable FloatMap/HalfMap (pfm, phm) - Photoshop documents (psd, psb, pdd, psdt) - Radiance HDR (hdr) - Scitex CT (sct) diff --git a/autotests/read/pfm/testcard_gray_half.phm b/autotests/read/pfm/testcard_gray_half.phm new file mode 100644 index 0000000000000000000000000000000000000000..7dea0913d35838c45b69782aaca6a70aff442fd0 GIT binary patch literal 131088 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 SqZ#n#LMn=C3dQoKe*X&vlCp&W literal 0 HcmV?d00001 diff --git a/src/imageformats/pfm.cpp b/src/imageformats/pfm.cpp index 0a5111d..a04f9ed 100644 --- a/src/imageformats/pfm.cpp +++ b/src/imageformats/pfm.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -29,6 +30,11 @@ private: */ bool m_bw; + /*! + * \brief m_half True if half float. + */ + bool m_half; + /*! * \brief m_ps True if saved by Photoshop (Photoshop variant). * @@ -61,12 +67,13 @@ private: QDataStream::ByteOrder m_byteOrder; public: - PFMHeader() : - m_bw(false), - m_ps(false), - m_width(0), - m_height(0), - m_byteOrder(QDataStream::BigEndian) + PFMHeader() + : m_bw(false) + , m_half(false) + , m_ps(false) + , m_width(0) + , m_height(0) + , m_byteOrder(QDataStream::BigEndian) { } @@ -81,6 +88,11 @@ public: return m_bw; } + bool isHalfFloat() const + { + return m_half; + } + bool isPhotoshop() const { return m_ps; @@ -109,7 +121,7 @@ public: QImage::Format format() const { if (isValid()) { - return QImage::Format_RGBX32FPx4; + return m_half ? QImage::Format_RGBX16FPx4 : QImage::Format_RGBX32FPx4; } return QImage::Format_Invalid; } @@ -118,8 +130,16 @@ public: { auto pf = d->read(3); if (pf == QByteArray("PF\n")) { + m_half = false; m_bw = false; } else if (pf == QByteArray("Pf\n")) { + m_half = false; + m_bw = true; + } else if (pf == QByteArray("PH\n")) { + m_half = true; + m_bw = false; + } else if (pf == QByteArray("Ph\n")) { + m_half = true; m_bw = true; } else { return false; @@ -196,6 +216,28 @@ bool PFMHandler::canRead(QIODevice *device) return h.isValid(); } +template +bool readScanLine(qint32 y, QDataStream &s, QImage &img, const PFMHeader &header) +{ + auto bw = header.isBlackAndWhite(); + auto line = reinterpret_cast(img.scanLine(header.isPhotoshop() ? y : img.height() - y - 1)); + for (auto x = 0, n = img.width() * 4; x < n; x += 4) { + line[x + 3] = T(1); + s >> line[x]; + if (bw) { + line[x + 1] = line[x]; + line[x + 2] = line[x]; + } else { + s >> line[x + 1]; + s >> line[x + 2]; + } + if (s.status() != QDataStream::Ok) { + return false; + } + } + return true; +} + bool PFMHandler::read(QImage *image) { auto&& header = d->m_header; @@ -215,22 +257,15 @@ bool PFMHandler::read(QImage *image) } for (auto y = 0, h = img.height(); y < h; ++y) { - auto bw = header.isBlackAndWhite(); - auto line = reinterpret_cast(img.scanLine(header.isPhotoshop() ? y : h - y - 1)); - for (auto x = 0, n = img.width() * 4; x < n; x += 4) { - line[x + 3] = float(1); - s >> line[x]; - if (bw) { - line[x + 1] = line[x]; - line[x + 2] = line[x]; - } else { - s >> line[x + 1]; - s >> line[x + 2]; - } - if (s.status() != QDataStream::Ok) { - qCWarning(LOG_PFMPLUGIN) << "PFMHandler::read() detected corrupted data"; - return false; - } + auto ok = false; + if (header.isHalfFloat()) { + ok = readScanLine(y, s, img, header); + } else { + ok = readScanLine(y, s, img, header); + } + if (!ok) { + qCWarning(LOG_PFMPLUGIN) << "PFMHandler::read() detected corrupted data"; + return false; } } @@ -296,7 +331,7 @@ QVariant PFMHandler::option(ImageOption option) const QImageIOPlugin::Capabilities PFMPlugin::capabilities(QIODevice *device, const QByteArray &format) const { - if (format == "pfm") { + if (format == "pfm" || format == "phm") { return Capabilities(CanRead); } if (!format.isEmpty()) { diff --git a/src/imageformats/pfm.json b/src/imageformats/pfm.json index 4c4d855..d8ba603 100644 --- a/src/imageformats/pfm.json +++ b/src/imageformats/pfm.json @@ -1,4 +1,4 @@ { - "Keys": [ "pfm" ], - "MimeTypes": [ "image/x-pfm" ] + "Keys": [ "pfm", "phm" ], + "MimeTypes": [ "image/x-pfm", "image/x-phm" ] }