From 276c608f26fddb6d45fc2eeccc52ae4e74e99a50 Mon Sep 17 00:00:00 2001 From: castano Date: Tue, 7 Sep 2010 18:24:50 +0000 Subject: [PATCH] Fix alignment assumptions in DDS loading code. Fixes issue 132. Merge misc changes from the-witness. --- src/nvcore/TextWriter.cpp | 4 ++-- src/nvimage/DirectDrawSurface.cpp | 6 +----- src/nvimage/FloatImage.cpp | 2 +- src/nvimage/nvimage.h | 10 ++++++++++ src/nvtt/CompressorRGB.cpp | 6 ------ src/nvtt/Context.cpp | 5 ----- 6 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/nvcore/TextWriter.cpp b/src/nvcore/TextWriter.cpp index 12884cb..7205677 100644 --- a/src/nvcore/TextWriter.cpp +++ b/src/nvcore/TextWriter.cpp @@ -30,7 +30,7 @@ void TextWriter::write(const char * format, ...) { va_list arg; va_start(arg,format); - str.format(format, arg); + str.formatList(format, arg); writeString(str.str(), str.length()); va_end(arg); } @@ -39,7 +39,7 @@ void TextWriter::write(const char * format, va_list arg) { va_list tmp; va_copy(tmp, arg); - str.format(format, arg); + str.formatList(format, arg); writeString(str.str(), str.length()); va_end(tmp); } diff --git a/src/nvimage/DirectDrawSurface.cpp b/src/nvimage/DirectDrawSurface.cpp index ae539a1..5eb8a7b 100644 --- a/src/nvimage/DirectDrawSurface.cpp +++ b/src/nvimage/DirectDrawSurface.cpp @@ -1404,11 +1404,7 @@ uint DirectDrawSurface::mipmapSize(uint mipmap) const { nvDebugCheck((header.pf.flags & DDPF_RGB) || (header.pf.flags & DDPF_LUMINANCE)); - // Align pixels to bytes. - uint byteCount = (header.pf.bitcount + 7) / 8; - - // Align pitch to 4 bytes. - uint pitch = 4 * ((w * byteCount + 3) / 4); + uint pitch = computePitch(w, header.pf.bitcount, 8); // Asuming 8 bit alignment, which is the same D3DX expects. return pitch * h * d; } diff --git a/src/nvimage/FloatImage.cpp b/src/nvimage/FloatImage.cpp index 9ef4099..88f33e4 100644 --- a/src/nvimage/FloatImage.cpp +++ b/src/nvimage/FloatImage.cpp @@ -258,7 +258,7 @@ void FloatImage::exponentiate(uint base_component, uint num, float power) float * ptr = this->channel(base_component + c); for(uint i = 0; i < size; i++) { - ptr[i] = pow(ptr[i], power); + ptr[i] = powf(max(0.0f, ptr[i]), power); } } } diff --git a/src/nvimage/nvimage.h b/src/nvimage/nvimage.h index b6001ae..03f9c2e 100644 --- a/src/nvimage/nvimage.h +++ b/src/nvimage/nvimage.h @@ -20,4 +20,14 @@ #define NVIMAGE_CLASS #endif + +// Some utility functions: + +inline uint computePitch(uint w, uint bitsize, uint alignment) +{ + return ((w * bitsize + 8 * alignment - 1) / (8 * alignment)) * alignment; +} + + + #endif // NV_IMAGE_H diff --git a/src/nvtt/CompressorRGB.cpp b/src/nvtt/CompressorRGB.cpp index eb64b79..6941b68 100644 --- a/src/nvtt/CompressorRGB.cpp +++ b/src/nvtt/CompressorRGB.cpp @@ -39,12 +39,6 @@ using namespace nvtt; namespace { - - inline uint computePitch(uint w, uint bitsize, uint alignment) - { - return ((w * bitsize + 8 * alignment - 1) / (8 * alignment)) * alignment; - } - inline void convert_to_a8r8g8b8(const void * src, void * dst, uint w) { memcpy(dst, src, 4 * w); diff --git a/src/nvtt/Context.cpp b/src/nvtt/Context.cpp index 667bc7c..dcdf374 100644 --- a/src/nvtt/Context.cpp +++ b/src/nvtt/Context.cpp @@ -89,11 +89,6 @@ namespace return 0; } - inline uint computePitch(uint w, uint bitsize, uint alignment) - { - return ((w * bitsize + 8 * alignment - 1) / (8 * alignment)) * alignment; - } - static int computeImageSize(uint w, uint h, uint d, uint bitCount, uint alignment, Format format) { if (format == Format_RGBA) {