[cairo] cairo+DevIL ?

John Ellson john.ellson at comcast.net
Thu Aug 23 08:42:34 PDT 2007


Vladimir Vukicevic wrote:
> John Ellson wrote:
>> In a January 2007 posting
>>     
>> <http://lists.cairographics.org/archives/cairo/2007-January/009198.html>
>> Vlad suggested that DevIL
>>     <http://openil.sourceforge.net/>
>> would make a good backend for rendering other bitmap formats (gif, 
>> jpeg, tga, ...) from cairo.
>>
>> Is this still the best-practice recommendation?   Is there any sample 
>> code out there?
>>
>> I've made an initial attempt to bind the two together.  The problem 
>> I'm having at the moment
>> is that the in-memory data formats seem to be incompatible:
>>     CAIRO_FORMAT_ARGB32   v.  IL_RGBA
>>
>> Do I really have to byte-twiddle the image data just to transfer 
>> between these two fine libraries?
>
> I'm not sure if there is a single best-practice recommendation; I've 
> certainly had good experience using DevIL in the past, though I have 
> never used it with cairo.  It's interesting that DevIL only provides 
> IL_RGBA and IL_BGRA; the documentation annoyingly states that these 
> formats are "self explanatory", which they are not.  Maybe IL_BGRA 
> happens to be compatible, if they're talking about byte order?
>
>     - Vlad
>

Just a followup on this topic.   In graphviz I've now built three new 
backends for cairo.
My immediate needs are for GIF and JPG.

    DevIL        + supports JPG
                 - no support for GIF output
                 + can use cairo's image data allocation without memory 
free problems
                 + IL_BGRA matches CAIRO_FORMAT_ARGB32
                 - Y ordering is inverted requiring an in-place 
byte-flipping pass over the data
                    (can't invert Y in cairo because pango doesn't 
support this for text)
                 - output to FILE* using ilSaveF() truncates output files
                    (this bug has been reported via Fedora bugzilla, a 
fix has been
                    reported and should be available soon)

    gdk-pixbuf:  + supports JPG
                 - no support for GIF output
                 + can use cairo's image data allocation without memory 
free problems
                 - byte ordering is ABGR, requiring an in-place 
byte-flipping pass over the data
                 + Y ordering matches
                 ++ accepts user-supplier file io functions


     gd:         + supports JPG
                 + supports GIF
                 - will internally free the image data when generating 
paletted images,
                    so cairo's data has to be copied
                 - ARGB byte ordering matches, but alpha channel is 
transparency 0..127,
                    rather than opaqueness 0..255 used in cairo.
                 + Y ordering matches
                 + output to FILE* works

So currently graphviz's preferred plugins are: gdk-pixbuf for JPG, and 
gd for GIF.

It would be nice to have a set of bitmap file formatter backends that 
efficiently accept a cairo ARGB surface. I think gdk-pixbuf is where 
this belongs.  One of the projects should bite-the-bullet and support 
the other's byte ordering.

If anyone wants to see my hacks, they are in the sources of the latest 
graphviz development snapshots from http://www.graphviz.org/ in:
    plugin/devil/gvformatter_devil.c
    plugin/gdk_pixbuf/gvformatter_gdk_pixbuf.c
    plugin/gd/gvformatter_gd.c

John
         
            


More information about the cairo mailing list