Path: blob/master/libmupen64plus/mupen64plus-video-rice/src/ConvertImage.h
2 views
/*1Copyright (C) 2003 Rice196423This program is free software; you can redistribute it and/or4modify it under the terms of the GNU General Public License5as published by the Free Software Foundation; either version 26of the License, or (at your option) any later version.78This program is distributed in the hope that it will be useful,9but WITHOUT ANY WARRANTY; without even the implied warranty of10MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11GNU General Public License for more details.1213You should have received a copy of the GNU General Public License14along with this program; if not, write to the Free Software15Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.1617*/1819#ifndef __CONVERTIMAGE_H__20#define __CONVERTIMAGE_H__2122#include "typedefs.h"23#include "Texture.h"24#include "TextureManager.h"252627static const uint8 OneToEight[2] =28{290x00, // 0 -> 00 00 00 00300xff // 1 -> 11 11 11 1131};3233static const uint8 OneToFour[2] =34{350x00, // 0 -> 00 00360x0f // 1 -> 11 1137};3839static const uint8 TwoToEight[4] =40{410x00, // 00 -> 00 00 00 00420x55, // 01 -> 01 01 01 01430xaa, // 10 -> 10 10 10 10440xff // 11 -> 11 11 11 1145};4647static const uint8 TwoToFour[4] =48{490x0, // 00 -> 00 00500x5, // 01 -> 01 01510xa, // 10 -> 10 10520xf // 11 -> 11 1153};5455static const uint8 ThreeToEight[8] =56{570x00, // 000 -> 00 00 00 00580x24, // 001 -> 00 10 01 00590x49, // 010 -> 01 00 10 01600x6d, // 011 -> 01 10 11 01610x92, // 100 -> 10 01 00 10620xb6, // 101 -> 10 11 01 10630xdb, // 110 -> 11 01 10 11640xff // 111 -> 11 11 11 1165};6667static const uint8 ThreeToFour[8] =68{690x0, // 000 -> 00 00 00 00700x2, // 001 -> 00 10 01 00710x4, // 010 -> 01 00 10 01720x6, // 011 -> 01 10 11 01730x9, // 100 -> 10 01 00 10740xb, // 101 -> 10 11 01 10750xd, // 110 -> 11 01 10 11760xf // 111 -> 11 11 11 1177};7879static const uint8 FourToEight[16] =80{810x00, 0x11, 0x22, 0x33,820x44, 0x55, 0x66, 0x77,830x88, 0x99, 0xaa, 0xbb,840xcc, 0xdd, 0xee, 0xff85};8687static const uint16 FourToSixteen[16] =88{890x0000, 0x1111, 0x2222, 0x3333,900x4444, 0x5555, 0x6666, 0x7777,910x8888, 0x9999, 0xaaaa, 0xbbbb,920xcccc, 0xdddd, 0xeeee, 0xffff93};9495static const uint8 FiveToEight[32] =96{970x00, // 00000 -> 00000000980x08, // 00001 -> 00001000990x10, // 00010 -> 000100001000x18, // 00011 -> 000110001010x21, // 00100 -> 001000011020x29, // 00101 -> 001010011030x31, // 00110 -> 001100011040x39, // 00111 -> 001110011050x42, // 01000 -> 010000101060x4a, // 01001 -> 010010101070x52, // 01010 -> 010100101080x5a, // 01011 -> 010110101090x63, // 01100 -> 011000111100x6b, // 01101 -> 011010111110x73, // 01110 -> 011100111120x7b, // 01111 -> 011110111131140x84, // 10000 -> 100001001150x8c, // 10001 -> 100011001160x94, // 10010 -> 100101001170x9c, // 10011 -> 100111001180xa5, // 10100 -> 101001011190xad, // 10101 -> 101011011200xb5, // 10110 -> 101101011210xbd, // 10111 -> 101111011220xc6, // 11000 -> 110001101230xce, // 11001 -> 110011101240xd6, // 11010 -> 110101101250xde, // 11011 -> 110111101260xe7, // 11100 -> 111001111270xef, // 11101 -> 111011111280xf7, // 11110 -> 111101111290xff // 11111 -> 11111111130};131132133#define RGBA5551_RedMask (0xF800)134#define RGBA5551_GreenMask (0x07C0)135#define RGBA5551_BlueMask (0x003E)136#define RGBA5551_AlphaMask (0x0001)137138139#define RGBA5551_RedShift 11140#define RGBA5551_GreenShift 6141#define RGBA5551_BlueShift 1142#define RGBA5551_AlphaShift 0143144#define RGBA565_RedMask (0xF800)145#define RGBA565_GreenMask (0x07E0)146#define RGBA565_BlueMask (0x001F)147148#define RGBA565_RedShift 11149#define RGBA565_GreenShift 5150#define RGBA565_BlueShift 0151152inline uint16 ConvertRGBTo555(uint8 red, uint8 grn, uint8 blu)153{154return (uint16)(((uint16)(red >> 3) << RGBA5551_RedShift) |155((uint16)(grn >> 3) << RGBA5551_GreenShift) |156((uint16)(blu >> 3) << RGBA5551_BlueShift) |157((uint16)(1) << RGBA5551_AlphaShift));158}159160inline uint16 ConvertRGBTo565(uint8 red, uint8 grn, uint8 blu)161{162return (uint16)(((uint16)(red >> 3) << RGBA565_RedShift) |163((uint16)(grn >> 2) << RGBA565_GreenShift) |164((uint16)(blu >> 3) << RGBA565_BlueShift));165}166inline uint16 Convert555To565(uint16 w555)167{168// Probably a faster method by fudging the low bits..169170uint8 red = FiveToEight[(w555&RGBA5551_RedMask) >> RGBA5551_RedShift];171uint8 grn = FiveToEight[(w555&RGBA5551_GreenMask)>> RGBA5551_GreenShift];172uint8 blu = FiveToEight[(w555&RGBA5551_BlueMask) >> RGBA5551_BlueShift];173174return ConvertRGBTo565(red, grn, blu);175}176177#define R4G4B4A4_MAKE(r,g,b,a) ((uint16)(((a) << 12) | ((r)<< 8) | ((g)<<4) | (b)))178179180inline uint32 Convert555ToRGBA(uint16 w555)181{182uint32 dwRed = FiveToEight[(w555&RGBA5551_RedMask) >> RGBA5551_RedShift];183uint32 dwGreen = FiveToEight[(w555&RGBA5551_GreenMask)>> RGBA5551_GreenShift];184uint32 dwBlue = FiveToEight[(w555&RGBA5551_BlueMask) >> RGBA5551_BlueShift];185uint32 dwAlpha = (w555&RGBA5551_AlphaMask) ? 0xFF : 0x00;186return COLOR_RGBA(dwRed, dwGreen, dwBlue, dwAlpha);187188}189inline uint16 Convert555ToR4G4B4A4(uint16 w555)190{191uint8 dwRed = ((w555&RGBA5551_RedMask) >> RGBA5551_RedShift)>>1;192uint8 dwGreen = ((w555&RGBA5551_GreenMask)>> RGBA5551_GreenShift)>>1;193uint8 dwBlue = ((w555&RGBA5551_BlueMask) >> RGBA5551_BlueShift)>>1;194uint8 dwAlpha = (w555&RGBA5551_AlphaMask) ? 0xF : 0x0;195196return R4G4B4A4_MAKE(dwRed, dwGreen, dwBlue, dwAlpha);197}198199inline uint32 ConvertIA4ToRGBA(uint8 IA4)200{201uint32 I = ThreeToEight[(IA4 & 0x0F) >> 1];202uint32 A = OneToEight[(IA4 & 0x01)];203return COLOR_RGBA(I, I, I, A);204}205206inline uint16 ConvertIA4ToR4G4B4A4(uint8 IA4)207{208uint32 I = ThreeToFour[(IA4 & 0x0F) >> 1];209uint32 A = OneToFour[(IA4 & 0x01)];210return R4G4B4A4_MAKE(I, I, I, A);211}212inline uint32 ConvertI4ToRGBA(uint8 I4)213{214uint32 I = FourToEight[I4 & 0x0F];215return COLOR_RGBA(I, I, I, I);216}217218inline uint16 ConvertI4ToR4G4B4A4(uint8 I4)219{220return FourToSixteen[I4 & 0x0F];221}222223inline uint32 ConvertIA16ToRGBA(uint16 wIA)224{225uint32 dwIntensity = (wIA >> 8) & 0xFF;226uint32 dwAlpha = (wIA ) & 0xFF;227return COLOR_RGBA(dwIntensity, dwIntensity, dwIntensity, dwAlpha);228}229230inline uint16 ConvertIA16ToR4G4B4A4(uint16 wIA)231{232uint16 dwIntensity = (wIA >> 12) & 0x0F;233uint16 dwAlpha = (wIA >> 4) & 0x0F;234235return R4G4B4A4_MAKE(dwIntensity, dwIntensity, dwIntensity, dwAlpha);236}237238extern int g_convk0,g_convk1,g_convk2,g_convk3,g_convk4,g_convk5;239extern float g_convc0,g_convc1,g_convc2,g_convc3,g_convc4,g_convc5;240241uint32 ConvertYUV16ToR8G8B8(int Y, int U, int V);242uint16 ConvertYUV16ToR4G4B4(int Y, int U, int V);243244245typedef void ( * ConvertFunction )( CTexture * p_texture, const TxtrInfo & ti );246247void ConvertRGBA16(CTexture *pTexture, const TxtrInfo &tinfo);248void ConvertRGBA32(CTexture *pTexture, const TxtrInfo &tinfo);249250251void ConvertIA4(CTexture *pTexture, const TxtrInfo &tinfo);252void ConvertIA8(CTexture *pTexture, const TxtrInfo &tinfo);253void ConvertIA16(CTexture *pTexture, const TxtrInfo &tinfo);254255void ConvertI4(CTexture *pTexture, const TxtrInfo &tinfo);256void ConvertI8(CTexture *pTexture, const TxtrInfo &tinfo);257258void ConvertCI4( CTexture *pTexture, const TxtrInfo & ti );259void ConvertCI8( CTexture *pTexture, const TxtrInfo & ti );260261void ConvertCI4_RGBA16(CTexture *pTexture, const TxtrInfo &tinfo);262void ConvertCI4_IA16(CTexture *pTexture, const TxtrInfo &tinfo);263void ConvertCI8_RGBA16(CTexture *pTexture, const TxtrInfo &tinfo);264void ConvertCI8_IA16(CTexture *pTexture, const TxtrInfo &tinfo);265266void ConvertYUV(CTexture *pTexture, const TxtrInfo &tinfo);267268// 16 a4r4g4b4269void ConvertRGBA16_16(CTexture *pTexture, const TxtrInfo &tinfo);270void ConvertRGBA32_16(CTexture *pTexture, const TxtrInfo &tinfo);271272273void ConvertIA4_16(CTexture *pTexture, const TxtrInfo &tinfo);274void ConvertIA8_16(CTexture *pTexture, const TxtrInfo &tinfo);275void ConvertIA16_16(CTexture *pTexture, const TxtrInfo &tinfo);276277void ConvertI4_16(CTexture *pTexture, const TxtrInfo &tinfo);278void ConvertI8_16(CTexture *pTexture, const TxtrInfo &tinfo);279280void ConvertCI4_16( CTexture *pTexture, const TxtrInfo & ti );281void ConvertCI8_16( CTexture *pTexture, const TxtrInfo & ti );282283void ConvertCI4_RGBA16_16(CTexture *pTexture, const TxtrInfo &tinfo);284void ConvertCI4_IA16_16(CTexture *pTexture, const TxtrInfo &tinfo);285void ConvertCI8_RGBA16_16(CTexture *pTexture, const TxtrInfo &tinfo);286void ConvertCI8_IA16_16(CTexture *pTexture, const TxtrInfo &tinfo);287288void ConvertYUV_16(CTexture *pTexture, const TxtrInfo &tinfo);289290void Convert4b(CTexture *pTexture, const TxtrInfo &tinfo);291void Convert8b(CTexture *pTexture, const TxtrInfo &tinfo);292void Convert16b(CTexture *pTexture, const TxtrInfo &tinfo);293294void Convert4b_16(CTexture *pTexture, const TxtrInfo &tinfo);295void Convert8b_16(CTexture *pTexture, const TxtrInfo &tinfo);296void Convert16b_16(CTexture *pTexture, const TxtrInfo &tinfo);297298#endif299300301302