1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00

Replace the static texture array by a map

This commit is contained in:
Mathieu Schroeter 2017-03-02 22:37:17 +01:00
parent 90bfd940dd
commit 3b027424a1
2 changed files with 67 additions and 44 deletions

View File

@ -42,9 +42,6 @@ CPixmap::CPixmap()
for (i = 0; i < MAXCURSORS; i++)
m_lpSDLCursors[i] = nullptr;
for (i = 0 ; i < MAXIMAGE ; i++)
m_lpSDLTexture[i] = nullptr;
m_lpCurrentCursor = nullptr;
}
@ -63,14 +60,9 @@ CPixmap::~CPixmap()
}
}
for (i = 0 ; i < countof (m_lpSDLTexture) ; i++)
{
if (m_lpSDLTexture[i] != nullptr)
{
SDL_DestroyTexture (m_lpSDLTexture[i]);
m_lpSDLTexture[i] = nullptr;
}
}
for (auto tex: m_SDLTextureInfo)
if (tex.second.texture)
SDL_DestroyTexture (tex.second.texture);
}
// Cr�e l'objet DirectDraw principal.
@ -136,7 +128,7 @@ Sint32 CPixmap::BltFast (Sint32 chDst, Sint32 channel, POINT dst, RECT rcRect)
dstRect.x = dst.x;
dstRect.y = dst.y;
res = SDL_RenderCopy (g_renderer, m_lpSDLTexture[channel], &srcRect, &dstRect);
res = SDL_RenderCopy (g_renderer, m_SDLTextureInfo[channel].texture, &srcRect, &dstRect);
}
else
{
@ -149,8 +141,8 @@ Sint32 CPixmap::BltFast (Sint32 chDst, Sint32 channel, POINT dst, RECT rcRect)
dstRect.x = dst.x;
dstRect.y = dst.y;
SDL_SetRenderTarget (g_renderer, m_lpSDLTexture[chDst]);
res = SDL_RenderCopy (g_renderer, m_lpSDLTexture[channel], &srcRect, &dstRect);
SDL_SetRenderTarget (g_renderer, m_SDLTextureInfo[chDst].texture);
res = SDL_RenderCopy (g_renderer, m_SDLTextureInfo[channel].texture, &srcRect, &dstRect);
SDL_SetRenderTarget (g_renderer, nullptr);
}
@ -175,7 +167,7 @@ Sint32 CPixmap::BltFast (SDL_Texture *lpSDL, Sint32 channel, POINT dst,
dstRect.y = dst.y;
SDL_SetRenderTarget (g_renderer, lpSDL);
res = SDL_RenderCopy (g_renderer, m_lpSDLTexture[channel], &srcRect, &dstRect);
res = SDL_RenderCopy (g_renderer, m_SDLTextureInfo[channel].texture, &srcRect, &dstRect);
SDL_SetRenderTarget (g_renderer, nullptr);
return res;
@ -200,34 +192,41 @@ bool CPixmap::Cache (Sint32 channel, const char *pFilename, POINT totalDim,
Sint32 access, w, h;
SDL_QueryTexture (texture, &format, &access, &w, &h);
if (!m_lpSDLTexture[channel])
if (m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
{
m_lpSDLTexture[channel] = SDL_CreateTexture (g_renderer, SDL_PIXELFORMAT_RGBA32,
SDL_TEXTUREACCESS_TARGET, w, h);
SDL_SetTextureBlendMode (m_lpSDLTexture[channel], SDL_BLENDMODE_BLEND);
m_SDLTextureInfo[channel].texture =
SDL_CreateTexture (g_renderer, SDL_PIXELFORMAT_RGBA32,
SDL_TEXTUREACCESS_TARGET, w, h);
if (!m_SDLTextureInfo[channel].texture)
{
SDL_LogError (SDL_LOG_CATEGORY_APPLICATION,
"Couldn't create texture from surface: %s", SDL_GetError());
return false;
}
m_SDLTextureInfo[channel].target = true;
m_SDLTextureInfo[channel].dimIcon = iconDim;
m_SDLTextureInfo[channel].dimTotal = totalDim;
m_SDLTextureInfo[channel].file = pFilename;
SDL_SetTextureBlendMode (m_SDLTextureInfo[channel].texture,
SDL_BLENDMODE_BLEND);
}
else
{
SDL_SetRenderTarget (g_renderer, m_lpSDLTexture[channel]);
SDL_SetRenderTarget (g_renderer, m_SDLTextureInfo[channel].texture);
SDL_SetRenderDrawColor (g_renderer, 0, 0, 0, 0);
SDL_RenderClear (g_renderer);
SDL_SetRenderTarget (g_renderer, nullptr);
}
SDL_SetRenderTarget (g_renderer, m_lpSDLTexture[channel]);
SDL_SetRenderTarget (g_renderer, m_SDLTextureInfo[channel].texture);
SDL_RenderCopy (g_renderer, texture, nullptr, nullptr);
SDL_SetRenderTarget (g_renderer, nullptr);
SDL_DestroyTexture (texture);
//m_lpSDLTexture[channel] = SDL_CreateTextureFromSurface (g_renderer, surface);
if (!m_lpSDLTexture[channel])
{
SDL_LogError (SDL_LOG_CATEGORY_APPLICATION,
"Couldn't create texture from surface: %s", SDL_GetError());
return false;
}
if (channel != CHBLUPI)
SDL_FreeSurface (surface);
@ -262,12 +261,14 @@ bool CPixmap::Cache (Sint32 channel, SDL_Surface *surface, POINT totalDim)
return false;
// Create the offscreen surface, by loading our bitmap.
if (m_lpSDLTexture[channel])
SDL_DestroyTexture (m_lpSDLTexture[channel]);
if ( m_SDLTextureInfo.find (channel) != m_SDLTextureInfo.end ()
&& m_SDLTextureInfo[channel].texture)
SDL_DestroyTexture (m_SDLTextureInfo[channel].texture);
m_lpSDLTexture[channel] = SDL_CreateTextureFromSurface (g_renderer, surface);
m_SDLTextureInfo[channel].texture =
SDL_CreateTextureFromSurface (g_renderer, surface);
if (!m_lpSDLTexture[channel])
if (!m_SDLTextureInfo[channel].texture)
return false;
m_totalDim[channel] = totalDim;
@ -299,7 +300,8 @@ bool CPixmap::IsIconPixel (Sint32 channel, Sint32 rank, POINT pos)
if (channel < 0 || channel >= MAXIMAGE)
return false;
if (m_lpSDLTexture[channel] == nullptr)
if (m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
return false;
if (m_iconDim[channel].x == 0 ||
@ -322,7 +324,7 @@ bool CPixmap::IsIconPixel (Sint32 channel, Sint32 rank, POINT pos)
rect.h = 1;
Uint32 pixel = 0;
SDL_SetRenderTarget (g_renderer, m_lpSDLTexture[channel]);
SDL_SetRenderTarget (g_renderer, m_SDLTextureInfo[channel].texture);
SDL_RenderReadPixels (g_renderer, &rect, 0, &pixel, 4);
SDL_SetRenderTarget (g_renderer, nullptr);
@ -341,7 +343,9 @@ bool CPixmap::DrawIcon (Sint32 chDst, Sint32 channel, Sint32 rank, POINT pos,
if (channel < 0 || channel >= MAXIMAGE)
return false;
if (channel != CHMAP && m_lpSDLTexture[channel] == nullptr)
if (channel != CHMAP
&& m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
return false;
if (m_iconDim[channel].x == 0 ||
@ -380,7 +384,8 @@ bool CPixmap::DrawIconDemi (Sint32 chDst, Sint32 channel, Sint32 rank,
if (channel < 0 || channel >= MAXIMAGE)
return false;
if (m_lpSDLTexture[channel] == nullptr)
if (m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
return false;
if (m_iconDim[channel].x == 0 ||
@ -414,7 +419,8 @@ bool CPixmap::DrawIconPart (Sint32 chDst, Sint32 channel, Sint32 rank,
if (channel < 0 || channel >= MAXIMAGE)
return false;
if (m_lpSDLTexture[channel] == nullptr)
if (m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
return false;
if (m_iconDim[channel].x == 0 ||
@ -445,7 +451,8 @@ bool CPixmap::DrawPart (Sint32 chDst, Sint32 channel, POINT dest, RECT rect,
{
if (channel < 0 || channel >= MAXIMAGE)
return false;
if (m_lpSDLTexture[channel] == nullptr)
if (m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
return false;
return !BltFast (chDst, channel, dest, rect);
@ -460,7 +467,8 @@ bool CPixmap::DrawImage (Sint32 chDst, Sint32 channel, RECT rect)
if (channel < 0 || channel >= MAXIMAGE)
return false;
if (m_lpSDLTexture[channel] == nullptr)
if (m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
return false;
dst.x = rect.left;
@ -490,7 +498,8 @@ bool CPixmap::BuildIconMask (Sint32 channelMask, Sint32 rankMask,
if (channel < 0 || channel >= MAXIMAGE)
return false;
if (m_lpSDLTexture[channel] == nullptr)
if (m_SDLTextureInfo.find (channel) == m_SDLTextureInfo.end ())
return false;
if (m_iconDim[channel].x == 0 ||
@ -511,7 +520,8 @@ bool CPixmap::BuildIconMask (Sint32 channelMask, Sint32 rankMask,
rect.bottom = rect.top + m_iconDim[channel].y;
posDst.x = (rankDst % nbx) * m_iconDim[channel].x;
posDst.y = (rankDst / nbx) * m_iconDim[channel].y;
res = BltFast (m_lpSDLTexture[channel], channel, posDst, rect);
res = BltFast (m_SDLTextureInfo[channel].texture, channel, posDst, rect);
if (res)
return false;
@ -529,7 +539,8 @@ bool CPixmap::BuildIconMask (Sint32 channelMask, Sint32 rankMask,
rect.top = (rankMask / nbx) * m_iconDim[channelMask].y;
rect.right = rect.left + m_iconDim[channelMask].x;
rect.bottom = rect.top + m_iconDim[channelMask].y;
res = BltFast (m_lpSDLTexture[channel], channelMask, posDst, rect);
res = BltFast (m_SDLTextureInfo[channel].texture, channelMask, posDst, rect);
return !res;
}

View File

@ -1,6 +1,7 @@
#pragma once
#include <unordered_map>
#include <SDL2/SDL.h>
#include "blupi.h"
@ -8,6 +9,17 @@
#define MAXIMAGE 100
#define MAXCURSORS 14
struct TextureInfo
{
SDL_Texture *texture;
bool target; // can be used as a render target
std::string file;
POINT dimTotal;
POINT dimIcon;
TextureInfo () : texture (nullptr), target (false) {}
};
class CPixmap
{
public:
@ -67,7 +79,7 @@ protected:
SDL_Cursor *m_lpCurrentCursor;
SDL_Cursor *m_lpSDLCursors[MAXCURSORS];
SDL_Surface *m_lpSDLBlupi;
SDL_Texture *m_lpSDLTexture[MAXIMAGE];
std::unordered_map<size_t, TextureInfo> m_SDLTextureInfo;
char m_filename[MAXIMAGE][20];
POINT m_totalDim[MAXIMAGE]; // dimensions totale image