[cairo] ARGB, BGRA, RGBA mess

Bill Spitzak spitzak at d2.com
Thu Jan 13 10:41:51 PST 2005

Chris wrote:

> I don't think it's a bug in Cairo, it is just unexpected from my view.
> In my world I'm used to having an particular format that always has the
> same byte ordering no matter what platform it is used on.  So if it says
> "ARGB" then I expect the bytes in memory to be A, R, G, B on all the
> platforms.  This is just my view from working with bitmaps, targa's,
> jpeg's, etc.

I would agree that, from looking at many image library specifications, 
the term "ABCD" means that A is at a lower memory address than B in the 
virtually every single one of them. Only X has the idea that ABCD means 
A is in the high-order byte of a word. I recommend Cairo and all new 
software follow the more common conventions. It is extremely confusing 
to do otherwise. It also makes it impossible to describe formats where 
the distance between pixels is 3 in any sensible way.

Other problem is that in all my work I have *never* seen "ARGB" or 
"BGRA".  By far the most common layout is "RGBA". The second-most common 
is "ABGR". I think it would be perfectly acceptable if Cairo only 
accepted RGBA and ABGR.

The terms I am familar with and in my order of importance are:

RGBA - &R < &G, &A == &R+3
ABGR - &A < &B, &R == &A+3
RGB - &R < &G, pixels are 3 apart. Pretend A==1
BGR - &G < &R, pixels are 3 apart. Pretend A==1
MONO - one byte, treat it as R==G==B==A.
ARGB - Though logical, I have never seen this used
BGRA - Seen even less, but should be supported if ARGB is

It may make sense to also define symbols "RGBA_WORD" and "ABGR_WORD" 
that match the symbols X uses. RGBA_WORD means that R is in the 
highest-order byte of a 32-bit unsigned value. On a little-endian system 
RGBA_WORD is AGBR, on a big-endian machine RGBA_WORD is RGBA.

More information about the cairo mailing list