[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