From ff7e64494fdb9452e59e73ca22a9676dc343880d Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 18 Nov 2016 01:15:58 +0100 Subject: [PATCH] Utility/Image: Add HasAlpha() method --- include/Nazara/Utility/Image.hpp | 2 ++ src/Nazara/Utility/Image.cpp | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/Nazara/Utility/Image.hpp b/include/Nazara/Utility/Image.hpp index 029157885..e1712aed1 100644 --- a/include/Nazara/Utility/Image.hpp +++ b/include/Nazara/Utility/Image.hpp @@ -91,6 +91,8 @@ namespace Nz ImageType GetType() const; unsigned int GetWidth(UInt8 level = 0) const; + bool HasAlpha() const; + bool IsValid() const; // Load diff --git a/src/Nazara/Utility/Image.cpp b/src/Nazara/Utility/Image.cpp index b4be2c7c5..39d99cdd1 100644 --- a/src/Nazara/Utility/Image.cpp +++ b/src/Nazara/Utility/Image.cpp @@ -825,6 +825,44 @@ namespace Nz return GetLevelSize(m_sharedImage->width, level); } + bool Image::HasAlpha() const + { + NazaraAssert(m_sharedImage != &emptyImage, "Image must be valid"); + + if (!PixelFormat::HasAlpha(m_sharedImage->format)) + return false; + + if (!PixelFormat::IsCompressed(m_sharedImage->format)) + { + const PixelFormatInfo& info = PixelFormat::GetInfo(m_sharedImage->format); + const UInt8* pixel = GetConstPixels(); + + Bitset<> workingBitset; + std::size_t pixelCount = m_sharedImage->width * m_sharedImage->height * ((m_sharedImage->type == ImageType_Cubemap) ? 6 : m_sharedImage->depth); + if (pixelCount == 0) + return false; + + auto seq = workingBitset.Read(GetConstPixels(), info.bitsPerPixel); + do + { + workingBitset &= info.alphaMask; + if (workingBitset.Count() != info.alphaMask.Count()) //< Means that at least one bit of the alpha mask of this pixel is disabled + return true; + + workingBitset.Clear(); + workingBitset.Read(seq, info.bitsPerPixel); + } + while (--pixelCount > 0); + + return false; + } + else + { + // FIXME: Currently, we assume the pixel format is already the right one + return true; + } + } + bool Image::IsValid() const { return m_sharedImage != &emptyImage;