Consolidate the three implementations of Decode5A3 found in Core into one. Fix some warnings.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2364 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
hrydgard 2009-02-22 12:43:25 +00:00
parent 8276ca3b21
commit aff0f1fbe3
16 changed files with 156 additions and 217 deletions

View File

@ -554,6 +554,14 @@
RelativePath=".\Src\ChunkFile.h"
>
</File>
<File
RelativePath=".\Src\ColorUtil.cpp"
>
</File>
<File
RelativePath=".\Src\ColorUtil.h"
>
</File>
<File
RelativePath=".\Src\Common.h"
>

View File

@ -0,0 +1,56 @@
// Copyright (C) 2003-2008 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "Common.h"
#include "ColorUtil.h"
namespace ColorUtil
{
const int lut5to8[] = { 0x00,0x08,0x10,0x18,0x20,0x29,0x31,0x39,
0x41,0x4A,0x52,0x5A,0x62,0x6A,0x73,0x7B,
0x83,0x8B,0x94,0x9C,0xA4,0xAC,0xB4,0xBD,
0xC5,0xCD,0xD5,0xDE,0xE6,0xEE,0xF6,0xFF };
const int lut4to8[] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,
0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF };
const int lut3to8[] = { 0x00,0x24,0x48,0x6D,0x91,0xB6,0xDA,0xFF };
u32 Decode5A3(u16 val)
{
const u32 bg_color = 0x00000000;
int r, g, b, a;
if (val & 0x8000)
{
r = lut5to8[(val >> 10) & 0x1f];
g = lut5to8[(val >> 5) & 0x1f];
b = lut5to8[(val) & 0x1f];
a = 0xFF;
}
else
{
a = lut3to8[(val >> 12) & 0x7];
r = (lut4to8[(val >> 8) & 0xf] * a + (bg_color & 0xFF) * (255 - a)) / 255;
g = (lut4to8[(val >> 4) & 0xf] * a + ((bg_color >> 8) & 0xFF) * (255 - a)) / 255;
b = (lut4to8[(val) & 0xf] * a + ((bg_color >> 16) & 0xFF) * (255 - a)) / 255;
a = 0xFF;
}
return (a << 24) | (r << 16) | (g << 8) | b;
}
} // namespace

View File

@ -0,0 +1,28 @@
// Copyright (C) 2003-2008 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _COLORUTIL_H
#define _COLORUTIL_H
namespace ColorUtil
{
u32 Decode5A3(u16 val);
} // namespace
#endif

View File

@ -76,7 +76,7 @@ u32 Ascii2Hex(std::string _Text)
u32 Result = 0;
// Max 32-bit values are supported
int Length = _Text.length();
size_t Length = _Text.length();
if (Length > 4)
Length = 4;

View File

@ -36,17 +36,15 @@ u32 timeGetTime()
}
#endif
namespace Common
{
//////////////////////////////////////////////////////////////////////////////////////////
// Initiate, Start, Stop, and Update the time
// ---------------
// Set initial values for the class
Timer::Timer(void)
Timer::Timer()
: m_LastTime(0), m_StartTime(0), m_Running(false)
{
Update();
@ -72,7 +70,7 @@ void Timer::Stop()
}
// Update the last time variable
void Timer::Update(void)
void Timer::Update()
{
m_LastTime = timeGetTime();
//TODO(ector) - QPF
@ -86,7 +84,7 @@ void Timer::Update(void)
// ---------------
// Get the number of milliseconds since the last Update()
s64 Timer::GetTimeDifference(void)
s64 Timer::GetTimeDifference()
{
return(timeGetTime() - m_LastTime);
}
@ -104,7 +102,7 @@ void Timer::WindBackStartingTime(u64 WindBack)
}
// Get the time elapsed since the Start()
u64 Timer::GetTimeElapsed(void)
u64 Timer::GetTimeElapsed()
{
/* If we have not started yet return 1 (because then I don't have to change the FPS
calculation in CoreRerecording.cpp */
@ -117,20 +115,20 @@ u64 Timer::GetTimeElapsed(void)
}
// Get the formattet time elapsed since the Start()
std::string Timer::GetTimeElapsedFormatted(void)
std::string Timer::GetTimeElapsedFormatted() const
{
// If we have not started yet, return zero
if (m_StartTime == 0)
return "00:00:00:000";
// The number of milliseconds since the start, use a different value if the timer is stopped
u32 Milliseconds;
u64 Milliseconds;
if (m_Running)
Milliseconds = timeGetTime() - m_StartTime;
else
Milliseconds = m_LastTime - m_StartTime;
// Seconds
u32 Seconds = Milliseconds / 1000;
u32 Seconds = (u32)(Milliseconds / 1000);
// Minutes
u32 Minutes = Seconds / 60;
// Hours
@ -172,14 +170,14 @@ void _time64(u64* t)
// Get the number of seconds since January 1 1970
u64 Timer::GetTimeSinceJan1970(void)
u64 Timer::GetTimeSinceJan1970()
{
time_t ltime;
time(&ltime);
return((u64)ltime);
}
u64 Timer::GetLocalTimeSinceJan1970(void)
u64 Timer::GetLocalTimeSinceJan1970()
{
time_t sysTime, tzDiff;
struct tm * gmTime;
@ -193,7 +191,7 @@ u64 Timer::GetLocalTimeSinceJan1970(void)
}
// Return the current time formatted as Minutes:Seconds:Milliseconds in the form 00:00:000
std::string Timer::GetTimeFormatted(void)
std::string Timer::GetTimeFormatted()
{
struct timeb tp;
(void)::ftime(&tp);

View File

@ -25,38 +25,38 @@ namespace Common
{
class Timer
{
public:
public:
Timer();
Timer();
void Start();
void Stop();
void Update();
void Start();
void Stop();
void Update();
// The time difference is always returned in milliseconds, regardless of alternative internal representation
s64 GetTimeDifference();
void AddTimeDifference();
void WindBackStartingTime(u64 WindBack);
// The time difference is always returned in milliseconds, regardless of alternative internal representation
s64 GetTimeDifference(void);
void AddTimeDifference();
void WindBackStartingTime(u64 WindBack);
static void IncreaseResolution();
static void RestoreResolution();
static u64 GetTimeSinceJan1970();
static u64 GetLocalTimeSinceJan1970();
static void IncreaseResolution();
static void RestoreResolution();
static u64 GetTimeSinceJan1970();
static u64 GetLocalTimeSinceJan1970();
static std::string GetTimeFormatted();
std::string GetTimeElapsedFormatted() const;
u64 GetTimeElapsed();
static std::string GetTimeFormatted();
std::string GetTimeElapsedFormatted();
u64 GetTimeElapsed();
public:
u64 m_LastTime;
u64 m_StartTime;
u64 m_frequency;
bool m_Running;
public:
u64 m_LastTime;
u64 m_StartTime;
u64 m_frequency;
bool m_Running;
};
} // end of namespace Common
#ifdef __GNUC__
u32 timeGetTime();
#endif
#endif

View File

@ -37,7 +37,7 @@ CDolLoader::CDolLoader(const char* _szFilename)
fread(tmpBuffer, size, 1, pStream);
fclose(pStream);
m_bInit = Initialize(tmpBuffer, size);
m_bInit = Initialize(tmpBuffer, (u32)size);
delete [] tmpBuffer;
}

View File

@ -20,6 +20,7 @@
// HyperIris: need clean code
#include "../../Core/Src/ConfigManager.h"
#include "ColorUtil.h"
#include "BannerLoaderGC.h"
namespace DiscIO
@ -28,22 +29,6 @@ CBannerLoaderGC::CBannerLoaderGC(DiscIO::IFileSystem& _rFileSystem)
: m_pBannerFile(NULL),
m_IsValid(false)
{
// build LUT Table
for (int i = 0; i < 8; i++)
{
lut3to8[i] = (i * 255) / 7;
}
for (int i = 0; i < 16; i++)
{
lut4to8[i] = (i * 255) / 15;
}
for (int i = 0; i < 32; i++)
{
lut5to8[i] = (i * 255) / 31;
}
// load the opening.bnr
size_t FileSize = (size_t) _rFileSystem.GetFileSize("opening.bnr");
@ -216,33 +201,6 @@ CBannerLoaderGC::GetDescription(std::string* _rDescription)
}
u32
CBannerLoaderGC::decode5A3(u16 val)
{
u32 bannerBGColor = 0x00000000;
int r, g, b, a;
if ((val & 0x8000))
{
r = lut5to8[(val >> 10) & 0x1f];
g = lut5to8[(val >> 5) & 0x1f];
b = lut5to8[(val) & 0x1f];
a = 0xFF;
}
else
{
a = lut3to8[(val >> 12) & 0x7];
r = (lut4to8[(val >> 8) & 0xf] * a + (bannerBGColor & 0xFF) * (255 - a)) / 255;
g = (lut4to8[(val >> 4) & 0xf] * a + ((bannerBGColor >> 8) & 0xFF) * (255 - a)) / 255;
b = (lut4to8[(val) & 0xf] * a + ((bannerBGColor >> 16) & 0xFF) * (255 - a)) / 255;
a = 0xFF;
}
return((a << 24) | (r << 16) | (g << 8) | b);
}
void
CBannerLoaderGC::decode5A3image(u32* dst, u16* src, int width, int height)
{
@ -254,7 +212,7 @@ CBannerLoaderGC::decode5A3image(u32* dst, u16* src, int width, int height)
{
for (int ix = 0; ix < 4; ix++)
{
u32 RGBA = decode5A3(Common::swap16(src[ix]));
u32 RGBA = ColorUtil::Decode5A3(Common::swap16(src[ix]));
dst[(y + iy) * width + (x + ix)] = RGBA;
}
}

View File

@ -26,24 +26,17 @@ class CBannerLoaderGC
: public IBannerLoader
{
public:
CBannerLoaderGC(DiscIO::IFileSystem& _rFileSystem);
virtual ~CBannerLoaderGC();
virtual bool IsValid();
virtual bool GetBanner(u32* _pBannerImage);
virtual bool GetName(std::string* _rName);
virtual bool GetCompany(std::string& _rCompany);
virtual bool GetDescription(std::string* _rDescription);
private:
enum
{
DVD_BANNER_WIDTH = 96,
@ -85,20 +78,13 @@ class CBannerLoaderGC
DVDBannerComment comment[6]; // Comments in six languages
};
// for banner decoding
int lut3to8[8];
int lut4to8[16];
int lut5to8[32];
u8* m_pBannerFile;
bool m_IsValid;
u32 decode5A3(u16 val);
void decode5A3image(u32* dst, u16* src, int width, int height);
BANNER_TYPE getBannerType();
};
} // namespace
#endif

View File

@ -20,6 +20,7 @@
#include <stdio.h>
#include "Common.h"
#include "ColorUtil.h"
#include "BannerLoaderWii.h"
#include "FileUtil.h"
@ -29,8 +30,6 @@ CBannerLoaderWii::CBannerLoaderWii(DiscIO::IFileSystem& _rFileSystem)
: m_pBannerFile(NULL)
, m_IsValid(false)
{
InitLUTTable();
char Filename[260];
char TitleID[4];
@ -143,54 +142,6 @@ CBannerLoaderWii::GetDescription(std::string* _rDescription)
return false;
}
void
CBannerLoaderWii::InitLUTTable()
{
// build LUT Table
for (int i = 0; i < 8; i++)
{
lut3to8[i] = (i * 255) / 7;
}
for (int i = 0; i < 16; i++)
{
lut4to8[i] = (i * 255) / 15;
}
for (int i = 0; i < 32; i++)
{
lut5to8[i] = (i * 255) / 31;
}
}
u32
CBannerLoaderWii::decode5A3(u16 val)
{
u32 bannerBGColor = 0x00000000;
int r, g, b, a;
if ((val & 0x8000))
{
r = lut5to8[(val >> 10) & 0x1f];
g = lut5to8[(val >> 5) & 0x1f];
b = lut5to8[(val) & 0x1f];
a = 0xFF;
}
else
{
a = lut3to8[(val >> 12) & 0x7];
r = (lut4to8[(val >> 8) & 0xf] * a + (bannerBGColor & 0xFF) * (255 - a)) / 255;
g = (lut4to8[(val >> 4) & 0xf] * a + ((bannerBGColor >> 8) & 0xFF) * (255 - a)) / 255;
b = (lut4to8[(val) & 0xf] * a + ((bannerBGColor >> 16) & 0xFF) * (255 - a)) / 255;
a = 0xFF;
}
return ((a << 24) | (r << 16) | (g << 8) | b);
}
void
CBannerLoaderWii::decode5A3image(u32* dst, u16* src, int width, int height)
{
@ -202,7 +153,7 @@ CBannerLoaderWii::decode5A3image(u32* dst, u16* src, int width, int height)
{
for (int ix = 0; ix < 4; ix++)
{
u32 RGBA = decode5A3(Common::swap16(src[ix]));
u32 RGBA = ColorUtil::Decode5A3(Common::swap16(src[ix]));
dst[(y + iy) * width + (x + ix)] = RGBA;
}
}

View File

@ -61,17 +61,10 @@ class CBannerLoaderWii
u8 m_IconTexture[8][WII_BANNER_ICON_SIZE];
} ;
// for banner decoding
int lut3to8[8];
int lut4to8[16];
int lut5to8[32];
u8* m_pBannerFile;
bool m_IsValid;
void InitLUTTable();
u32 decode5A3(u16 val);
void decode5A3image(u32* dst, u16* src, int width, int height);
};
} // namespace

View File

@ -15,6 +15,7 @@
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "GCMemcard.h"
#include "ColorUtil.h"
// i think there is support for this stuff in the common lib... if not there should be support
@ -26,34 +27,6 @@ void ByteSwap(u8 *valueA, u8 *valueB)
*valueB = tmp;
}
u32 decode5A3(u16 val)
{
const int lut5to8[] = { 0x00,0x08,0x10,0x18,0x20,0x29,0x31,0x39,
0x41,0x4A,0x52,0x5A,0x62,0x6A,0x73,0x7B,
0x83,0x8B,0x94,0x9C,0xA4,0xAC,0xB4,0xBD,
0xC5,0xCD,0xD5,0xDE,0xE6,0xEE,0xF6,0xFF};
const int lut4to8[] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,
0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};
const int lut3to8[] = { 0x00,0x24,0x48,0x6D,0x91,0xB6,0xDA,0xFF};
int r,g,b,a;
if ((val&0x8000))
{
r=lut5to8[(val>>10) & 0x1f];
g=lut5to8[(val>>5 ) & 0x1f];
b=lut5to8[(val ) & 0x1f];
a=0xFF;
}
else
{
a=lut3to8[(val>>12) & 0x7];
r=lut4to8[(val>>8 ) & 0xf];
g=lut4to8[(val>>4 ) & 0xf];
b=lut4to8[(val ) & 0xf];
}
return (a<<24) | (r<<16) | (g<<8) | b;
}
void decode5A3image(u32* dst, u16* src, int width, int height)
{
for (int y = 0; y < height; y += 4)
@ -64,7 +37,7 @@ void decode5A3image(u32* dst, u16* src, int width, int height)
{
for (int ix = 0; ix < 4; ix++)
{
u32 RGBA = decode5A3(Common::swap16(src[ix]));
u32 RGBA = ColorUtil::Decode5A3(Common::swap16(src[ix]));
dst[(y + iy) * width + (x + ix)] = RGBA;
}
}
@ -83,7 +56,8 @@ void decodeCI8image(u32* dst, u8* src, u16* pal, int width, int height)
u32 *tdst = dst+(y+iy)*width+x;
for (int ix = 0; ix < 8; ix++)
{
tdst[ix] = decode5A3(Common::swap16(pal[src[ix]]));
// huh, this seems wrong. CI8, not 5A3, no?
tdst[ix] = ColorUtil::Decode5A3(Common::swap16(pal[src[ix]]));
}
}
}
@ -910,13 +884,13 @@ u32 GCMemcard::ExportGci(u8 index, const char *fileName, std::string *fileName2)
{
if (BE32(dir.Dir[index].Gamecode) == 0xFFFFFFFF) return SUCCESS;
int length = fileName2->length() + 42;
size_t length = fileName2->length() + 42;
char *filename = new char[length];
char GameCode[5];
DEntry_GameCode(index, GameCode);
sprintf(filename,"%s/%s_%s.gci",fileName2->c_str(), GameCode, dir.Dir[index].Filename);
sprintf(filename, "%s/%s_%s.gci", fileName2->c_str(), GameCode, dir.Dir[index].Filename);
gci = fopen((const char *)filename, "wb");
}
else
@ -953,9 +927,9 @@ u32 GCMemcard::ExportGci(u8 index, const char *fileName, std::string *fileName2)
}
fseek(gci, 0x40, SEEK_SET);
if (fwrite(tempSaveData, 1, size, gci) != size)
completeWrite = false;
completeWrite = false;
fclose(gci);
delete []tempSaveData;
delete [] tempSaveData;
if (completeWrite) return SUCCESS;
else return WRITEFAIL;

View File

@ -1,6 +1,7 @@
#include <shlobj.h>
#include <xstring>
#include <string>
#include "ShellUtil.h"
namespace W32Util
@ -30,19 +31,14 @@ namespace W32Util
// function WinBrowseForFileName
//---------------------------------------------------------------------------------------------------
bool BrowseForFileName (bool _bLoad, HWND _hParent, const char *_pTitle,
const char *_pInitialFolder,const char *_pFilter,const char *_pExtension,
const char *_pInitialFolder, const char *_pFilter, const char *_pExtension,
std::string& _strFileName)
{
char szFile [MAX_PATH+1];
char szFileTitle [MAX_PATH+1];
strcpy (szFile,"");
strcpy (szFileTitle,"");
char szFile [MAX_PATH+1] = {0};
char szFileTitle [MAX_PATH+1] = {0};
OPENFILENAME ofn;
ZeroMemory (&ofn,sizeof (ofn));
ofn.lStructSize = sizeof (OPENFILENAME);
ofn.lpstrInitialDir = _pInitialFolder;
ofn.lpstrFilter = _pFilter;
@ -57,13 +53,12 @@ namespace W32Util
if (_strFileName.size () != 0)
ofn.lpstrFile = (char *)_strFileName.c_str();
if (((_bLoad)?GetOpenFileName (&ofn):GetSaveFileName (&ofn)))
if (((_bLoad) ? GetOpenFileName(&ofn) : GetSaveFileName(&ofn)))
{
_strFileName = ofn.lpstrFile;
return true;
}
else
return false;
return false;
}
std::vector<std::string> BrowseForFileNameMultiSelect(bool _bLoad, HWND _hParent, const char *_pTitle,
@ -113,12 +108,6 @@ namespace W32Util
}
return files;
}
else
return std::vector<std::string>(); // empty vector;
return std::vector<std::string>(); // empty vector;
}
}
} // namespace

View File

@ -807,8 +807,8 @@ void Renderer::Swap(const TRectangle& rc)
// Rc.right and rc.bottom is the original picture pixel size
/* There is a +1 in Rc (earlier called multirc, the input to this function), but these
adjustments seems to work better without it. */
float WidthRatio = (float)(rc.right - 1) / 640.0;
float HeightRatio = (float)(rc.bottom - 1) / 480.0;
float WidthRatio = (float)(rc.right - 1) / 640.0f;
float HeightRatio = (float)(rc.bottom - 1) / 480.0f;
// The pixel size of the image on the screen, adjusted for the actual window size
float OldWidth = WidthRatio * (float)WinWidth;
@ -854,10 +854,8 @@ void Renderer::Swap(const TRectangle& rc)
float WinWidth = (float)OpenGL_GetWidth();
float WinHeight = (float)OpenGL_GetHeight();
// The rendering window aspect ratio as a fraction of the 4:3 ratio
float Ratio = WinWidth / WinHeight / (4.0 / 3.0);
float Ratio = WinWidth / WinHeight / (4.0f / 3.0f);
float wAdj, hAdj;
float ActualRatioW, ActualRatioH;
float Overflow;
// Actual pixel size of the picture after adjustment
float PictureWidth = WinWidth, PictureHeight = WinHeight;
@ -894,8 +892,8 @@ void Renderer::Swap(const TRectangle& rc)
// Calculate the new width and height for glViewport, this is not the actual size of either the picture or the screen
// ----------------
// Invert the ratio to make it > 1
Ratio = 1.0 / Ratio;
wAdj = 1.0;
Ratio = 1.0f / Ratio;
wAdj = 1.0f;
hAdj = Ratio;
FloatGLWidth = FloatGLWidth / wAdj;
FloatGLHeight = FloatGLHeight / hAdj;
@ -909,9 +907,9 @@ void Renderer::Swap(const TRectangle& rc)
// Keep the picture on the bottom of the screen, this is needed because YOffset may not be 0 here
FloatYOffset = FloatYOffset / hAdj;
// Move the bottom of the picture to the middle of the screen
FloatYOffset = FloatYOffset + WinHeight / 2.0;
FloatYOffset = FloatYOffset + WinHeight / 2.0f;
// Then remove half the picture height to move it to the vertical center
FloatYOffset = FloatYOffset - PictureHeight / 2.0;
FloatYOffset = FloatYOffset - PictureHeight / 2.0f;
// --------------------
}

View File

@ -79,6 +79,7 @@ extern int frameCount;
class Renderer
{
private:
static void FlushZBufferAlphaToTarget();
public:

View File

@ -133,7 +133,6 @@ void LoadRecordedMovements()
//Console::Print("Recording%i ", i + 1);
// Temporary storage
bool bTmp;
int iTmp;
std::string STmp;