From 42a4a1e4ba2561677f71e519d4ca5060974a9bf1 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Thu, 2 May 2013 10:56:30 +0200 Subject: [PATCH] Brightness fix for scaled RGB565 and RGB5551 textures. Fix broken color conversion in DecodeTexture (which is not normally used). --- GPU/GLES/TextureCache.cpp | 21 +++++++++++---------- GPU/GLES/TextureCache.h | 1 + GPU/GLES/TextureScaler.cpp | 12 ++++++------ 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 68ccd00da5..6d6d2a8be1 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -1222,6 +1222,7 @@ void TextureCache::LoadTextureLevel(TexCacheEntry &entry, int level) { glTexImage2D(GL_TEXTURE_2D, level, components, w, h, 0, components, dstFmt, pixelData); } +// Only used by Qt UI? bool TextureCache::DecodeTexture(u8* output, GPUgstate state) { GPUgstate oldState = gstate; @@ -1258,10 +1259,10 @@ bool TextureCache::DecodeTexture(u8* output, GPUgstate state) for(int y = 0; y < bufw; y++) { u32 val = ((u16*)finalBuf)[x*bufw + y]; - u32 a = (val & 0xF) * 255 / 15; - u32 r = ((val & 0xF) >> 24) * 255 / 15; - u32 g = ((val & 0xF) >> 16) * 255 / 15; - u32 b = ((val & 0xF) >> 8) * 255 / 15; + u32 r = ((val>>12) & 0xF) * 17; + u32 g = ((val>> 8) & 0xF) * 17; + u32 b = ((val>> 4) & 0xF) * 17; + u32 a = ((val>> 0) & 0xF) * 17; ((u32*)output)[x*w + y] = (a << 24) | (r << 16) | (g << 8) | b; } break; @@ -1271,10 +1272,10 @@ bool TextureCache::DecodeTexture(u8* output, GPUgstate state) for(int y = 0; y < bufw; y++) { u32 val = ((u16*)finalBuf)[x*bufw + y]; + u32 r = Convert5To8((val>>11) & 0x1F); + u32 g = Convert5To8((val>> 6) & 0x1F); + u32 b = Convert5To8((val>> 1) & 0x1F); u32 a = (val & 0x1) * 255; - u32 r = ((val & 0x1F) >> 11) * 255 / 31; - u32 g = ((val & 0x1F) >> 6) * 255 / 31; - u32 b = ((val & 0x1F) >> 1) * 255 / 31; ((u32*)output)[x*w + y] = (a << 24) | (r << 16) | (g << 8) | b; } break; @@ -1285,9 +1286,9 @@ bool TextureCache::DecodeTexture(u8* output, GPUgstate state) { u32 val = ((u16*)finalBuf)[x*bufw + y]; u32 a = 0xFF; - u32 r = ((val & 0x1F) >> 11) * 255 / 31; - u32 g = ((val & 0x3F) >> 6) * 255 / 63; - u32 b = ((val & 0x1F)) * 255 / 31; + u32 r = Convert5To8((val>>11) & 0x1F); + u32 g = Convert6To8((val>> 5) & 0x3F); + u32 b = Convert5To8((val ) & 0x1F); ((u32*)output)[x*w + y] = (a << 24) | (r << 16) | (g << 8) | b; } break; diff --git a/GPU/GLES/TextureCache.h b/GPU/GLES/TextureCache.h index b7661a205a..fa2fefd3ed 100644 --- a/GPU/GLES/TextureCache.h +++ b/GPU/GLES/TextureCache.h @@ -47,6 +47,7 @@ public: return cache.size(); } + // Only used by Qt UI? bool DecodeTexture(u8 *output, GPUgstate state); private: diff --git a/GPU/GLES/TextureScaler.cpp b/GPU/GLES/TextureScaler.cpp index 0d024b7ca1..953eb99828 100644 --- a/GPU/GLES/TextureScaler.cpp +++ b/GPU/GLES/TextureScaler.cpp @@ -63,9 +63,9 @@ namespace { for(int y = l; y < u; ++y) { for(int x = 0; x < width; ++x) { u32 val = ((u16*)data)[y*width + x]; - u32 r = ((val>>11) & 0x1F) * 8; - u32 g = ((val>> 5) & 0x3F) * 4; - u32 b = ((val ) & 0x1F) * 8; + u32 r = Convert5To8((val>>11) & 0x1F); + u32 g = Convert6To8((val>> 5) & 0x3F); + u32 b = Convert5To8((val ) & 0x1F); out[y*width + x] = (0xFF << 24) | (b << 16) | (g << 8) | r; } } @@ -75,9 +75,9 @@ namespace { for(int y = l; y < u; ++y) { for(int x = 0; x < width; ++x) { u32 val = ((u16*)data)[y*width + x]; - u32 r = ((val>>11) & 0x1F) * 8; - u32 g = ((val>> 6) & 0x1F) * 8; - u32 b = ((val>> 1) & 0x1F) * 8; + u32 r = Convert5To8((val>>11) & 0x1F); + u32 g = Convert5To8((val>> 6) & 0x1F); + u32 b = Convert5To8((val>> 1) & 0x1F); u32 a = (val & 0x1) * 255; out[y*width + x] = (a << 24) | (b << 16) | (g << 8) | r; }