From 0f00da8fea2c2a10495a14f3947bc7af28bef1bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 21 Jan 2025 16:47:20 +0100 Subject: [PATCH] Move image-internal utilities to a private header. No need for these to be in the public PixelStorage.h. --- src/Magnum/GL/AbstractFramebuffer.cpp | 1 + src/Magnum/GL/AbstractTexture.cpp | 1 + src/Magnum/GL/CubeMapTexture.cpp | 1 + src/Magnum/Implementation/ImageProperties.h | 52 +++++++++++++++++++++ src/Magnum/PixelStorage.h | 52 --------------------- src/Magnum/Test/PixelStorageTest.cpp | 1 + 6 files changed, 56 insertions(+), 52 deletions(-) diff --git a/src/Magnum/GL/AbstractFramebuffer.cpp b/src/Magnum/GL/AbstractFramebuffer.cpp index 4398c5990..ac5250a78 100644 --- a/src/Magnum/GL/AbstractFramebuffer.cpp +++ b/src/Magnum/GL/AbstractFramebuffer.cpp @@ -28,6 +28,7 @@ #include "Magnum/Image.h" #include "Magnum/ImageView.h" +#include "Magnum/Implementation/ImageProperties.h" #ifndef MAGNUM_TARGET_GLES2 #include "Magnum/GL/BufferImage.h" #endif diff --git a/src/Magnum/GL/AbstractTexture.cpp b/src/Magnum/GL/AbstractTexture.cpp index 31a12f4b6..352c4cbdc 100644 --- a/src/Magnum/GL/AbstractTexture.cpp +++ b/src/Magnum/GL/AbstractTexture.cpp @@ -33,6 +33,7 @@ #include "Magnum/Image.h" #include "Magnum/ImageView.h" +#include "Magnum/Implementation/ImageProperties.h" #ifndef MAGNUM_TARGET_GLES2 #include "Magnum/GL/BufferImage.h" #endif diff --git a/src/Magnum/GL/CubeMapTexture.cpp b/src/Magnum/GL/CubeMapTexture.cpp index 97f046c39..e67968d78 100644 --- a/src/Magnum/GL/CubeMapTexture.cpp +++ b/src/Magnum/GL/CubeMapTexture.cpp @@ -32,6 +32,7 @@ #include "Magnum/Image.h" #include "Magnum/ImageView.h" +#include "Magnum/Implementation/ImageProperties.h" #ifndef MAGNUM_TARGET_GLES2 #include "Magnum/GL/BufferImage.h" #endif diff --git a/src/Magnum/Implementation/ImageProperties.h b/src/Magnum/Implementation/ImageProperties.h index 68217eade..05d621edb 100644 --- a/src/Magnum/Implementation/ImageProperties.h +++ b/src/Magnum/Implementation/ImageProperties.h @@ -68,6 +68,58 @@ template std::pair::pad(dataProperties.first), Math::Vector::pad(dataProperties.second)); } +/* Used in image query functions */ +template std::size_t imageDataSizeFor(const T& image, const Math::Vector& size) { + std::pair, Math::Vector3> dataProperties = image.storage().dataProperties(image.pixelSize(), Vector3i::pad(size, 1)); + + /* Smallest line/rectangle/cube that covers the area */ + std::size_t dataOffset = 0; + if(dataProperties.first.z()) + dataOffset += dataProperties.first.z(); + else if(dataProperties.first.y()) { + if(!image.storage().imageHeight()) + dataOffset += dataProperties.first.y(); + } else if(dataProperties.first.x()) { + if(!image.storage().rowLength()) + dataOffset += dataProperties.first.x(); + } + return dataOffset + dataProperties.second.product(); +} + +/* Used in data size assertions */ +template inline std::size_t imageDataSize(const T& image) { + return imageDataSizeFor(image, image.size()); +} + +template std::pair compressedImageDataOffsetSizeFor(const T& image, const Math::Vector& size) { + CORRADE_INTERNAL_ASSERT(image.storage().compressedBlockSize().product() && image.storage().compressedBlockDataSize()); + + std::pair, Math::Vector3> dataProperties = image.storage().dataProperties(Vector3i::pad(size, 1)); + + const auto realBlockCount = Math::Vector3{(Vector3i::pad(size, 1) + image.storage().compressedBlockSize() - Vector3i{1})/image.storage().compressedBlockSize()}; + + return {dataProperties.first.sum(), (dataProperties.second.product() - (dataProperties.second.x() - realBlockCount.x()) - (dataProperties.second.y() - realBlockCount.y())*dataProperties.second.x())*image.storage().compressedBlockDataSize()}; +} + +/* Used in image query functions */ +template std::size_t compressedImageDataSizeFor(const T& image, const Math::Vector& size) { + auto r = compressedImageDataOffsetSizeFor(image, size); + return r.first + r.second; +} + +/* Use in compressed image upload functions */ +template std::size_t occupiedCompressedImageDataSize(const T& image, std::size_t dataSize) { + return image.storage().compressedBlockSize().product() && image.storage().compressedBlockDataSize() + ? compressedImageDataOffsetSizeFor(image, image.size()).second : dataSize; +} + +template std::ptrdiff_t pixelStorageSkipOffsetFor(const T& image, const Math::Vector& size) { + return image.storage().dataProperties(image.pixelSize(), Vector3i::pad(size, 1)).first.sum(); +} +template std::ptrdiff_t pixelStorageSkipOffset(const T& image) { + return pixelStorageSkipOffsetFor(image, image.size()); +} + template Containers::StridedArrayView imagePixelView(Image& image, const Data data) { const std::pair, VectorTypeFor> properties = image.dataProperties(); diff --git a/src/Magnum/PixelStorage.h b/src/Magnum/PixelStorage.h index 526ddb5b2..b4ca69d09 100644 --- a/src/Magnum/PixelStorage.h +++ b/src/Magnum/PixelStorage.h @@ -257,58 +257,6 @@ namespace Implementation { template inline UnsignedInt pixelFormatSizeAdl(T format, U formatExtra) { return pixelFormatSize(format, formatExtra); } - - /* Used in image query functions */ - template std::size_t imageDataSizeFor(const T& image, const Math::Vector& size) { - std::pair, Math::Vector3> dataProperties = image.storage().dataProperties(image.pixelSize(), Vector3i::pad(size, 1)); - - /* Smallest line/rectangle/cube that covers the area */ - std::size_t dataOffset = 0; - if(dataProperties.first.z()) - dataOffset += dataProperties.first.z(); - else if(dataProperties.first.y()) { - if(!image.storage().imageHeight()) - dataOffset += dataProperties.first.y(); - } else if(dataProperties.first.x()) { - if(!image.storage().rowLength()) - dataOffset += dataProperties.first.x(); - } - return dataOffset + dataProperties.second.product(); - } - - /* Used in data size assertions */ - template inline std::size_t imageDataSize(const T& image) { - return imageDataSizeFor(image, image.size()); - } - - template std::pair compressedImageDataOffsetSizeFor(const T& image, const Math::Vector& size) { - CORRADE_INTERNAL_ASSERT(image.storage().compressedBlockSize().product() && image.storage().compressedBlockDataSize()); - - std::pair, Math::Vector3> dataProperties = image.storage().dataProperties(Vector3i::pad(size, 1)); - - const auto realBlockCount = Math::Vector3{(Vector3i::pad(size, 1) + image.storage().compressedBlockSize() - Vector3i{1})/image.storage().compressedBlockSize()}; - - return {dataProperties.first.sum(), (dataProperties.second.product() - (dataProperties.second.x() - realBlockCount.x()) - (dataProperties.second.y() - realBlockCount.y())*dataProperties.second.x())*image.storage().compressedBlockDataSize()}; - } - - /* Used in image query functions */ - template std::size_t compressedImageDataSizeFor(const T& image, const Math::Vector& size) { - auto r = compressedImageDataOffsetSizeFor(image, size); - return r.first + r.second; - } - - /* Use in compressed image upload functions */ - template std::size_t occupiedCompressedImageDataSize(const T& image, std::size_t dataSize) { - return image.storage().compressedBlockSize().product() && image.storage().compressedBlockDataSize() - ? compressedImageDataOffsetSizeFor(image, image.size()).second : dataSize; - } - - template std::ptrdiff_t pixelStorageSkipOffsetFor(const T& image, const Math::Vector& size) { - return image.storage().dataProperties(image.pixelSize(), Vector3i::pad(size, 1)).first.sum(); - } - template std::ptrdiff_t pixelStorageSkipOffset(const T& image) { - return pixelStorageSkipOffsetFor(image, image.size()); - } } } diff --git a/src/Magnum/Test/PixelStorageTest.cpp b/src/Magnum/Test/PixelStorageTest.cpp index c4207eca8..dedcb11bc 100644 --- a/src/Magnum/Test/PixelStorageTest.cpp +++ b/src/Magnum/Test/PixelStorageTest.cpp @@ -30,6 +30,7 @@ #include "Magnum/Image.h" #include "Magnum/PixelFormat.h" #include "Magnum/PixelStorage.h" +#include "Magnum/Implementation/ImageProperties.h" namespace Magnum { namespace Test { namespace {