[cairo] Re: cairo-win32 falls over when asked for the path of a glyph from a bitmap font

Behdad Esfahbod behdad at behdad.org
Mon Apr 9 10:21:10 PDT 2007


On Mon, 2007-04-09 at 08:42 -0400, Owen Taylor wrote:
> On Thu, 2007-04-05 at 15:00 -0400, Behdad Esfahbod wrote:
> > On Thu, 2007-04-05 at 13:29 -0400, Carl Worth wrote:
> > > 
> > > I'm baffled. How has cairo-win32 font stuff ever appeared to work in
> > > the past? 
> > 
> > That's the question I asked before too.  The current show_glyphs in
> > cairo-win32-font.c seems to just work with win32 surfaces.  I have no
> > idea how it can draw to an image surface. 
> 
> Because the relevant code _cairo_win32_scaled_font_show_glyphs() has:
> 
>      if (_cairo_surface_is_win32 (generic_surface) &&
>         surface->format == CAIRO_FORMAT_RGB24 &&
>         op == CAIRO_OPERATOR_OVER &&
>         _cairo_pattern_is_opaque_solid (pattern)) {
>         [...]
>      } else {
> 
>     } else {
>         /* Otherwise, we need to draw using software fallbacks. We create a mask
>          * surface by drawing the the glyphs onto a DIB, black-on-white then
>          * inverting. GDI outputs gamma-corrected images so inverted black-on-white
>          * is very different from white-on-black. We favor the more common
>          * case where the final output is dark-on-light.
>          */
>         cairo_win32_surface_t *t
>         [...]
>    }
> 
> ? Rendering by creating individual glyphs from surfaces and caching them
> would not smart thing to do for win32; the operating system already has code
> to cache glyphs. So, at that point when glyph_init() was added to cairo,
> the contract was that if backend implemented show_glyphs() then it didn't need 
> to implement that part of glyph_init(). Apparently that's changed... 
> 
> Obviously that part of glyph_init() could be implemented, but I don't think
> it's the right way to go for normal rendering to a surface.

Thanks.  This all makes a lot of sense.  So, one way to go forward is to
make win32_font_show_glyphs set surface for the glyph if asked for a
path, so higher level can extract a path from the bitmap then.

behdad


> >  I still think clearing
> > cairo-win32-font.c of cairo-win32-surface stuff is the way to go.  A
> > font backend's show_glyphs should work for any surface.  If it's
> > win32-surface-specific, it should go into cairo-win32-surface.c, and
> > there is one there already...
> 
> And I still want to see _cairo_win32_surface_show_glyphs() deleted. It
> makes the code more confusing and causes code duplication. There are no
> optimizations there that couldn't have been done in the existing 
> code path as well... 
> 
> (See the messages around
> http://lists.freedesktop.org/archives/cairo/2006-October/008112.html
> for discussion of the change that was made and I dislike.)
> 
> The reason that there is "win32 surface stuff" in cairo-win32-font.c is
> that win32 fonts can *ONLY* be rendered using ExtTextOutW() to a win32
> device context. This is true whether we are:
> 
>  - Rendering directly to a win32 surface that already exists
>  - Rendering using a temporary DIB to an image surface
>  - Create a glyph image for a bitmap font for tracing to an outline
> 
> And the abstraction we have for a win32 device context, is a 
> win32 surface.
> 
> 					- Owen
> 
> 
-- 
behdad
http://behdad.org/

"Those who would give up Essential Liberty to purchase a little
 Temporary Safety, deserve neither Liberty nor Safety."
        -- Benjamin Franklin, 1759





More information about the cairo mailing list