http://source.netsurf-browser.org/?view=rev&revision=9027 Stop utterly insane palette entry population. Palette entries are always ABGR, regardless of platform endianness. This change probably breaks big-endian platforms which, under the old approach, had palette entries of the form RGBA (assuming I understood the code correctly). http://source.netsurf-browser.org/?view=rev&revision=9138 Fix palette entry population some more. Hopefully, it's completely endian agnostic now and still builds with GCC 4.4 --- libnsgif/src/libnsgif.c 2009/03/29 01:43:27 6984 +++ libnsgif/src/libnsgif.c 2009/08/09 22:24:14 9138 @@ -319,19 +319,34 @@ return GIF_INSUFFICIENT_DATA; } for (index = 0; index < gif->colour_table_size; index++) { - char colour[] = {0, 0, 0, (char)0xff}; - colour[0] = gif_data[0]; - colour[1] = gif_data[1]; - colour[2] = gif_data[2]; - gif->global_colour_table[index] = *((int *) (void *) colour); + /* Gif colour map contents are r,g,b. + * + * We want to pack them bytewise into the + * colour table, such that the red component + * is in byte 0 and the alpha component is in + * byte 3. + */ + unsigned char *entry = (unsigned char *) &gif-> + global_colour_table[index]; + + entry[0] = gif_data[0]; /* r */ + entry[1] = gif_data[1]; /* g */ + entry[2] = gif_data[2]; /* b */ + entry[3] = 0xff; /* a */ + gif_data += 3; } gif->buffer_position = (gif_data - gif->gif_data); } else { /* Create a default colour table with the first two colours as black and white */ - gif->global_colour_table[0] = 0xff000000; - gif->global_colour_table[1] = 0xffffffff; + unsigned int *entry = gif->global_colour_table; + + entry[0] = 0x00000000; + /* Force Alpha channel to opaque */ + ((unsigned char *) entry)[3] = 0xff; + + entry[1] = 0xffffffff; } } @@ -844,11 +859,21 @@ colour_table = gif->local_colour_table; if (!clear_image) { for (index = 0; index < colour_table_size; index++) { - char colour[] = {0, 0, 0, (char)0xff}; - colour[0] = gif_data[0]; - colour[1] = gif_data[1]; - colour[2] = gif_data[2]; - colour_table[index] = *((int *) (void *) colour); + /* Gif colour map contents are r,g,b. + * + * We want to pack them bytewise into the + * colour table, such that the red component + * is in byte 0 and the alpha component is in + * byte 3. + */ + unsigned char *entry = + (unsigned char *) &colour_table[index]; + + entry[0] = gif_data[0]; /* r */ + entry[1] = gif_data[1]; /* g */ + entry[2] = gif_data[2]; /* b */ + entry[3] = 0xff; /* a */ + gif_data += 3; } } else {