Browse Source

TextureTools: take a strided view in atlasArrayPowerOfTwo().

Together with the parent commit, it's now possible to do THE
UNTHINKABLE:

    Containers::Array<Trade::ImageData2D> inputImages = ...;

    auto out = TextureTools::atlasArrayPowerOfTwo({2048, 2048},
        stridedArrayView(inputImages).slice(&Trade::ImageData2D::size));

An actual use case, in fact. Because why not.
pull/578/head
Vladimír Vondruš 4 years ago
parent
commit
cb3ac83485
  1. 5
      src/Magnum/TextureTools/Atlas.cpp
  2. 2
      src/Magnum/TextureTools/Atlas.h
  3. 1
      src/Magnum/TextureTools/Test/AtlasTest.cpp

5
src/Magnum/TextureTools/Atlas.cpp

@ -28,6 +28,7 @@
#include <algorithm>
#include <vector>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/StridedArrayView.h>
#include <Corrade/Containers/Pair.h>
#include "Magnum/Math/Functions.h"
@ -64,7 +65,7 @@ std::vector<Range2Di> atlas(const Vector2i& atlasSize, const std::vector<Vector2
return atlas;
}
Containers::Pair<Int, Containers::Array<Vector3i>> atlasArrayPowerOfTwo(const Vector2i& layerSize, const Containers::ArrayView<const Vector2i> sizes) {
Containers::Pair<Int, Containers::Array<Vector3i>> atlasArrayPowerOfTwo(const Vector2i& layerSize, const Containers::StridedArrayView1D<const Vector2i> sizes) {
CORRADE_ASSERT(layerSize.product() && layerSize.x() == layerSize.y() && (layerSize & (layerSize - Vector2i{1})).isZero(),
"TextureTools::atlasArrayPowerOfTwo(): expected layer size to be a non-zero power-of-two square, got" << Debug::packed << layerSize, {});
@ -140,7 +141,7 @@ Containers::Pair<Int, Containers::Array<Vector3i>> atlasArrayPowerOfTwo(const Ve
}
Containers::Pair<Int, Containers::Array<Vector3i>> atlasArrayPowerOfTwo(const Vector2i& layerSize, const std::initializer_list<Vector2i> sizes) {
return atlasArrayPowerOfTwo(layerSize, Containers::arrayView(sizes));
return atlasArrayPowerOfTwo(layerSize, Containers::stridedArrayView(sizes));
}
}}

2
src/Magnum/TextureTools/Atlas.h

@ -72,7 +72,7 @@ atlasing in a single @f$ \mathcal{O}(n) @f$ operation. Due to the sort
involved, a temporary allocation holds the sorted array and additionally
@ref std::stable_sort() performs its own allocation.
*/
Containers::Pair<Int, Containers::Array<Vector3i>> MAGNUM_TEXTURETOOLS_EXPORT atlasArrayPowerOfTwo(const Vector2i& layerSize, Containers::ArrayView<const Vector2i> sizes);
Containers::Pair<Int, Containers::Array<Vector3i>> MAGNUM_TEXTURETOOLS_EXPORT atlasArrayPowerOfTwo(const Vector2i& layerSize, Containers::StridedArrayView1D<const Vector2i> sizes);
/**
* @overload

1
src/Magnum/TextureTools/Test/AtlasTest.cpp

@ -27,6 +27,7 @@
#include <vector>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Pair.h>
#include <Corrade/Containers/StridedArrayView.h>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/Utility/DebugStl.h>

Loading…
Cancel
Save