To: discussions about usage and development of dia <dia-list gnome org>
Subject: Re: auto-scaling text dia .94
Date: Tue, 26 Oct 2004 11:32:55 +0200
On Tue, 26 Oct 2004 00:21:08 +0200 (MEST), Robert Ögren <gtk roboros com> wrote:
>
> I can always reproduce the problem by following these steps:
>
> 1. Start dia
> 2. Create a new diagram
> 3. Zoom in to 200 %
> 4. Add a flowchart symbol, for example a process (box)
> 5. Add the following two letters: ad
>
> When I type the first letter in step 5, the a is shown in the correct
> size. When I then type d, the text is shrunk to half the size. Adding some
> other letters then makes the text normal size again. The choice of letters
> is important and also depends on the zoom level, for example at 400 % zoom
> I have to type adf for the problem to appear.
>
> As far as I can see from my very limited knowledge of the dia sources and
> some gdb:ing, the problem seems to be with the layout cache used by
> dia_font_build_layout. The cache only stores a reference to the font
> object used to create the layout, but it may be modified by subsequent
> calls to dia_font_build_layout with different heights so that font->pfd
> no longer matches the cached layout.
>
> Example, end of dia_font_build_layout (string=0x14630c8 "ad",
> font=0x13ea240, height=1.6000000000000001), font.c:
> (gdb) n
> 638 return cached->layout;
> (gdb) p *cached->font->pfd
> $52 = {family_name = 0x14f28c0 "sans", style = PANGO_STYLE_NORMAL,
> variant = PANGO_VARIANT_NORMAL, weight = PANGO_WEIGHT_NORMAL,
> stretch = PANGO_STRETCH_NORMAL, mask = 43, static_family = 0, size =
> 22937}
> (gdb) p *((PangoAttrFontDesc
> *)cached->layout->attrs->attributes->data)->desc
> $53 = {family_name = 0x14f0658 "sans", style = PANGO_STYLE_NORMAL,
> variant = PANGO_VARIANT_NORMAL, weight = PANGO_WEIGHT_NORMAL,
> stretch = PANGO_STRETCH_NORMAL, mask = 43, static_family = 0, size =
> 11468}
> (gdb)
>
> A solution which appears to work in a brief test is to replace the
> dia_font_ref call in dia_font_build_layout by
> item->font = dia_font_copy(font);
>
> but I don't know if this is the right way to do it or not.
> Reverting to rev 1.122 of lib/font.c also seems to make this problem go
> away, but probably unfixes other bugs.
I believe it introduces a major memory leak. If we can combine the
dia_font_copy above with proper deallocation, we may have a fix. The
test for memory leak should include having a huge diagram, zooming it
way out, and then making it redraw repeatedly (bug from 0.93).
I miss garbage collection.
OTOH, newer Pango versions have a way of forcing the width of the
text, which would eliminate the entire tweaking thing. Would be good
to look at.
> Btw, thanks for a great program!
You're welcome!
-Lars