summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/TextureDecoder.cpp
diff options
context:
space:
mode:
authorhrydgard <hrydgard@gmail.com>2009-09-02 21:30:54 +0000
committerhrydgard <hrydgard@gmail.com>2009-09-02 21:30:54 +0000
commit97af2f1126ae5c638a83a100c055c30947ed5697 (patch)
treedde739796f543379cfb25544915ae455797c5d02 /Source/Core/VideoCommon/Src/TextureDecoder.cpp
parent2be5d013e01bc8c6461a6b2f3ffc154c2b358cae (diff)
GL/D3D: slightly more accurate and faster DXT decoding, thanks to Orphis
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4172 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/TextureDecoder.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/TextureDecoder.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.cpp b/Source/Core/VideoCommon/Src/TextureDecoder.cpp
index 7c8422f45a..35907e0ca2 100644
--- a/Source/Core/VideoCommon/Src/TextureDecoder.cpp
+++ b/Source/Core/VideoCommon/Src/TextureDecoder.cpp
@@ -325,28 +325,30 @@ void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch)
// S3TC Decoder (Note: GCN decodes differently from PC so we can't use native support)
u16 c1 = Common::swap16(src->color1);
u16 c2 = Common::swap16(src->color2);
- u8 blue1 = Convert5To8(c1 & 0x1F);
- u8 blue2 = Convert5To8(c2 & 0x1F);
- u8 green1 = Convert6To8((c1 >> 5) & 0x3F);
- u8 green2 = Convert6To8((c2 >> 5) & 0x3F);
- u8 red1 = Convert5To8((c1 >> 11) & 0x1F);
- u8 red2 = Convert5To8((c2 >> 11) & 0x1F);
+ int blue1 = Convert5To8(c1 & 0x1F);
+ int blue2 = Convert5To8(c2 & 0x1F);
+ int green1 = Convert6To8((c1 >> 5) & 0x3F);
+ int green2 = Convert6To8((c2 >> 5) & 0x3F);
+ int red1 = Convert5To8((c1 >> 11) & 0x1F);
+ int red2 = Convert5To8((c2 >> 11) & 0x1F);
int colors[4];
if (c1 > c2)
{
+ int blue3 = ((blue2 - blue1) >> 1) - ((blue2 - blue1) >> 3);
+ int green3 = ((green2 - green1) >> 1) - ((green2 - green1) >> 3);
+ int red3 = ((red2 - red1) >> 1) - ((red2 - red1) >> 3);
colors[0] = makecol(red1, green1, blue1, 255);
colors[1] = makecol(red2, green2, blue2, 255);
- // TODO: use 3/8ths and 5/8ths instead of 3rd and 2/3rds. most hw works like that.
- colors[2] = makecol(red1 + (red2 - red1) / 3, green1 + (green2 - green1) / 3, blue1 + (blue2 - blue1) / 3, 255);
- colors[3] = makecol(red2 + (red1 - red2) / 3, green2 + (green1 - green2) / 3, blue2 + (blue1 - blue2) / 3, 255);
+ colors[2] = makecol(red1 + red3, green1 + green3, blue1 + blue3, 255);
+ colors[3] = makecol(red2 - red3, green2 - green3, blue2 - blue3, 255);
}
else
{
colors[0] = makecol(red1, green1, blue1, 255); // Color 1
colors[1] = makecol(red2, green2, blue2, 255); // Color 2
- colors[2] = makecol((int)ceil((float)(red1 + red2) / 2), // Average
- (int)ceil((float)(green1 + green2) / 2),
- (int)ceil((float)(blue1 + blue2) / 2), 255);
+ colors[2] = makecol((red1 + red2 + 1) / 2, // Average
+ (green1 + green2 + 1) / 2,
+ (blue1 + blue2 + 1) / 2, 255);
colors[3] = makecol(red2, green2, blue2, 0); // Color2 but transparent
}