mirror of
https://github.com/Lime3DS/Lime3DS
synced 2024-12-26 09:02:44 -06:00
Pica: Cleanup color conversion.
This commit is contained in:
parent
614baa39d1
commit
47543d62cf
3 changed files with 51 additions and 26 deletions
|
@ -10,6 +10,7 @@
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QSpinBox>
|
#include <QSpinBox>
|
||||||
|
|
||||||
|
#include "video_core/color.h"
|
||||||
#include "video_core/pica.h"
|
#include "video_core/pica.h"
|
||||||
|
|
||||||
#include "graphics_framebuffer.hxx"
|
#include "graphics_framebuffer.hxx"
|
||||||
|
@ -259,14 +260,10 @@ void GraphicsFramebufferWidget::OnUpdate()
|
||||||
for (unsigned y = 0; y < framebuffer_height; ++y) {
|
for (unsigned y = 0; y < framebuffer_height; ++y) {
|
||||||
for (unsigned x = 0; x < framebuffer_width; ++x) {
|
for (unsigned x = 0; x < framebuffer_width; ++x) {
|
||||||
u16 value = *(u16*)(((u8*)color_buffer) + x * 2 + y * framebuffer_width * 2);
|
u16 value = *(u16*)(((u8*)color_buffer) + x * 2 + y * framebuffer_width * 2);
|
||||||
u8 r = (value >> 11) & 0x1F;
|
u8 r = Color::Convert5To8((value >> 11) & 0x1F);
|
||||||
u8 g = (value >> 6) & 0x1F;
|
u8 g = Color::Convert5To8((value >> 6) & 0x1F);
|
||||||
u8 b = (value >> 1) & 0x1F;
|
u8 b = Color::Convert5To8((value >> 1) & 0x1F);
|
||||||
u8 a = value & 1;
|
u8 a = Color::Convert1To8(value & 1);
|
||||||
r = (r << 3) | (r >> 2);
|
|
||||||
g = (g << 3) | (g >> 2);
|
|
||||||
b = (b << 3) | (b >> 2);
|
|
||||||
a *= 255;
|
|
||||||
|
|
||||||
decoded_image.setPixel(x, y, qRgba(r, g, b, 255/*a*/));
|
decoded_image.setPixel(x, y, qRgba(r, g, b, 255/*a*/));
|
||||||
}
|
}
|
||||||
|
|
32
src/video_core/color.h
Normal file
32
src/video_core/color.h
Normal file
|
@ -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
|
|
@ -19,6 +19,7 @@
|
||||||
#include "common/log.h"
|
#include "common/log.h"
|
||||||
#include "common/file_util.h"
|
#include "common/file_util.h"
|
||||||
|
|
||||||
|
#include "video_core/color.h"
|
||||||
#include "video_core/math.h"
|
#include "video_core/math.h"
|
||||||
#include "video_core/pica.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 g = ((source_ptr) >> 6) & 0x1F;
|
||||||
u8 b = (source_ptr >> 1) & 0x1F;
|
u8 b = (source_ptr >> 1) & 0x1F;
|
||||||
u8 a = source_ptr & 1;
|
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:
|
case Regs::TextureFormat::RGB565:
|
||||||
{
|
{
|
||||||
const u16 source_ptr = *(const u16*)(source + offset * 2);
|
const u16 source_ptr = *(const u16*)(source + offset * 2);
|
||||||
u8 r = (source_ptr >> 11) & 0x1F;
|
u8 r = Color::Convert5To8((source_ptr >> 11) & 0x1F);
|
||||||
u8 g = ((source_ptr) >> 5) & 0x3F;
|
u8 g = Color::Convert6To8(((source_ptr) >> 5) & 0x3F);
|
||||||
u8 b = (source_ptr) & 0x1F;
|
u8 b = Color::Convert5To8((source_ptr) & 0x1F);
|
||||||
return Math::MakeVec<u8>((r << 3) | (r >> 2), (g << 2) | (g >> 4), (b << 3) | (b >> 2), 255);
|
return Math::MakeVec<u8>(r, g, b, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
case Regs::TextureFormat::RGBA4:
|
case Regs::TextureFormat::RGBA4:
|
||||||
{
|
{
|
||||||
const u8* source_ptr = source + offset * 2;
|
const u8* source_ptr = source + offset * 2;
|
||||||
u8 r = source_ptr[1] >> 4;
|
u8 r = Color::Convert4To8(source_ptr[1] >> 4);
|
||||||
u8 g = source_ptr[1] & 0xF;
|
u8 g = Color::Convert4To8(source_ptr[1] & 0xF);
|
||||||
u8 b = source_ptr[0] >> 4;
|
u8 b = Color::Convert4To8(source_ptr[0] >> 4);
|
||||||
u8 a = source_ptr[0] & 0xF;
|
u8 a = Color::Convert4To8(source_ptr[0] & 0xF);
|
||||||
r = (r << 4) | r;
|
|
||||||
g = (g << 4) | g;
|
|
||||||
b = (b << 4) | b;
|
|
||||||
a = (a << 4) | a;
|
|
||||||
return { r, g, b, disable_alpha ? (u8)255 : a };
|
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;
|
const u8* source_ptr = source + offset;
|
||||||
|
|
||||||
u8 i = ((*source_ptr) & 0xF0) >> 4;
|
u8 i = Color::Convert4To8(((*source_ptr) & 0xF0) >> 4);
|
||||||
u8 a = (*source_ptr) & 0xF;
|
u8 a = Color::Convert4To8((*source_ptr) & 0xF);
|
||||||
a |= a << 4;
|
|
||||||
i |= i << 4;
|
|
||||||
|
|
||||||
if (disable_alpha) {
|
if (disable_alpha) {
|
||||||
// Show intensity as red, alpha as green
|
// 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;
|
const u8* source_ptr = source + offset / 2;
|
||||||
|
|
||||||
u8 a = (coarse_x % 2) ? ((*source_ptr)&0xF) : (((*source_ptr) & 0xF0) >> 4);
|
u8 a = (coarse_x % 2) ? ((*source_ptr)&0xF) : (((*source_ptr) & 0xF0) >> 4);
|
||||||
a |= a << 4;
|
a = Color::Convert4To8(a);
|
||||||
|
|
||||||
if (disable_alpha) {
|
if (disable_alpha) {
|
||||||
return { a, a, a, 255 };
|
return { a, a, a, 255 };
|
||||||
|
|
Loading…
Reference in a new issue