Skip to content

Commit

Permalink
GLVideoDriver: More clean, more stable. Fixed problems with attached …
Browse files Browse the repository at this point in the history
…palettes. Implemented GetScreenshot()
  • Loading branch information
BehoIder authored and lynxlynxlynx committed May 2, 2014
1 parent fb5bd1a commit f7ecbac
Show file tree
Hide file tree
Showing 7 changed files with 142 additions and 82 deletions.
44 changes: 28 additions & 16 deletions gemrb/plugins/SDLVideo/GLPaletteManager.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -10,12 +10,10 @@


using namespace GemRB; using namespace GemRB;


std::map<PaletteKey, PaletteValue> GLPaletteManager::textures;

GLuint GLPaletteManager::CreatePaletteTexture(Palette* palette, unsigned int colorKey) GLuint GLPaletteManager::CreatePaletteTexture(Palette* palette, unsigned int colorKey)
{ {
PaletteKey key = std::make_pair(palette, colorKey); const PaletteKey key(palette, colorKey);
if (GLPaletteManager::textures.find(key) == GLPaletteManager::textures.end()) if (textures.find(key) == textures.end())
{ {
// not found, we need to create it // not found, we need to create it
GLuint texture; GLuint texture;
Expand All @@ -41,6 +39,7 @@ GLuint GLPaletteManager::CreatePaletteTexture(Palette* palette, unsigned int col
delete[] colors; delete[] colors;
PaletteValue value = std::make_pair(texture, 1); PaletteValue value = std::make_pair(texture, 1);
textures.insert(std::make_pair(key, value)); textures.insert(std::make_pair(key, value));
indexes.insert(std::make_pair(texture, key));
} }
else else
{ {
Expand All @@ -51,7 +50,7 @@ GLuint GLPaletteManager::CreatePaletteTexture(Palette* palette, unsigned int col


void GLPaletteManager::RemovePaletteTexture(Palette* palette, unsigned int colorKey) void GLPaletteManager::RemovePaletteTexture(Palette* palette, unsigned int colorKey)
{ {
std::pair<Palette*, unsigned int> key = std::make_pair(palette, colorKey); const PaletteKey key(palette, colorKey);
if (textures.find(key) == textures.end()) if (textures.find(key) == textures.end())
{ {
// nothing found // nothing found
Expand All @@ -62,6 +61,7 @@ void GLPaletteManager::RemovePaletteTexture(Palette* palette, unsigned int color
if (value.second > 1) value.second --; if (value.second > 1) value.second --;
else else
{ {
indexes.erase(value.first);
glDeleteTextures(1, &(value.first)); glDeleteTextures(1, &(value.first));
textures.erase(key); textures.erase(key);
} }
Expand All @@ -70,29 +70,41 @@ void GLPaletteManager::RemovePaletteTexture(Palette* palette, unsigned int color


void GLPaletteManager::RemovePaletteTexture(GLuint texture) void GLPaletteManager::RemovePaletteTexture(GLuint texture)
{ {
for(std::map<std::pair<Palette*, unsigned int>, PaletteValue>::iterator it = textures.begin(); it != textures.end(); ++it) if (indexes.find(texture) == indexes.end())
{ {
if(textures[it->first].first == texture) // nothing found
}
else
{
PaletteKey key = indexes[texture];
PaletteValue value = textures[key];
if (value.second > 1) value.second --;
else
{ {
if (textures[it->first].second > 1) indexes.erase(texture);
textures[it->first].second--; glDeleteTextures(1, &texture);
else textures.erase(key);
{
glDeleteTextures(1, &texture);
textures.erase(it->first);
}
return;
} }
} }
} }


void GLPaletteManager::Clear() void GLPaletteManager::Clear()
{ {
for(std::map<std::pair<Palette*, unsigned int>, PaletteValue>::iterator it = textures.begin(); it != textures.end(); ++it) for(std::map<PaletteKey, PaletteValue, PaletteKey>::iterator it = textures.begin(); it != textures.end(); ++it)
{ {
glDeleteTextures(1, &(textures[it->first].first)); glDeleteTextures(1, &(textures[it->first].first));
} }
textures.clear(); textures.clear();
indexes.clear();
}

GLPaletteManager::GLPaletteManager()
{
}

GLPaletteManager::~GLPaletteManager()
{
Clear();
} }




Expand Down
32 changes: 26 additions & 6 deletions gemrb/plugins/SDLVideo/GLPaletteManager.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -7,18 +7,38 @@ namespace GemRB
{ {
class Palette; class Palette;


typedef std::pair<Palette*, unsigned int> PaletteKey; struct PaletteKey
{
Palette* palette;
unsigned int colorKey;
bool operator () (const PaletteKey& lhs, const PaletteKey& rhs) const
{
if (lhs.palette < rhs.palette) return true;
else
if (rhs.palette < lhs.palette) return false;
if (lhs.colorKey < rhs.colorKey) return true;
else
if (rhs.colorKey < lhs.colorKey) return false;
return false;
}
PaletteKey(Palette* pal, unsigned int key) { colorKey = key; palette = pal; }
PaletteKey() {}
};

typedef std::pair<GLuint, unsigned int> PaletteValue; typedef std::pair<GLuint, unsigned int> PaletteValue;


class GLPaletteManager class GLPaletteManager
{ {
private: private:
static std::map<PaletteKey, PaletteValue> textures; std::map<PaletteKey, PaletteValue, PaletteKey> textures;
std::map<GLuint, PaletteKey> indexes;
public: public:
static GLuint CreatePaletteTexture(Palette* palette, unsigned int colorKey); GLuint CreatePaletteTexture(Palette* palette, unsigned int colorKey);
static void RemovePaletteTexture(Palette* palette, unsigned int colorKey); void RemovePaletteTexture(Palette* palette, unsigned int colorKey);
static void RemovePaletteTexture(GLuint texture); void RemovePaletteTexture(GLuint texture);
static void Clear(); void Clear();
~GLPaletteManager();
GLPaletteManager();
}; };
} }


Expand Down
51 changes: 36 additions & 15 deletions gemrb/plugins/SDLVideo/GLTextureSprite2D.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ GLTextureSprite2D::~GLTextureSprite2D()
if (glTexture != 0) glDeleteTextures(1, &glTexture); if (glTexture != 0) glDeleteTextures(1, &glTexture);
if (glMaskTexture != 0) glDeleteTextures(1, &glMaskTexture); if (glMaskTexture != 0) glDeleteTextures(1, &glMaskTexture);
if (glPaletteTexture != 0) if (glPaletteTexture != 0)
GLPaletteManager::RemovePaletteTexture(currentPalette, colorKeyIndex); paletteManager->RemovePaletteTexture(glPaletteTexture);
if (glAttachedPaletteTexture != 0) if (glAttachedPaletteTexture != 0)
GLPaletteManager::RemovePaletteTexture(attachedPalette, colorKeyIndex); paletteManager->RemovePaletteTexture(glAttachedPaletteTexture);
} }


GLTextureSprite2D::GLTextureSprite2D(const GLTextureSprite2D &obj) : Sprite2D(obj) GLTextureSprite2D::GLTextureSprite2D(const GLTextureSprite2D &obj) : Sprite2D(obj)
Expand All @@ -56,6 +56,7 @@ GLTextureSprite2D::GLTextureSprite2D(const GLTextureSprite2D &obj) : Sprite2D(ob
currentPalette = NULL; currentPalette = NULL;
attachedPalette = NULL; attachedPalette = NULL;
colorKeyIndex = obj.colorKeyIndex; colorKeyIndex = obj.colorKeyIndex;
paletteManager = obj.paletteManager;
rMask = obj.rMask; rMask = obj.rMask;
gMask = obj.bMask; gMask = obj.bMask;
bMask = obj.bMask; bMask = obj.bMask;
Expand All @@ -70,13 +71,13 @@ GLTextureSprite2D* GLTextureSprite2D::copy() const


void GLTextureSprite2D::SetPalette(Palette *pal) void GLTextureSprite2D::SetPalette(Palette *pal)
{ {
if(!IsPaletted() || currentPalette == pal || !pal) return; if (!IsPaletted() || pal == NULL || currentPalette == pal) return;
pal->acquire(); pal->acquire();
if (currentPalette) if (currentPalette != NULL)
{ {
currentPalette->release(); currentPalette->release();
} }
if (glPaletteTexture != 0) GLPaletteManager::RemovePaletteTexture(currentPalette, colorKeyIndex); if (glPaletteTexture != 0) paletteManager->RemovePaletteTexture(glPaletteTexture);
glPaletteTexture = 0; glPaletteTexture = 0;
currentPalette = pal; currentPalette = pal;
} }
Expand All @@ -90,12 +91,13 @@ Palette* GLTextureSprite2D::GetPalette() const


void GLTextureSprite2D::SetColorKey(ieDword index) void GLTextureSprite2D::SetColorKey(ieDword index)
{ {
if (colorKeyIndex == index) return;
colorKeyIndex = index; colorKeyIndex = index;
if(IsPaletted()) if(IsPaletted())
{ {
glDeleteTextures(1, &glMaskTexture); glDeleteTextures(1, &glMaskTexture);
if (glPaletteTexture != 0) GLPaletteManager::RemovePaletteTexture(currentPalette, colorKeyIndex); if (glPaletteTexture != 0) paletteManager->RemovePaletteTexture(glPaletteTexture);
if (glAttachedPaletteTexture != 0) GLPaletteManager::RemovePaletteTexture(attachedPalette, colorKeyIndex); if (glAttachedPaletteTexture != 0) paletteManager->RemovePaletteTexture(glAttachedPaletteTexture);
glPaletteTexture = 0; glPaletteTexture = 0;
glAttachedPaletteTexture = 0; glAttachedPaletteTexture = 0;
glMaskTexture = 0; glMaskTexture = 0;
Expand All @@ -113,15 +115,26 @@ Color GLTextureSprite2D::GetPixel(unsigned short x, unsigned short y) const
if (Bpp == 8) if (Bpp == 8)
{ {
Uint8 pixel = ((Uint8*)pixels)[y*Width + x]; Uint8 pixel = ((Uint8*)pixels)[y*Width + x];
Color color = currentPalette->col[pixel]; // hack (we have a = 0 for non-transparent pixels on palette) Color color = currentPalette->col[pixel];
if(pixel != colorKeyIndex) color.a = 255; // hack (we have a = 0 for non-transparent pixels on palette)
if (pixel != colorKeyIndex) color.a = 255;
return color;
}
else
{
Uint32 pixel = ((Uint32*)pixels)[y*Width + x];
Color color;
color.r = (pixel & rMask) >> GetShiftValue(rMask);
color.g = (pixel & gMask) >> GetShiftValue(gMask);
color.b = (pixel & bMask) >> GetShiftValue(bMask);
color.a = (pixel & aMask) >> GetShiftValue(aMask);
return color; return color;
} }
return Color(); // not supported yet
} }


void GLTextureSprite2D::createGlTexture() void GLTextureSprite2D::createGlTexture()
{ {
if (Bpp != 32 && Bpp != 8) return;
if (glTexture != 0) glDeleteTextures(1, &glTexture); if (glTexture != 0) glDeleteTextures(1, &glTexture);
glGenTextures(1, &glTexture); glGenTextures(1, &glTexture);
glBindTexture(GL_TEXTURE_2D, glTexture); glBindTexture(GL_TEXTURE_2D, glTexture);
Expand Down Expand Up @@ -158,7 +171,7 @@ void GLTextureSprite2D::createGlTexture()


void GLTextureSprite2D::createGlTextureForPalette() void GLTextureSprite2D::createGlTextureForPalette()
{ {
glPaletteTexture = GLPaletteManager::CreatePaletteTexture(currentPalette, colorKeyIndex); glPaletteTexture = paletteManager->CreatePaletteTexture(currentPalette, colorKeyIndex);
} }


void GLTextureSprite2D::createGLMaskTexture() void GLTextureSprite2D::createGLMaskTexture()
Expand Down Expand Up @@ -191,17 +204,25 @@ GLuint GLTextureSprite2D::GetPaletteTexture()
} }


// use this method only for adding external palettes // use this method only for adding external palettes
GLuint GLTextureSprite2D::GetPaletteTexture(Palette* attached) GLuint GLTextureSprite2D::GetAttachedPaletteTexture(Palette* attached)
{ {
if (attached == NULL || !IsPaletted()) return 0; // nothing to do if (!IsPaletted()) return 0;

// we already have a texture for requested palette // we already have a texture for requested palette
if (attached == attachedPalette && glAttachedPaletteTexture != 0) return glAttachedPaletteTexture; if (attached == attachedPalette && glAttachedPaletteTexture != 0) return glAttachedPaletteTexture;
attachedPalette = attached; attachedPalette = attached;
glAttachedPaletteTexture = GLPaletteManager::CreatePaletteTexture(attachedPalette, colorKeyIndex); attachedPalette->acquire();
glAttachedPaletteTexture = paletteManager->CreatePaletteTexture(attachedPalette, colorKeyIndex);
return glAttachedPaletteTexture; return glAttachedPaletteTexture;
} }


void GLTextureSprite2D::RemoveAttachedPaletteTexture()
{
if (glAttachedPaletteTexture != 0) paletteManager->RemovePaletteTexture(glAttachedPaletteTexture);
glAttachedPaletteTexture = 0;
attachedPalette->release();
attachedPalette = NULL;
}

GLuint GLTextureSprite2D::GetMaskTexture() GLuint GLTextureSprite2D::GetMaskTexture()
{ {
if (!IsPaletted()) return 0; // nothing to do if (!IsPaletted()) return 0; // nothing to do
Expand Down
8 changes: 7 additions & 1 deletion gemrb/plugins/SDLVideo/GLTextureSprite2D.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@


namespace GemRB namespace GemRB
{ {
class GLPaletteManager;

class GLTextureSprite2D : public Sprite2D class GLTextureSprite2D : public Sprite2D
{ {
private: private:
Expand All @@ -19,12 +21,15 @@ namespace GemRB
Palette* attachedPalette; Palette* attachedPalette;
GLuint glAttachedPaletteTexture; GLuint glAttachedPaletteTexture;


GLPaletteManager* paletteManager;

void createGlTexture(); void createGlTexture();
void createGlTextureForPalette(); void createGlTextureForPalette();
void createGLMaskTexture(); void createGLMaskTexture();
public: public:
GLuint GetTexture(); GLuint GetTexture();
GLuint GetPaletteTexture(Palette* pal); GLuint GetAttachedPaletteTexture(Palette* attached);
void RemoveAttachedPaletteTexture();
GLuint GetPaletteTexture(); GLuint GetPaletteTexture();
GLuint GetMaskTexture(); GLuint GetMaskTexture();
void SetPaletteTexture(int texture); void SetPaletteTexture(int texture);
Expand All @@ -35,6 +40,7 @@ namespace GemRB
ieDword GetColorKey() const { return colorKeyIndex; } ieDword GetColorKey() const { return colorKeyIndex; }
void SetColorKey(ieDword); void SetColorKey(ieDword);
bool IsPaletted() const { return Bpp == 8; } bool IsPaletted() const { return Bpp == 8; }
void SetPaletteManager(GLPaletteManager* manager) { paletteManager = manager; }
GLTextureSprite2D (int Width, int Height, int Bpp, void* pixels, Uint32 rmask=0, Uint32 gmask=0, Uint32 bmask=0, Uint32 amask=0); GLTextureSprite2D (int Width, int Height, int Bpp, void* pixels, Uint32 rmask=0, Uint32 gmask=0, Uint32 bmask=0, Uint32 amask=0);
~GLTextureSprite2D(); ~GLTextureSprite2D();
GLTextureSprite2D(const GLTextureSprite2D &obj); GLTextureSprite2D(const GLTextureSprite2D &obj);
Expand Down
Loading

0 comments on commit f7ecbac

Please sign in to comment.