- gif.c modificat
This commit is contained in:
@@ -109,7 +109,7 @@ namespace draw
|
||||
}
|
||||
|
||||
// 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)
|
||||
surface *loadSurface(const std::string &filename, const bool loadPalette)
|
||||
{
|
||||
// Agafem un buffer de bytes de l'arxiu especificat
|
||||
// getFileBuffer() simplement ens torna el arxiu sencer dins de un array de char
|
||||
@@ -131,6 +131,22 @@ namespace draw
|
||||
// però, ojo, sí que tindrem que alliberar-la.
|
||||
surf->pixels = LoadGif(buffer, &surf->w, &surf->h);
|
||||
|
||||
// Si li havem dit que carregue també la paleta...
|
||||
if (loadPalette)
|
||||
{
|
||||
// Li passem el array del arxiu a LoadPalette. Ell ens torna un array de uint32_t amb la paleta
|
||||
// Van a ser com a molt 256 entrades de 32 bits (pero no sempre), cada entrada es un color, amb el format 0xAARRGGBB
|
||||
int paletteSize;
|
||||
uint32_t *pal = LoadPalette(buffer, &paletteSize);
|
||||
|
||||
// Copiem eixe array al nostre array de la paleta de sistema. Ara ja tenim la paleta carregada.
|
||||
memset(palette, 0, 1024); // Fiquem tot a 0, que la paleta potser no es de 256 i quedaria basura
|
||||
memcpy(palette, pal, paletteSize*4); // 32 bits per entrada == 4 bytes x 'paletteSize' entrades
|
||||
|
||||
// Alliberem el array que ens habia tornat LoadPalette()
|
||||
free(pal);
|
||||
}
|
||||
|
||||
// Com ja no ens fa falta, alliberem la memòria del buffer del arxiu
|
||||
free(buffer);
|
||||
|
||||
@@ -205,8 +221,8 @@ namespace draw
|
||||
return y - viewport.y;
|
||||
}
|
||||
|
||||
// Estableix la paleta del sistema carregant-la d'un GIF
|
||||
void loadPalette(const std::string &filename)
|
||||
// Carrega la paleta d'un GIF i la torna en un array de uint32_t
|
||||
uint32_t *loadPalette(const std::string &filename, int *paletteSize)
|
||||
{
|
||||
// Agafem un buffer de bytes de l'arxiu especificat
|
||||
// getFileBuffer() simplement ens torna el arxiu sencer dins de un array de char
|
||||
@@ -217,14 +233,20 @@ namespace draw
|
||||
// Van a ser 256 entrades de 32 bits, cada entrada es un color, amb el format 0xAARRGGBB
|
||||
uint32_t *pal = LoadPalette(buffer);
|
||||
|
||||
// Copiem eixe array al nostre array de la paleta de sistema. Ara ja tenim la paleta carregada.
|
||||
memcpy(palette, pal, 1024); // 32 bits per entrada == 4 bytes x 256 entrades == 1024
|
||||
|
||||
// Alliberem el array que ens habia tornat LoadPalette()
|
||||
free(pal);
|
||||
|
||||
// I també el buffer del arxiu
|
||||
free(buffer);
|
||||
|
||||
if (paletteSize) *paletteSize = size;
|
||||
return pal;
|
||||
}
|
||||
|
||||
// Estableix la paleta del sistema, o part de ella, des d'un array especificat
|
||||
void setPalette(const uint32_t *pal, const int len, const int pos)
|
||||
{
|
||||
for (int i=0; i<len; ++i)
|
||||
{
|
||||
palette[i+pos] = pal[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Estableix una entrada de la paleta del sistema
|
||||
|
||||
Reference in New Issue
Block a user