[Gtk2] About bug 11523: analysis and proper fix(es)

Mattias Gaertner nc-gaertnma at netcologne.de
Sun Jul 13 10:06:34 CEST 2008


On Sat, 12 Jul 2008 12:37:17 -0300
Luiz Americo Pereira Camara <luizmed at oi.com.br> wrote:

> The problem occurs because each device context instance has a text
> cache while the layout is shared between all device contexts that
> have the same font.
> 
> In TextOutCacheGtk2.zip there's a project that helps to show the
> problem.
> 
> Considering that "Single Line" option is set:
> Str1 is draw to Bitmap1.Canvas:
>  - The text cache of Bitmap1.Canvas is empty and is set to Str1 data
>  - Str1 is set as the layout text
> Str2 is draw to Bitmap2.Canvas:
>  - The text cache of Bitmap2.Canvas is empty and is set to Str2 data
>  - Str2 is set as the layout text
> Str1 is draw (again) to Bitmap1.Canvas:
>  - The text cache of Bitmap1.Canvas has Str1 data so it does not set
> the layout text
>  - The layout still have Str2 as the text...
> 
> I can't explain what's going on when "Single Line" option is not
> set...
> 
> The fix is simple, instead of caching the text data at each time the 
> layout text is set, retrieve the text directly from the layout using 
> pango_layout_get_text (unlike the *set_text function this is pretty 
> cheap since it just returns a pointer of the stored text). With this 
> approach i have two wons: no data copy/duplication and avoid the out
> of sync between cache and layout texts.
> 
> I implemented  in three ways (see the patches):
> 
> 1) Stores the OldFont (Pangolayout) and compare the Old/New strings 
> using strcomp*
> 
> Than i noticed that is not necessary to store the old font and comes 
> with the 2nd implementation. There's also no more need to be a method
> of TGtk2DeviceContext.
> 
> 2) Just compare the two strings using StrComp*

That's better.

 
> * Is better to use StrLComp instead of StrComp
> 
> But i lost the shortcut evaluation of length that prevents a string 
> comparation. So...
> 
> 3) Stores the old length in the layout object using a gquark* and 
> compare both strings with comparebytes (i know that both strings are
> the same size)
> 
> ** The old length can be also stored in a field of font GdiObject

Have you compared times?
I guess option 3 will be even slower for normal texts.

Mattias



More information about the Gtk2 mailing list