- gif.c modificat

This commit is contained in:
2023-10-12 21:43:08 +02:00
parent 1309e5d7d8
commit a1d3209dd3
3 changed files with 47 additions and 16 deletions

View File

@@ -334,7 +334,8 @@ unsigned char* process_image_descriptor( unsigned char* buffer,
*/ */
#define rb (*(buffer++)) #define rb (*(buffer++))
uint32_t* LoadPalette(unsigned char *buffer) { uint32_t* LoadPalette(unsigned char *b, int *paletteSize = NULL) {
unsigned char *buffer = b;
unsigned char header[7]; unsigned char header[7];
screen_descriptor_t screen_descriptor; screen_descriptor_t screen_descriptor;
//int color_resolution_bits; //int color_resolution_bits;
@@ -346,12 +347,12 @@ uint32_t* LoadPalette(unsigned char *buffer) {
READ(&screen_descriptor, 7); READ(&screen_descriptor, 7);
//color_resolution_bits = ((screen_descriptor.fields & 0x70) >> 4) + 1; //color_resolution_bits = ((screen_descriptor.fields & 0x70) >> 4) + 1;
global_color_table = (uint32_t *)calloc(1, 1024); //global_color_table = (uint32_t *)calloc(1, 1024);
if (screen_descriptor.fields & 0x80) { if (screen_descriptor.fields & 0x80) {
global_color_table_size = 1 << (((screen_descriptor.fields & 0x07) + 1)); global_color_table_size = 1 << (((screen_descriptor.fields & 0x07) + 1));
if (paletteSize != NULL) *paletteSize = global_color_table_size;
//global_color_table = (rgb *)malloc(3 * global_color_table_size); global_color_table = (uint32_t *)malloc(3 * global_color_table_size);
//READ(global_color_table, 3 * global_color_table_size); //READ(global_color_table, 3 * global_color_table_size);
for (int i=0; i<global_color_table_size;++i) { for (int i=0; i<global_color_table_size;++i) {
global_color_table[i] = (buffer[0]<<16) + (buffer[1]<<8) + buffer[2]; global_color_table[i] = (buffer[0]<<16) + (buffer[1]<<8) + buffer[2];

View File

@@ -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 // 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 // Agafem un buffer de bytes de l'arxiu especificat
// getFileBuffer() simplement ens torna el arxiu sencer dins de un array de char // 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. // però, ojo, sí que tindrem que alliberar-la.
surf->pixels = LoadGif(buffer, &surf->w, &surf->h); 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 // Com ja no ens fa falta, alliberem la memòria del buffer del arxiu
free(buffer); free(buffer);
@@ -205,8 +221,8 @@ namespace draw
return y - viewport.y; return y - viewport.y;
} }
// Estableix la paleta del sistema carregant-la d'un GIF // Carrega la paleta d'un GIF i la torna en un array de uint32_t
void loadPalette(const std::string &filename) uint32_t *loadPalette(const std::string &filename, int *paletteSize)
{ {
// Agafem un buffer de bytes de l'arxiu especificat // Agafem un buffer de bytes de l'arxiu especificat
// getFileBuffer() simplement ens torna el arxiu sencer dins de un array de char // 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 // Van a ser 256 entrades de 32 bits, cada entrada es un color, amb el format 0xAARRGGBB
uint32_t *pal = LoadPalette(buffer); 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 // I també el buffer del arxiu
free(buffer); 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 // Estableix una entrada de la paleta del sistema

View File

@@ -39,8 +39,9 @@ namespace draw
/// @brief Carrega un gràfic d'un arxiu (en format GIF) a una nova superficie, i torna un punter a ella /// @brief Carrega un gràfic d'un arxiu (en format GIF) a una nova superficie, i torna un punter a ella
/// @param filename nom de l'arxiu GIF d'on carregar la superficie /// @param filename nom de l'arxiu GIF d'on carregar la superficie
/// @param loadPalette si es true també se carrega la paleta del GIF
/// @return un punter a una nova superficie /// @return un punter a una nova superficie
surface *loadSurface(const std::string &filename); surface *loadSurface(const std::string &filename, const bool loadPalette = false);
/// @brief Allibera la memòria d'una superficie, els seus pixels inclosos /// @brief Allibera la memòria d'una superficie, els seus pixels inclosos
/// @param surf punter a la superficie a alliberar /// @param surf punter a la superficie a alliberar
@@ -63,9 +64,16 @@ namespace draw
const int getLocalX(const int x); const int getLocalX(const int x);
const int getLocalY(const int y); const int getLocalY(const int y);
/// @brief Estableix la paleta del sistema carregant-la d'un GIF /// @brief Carrega la paleta d'un GIF i la torna en un array de uint32_t
/// @param filename nom de l'arxiu GIF d'on carregar la paleta /// @param filename nom de l'arxiu GIF d'on carregar la paleta
void loadPalette(const std::string &filename); /// @param paletteSize si no es NULL ens torna el tamany de la paleta carregada
uint32_t *loadPalette(const std::string &filename, int *paletteSize = nullptr);
/// @brief Estableix la paleta del sistema, o part de ella, des d'un array especificat
/// @param pal un array de uint32_t
/// @param len quantes entrades volem trasladar a la paleta de sistema (no superar el tamany de 'pal'!)
/// @param pos des de quina posició de la paleta de sistema comencem a copiar
void setPalette(const uint32_t *pal, const int len, const int pos=0);
/// @brief Estableix una entrada de la paleta del sistema /// @brief Estableix una entrada de la paleta del sistema
/// @param index l'index de l'entrada de la paleta /// @param index l'index de l'entrada de la paleta