/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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, either version 3 of the License, or
* (at your option) any later version.
*
* 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#ifndef ULTIMA8_GFX_PALETTEMANAGER_H
#define ULTIMA8_GFX_PALETTEMANAGER_H
#include "ultima/shared/std/containers.h"
#include "graphics/pixelformat.h"
#include "ultima/ultima8/gfx/pal_transforms.h"
namespace Ultima {
namespace Ultima8 {
class Palette;
class PaletteManager {
public:
explicit PaletteManager(const Graphics::PixelFormat &format);
~PaletteManager();
static PaletteManager *get_instance() {
return _paletteManager;
}
enum PalIndex {
Pal_Game = 0,
Pal_Movie = 1,
Pal_Diff = 2, // Crusaders only - difficulty screen??
Pal_Misc = 3, // Crusaders only - game menu
Pal_Misc2 = 4, // Crusaders only - ??
Pal_Star = 5, // Crusaders only - ??
Pal_Cred = 6, // Crusader: No regret only (but mentioned in the no remorse exe!)
Pal_JPFontStart = 16
};
void load(PalIndex index, Common::ReadStream &rs, Common::ReadStream &xformrs);
void load(PalIndex index, Common::ReadStream &rs);
Palette *getPalette(PalIndex index);
uint getNumPalettes() const { return _palettes.size(); }
void duplicate(PalIndex src, PalIndex dest);
//! Re-convert a palette to native format after modifying it. If maxindex is set,
//! only recalculate color indexes up to that value.
void updatedPalette(PalIndex index, int maxindex = 0);
//! Apply a transform matrix to a palette (-4.11 fixed)
void transformPalette(PalIndex index, const int16 matrix[12]);
//! reset the transformation matrix of a palette
void untransformPalette(PalIndex index);
//! Get the current TransformMatrix for the given index
bool getTransformMatrix(int16 matrix[12], PalIndex index);
// Get a TransformMatrix from a PalTransforms value (-4.11 fixed)
static void getTransformMatrix(int16 matrix[12],
PalTransforms trans);
// Create a custom Transform Matrix from RGBA col32. (-4.11 fixed)
// Alpha will set how much of original palette to keep. 0 = keep none
static void getTransformMatrix(int16 matrix[12], uint32 col32);
//! Change the pixel format used by the PaletteManager
void PixelFormatChanged(const Graphics::PixelFormat &format);
//! Reset the Palette Manager
void reset();
//! Reset all the transforms back to default
void resetTransforms();
bool loadTransforms(Common::ReadStream &rs);
void saveTransforms(Common::WriteStream &ws);
private:
Std::vector _palettes;
Graphics::PixelFormat _format;
static PaletteManager *_paletteManager;
};
} // End of namespace Ultima8
} // End of namespace Ultima
#endif