From ef4c732751b6a1823a9ff48bfd91afc6acee76d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 26 Jan 2025 00:09:26 +0100 Subject: [PATCH] Move CompressedPixelStorage dataProperties() logic to an internal header. It'll be used directly from images, bypassing the storage block parameters. --- src/Magnum/Implementation/ImageProperties.h | 15 +++++++++++++++ src/Magnum/PixelStorage.cpp | 11 ++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Magnum/Implementation/ImageProperties.h b/src/Magnum/Implementation/ImageProperties.h index a55a6ea77..fedf30280 100644 --- a/src/Magnum/Implementation/ImageProperties.h +++ b/src/Magnum/Implementation/ImageProperties.h @@ -72,6 +72,21 @@ template std::pair::pad(dataProperties.first), Math::Vector::pad(dataProperties.second)); } +/* Used in CompressedPixelStorage::dataProperties(), where it passes the + storage-supplied block size */ +inline std::pair, Math::Vector3> compressedDataProperties(const CompressedPixelStorage& storage, const Vector3i& blockSize, const UnsignedInt blockDataSize, const Vector3i& size) { + const Vector3i blockCount = (size + blockSize - Vector3i{1})/blockSize; + const Math::Vector3 dataSize{ + std::size_t(storage.rowLength() ? (storage.rowLength() + blockSize.x() - 1)/blockSize.x() : blockCount.x()), + std::size_t(storage.imageHeight() ? (storage.imageHeight() + blockSize.y() - 1)/blockSize.y() : blockCount.y()), + std::size_t(blockCount.z())}; + + const Vector3i skipBlockCount = (storage.skip() + blockSize - Vector3i{1})/blockSize; + const Math::Vector3 offset = (Math::Vector3{1, dataSize.x(), dataSize.xy().product()}*Math::Vector3{skipBlockCount})*blockDataSize; + + return std::make_pair(offset, size.product() ? dataSize : Math::Vector3{}); +} + /* Used in Compressed*Image::dataProperties() */ template std::pair, Math::Vector> compressedImageDataProperties(const T& image) { std::pair, Math::Vector3> dataProperties = image.storage().dataProperties(Vector3i::pad(image.size(), 1)); diff --git a/src/Magnum/PixelStorage.cpp b/src/Magnum/PixelStorage.cpp index e7a3b3c76..2b547cd47 100644 --- a/src/Magnum/PixelStorage.cpp +++ b/src/Magnum/PixelStorage.cpp @@ -29,6 +29,7 @@ #include #include "Magnum/Math/Vector3.h" +#include "Magnum/Implementation/ImageProperties.h" namespace Magnum { @@ -54,16 +55,8 @@ std::pair, Math::Vector3> PixelStorage:: std::pair, Math::Vector3> CompressedPixelStorage::dataProperties(const Vector3i& size) const { CORRADE_ASSERT(_blockDataSize && _blockSize.product(), "CompressedPixelStorage::dataProperties(): expected non-zero storage parameters", {}); - const Vector3i blockCount = (size + _blockSize - Vector3i{1})/_blockSize; - const Math::Vector3 dataSize{ - std::size_t(_rowLength ? (_rowLength + _blockSize.x() - 1)/_blockSize.x() : blockCount.x()), - std::size_t(_imageHeight ? (_imageHeight + _blockSize.y() - 1)/_blockSize.y() : blockCount.y()), - std::size_t(blockCount.z())}; - - const Vector3i skipBlockCount = (_skip + _blockSize - Vector3i{1})/_blockSize; - const Math::Vector3 offset = (Math::Vector3{1, dataSize.x(), dataSize.xy().product()}*Math::Vector3{skipBlockCount})*_blockDataSize; + return Implementation::compressedDataProperties(*this, _blockSize, _blockDataSize, size); - return std::make_pair(offset, size.product() ? dataSize : Math::Vector3{}); } bool CompressedPixelStorage::operator==(const CompressedPixelStorage& other) const {