mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00: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…
	
	Add table
		Add a link
		
	
		Reference in a new issue