[cairo] [PATCH] Use the new pixman_glyph_cache_t API that will be in pixman 0.28.0

Behdad Esfahbod behdad at behdad.org
Wed May 30 18:36:50 PDT 2012


On 05/30/2012 08:30 PM, Søren Sandmann wrote:
> From: Søren Sandmann Pedersen <ssp at redhat.com>
> 
> This new pixman API allows glyphs to be cached and composited in one
> go, which reduces overhead compared to individual calls to
> pixman_image_composite_region32().

Nice.  Let me take a look.  In the mean time, comments below.


> Notes:
> 
> - There is an explicit call to _cairo_image_scaled_glyph_fini(). This
>   could instead be done with a private, but I chose not to do that
>   since we don't need to store any actual data; we only need
>   notification when the glyph dies.
> 
> - The mask format used with pixman_composite_glyphs() is that of the
>   first glyph. This makes the implicit assumption that all the glyphs
>   in the font have the same format, which I believe is true.

Keith thought so too.  Wrong.  See:

commit 805b668260c47e6d3d854361fcc53f12bd2a57e1
commit 83963d2a9ec445e23cfbe692b877177a9d9d135e
commit 83963d2a9ec445e23cfbe692b877177a9d9d135e
https://bugs.freedesktop.org/show_bug.cgi?id=13479


>   Note that while the current code _looks_ like it will support both
>   a8 and a8r8g8b8 glyphs within the same font, that is not actually
>   the case since if the mask gets upgraded, adding a8 glyphs will
>   produce the wrong result since the RGB channels are considered 0 in
>   this format and so they will be drawn empty.

Again, wrong.  I fixed and tested this.  See:

22d7f311f7733a57ece5d91708b2b5da9b71de86

The trick is:

        status = _cairo_surface_composite (CAIRO_OPERATOR_ADD,
+                                          &white_pattern.base,
                                           &glyph_pattern.base,
-                                          NULL,
                                           mask,

ie. use the glyph raster as mask, not source.


behdad


More information about the cairo mailing list