- [NEW] Gestió més eficient de la memòria que usen els GIFs
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
#include "SDL2/SDL.h"
|
||||
#include "gif.c"
|
||||
#include "jfile.h"
|
||||
#include <vector>
|
||||
|
||||
namespace draw
|
||||
{
|
||||
@@ -31,6 +32,9 @@ namespace draw
|
||||
|
||||
SDL_Rect viewport;
|
||||
|
||||
surface* managed[50];
|
||||
int num_managed = 0;
|
||||
|
||||
// Inicialització de tot el que fa falta per a carregar gràfics i pintar en pantalla
|
||||
void init(const std::string &titol, const uint16_t width, const uint16_t height, const int zoom)
|
||||
{
|
||||
@@ -52,15 +56,27 @@ namespace draw
|
||||
sel_color = transparent = 0;
|
||||
for (int i=0;i<256;++i) color_indices[i] = i;
|
||||
|
||||
textsurf = loadSurface("font.gif");
|
||||
textsurf2 = loadSurface("font2.gif");
|
||||
int size;
|
||||
char *buffer = file::getFileBuffer("gifs.txt", size, true);
|
||||
char *p = buffer;
|
||||
char *n = buffer;
|
||||
while (*n!=0) {
|
||||
while (*n!='\n') n++; *n=0;
|
||||
loadSurface(p);
|
||||
p=++n;
|
||||
}
|
||||
free(buffer);
|
||||
|
||||
textsurf = getSurface("font.gif");
|
||||
textsurf2 = getSurface("font2.gif");
|
||||
}
|
||||
|
||||
// Finalització del sistema
|
||||
void quit()
|
||||
{
|
||||
if (textsurf) freeSurface(textsurf);
|
||||
if (textsurf2) freeSurface(textsurf2);
|
||||
for (int i=0; i<num_managed; ++i) if (managed[i]) freeSurface(managed[i]);
|
||||
//if (textsurf) freeSurface(textsurf);
|
||||
//if (textsurf2) freeSurface(textsurf2);
|
||||
|
||||
// Si la superficie "screen" existia, alliberem la seua memòria
|
||||
if (screen != nullptr)
|
||||
@@ -99,12 +115,15 @@ namespace draw
|
||||
surf->w = w;
|
||||
surf->h = h;
|
||||
|
||||
// Es una surface nova, no ve de arxiu ni tindrà varies referències
|
||||
surf->filename = nullptr;
|
||||
|
||||
// ...i tornem la superficie creada, clar
|
||||
return surf;
|
||||
}
|
||||
|
||||
// Carrega un gràfic d'un arxiu (en format GIF) a una nova superficie, i torna un punter a ella
|
||||
surface *loadSurface(const std::string &filename)
|
||||
void loadSurface(const std::string &filename)
|
||||
{
|
||||
// Agafem un buffer de bytes de l'arxiu especificat
|
||||
// getFileBuffer() simplement ens torna el arxiu sencer dins de un array de char
|
||||
@@ -114,7 +133,8 @@ namespace draw
|
||||
// Si ens ha tornat nullptr, es que no l'ha trobat, tornem nosaltres també nullptr ja que no s'ha pogut crear la superficie
|
||||
if (buffer == nullptr)
|
||||
{
|
||||
return nullptr;
|
||||
printf("ERROR: GIF no trobat: '%s'\n", filename.c_str());
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Primer reservem memòria per a la estructura "surface"
|
||||
@@ -129,8 +149,23 @@ namespace draw
|
||||
// Com ja no ens fa falta, alliberem la memòria del buffer del arxiu
|
||||
free(buffer);
|
||||
|
||||
// I finalment tornem la superficie
|
||||
return surf;
|
||||
// Especifiquem el nom de l'arxiu del que vé i el guardem a la llista
|
||||
surf->filename = (char*)malloc(filename.length()+1);
|
||||
strcpy(surf->filename, filename.c_str());
|
||||
managed[num_managed++] = surf;
|
||||
}
|
||||
|
||||
surface *getSurface(const std::string &filename)
|
||||
{
|
||||
for(int i=0; i<num_managed; ++i)
|
||||
{
|
||||
// Si ja existia, pujem el nombre de referències i tornem eixa surface, i au
|
||||
if (strcmp(managed[i]->filename, filename.c_str())==0)
|
||||
{
|
||||
return managed[i];
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Allibera la memòria d'una superficie, els seus pixels inclosos
|
||||
@@ -145,7 +180,12 @@ namespace draw
|
||||
free(surf->pixels);
|
||||
}
|
||||
|
||||
// ... alliberem la superficie
|
||||
// Si el nom de l'arxiu existeix, l'alliberem
|
||||
if (surf->filename != nullptr)
|
||||
{
|
||||
free(surf->filename);
|
||||
}
|
||||
|
||||
free(surf);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user