aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/netsurf/files/libnsgif-strict-aliasing.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/netsurf/files/libnsgif-strict-aliasing.patch')
-rw-r--r--recipes/netsurf/files/libnsgif-strict-aliasing.patch82
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 {
+