cesium-native/CesiumGltfReader/test/TestImageDecoder.cpp

76 lines
2.8 KiB
C++

#include <CesiumGltf/ImageAsset.h>
#include <CesiumGltfReader/ImageDecoder.h>
#include <CesiumNativeTests/readFile.h>
#include <doctest/doctest.h>
#include <cstddef>
#include <filesystem>
#include <vector>
using namespace CesiumGltf;
using namespace CesiumGltfReader;
TEST_CASE("CesiumGltfReader::ImageDecoder") {
SUBCASE("Can correctly interpret mipmaps in KTX2 files") {
{
// This KTX2 file has a single mip level and no further mip levels should
// be generated. `mipPositions` should reflect this single mip level.
std::filesystem::path ktx2File = CesiumGltfReader_TEST_DATA_DIR;
ktx2File /= "ktx2/kota-onelevel.ktx2";
std::vector<std::byte> data = readFile(ktx2File.string());
ImageReaderResult imageResult =
ImageDecoder::readImage(data, Ktx2TranscodeTargets{});
REQUIRE(imageResult.pImage);
const ImageAsset& image = *imageResult.pImage;
REQUIRE(image.mipPositions.size() == 1);
CHECK(image.mipPositions[0].byteOffset == 0);
CHECK(image.mipPositions[0].byteSize > 0);
CHECK(
image.mipPositions[0].byteSize ==
size_t(image.width * image.height * image.channels));
CHECK(image.mipPositions[0].byteSize == image.pixelData.size());
}
{
// This KTX2 file has only a base image but further mip levels can be
// generated. This image effectively has no mip levels.
std::filesystem::path ktx2File = CesiumGltfReader_TEST_DATA_DIR;
ktx2File /= "ktx2/kota-automipmap.ktx2";
std::vector<std::byte> data = readFile(ktx2File.string());
ImageReaderResult imageResult =
ImageDecoder::readImage(data, Ktx2TranscodeTargets{});
REQUIRE(imageResult.pImage);
const ImageAsset& image = *imageResult.pImage;
REQUIRE(image.mipPositions.size() == 0);
CHECK(image.pixelData.size() > 0);
}
{
// This KTX2 file has a complete mip chain.
std::filesystem::path ktx2File = CesiumGltfReader_TEST_DATA_DIR;
ktx2File /= "ktx2/kota-mipmaps.ktx2";
std::vector<std::byte> data = readFile(ktx2File.string());
ImageReaderResult imageResult =
ImageDecoder::readImage(data, Ktx2TranscodeTargets{});
REQUIRE(imageResult.pImage);
const ImageAsset& image = *imageResult.pImage;
REQUIRE(image.mipPositions.size() == 9);
CHECK(image.mipPositions[0].byteSize > 0);
CHECK(
image.mipPositions[0].byteSize ==
size_t(image.width * image.height * image.channels));
CHECK(image.mipPositions[0].byteSize < image.pixelData.size());
size_t smallerThan = image.mipPositions[0].byteSize;
for (size_t i = 1; i < image.mipPositions.size(); ++i) {
CHECK(image.mipPositions[i].byteSize < smallerThan);
smallerThan = image.mipPositions[i].byteSize;
}
}
}
}