From a6877d5baa65a941225b7e5ed697314255e4edc3 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Wed, 8 Aug 2018 16:24:49 -0700 Subject: [PATCH] Fix cmgen cross cubmap input Fixes bug #45 --- libs/imageio/src/ImageDecoder.cpp | 13 +++--- tools/cmgen/src/CubemapUtils.cpp | 25 ++++++++---- tools/cmgen/src/CubemapUtils.h | 7 +++- tools/cmgen/src/cmgen.cpp | 68 +++++++++++++++++-------------- 4 files changed, 67 insertions(+), 46 deletions(-) diff --git a/libs/imageio/src/ImageDecoder.cpp b/libs/imageio/src/ImageDecoder.cpp index 5b6a8d08d4..95f19b08d7 100644 --- a/libs/imageio/src/ImageDecoder.cpp +++ b/libs/imageio/src/ImageDecoder.cpp @@ -1,3 +1,5 @@ +#include + /* * Copyright (C) 2015 The Android Open Source Project * @@ -290,7 +292,7 @@ Image PNGDecoder::decode() { uint32_t height = png_get_image_height(mPNG, mInfo); size_t rowBytes = png_get_rowbytes(mPNG, mInfo); - imageData.reset(new uint8_t[height * rowBytes]); + imageData = std::make_unique(height * rowBytes); std::unique_ptr rowPointers(new png_bytep[height]); for (size_t y = 0 ; y < height ; y++) { rowPointers[y] = &imageData[y * rowBytes]; @@ -369,8 +371,7 @@ HDRDecoder::HDRDecoder(std::istream& stream) : mStream(stream), mStreamStartPos(stream.tellg()) { } -HDRDecoder::~HDRDecoder() { -} +HDRDecoder::~HDRDecoder() = default; Image HDRDecoder::decode() { try { @@ -480,8 +481,7 @@ PSDDecoder::PSDDecoder(std::istream& stream) : mStream(stream), mStreamStartPos(stream.tellg()) { } -PSDDecoder::~PSDDecoder() { -} +PSDDecoder::~PSDDecoder() = default; Image PSDDecoder::decode() { #pragma pack(push, 1) @@ -593,8 +593,7 @@ EXRDecoder::EXRDecoder(std::istream& stream, const std::string& sourceName) : mStream(stream), mStreamStartPos(stream.tellg()), mSourceName(sourceName) { } -EXRDecoder::~EXRDecoder() { -} +EXRDecoder::~EXRDecoder() = default; Image EXRDecoder::decode() { try { diff --git a/tools/cmgen/src/CubemapUtils.cpp b/tools/cmgen/src/CubemapUtils.cpp index 52e66af1ff..fe376fda31 100644 --- a/tools/cmgen/src/CubemapUtils.cpp +++ b/tools/cmgen/src/CubemapUtils.cpp @@ -81,7 +81,7 @@ void CubemapUtils::equirectangularToCubemap(Cubemap& dst, const image::Image& sr c += Cubemap::sampleAt(src.getSampleRef((uint32_t)xf, (uint32_t)yf)); } c *= iNumSamples; - dst.writeAt(data, c); + Cubemap::writeAt(data, c); } }); } @@ -92,7 +92,7 @@ void CubemapUtils::downsampleCubemapLevelBoxFilter(Cubemap& dst, const Cubemap& [&](EmptyState&, size_t y, Cubemap::Face f, Cubemap::Texel* data, size_t dim) { const image::Image& image(src.getImageForFace(f)); for (size_t x=0 ; x= src.getWidth() && dst.getHeight() >= src.getHeight()); + for (size_t y = 0, my = src.getHeight(); y < my; ++y) { + memcpy(dst.getPixelRef(0, y), src.getPixelRef(0, y), src.getBytesPerRow()); + } +} + void CubemapUtils::mirrorCubemap(Cubemap& dst, const Cubemap& src) { process(dst, [&](EmptyState&, size_t y, Cubemap::Face f, Cubemap::Texel* data, size_t dim) { for (size_t x=0 ; x height; size_t dim = std::max(height, width) / 4; - levels.push_back(Cubemap(dim)); if (!g_quiet) { std::cout << "Loading cross... " << std::endl; } - Cubemap& base(levels[0]); - CubemapUtils::setAllFacesFromCross(base, inputImage); - base.makeSeamless(); - images.push_back(std::move(inputImage)); + + Image temp; + Cubemap cml = CubemapUtils::create(temp, dim, isHorizontal); + CubemapUtils::copyImage(temp, inputImage); + cml.makeSeamless(); + images.push_back(std::move(temp)); + levels.push_back(std::move(cml)); } else if (width == 2 * height) { // we assume a spherical (equirectangular) image, which we will convert to a cross image size_t dim = g_output_size ? g_output_size : 256; @@ -429,8 +437,8 @@ int main(int argc, char* argv[]) { std::cerr << "Aspect ratio not supported: " << width << "x" << height << std::endl; std::cerr << "Supported aspect ratios:" << std::endl; std::cerr << " 2:1, lat/long or equirectangular" << std::endl; - std::cerr << " 3:4, vertical cross (width must be power of two)" << std::endl; - std::cerr << " 4:3, horizontal cross (height must be power of two)" << std::endl; + std::cerr << " 3:4, vertical cross (height must be power of two)" << std::endl; + std::cerr << " 4:3, horizontal cross (width must be power of two)" << std::endl; exit(0); } } else {