diff options
| author | Tony Wasserka <NeoBrainX@gmail.com> | 2014-12-31 15:17:07 +0100 | 
|---|---|---|
| committer | Tony Wasserka <NeoBrainX@gmail.com> | 2014-12-31 16:32:55 +0100 | 
| commit | 47543d62cf9e982598f58438ad24769c2b36ec77 (patch) | |
| tree | 856ccab2a9165d0a50def92f958851566bb93b2b | |
| parent | 614baa39d1bc1489c25acf3578ae7f99cc1b5ad0 (diff) | |
Pica: Cleanup color conversion.
| -rw-r--r-- | src/citra_qt/debugger/graphics_framebuffer.cpp | 13 | ||||
| -rw-r--r-- | src/video_core/color.h | 32 | ||||
| -rw-r--r-- | src/video_core/debug_utils/debug_utils.cpp | 32 | 
3 files changed, 51 insertions, 26 deletions
| diff --git a/src/citra_qt/debugger/graphics_framebuffer.cpp b/src/citra_qt/debugger/graphics_framebuffer.cpp index 4a45027b8..a9e9de652 100644 --- a/src/citra_qt/debugger/graphics_framebuffer.cpp +++ b/src/citra_qt/debugger/graphics_framebuffer.cpp @@ -10,6 +10,7 @@  #include <QPushButton>  #include <QSpinBox> +#include "video_core/color.h"  #include "video_core/pica.h"  #include "graphics_framebuffer.hxx" @@ -259,14 +260,10 @@ void GraphicsFramebufferWidget::OnUpdate()          for (unsigned y = 0; y < framebuffer_height; ++y) {              for (unsigned x = 0; x < framebuffer_width; ++x) {                  u16 value = *(u16*)(((u8*)color_buffer) + x * 2 + y * framebuffer_width * 2); -                u8 r = (value >> 11) & 0x1F; -                u8 g = (value >> 6) & 0x1F; -                u8 b = (value >> 1) & 0x1F; -                u8 a = value & 1; -                r = (r << 3) | (r >> 2); -                g = (g << 3) | (g >> 2); -                b = (b << 3) | (b >> 2); -                a *= 255; +                u8 r = Color::Convert5To8((value >> 11) & 0x1F); +                u8 g = Color::Convert5To8((value >> 6) & 0x1F); +                u8 b = Color::Convert5To8((value >> 1) & 0x1F); +                u8 a = Color::Convert1To8(value & 1);                  decoded_image.setPixel(x, y, qRgba(r, g, b, 255/*a*/));              } diff --git a/src/video_core/color.h b/src/video_core/color.h new file mode 100644 index 000000000..e86ac1265 --- /dev/null +++ b/src/video_core/color.h @@ -0,0 +1,32 @@ +// Copyright 2014 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "common/common_types.h" + +namespace Color { + +/// Convert a 1-bit color component to 8 bit +static inline u8 Convert1To8(u8 value) { +    return value * 255; +} + +/// Convert a 4-bit color component to 8 bit +static inline u8 Convert4To8(u8 value) { +    return (value << 4) | value; +} + +/// Convert a 5-bit color component to 8 bit +static inline u8 Convert5To8(u8 value) { +    return (value << 3) | (value >> 2); +} + +/// Convert a 6-bit color component to 8 bit +static inline u8 Convert6To8(u8 value) { +    return (value << 2) | (value >> 4); +} + + +} // namespace diff --git a/src/video_core/debug_utils/debug_utils.cpp b/src/video_core/debug_utils/debug_utils.cpp index 83d585d16..a494465b9 100644 --- a/src/video_core/debug_utils/debug_utils.cpp +++ b/src/video_core/debug_utils/debug_utils.cpp @@ -19,6 +19,7 @@  #include "common/log.h"  #include "common/file_util.h" +#include "video_core/color.h"  #include "video_core/math.h"  #include "video_core/pica.h" @@ -359,29 +360,26 @@ const Math::Vec4<u8> LookupTexture(const u8* source, int x, int y, const Texture          u8 g = ((source_ptr) >> 6) & 0x1F;          u8 b = (source_ptr >> 1) & 0x1F;          u8 a = source_ptr & 1; -        return Math::MakeVec<u8>((r << 3) | (r >> 2), (g << 3) | (g >> 2), (b << 3) | (b >> 2), disable_alpha ? 255 : (a * 255)); +        return Math::MakeVec<u8>(Color::Convert5To8(r), Color::Convert5To8(g), +                                 Color::Convert5To8(b), disable_alpha ? 255 : Color::Convert1To8(a));      }      case Regs::TextureFormat::RGB565:      {          const u16 source_ptr = *(const u16*)(source + offset * 2); -        u8 r = (source_ptr >> 11) & 0x1F; -        u8 g = ((source_ptr) >> 5) & 0x3F; -        u8 b = (source_ptr) & 0x1F; -        return Math::MakeVec<u8>((r << 3) | (r >> 2), (g << 2) | (g >> 4), (b << 3) | (b >> 2), 255); +        u8 r = Color::Convert5To8((source_ptr >> 11) & 0x1F); +        u8 g = Color::Convert6To8(((source_ptr) >> 5) & 0x3F); +        u8 b = Color::Convert5To8((source_ptr) & 0x1F); +        return Math::MakeVec<u8>(r, g, b, 255);      }      case Regs::TextureFormat::RGBA4:      {          const u8* source_ptr = source + offset * 2; -        u8 r = source_ptr[1] >> 4; -        u8 g = source_ptr[1] & 0xF; -        u8 b = source_ptr[0] >> 4; -        u8 a = source_ptr[0] & 0xF; -        r = (r << 4) | r; -        g = (g << 4) | g; -        b = (b << 4) | b; -        a = (a << 4) | a; +        u8 r = Color::Convert4To8(source_ptr[1] >> 4); +        u8 g = Color::Convert4To8(source_ptr[1] & 0xF); +        u8 b = Color::Convert4To8(source_ptr[0] >> 4); +        u8 a = Color::Convert4To8(source_ptr[0] & 0xF);          return { r, g, b, disable_alpha ? (u8)255 : a };      } @@ -418,10 +416,8 @@ const Math::Vec4<u8> LookupTexture(const u8* source, int x, int y, const Texture      {          const u8* source_ptr = source + offset; -        u8 i = ((*source_ptr) & 0xF0) >> 4; -        u8 a = (*source_ptr) & 0xF; -        a |= a << 4; -        i |= i << 4; +        u8 i = Color::Convert4To8(((*source_ptr) & 0xF0) >> 4); +        u8 a = Color::Convert4To8((*source_ptr) & 0xF);          if (disable_alpha) {              // Show intensity as red, alpha as green @@ -436,7 +432,7 @@ const Math::Vec4<u8> LookupTexture(const u8* source, int x, int y, const Texture          const u8* source_ptr = source + offset / 2;          u8 a = (coarse_x % 2) ? ((*source_ptr)&0xF) : (((*source_ptr) & 0xF0) >> 4); -        a |= a << 4; +        a = Color::Convert4To8(a);          if (disable_alpha) {              return { a, a, a, 255 }; | 
