From 79387dddb24ddf035b70cd9379a42368dcd49e93 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Mon, 29 May 2017 17:02:09 -0500 Subject: Add support for hybrid XFB --- Source/Core/VideoCommon/TextureDecoder_x64.cpp | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'Source/Core/VideoCommon/TextureDecoder_x64.cpp') diff --git a/Source/Core/VideoCommon/TextureDecoder_x64.cpp b/Source/Core/VideoCommon/TextureDecoder_x64.cpp index 135fc60629..b31d3692f0 100644 --- a/Source/Core/VideoCommon/TextureDecoder_x64.cpp +++ b/Source/Core/VideoCommon/TextureDecoder_x64.cpp @@ -9,6 +9,7 @@ #include "Common/CPUDetect.h" #include "Common/CommonTypes.h" #include "Common/Intrinsics.h" +#include "Common/MathUtil.h" #include "Common/MsgHandler.h" #include "Common/Swap.h" @@ -1485,6 +1486,37 @@ void _TexDecoder_DecodeImpl(u32* dst, const u8* src, int width, int height, Text case TextureFormat::CMPR: TexDecoder_DecodeImpl_CMPR(dst, src, width, height, texformat, tlut, tlutfmt, Wsteps4, Wsteps8); break; + + case TextureFormat::XFB: + { + for (int y = 0; y < height; y += 1) + { + for (int x = 0; x < width; x += 2) + { + size_t offset = static_cast((y * width + x) * 2); + + // We do this one color sample (aka 2 RGB pixles) at a time + int Y1 = int(src[offset]) - 16; + int U = int(src[offset + 1]) - 128; + int Y2 = int(src[offset + 2]) - 16; + int V = int(src[offset + 3]) - 128; + + // We do the inverse BT.601 conversion for YCbCr to RGB + // http://www.equasys.de/colorconversion.html#YCbCr-RGBColorFormatConversion + u8 R1 = static_cast(MathUtil::Clamp(int(1.164f * Y1 + 1.596f * V), 0, 255)); + u8 G1 = static_cast(MathUtil::Clamp(int(1.164f * Y1 - 0.392f * U - 0.813f * V), 0, 255)); + u8 B1 = static_cast(MathUtil::Clamp(int(1.164f * Y1 + 2.017f * U), 0, 255)); + + u8 R2 = static_cast(MathUtil::Clamp(int(1.164f * Y2 + 1.596f * V), 0, 255)); + u8 G2 = static_cast(MathUtil::Clamp(int(1.164f * Y2 - 0.392f * U - 0.813f * V), 0, 255)); + u8 B2 = static_cast(MathUtil::Clamp(int(1.164f * Y2 + 2.017f * U), 0, 255)); + + dst[y * width + x] = 0xff000000 | B1 << 16 | G1 << 8 | R1; + dst[y * width + x + 1] = 0xff000000 | B2 << 16 | G2 << 8 | R2; + } + } + } + break; default: PanicAlert("Invalid Texture Format (0x%X)! (_TexDecoder_DecodeImpl)", -- cgit v1.2.3