From 5ce1d3ba9132437027c058c5f5236eb43ad9f06e Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sun, 19 Aug 2018 21:15:25 -0400 Subject: [PATCH 1/4] Teach PRPShop about PNG compressed mipmaps --- src/PrpShop/PRP/Surface/QMipmap.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/PrpShop/PRP/Surface/QMipmap.cpp b/src/PrpShop/PRP/Surface/QMipmap.cpp index cd0bbaa..007b18c 100644 --- a/src/PrpShop/PRP/Surface/QMipmap.cpp +++ b/src/PrpShop/PRP/Surface/QMipmap.cpp @@ -193,6 +193,19 @@ QString getCompressionText(plBitmap* tex) case plBitmap::kAInten88: return "JPEG (Alpha+Greyscale)"; } + } else if (tex->getCompressionType() == plBitmap::kPNGCompression) { + switch (tex->getARGBType()) { + case plBitmap::kRGB8888: + return "PNG (ARGB8888)"; + case plBitmap::kRGB4444: + return "PNG (ARGB4444)"; + case plBitmap::kRGB1555: + return "PNG (ARGB1555)"; + case plBitmap::kInten8: + return "PNG (Greyscale)"; + case plBitmap::kAInten88: + return "PNG (Alpha+Greyscale)"; + } } else { switch (tex->getARGBType()) { case plBitmap::kRGB8888: From 4cefe4226e1e24772868c0f7d3ab362256716ffc Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sun, 19 Aug 2018 21:17:18 -0400 Subject: [PATCH 2/4] Fix non-DXT image channels All Plasma image data, other than DXT, is stored as BGR in plMipmap --- src/PrpShop/PRP/Surface/QMipmap.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/PrpShop/PRP/Surface/QMipmap.cpp b/src/PrpShop/PRP/Surface/QMipmap.cpp index 007b18c..1e02e81 100644 --- a/src/PrpShop/PRP/Surface/QMipmap.cpp +++ b/src/PrpShop/PRP/Surface/QMipmap.cpp @@ -81,7 +81,7 @@ void QTextureBox::setTexture(plMipmap* tex, int level) fImageData = new unsigned char[size]; tex->DecompressImage(level, fImageData, size); - if (tex->getCompressionType() != plMipmap::kUncompressed) { + if (tex->getCompressionType() == plMipmap::kDirectXCompression) { // Manipulate the data from RGBA to BGRA unsigned int* dp = (unsigned int*)fImageData; for (size_t i=0; i(data); + for (size_t i=0; i> 16 + | (*dp & 0x000000FF) << 16; + dp++; + } +} + static void makeJColorSurface(const plMipmap* tex, hsStream* S) { if (tex->getCompressionType() != plBitmap::kJPEGCompression) { @@ -367,6 +378,7 @@ static void makeJColorSurface(const plMipmap* tex, hsStream* S) // Strip down data to 24 bit color unsigned char* data = new unsigned char[dds.fLinearSize]; tex->extractColorData(data, dds.fLinearSize); + swapColorChannels(data, dds.fLinearSize); dds.setData(dds.fLinearSize, data); delete[] data; @@ -425,6 +437,7 @@ static bool getJColorSurface(const plDDSurface& dds, plMipmap* tex) tex->Create(dds.fWidth, dds.fHeight, 0, plBitmap::kJPEGCompression, plBitmap::kRGB8888); tex->setColorData(dds.getData(), dds.getDataSize()); + swapColorChannels(reinterpret_cast(tex->getImageData()), dds.getDataSize()); return true; } From 9aadb4692700ebf5a01e531a5bb9d6d02f6cc892 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 5 Mar 2024 18:18:08 -0500 Subject: [PATCH 3/4] Add alignment check per CR. --- src/PrpShop/PRP/Surface/QMipmap.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PrpShop/PRP/Surface/QMipmap.cpp b/src/PrpShop/PRP/Surface/QMipmap.cpp index 1e02e81..b45be41 100644 --- a/src/PrpShop/PRP/Surface/QMipmap.cpp +++ b/src/PrpShop/PRP/Surface/QMipmap.cpp @@ -343,6 +343,8 @@ QMipmap::QMipmap(plCreatable* pCre, QWidget* parent) static void swapColorChannels(unsigned char* data, size_t size) { + Q_ASSERT(reinterpret_cast(data) % sizeof(unsigned int) == 0); + unsigned int* dp = reinterpret_cast(data); for (size_t i=0; i Date: Tue, 5 Mar 2024 22:00:41 -0500 Subject: [PATCH 4/4] Apply suggestion from CR. Co-authored-by: Michael Hansen --- src/PrpShop/PRP/Surface/QMipmap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PrpShop/PRP/Surface/QMipmap.cpp b/src/PrpShop/PRP/Surface/QMipmap.cpp index b45be41..f22d20f 100644 --- a/src/PrpShop/PRP/Surface/QMipmap.cpp +++ b/src/PrpShop/PRP/Surface/QMipmap.cpp @@ -343,7 +343,7 @@ QMipmap::QMipmap(plCreatable* pCre, QWidget* parent) static void swapColorChannels(unsigned char* data, size_t size) { - Q_ASSERT(reinterpret_cast(data) % sizeof(unsigned int) == 0); + Q_ASSERT(reinterpret_cast(data) % alignof(unsigned int) == 0); unsigned int* dp = reinterpret_cast(data); for (size_t i=0; i