diff options
author | Fabio Battaglia | 2010-12-20 21:46:28 +0000 |
---|---|---|
committer | Fabio Battaglia | 2010-12-20 21:46:28 +0000 |
commit | 5f6dfb2b6797592c965ceaa01eabe8b8a24f5e53 (patch) | |
tree | 225dff18f15b323bdd18f8db5c311fcf7f41dd16 | |
parent | b87bc18d223ec42d797b3db0b42fa0c257041716 (diff) | |
download | scummvm-rg350-5f6dfb2b6797592c965ceaa01eabe8b8a24f5e53.tar.gz scummvm-rg350-5f6dfb2b6797592c965ceaa01eabe8b8a24f5e53.tar.bz2 scummvm-rg350-5f6dfb2b6797592c965ceaa01eabe8b8a24f5e53.zip |
N64: save and return exact palette for grabPalette
Save the exact palette and return it when grabPalette is called,
The less precise 16bit conversion is still used inside though.
svn-id: r54981
-rw-r--r-- | backends/platform/n64/osys_n64.h | 4 | ||||
-rw-r--r-- | backends/platform/n64/osys_n64_base.cpp | 11 |
2 files changed, 15 insertions, 0 deletions
diff --git a/backends/platform/n64/osys_n64.h b/backends/platform/n64/osys_n64.h index 707bb1b7ae..11f71f5783 100644 --- a/backends/platform/n64/osys_n64.h +++ b/backends/platform/n64/osys_n64.h @@ -91,6 +91,10 @@ protected: OverlayColor *_overlayBuffer; // Offscreen for the overlay (16 bit) uint16 *_screenPalette; // Array for palette entries (256 colors max) + +#ifndef N64_EXTREME_MEMORY_SAVING + uint32 *_screenExactPalette; // Array for palette entries, as received by setPalette(), no precision loss +#endif uint16 _cursorPalette[256]; // Palette entries for the cursor int _graphicMode; // Graphic mode diff --git a/backends/platform/n64/osys_n64_base.cpp b/backends/platform/n64/osys_n64_base.cpp index 8862693138..1b9c704225 100644 --- a/backends/platform/n64/osys_n64_base.cpp +++ b/backends/platform/n64/osys_n64_base.cpp @@ -112,6 +112,10 @@ OSystem_N64::OSystem_N64() { // Clear palette array _screenPalette = (uint16*)memalign(8, 256 * sizeof(uint16)); +#ifndef N64_EXTREME_MEMORY_SAVING + _screenExactPalette = (uint32*)memalign(8, 256 * sizeof(uint32)); + memset(_screenExactPalette, 0, 256 * sizeof(uint32)); +#endif memset(_screenPalette, 0, 256 * sizeof(uint16)); memset(_cursorPalette, 0, 256 * sizeof(uint16)); @@ -348,6 +352,9 @@ int16 OSystem_N64::getWidth() { void OSystem_N64::setPalette(const byte *colors, uint start, uint num) { for (uint i = 0; i < num; ++i) { _screenPalette[start + i] = colRGB888toBGR555(colors[2], colors[1], colors[0]); +#ifndef N64_EXTREME_MEMORY_SAVING + _screenExactPalette[start + i] = *((uint32*)(colors)); +#endif colors += 4; } @@ -395,6 +402,7 @@ void OSystem_N64::rebuildOffscreenMouseBuffer(void) { } void OSystem_N64::grabPalette(byte *colors, uint start, uint num) { +#ifdef N64_EXTREME_MEMORY_SAVING // This way loses precisions uint32 i; uint16 color; @@ -407,6 +415,9 @@ void OSystem_N64::grabPalette(byte *colors, uint start, uint num) { *colors++ = (((color >> 10) & 0x1F) << 3); *colors++ = 0; } +#else + memcpy(colors, (uint8*)(_screenExactPalette + start), num * 4); +#endif return; } |