diff options
Diffstat (limited to 'recipes/netsurf/files/libnsgif-strict-aliasing.patch')
-rw-r--r-- | recipes/netsurf/files/libnsgif-strict-aliasing.patch | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/recipes/netsurf/files/libnsgif-strict-aliasing.patch b/recipes/netsurf/files/libnsgif-strict-aliasing.patch new file mode 100644 index 0000000000..4fe913c491 --- /dev/null +++ b/recipes/netsurf/files/libnsgif-strict-aliasing.patch @@ -0,0 +1,82 @@ +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 { + |