fix image loader bug where rows and cols were misinterpreted

This commit is contained in:
ohyzha
2025-01-02 17:40:15 +02:00
parent b866f5ac46
commit e789c569db

View File

@@ -16,9 +16,9 @@ namespace OpenVulkano::Image
std::unique_ptr<Image> IImageLoader::loadData(const uint8_t* data, int size, int desiredChannels) std::unique_ptr<Image> IImageLoader::loadData(const uint8_t* data, int size, int desiredChannels)
{ {
Image result; Image result;
int rows, cols, channels; int width, height, channels;
stbi_set_flip_vertically_on_load(true); stbi_set_flip_vertically_on_load(true);
uint8_t* pixelData = stbi_load_from_memory(data, static_cast<int>(size), &rows, &cols, &channels, desiredChannels); uint8_t* pixelData = stbi_load_from_memory(data, static_cast<int>(size), &width, &height, &channels, desiredChannels);
if (desiredChannels != 0 && channels < desiredChannels) if (desiredChannels != 0 && channels < desiredChannels)
{ {
Logger::INPUT->warn( Logger::INPUT->warn(
@@ -38,13 +38,13 @@ namespace OpenVulkano::Image
result.dataFormat = OpenVulkano::DataFormat::R8G8B8A8_UNORM; result.dataFormat = OpenVulkano::DataFormat::R8G8B8A8_UNORM;
break; break;
} }
result.resolution.x = cols; result.resolution.x = width;
result.resolution.y = rows; result.resolution.y = height;
result.resolution.z = 1; result.resolution.z = 1;
if (channels == 3) if (channels == 3)
{ {
result.data = OpenVulkano::Array<uint8_t>(cols * rows * 4); result.data = OpenVulkano::Array<uint8_t>(width * height * 4);
for (size_t srcPos = 0, dstPos = 0; srcPos < cols * rows * 3; srcPos += 3, dstPos += 4) for (size_t srcPos = 0, dstPos = 0; srcPos < width * height * 3; srcPos += 3, dstPos += 4)
{ {
result.data[dstPos] = pixelData[srcPos]; result.data[dstPos] = pixelData[srcPos];
result.data[dstPos + 1] = pixelData[srcPos + 1]; result.data[dstPos + 1] = pixelData[srcPos + 1];
@@ -54,7 +54,7 @@ namespace OpenVulkano::Image
} }
else else
{ {
result.data = OpenVulkano::Array<uint8_t>(cols * rows * channels); result.data = OpenVulkano::Array<uint8_t>(width * height * channels);
std::memcpy(result.data.Data(), pixelData, result.data.Size()); std::memcpy(result.data.Data(), pixelData, result.data.Size());
} }
stbi_image_free(pixelData); stbi_image_free(pixelData);