Fix for dimensions that aren't a multiple of four
Grows the preview size to the nearest 4x4 to match the block size used.
diff --git a/contrib/previewers/win/helpers.cpp b/contrib/previewers/win/helpers.cpp
index ab89279..b37c8f5 100644
--- a/contrib/previewers/win/helpers.cpp
+++ b/contrib/previewers/win/helpers.cpp
@@ -139,13 +139,15 @@
* regular case.
*
* TODO: 16-bit variant instead?
- * TODO: bitmaps with dimensions that aren't a multiple of 4
+ * TODO: we're growing the nearest 4x4 but not cropping afterwards (what about shrinking and skipping the last blocks?)
*/
+ uint32_t nearW = (imgW + 3) & ~3;
+ uint32_t nearH = (imgH + 3) & ~3;
BITMAPINFO bmi = {
sizeof(bmi.bmiHeader)
};
- bmi.bmiHeader.biWidth = imgW;
- bmi.bmiHeader.biHeight = (flip) ? imgH : -static_cast<int32_t>(imgH);
+ bmi.bmiHeader.biWidth = nearW;
+ bmi.bmiHeader.biHeight = (flip) ? nearH : -static_cast<int32_t>(nearH);
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
@@ -156,14 +158,14 @@
*/
if (hbmp && pixels) {
uint32_t* dst = static_cast<uint32_t*>(pixels);
- for (unsigned y = 0; y < imgH; y += 4) {
+ for (unsigned y = 0; y < nearH; y += 4) {
uint32_t* row = dst;
- for (unsigned x = 0; x < imgW; x += 4) {
- decodeDxt1(src, row, imgW);
+ for (unsigned x = 0; x < nearW; x += 4) {
+ decodeDxt1(src, row, nearW);
src += 8;
row += 4;
}
- dst += 4 * imgW;
+ dst += 4 * nearW;
}
}
return hbmp;