[cairo] cairo on cross-endian architectures

Egon Nijns Egon.Nijns at bib.kuleuven.be
Mon Sep 12 03:17:05 PDT 2005

Hi all,

I'm running into some color problems (red and blue are swapped) with 
cairo (as used by Mozilla's SVG implementation) on a cross-endian 
architecture (these were already discussed earlier on the cairo mailing 
list, I've attached part of the earlier discussion below).

We are using a Sun Ray Server, and I think that this is a cross-endian 
architecture, since I'm seeing the swapped colors problem. I've 
submitted a badly written patch doing the byte-swaps Owen Taylor 
suggested to Mozilla's bugzilla, and want to clean up the code (I hope 
that a fix for this can one day be included in cairo).

The biggest problem I have is that I don't know how to do the 
cross-endian detection (plus I have no experience with Xlib coding 
whatsoever), but maybe someone on this list can give me some clues on 
how to do this properly?

kind regards,

> On Tue, 2005-05-10 at 15:04 -0600, Peter Dennis Bartok wrote:
>>> Hi all,
>>> Has anyone successfully used Cairo on anything other than a 
>>> Xfree/Xorg X server?
>>> Two cases where we are seeing problems are Sun's X server and 
>>> Hummingbirds' Exceed Win32 X server. On both or applications usually 
>>> die with a BadMatch (in XPutImage or XGetImage). *Also, on Servers 
>>> that have MSB first, cairo treats it as if they are LSB first, 
>>> thereby swapping red and blue.*
>>> My understanding of the inner workings of cairo and libpixman sadly 
>>> is quite limited, so I wouldn't know where to start trying to fix this.
> No libpixman or Cairo knowledge needed. It's all really shallow inside
> cairo-xlib-surface.c.
> *For the endianess problems, the code simply needs to byte-swap the
> image after calling XGetImage / before calling XPutImage if you detect 
> cross-endian. (Image byte order not equal to local byte
> order.)*
> (In some cases, there are tricks you can play with calling a big 
> endian RGB x888 visual a little endian BGR 888x visual. libpixman can 
> draw to a BGR 888x visual but it's going to be slow. Certainly simpler 
> to just byte-swap than to worry about
> accelerating that.)
> It looks to me like the code should work fine on MSB as long
> as the client/server endianess matches.
> [...]
> Regards,
>                     Owen 

Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm

More information about the cairo mailing list