Gitweb links:
...log
http://git.netsurf-browser.org/netsurf.git/shortlog/c47a497bca10e2fce6fd2...
...commit
http://git.netsurf-browser.org/netsurf.git/commit/c47a497bca10e2fce6fd2f4...
...tree
http://git.netsurf-browser.org/netsurf.git/tree/c47a497bca10e2fce6fd2f458...
The branch, master has been updated
via c47a497bca10e2fce6fd2f458e9b5b9f6992062d (commit)
from 1511a742031342944d7aae38b35854fe62eaaf91 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=c47a497bca10e2fce6f...
commit c47a497bca10e2fce6fd2f458e9b5b9f6992062d
Author: John-Mark Bell <jmb(a)netsurf-browser.org>
Commit: John-Mark Bell <jmb(a)netsurf-browser.org>
GTK: more endian fixes for bitmap conversion.
diff --git a/gtk/bitmap.c b/gtk/bitmap.c
index 4b14c28..3ae2114 100644
--- a/gtk/bitmap.c
+++ b/gtk/bitmap.c
@@ -204,20 +204,42 @@ unsigned char *bitmap_get_buffer(void *vbitmap)
cairo_image_surface_get_height(gbitmap->surface);
if (fmt == CAIRO_FORMAT_RGB24) {
- /* Opaque image: simply swap R & B channels */
+ /* Opaque image */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
+ /* Cairo surface is ARGB, written in native endian */
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
b = pixels[4 * pixel_loop + 0];
+ g = pixels[4 * pixel_loop + 1];
r = pixels[4 * pixel_loop + 2];
+ t = pixels[4 * pixel_loop + 3];
+#else
+ t = pixels[4 * pixel_loop + 0];
+ r = pixels[4 * pixel_loop + 1];
+ g = pixels[4 * pixel_loop + 2];
+ b = pixels[4 * pixel_loop + 3];
+#endif
+
+ /* Core bitmaps always have a component order of rgba,
+ * regardless of system endianness */
pixels[4 * pixel_loop + 0] = r;
+ pixels[4 * pixel_loop + 1] = g;
pixels[4 * pixel_loop + 2] = b;
+ pixels[4 * pixel_loop + 3] = t;
}
} else {
- /* Alpha image: swap R & B channels, and de-multiply alpha */
+ /* Alpha image: de-multiply alpha */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
b = pixels[4 * pixel_loop + 0];
g = pixels[4 * pixel_loop + 1];
r = pixels[4 * pixel_loop + 2];
t = pixels[4 * pixel_loop + 3];
+#else
+ t = pixels[4 * pixel_loop + 0];
+ r = pixels[4 * pixel_loop + 1];
+ g = pixels[4 * pixel_loop + 2];
+ b = pixels[4 * pixel_loop + 3];
+#endif
if (t != 0) {
r = (r << 8) / t;
@@ -343,15 +365,30 @@ void bitmap_modified(void *vbitmap) {
}
if (fmt == CAIRO_FORMAT_RGB24) {
- /* Opaque image: simply swap R & B channels */
+ /* Opaque image */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
+ /* Core bitmaps always have a component order of rgba,
+ * regardless of system endianness */
r = pixels[4 * pixel_loop + 0];
+ g = pixels[4 * pixel_loop + 1];
b = pixels[4 * pixel_loop + 2];
+ t = pixels[4 * pixel_loop + 3];
+
+ /* Cairo surface is ARGB, written in native endian */
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
pixels[4 * pixel_loop + 0] = b;
+ pixels[4 * pixel_loop + 1] = g;
pixels[4 * pixel_loop + 2] = r;
+ pixels[4 * pixel_loop + 3] = t;
+#else
+ pixels[4 * pixel_loop + 0] = t;
+ pixels[4 * pixel_loop + 1] = r;
+ pixels[4 * pixel_loop + 2] = g;
+ pixels[4 * pixel_loop + 3] = b;
+#endif
}
} else {
- /* Alpha image: swap R & B channels, and pre-multiply alpha */
+ /* Alpha image: pre-multiply alpha */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
r = pixels[4 * pixel_loop + 0];
g = pixels[4 * pixel_loop + 1];
@@ -366,10 +403,17 @@ void bitmap_modified(void *vbitmap) {
r = g = b = 0;
}
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
pixels[4 * pixel_loop + 0] = b;
pixels[4 * pixel_loop + 1] = g;
pixels[4 * pixel_loop + 2] = r;
pixels[4 * pixel_loop + 3] = t;
+#else
+ pixels[4 * pixel_loop + 0] = t;
+ pixels[4 * pixel_loop + 1] = r;
+ pixels[4 * pixel_loop + 2] = g;
+ pixels[4 * pixel_loop + 3] = b;
+#endif
}
}
-----------------------------------------------------------------------
Summary of changes:
gtk/bitmap.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/gtk/bitmap.c b/gtk/bitmap.c
index 4b14c28..3ae2114 100644
--- a/gtk/bitmap.c
+++ b/gtk/bitmap.c
@@ -204,20 +204,42 @@ unsigned char *bitmap_get_buffer(void *vbitmap)
cairo_image_surface_get_height(gbitmap->surface);
if (fmt == CAIRO_FORMAT_RGB24) {
- /* Opaque image: simply swap R & B channels */
+ /* Opaque image */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
+ /* Cairo surface is ARGB, written in native endian */
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
b = pixels[4 * pixel_loop + 0];
+ g = pixels[4 * pixel_loop + 1];
r = pixels[4 * pixel_loop + 2];
+ t = pixels[4 * pixel_loop + 3];
+#else
+ t = pixels[4 * pixel_loop + 0];
+ r = pixels[4 * pixel_loop + 1];
+ g = pixels[4 * pixel_loop + 2];
+ b = pixels[4 * pixel_loop + 3];
+#endif
+
+ /* Core bitmaps always have a component order of rgba,
+ * regardless of system endianness */
pixels[4 * pixel_loop + 0] = r;
+ pixels[4 * pixel_loop + 1] = g;
pixels[4 * pixel_loop + 2] = b;
+ pixels[4 * pixel_loop + 3] = t;
}
} else {
- /* Alpha image: swap R & B channels, and de-multiply alpha */
+ /* Alpha image: de-multiply alpha */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
b = pixels[4 * pixel_loop + 0];
g = pixels[4 * pixel_loop + 1];
r = pixels[4 * pixel_loop + 2];
t = pixels[4 * pixel_loop + 3];
+#else
+ t = pixels[4 * pixel_loop + 0];
+ r = pixels[4 * pixel_loop + 1];
+ g = pixels[4 * pixel_loop + 2];
+ b = pixels[4 * pixel_loop + 3];
+#endif
if (t != 0) {
r = (r << 8) / t;
@@ -343,15 +365,30 @@ void bitmap_modified(void *vbitmap) {
}
if (fmt == CAIRO_FORMAT_RGB24) {
- /* Opaque image: simply swap R & B channels */
+ /* Opaque image */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
+ /* Core bitmaps always have a component order of rgba,
+ * regardless of system endianness */
r = pixels[4 * pixel_loop + 0];
+ g = pixels[4 * pixel_loop + 1];
b = pixels[4 * pixel_loop + 2];
+ t = pixels[4 * pixel_loop + 3];
+
+ /* Cairo surface is ARGB, written in native endian */
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
pixels[4 * pixel_loop + 0] = b;
+ pixels[4 * pixel_loop + 1] = g;
pixels[4 * pixel_loop + 2] = r;
+ pixels[4 * pixel_loop + 3] = t;
+#else
+ pixels[4 * pixel_loop + 0] = t;
+ pixels[4 * pixel_loop + 1] = r;
+ pixels[4 * pixel_loop + 2] = g;
+ pixels[4 * pixel_loop + 3] = b;
+#endif
}
} else {
- /* Alpha image: swap R & B channels, and pre-multiply alpha */
+ /* Alpha image: pre-multiply alpha */
for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) {
r = pixels[4 * pixel_loop + 0];
g = pixels[4 * pixel_loop + 1];
@@ -366,10 +403,17 @@ void bitmap_modified(void *vbitmap) {
r = g = b = 0;
}
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
pixels[4 * pixel_loop + 0] = b;
pixels[4 * pixel_loop + 1] = g;
pixels[4 * pixel_loop + 2] = r;
pixels[4 * pixel_loop + 3] = t;
+#else
+ pixels[4 * pixel_loop + 0] = t;
+ pixels[4 * pixel_loop + 1] = r;
+ pixels[4 * pixel_loop + 2] = g;
+ pixels[4 * pixel_loop + 3] = b;
+#endif
}
}
--
NetSurf Browser