From e9d53fd834a0d9a54ef989f6e782642218d4080c Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 3 Jan 2018 23:38:25 +0100 Subject: [PATCH] fixed unswizzling bug --- src/ps2/ps2raster.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ps2/ps2raster.cpp b/src/ps2/ps2raster.cpp index 5dc8583..80cff14 100644 --- a/src/ps2/ps2raster.cpp +++ b/src/ps2/ps2raster.cpp @@ -1430,7 +1430,7 @@ unswizzle(uint8 *dst, uint8 *src, int32 w, int32 h, int32 d) return; } - // this is more complicated...and not correct.... + // this is more complicated... uint8 *tmp = rwNewT(uint8, tw*th, MEMDUR_FUNCTION | ID_RASTERPS2); unswizzle8(tmp, src, tw, th); for(y = 0; y < h; y++) @@ -1508,8 +1508,17 @@ rasterToImage(Raster *raster) out = image->pixels; in = raster->lock(0); if(depth == 4){ - uint8 *in8 = rwNewT(uint8, w*h, MEMDUR_FUNCTION | ID_RASTERPS2); - for(uint32 i = 0; i < w*h/2; i++){ + // Actually PSMT4 is transferred as PSMCT16 but + // apparently we can "uncompress" the indices into PSMT8 + // and unswizzle as if transferred as PSMCT32 + // Would be nice to understand this correctly some day + int minw, minh; + int th, tw; + transferMinSize(PSMT4, 4, &minw, &minh); + tw = max(w, minw); + th = max(h, minh); + uint8 *in8 = rwNewT(uint8, tw*th, MEMDUR_FUNCTION | ID_RASTERPS2); + for(uint32 i = 0; i < tw*th/2; i++){ in8[i*2+0] = in[i] & 0xF; in8[i*2+1] = in[i] >> 4; }