[cairo] using ARGB32 surfaces with pygame
Bill Spitzak
spitzak at thefoundry.co.uk
Mon Feb 23 11:41:44 PST 2009
Cairo is creating the image in ARGB32 format. This defines the order of
the colors inside a *word*, ie which bits mean each color when 32 bits
from memory are loaded into a 32-big register in the cpu.
On a little-endian machine the bytes are in BGRA order.
On a big-endian machine the bytes are in ARGB order.
To convert to RGBA depends on the endianess. On a little-endian machine
you swap byts 0 and 2. On a big-endian machine you rotate 0<-1, 1<-2,
2<-3, and 3<-0.
Jayesh Salvi wrote:
> Thanks Bill.
>
> So if I get you correctly, what's happening is cairo is creating color
> info in ARGB format. pygame is interpreting it as BGRA, because of the
> byte-order difference. The code I am using is swapping 0th and 2nd
> color, i.e. B and R - thus leading to RGBA. That's the format I am
> feeding to pygame.image.frombuffer.
>
> It sounds like it is inevitable to do this operation when using cairo
> with pygame. I will see how big performance impact it can cause, if at all.
>
> For anyone interested, I at least managed to do the swapping without the
> help of numpy. thanks to:
> http://www.mail-archive.com/pygame-users@seul.org/msg01707.html
>
> def ARGBtoRGBA(self,str_buf):
> # cairo's ARGB is interpreted by pygame as BGRA due to
> # then endian-format difference this routine swaps B and R
> # (0th and 2nd) byte converting it to RGBA format.
> byte_buf = array.array("B", str_buf)
> num_quads = len(byte_buf)/4
> for i in xrange(num_quads):
> tmp = byte_buf[i*4 + 0]
> byte_buf[i*4 + 0] = byte_buf[i*4 + 2]
> byte_buf[i*4 + 2] = tmp
> return byte_buf.tostring()
--
Bill Spitzak, Senior Software Engineer
The Foundry, 618 Hampton Drive, Venice, CA, 90291, USA
Tel: +1 310 399-4555 * Fax: +1 310 450-4516 * Web: www.thefoundry.co.uk
The Foundry Visionmongers Ltd * Registered in England and Wales No: 4642027
More information about the cairo
mailing list