Hi all ,

 I have been working on porting VCL toDirectFB. The  VCL ported on
GDK-DirectFB uses Pango to do the Layout.
 I needed some pointers analyzing the leaks .The leaks end in the Pango
library .

I am  freeing all Pango related structures in the GetFontMetric function
after the call to pango_context_get_metrics . I fail to understand that how
the ported code is causing leaks in low level fontconfig library.
Is there a way to find what in my code is causing this leak?  Any Pointers /
quick suggestions .

These are the valgrind traces. I see almost the same trace when i open a
document with writer /impress.

=3318== Memcheck, a memory error detector.
--3318-- Command line
--3318--    /opt/openoffice.org2.3/program/soffice.bin
--3318--    -view
--3318--    ~/simple.ppt
--3318-- Startup, with flags:
--3318--    -v
--3318--    --tool=memcheck
--3318--    --leak-check=full
--3318--    --show-reachable=no

=*=3318== 324,124 (104,448 direct, 219,676 indirect) bytes in 408 blocks are
definitely lost in loss record 151 of 154*
==3318==    at 0x400593E: realloc (vg_replace_malloc.c:429)
==3318==    by 0xAB9E13: (within /usr/lib/libfontconfig.so.1.1.0)
==3318==    by 0xABA7E3: (within /usr/lib/libfontconfig.so.1.1.0)
==3318==    by 0xABACDB: (within /usr/lib/libfontconfig.so.1.1.0)
==3318==    by 0xAB7520: FcFontRenderPrepare (in
/usr/lib/libfontconfig.so.1.1.0)
==3318==    by 0x6E78B72: pango_fc_font_map_load_fontset
(pangofc-fontmap.c:1109)
==3318==    by 0x6D72F95: pango_font_map_load_fontset (pango-fontmap.c:107)
==3318==    by 0x6D71A41: *pango_context_get_metrics* (pango-context.c:1619)
==3318==    by 0x690CF20:
*GtkSalGraphics::GetFontMetric**(*ImplFontMetricData*)
(in /opt/openoffice.org2.3/program/libvclplug_gtk680li.so.1.1)
==3318==    by 0x4124E36: OutputDevice::ImplNewFont() const (in
/opt/openoffice.org2.3/program/libvcl680li.so.1.1)
==3318==    by 0x41255BF: OutputDevice::GetTextHeight() const (in
/opt/openoffice.org2.3/program/libvcl680li.so.1.1)
==3318==    by 0x10008587: SvxFont::QuickGetTextSize(OutputDevice const*,
String const&, unsigned short, unsigned short, long*) const (in
/opt/openoffice.org2.3/program/libsvx680li.so.1.1)

The GetFontMetric code snippet :-

void
GtkSalGraphics::GetFontMetric( ImplFontMetricData *pMetric )
{
        PangoContext*                   pcc =
gdk_pango_context_get_for_screen (gdk_screen_get_default ());
        PangoLanguage*                  pl = pango_language_get_default( );
        PangoFontDescription*   pfd =  pango_font_description_new();
        PangoFontMetrics*               pfm;

        pango_font_description_set_family( pfd, ByteString(
mpUseFont->mpFontData->GetFamilyName(),
RTL_TEXTENCODING_UTF8 ).GetBuffer() );
        pango_font_description_set_size( pfd, mpUseFont->mnHeight *
PANGO_SCALE );
       * pfm = pango_context_get_metrics( pcc, pfd, pl );*

        pMetric->mnWidth                       =
pango_font_metrics_get_approximate_char_width( pfm ) / PANGO_SCALE + 5;
        pMetric->mnAscent                     =
pango_font_metrics_get_ascent( pfm ) / PANGO_SCALE ;
        pMetric->mnDescent                   =
pango_font_metrics_get_descent( pfm ) / PANGO_SCALE ;
        pMetric->mnWUnderlineOffset     =
pango_font_metrics_get_underline_position( pfm ) / PANGO_SCALE;
        pMetric->mnStrikeoutOffset         =
pango_font_metrics_get_strikethrough_position( pfm ) / PANGO_SCALE;
        pMetric->mnIntLeading               = 0;
        pMetric->mnExtLeading              = 0;
       pMetric->mbScalableFont = true;

pango_font_description_free(pfd);
*pango_font_metrics_unref( pfm ); /*/ *Freed the context metrics *
g_object_unref( pcc );

}

Regards,
Monali.

Reply via email to