From 259e7c58fd2c7061de1b503e9b7351dd4cb8569a Mon Sep 17 00:00:00 2001 From: castano Date: Tue, 11 Mar 2008 21:22:54 +0000 Subject: [PATCH] Merge Viktor Linder patch into 2.0 and trunk. Fixes RGB modes with less than 32 bpp. --- src/nvimage/DirectDrawSurface.cpp | 6 +++--- src/nvtt/CompressRGB.cpp | 10 ++++++++-- src/nvtt/Compressor.cpp | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/nvimage/DirectDrawSurface.cpp b/src/nvimage/DirectDrawSurface.cpp index 7827d16..c75ce22 100644 --- a/src/nvimage/DirectDrawSurface.cpp +++ b/src/nvimage/DirectDrawSurface.cpp @@ -530,9 +530,9 @@ void DDSHeader::setPixelFormat(uint bitcount, uint rmask, uint gmask, uint bmask nvCheck(bitcount > 0 && bitcount <= 32); // Align to 8. - if (bitcount < 8) bitcount = 8; - else if (bitcount < 16) bitcount = 16; - else if (bitcount < 24) bitcount = 24; + if (bitcount <= 8) bitcount = 8; + else if (bitcount <= 16) bitcount = 16; + else if (bitcount <= 24) bitcount = 24; else bitcount = 32; this->pf.fourcc = 0; //findD3D9Format(bitcount, rmask, gmask, bmask, amask); diff --git a/src/nvtt/CompressRGB.cpp b/src/nvtt/CompressRGB.cpp index 33b41e5..f45f5b6 100644 --- a/src/nvtt/CompressRGB.cpp +++ b/src/nvtt/CompressRGB.cpp @@ -115,12 +115,18 @@ void nv::compressRGB(const Image * image, const OutputOptions::Private & outputO c |= PixelFormat::convert(src[x].b, 8, bsize) << bshift; c |= PixelFormat::convert(src[x].a, 8, asize) << ashift; - // Output one byte at a time. @@ Not tested... Does this work on LE and BE? + // Output one byte at a time. for (uint i = 0; i < byteCount; i++) { - *(dst + x * byteCount) = (c >> (i * 8)) & 0xFF; + *(dst + x * byteCount + i) = (c >> (i * 8)) & 0xFF; } } + + // Zero padding. + for (uint x = w; x < pitch; x++) + { + *(dst + x) = 0; + } } if (outputOptions.outputHandler != NULL) diff --git a/src/nvtt/Compressor.cpp b/src/nvtt/Compressor.cpp index fb86871..357630f 100644 --- a/src/nvtt/Compressor.cpp +++ b/src/nvtt/Compressor.cpp @@ -341,7 +341,7 @@ bool Compressor::Private::outputHeader(const InputOptions::Private & inputOption if (compressionOptions.format == Format_RGBA) { - header.setPitch(4 * inputOptions.targetWidth); + header.setPitch(computePitch(inputOptions.targetWidth, compressionOptions.bitcount)); header.setPixelFormat(compressionOptions.bitcount, compressionOptions.rmask, compressionOptions.gmask, compressionOptions.bmask, compressionOptions.amask); } else