From a1d3209dd3cc0a514a43dc67c73fe7873bc79202 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Thu, 12 Oct 2023 21:43:08 +0200 Subject: [PATCH] - gif.c modificat --- source/gif.c | 9 +++++---- source/jdraw.cpp | 40 +++++++++++++++++++++++++++++++--------- source/jdraw.h | 14 +++++++++++--- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/source/gif.c b/source/gif.c index 8c19b14..66a63cc 100644 --- a/source/gif.c +++ b/source/gif.c @@ -334,7 +334,8 @@ unsigned char* process_image_descriptor( unsigned char* 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]; screen_descriptor_t screen_descriptor; //int color_resolution_bits; @@ -346,12 +347,12 @@ uint32_t* LoadPalette(unsigned char *buffer) { READ(&screen_descriptor, 7); //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) { global_color_table_size = 1 << (((screen_descriptor.fields & 0x07) + 1)); - - //global_color_table = (rgb *)malloc(3 * global_color_table_size); + if (paletteSize != NULL) *paletteSize = global_color_table_size; + global_color_table = (uint32_t *)malloc(3 * global_color_table_size); //READ(global_color_table, 3 * global_color_table_size); for (int i=0; ipixels = 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