diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | backend/tiff/tiff-document.c | 23 |
2 files changed, 16 insertions, 12 deletions
@@ -1,5 +1,10 @@ 2009-04-09 Benjamin Berg <benjamin@sipsolutions.net> + * backend/tiff/tiff-document.c: (tiff_document_render): + Fix tiff pixel conversion on big endian machines. Fixes bug #509920. + +2009-04-09 Benjamin Berg <benjamin@sipsolutions.net> + * backend/dvi/cairo-device.c: (dvi_cairo_put_pixel): Fix output on big endian machines. Fixes bug #578433. diff --git a/backend/tiff/tiff-document.c b/backend/tiff/tiff-document.c index 5501451..7f10c9a 100644 --- a/backend/tiff/tiff-document.c +++ b/backend/tiff/tiff-document.c @@ -260,10 +260,10 @@ tiff_document_render (EvDocument *document, rowstride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, width); #else rowstride = width * 4; +#endif if (rowstride / 4 != width) - /* overflow */ + /* overflow, or cairo was changed in an unsupported way */ return NULL; -#endif bytes = height * rowstride; if (bytes / rowstride != height) @@ -292,16 +292,15 @@ tiff_document_render (EvDocument *document, */ p = pixels; while (p < pixels + bytes) { - uint32 pixel = *(uint32 *)p; - int r = TIFFGetR(pixel); - int g = TIFFGetG(pixel); - int b = TIFFGetB(pixel); - int a = TIFFGetA(pixel); - - *p++ = b; - *p++ = g; - *p++ = r; - *p++ = a; + guint32 *pixel = (guint32*)p; + guint8 r = TIFFGetR(*pixel); + guint8 g = TIFFGetG(*pixel); + guint8 b = TIFFGetB(*pixel); + guint8 a = TIFFGetA(*pixel); + + *pixel = (a << 24) | (r << 16) | (g << 8) | b; + + p += 4; } rotated_surface = ev_document_misc_surface_rotate_and_scale (surface, |