Re: PangoF2 in win32 not applying GSUB - Fixed.
- From: "Ravi Kiran." <kiranps yahoo com>
- To: Tor Lillqvist <tml iki fi>
- Cc: gtk-i18n-list gnome org
- Subject: Re: PangoF2 in win32 not applying GSUB - Fixed.
- Date: Mon, 1 Mar 2010 21:17:02 -0800 (PST)
Thanks Tml,
This fixed the issue for me, now the GSUBs are working properly in win32.
I just commented out the portion in pango_ot_info_get() in
pango-1.26.2\pango\pango-ot-info.c.
PangoOTInfo *
pango_ot_info_get (FT_Face face)
{
PangoOTInfo *info;
if (G_LIKELY (face->generic.data && face->generic.finalizer == pango_ot_info_finalizer))
return face->generic.data;
else
{
if (face->generic.finalizer)
face->generic.finalizer (face->generic.data);
info = face->generic.data = g_object_new (PANGO_TYPE_OT_INFO, NULL);
face->generic.finalizer = pango_ot_info_finalizer;
info->face = face;
/*
if (face->stream->base != NULL) {
hb_blob_t *blob;
blob = hb_blob_create ((const char *) face->stream->base,
(unsigned int) face->stream->size,
HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE,
NULL, NULL);
info->hb_face = hb_face_create_for_data (blob, face->face_index);
hb_blob_destroy (blob);
} else
*/
{
info->hb_face = hb_face_create_for_tables (_get_table, NULL, info);
}
hb_face_set_unicode_funcs (info->hb_face, hb_glib_get_unicode_funcs ());
/* XXX this is such a waste if not SFNT */
if (!hb_ot_layout_has_font_glyph_classes (info->hb_face))
synthesize_class_def (info);
}
return info;
}
Warm Regds,
Ravi Kiran.
--- On Mon, 3/1/10, Tor Lillqvist <tml iki fi> wrote:
> From: Tor Lillqvist <tml iki fi>
> Subject: Re: PangoF2 in win32 not applying GSUB.
> To: "Ravi Kiran." <kiranps yahoo com>
> Cc: gtk-i18n-list gnome org
> Date: Monday, March 1, 2010, 10:41 AM
> I think I found the cause to the
> problem. Pango assumes that the
> FT_StreamRec::base field, if non-zero, points to the whole
> font file
> read or mapped into memory. See pango_ot_info_get(). As
> such this is
> correct according to FreeType documentation, as said in
> ftsystem.h,
> "base :: For memory-based streams, this is the address of
> the first
> stream byte in memory. This field should always be
> set to NULL for
> disk-based streams."
>
> Now, for some reason the base field is not set to NULL on
> Windows when
> pango_ot_info_get() gets called, even if the FT stream is
> not
> memory-based. (FreeType doesn't contain code to map fonts
> into memory
> on Windows, even if the API as such is almost as easy to
> use as mmap()
> &co.)
>
> Freetype, a bit dangerously, uses the FT_StreamRec::base
> field
> internally while reading stuff from the font file, setting
> it in
> FT_Stream_EnterFrame() and resetting it to NULL in
> FT_Stream_ExitFrame(). Before pango_ot_info_get() gets
> called,
> FT_Stream_EnterFrame() has been called but the
> corresponding call to
> FT_Stream_ExitFrame() doesn't seem to have happened yet.
>
> Whether this is a bug in FreeType, a Windows- or
> MinGW-specific
> problem, or whether Pango uses FreeType in some
> wrong/undefined way,
> no idea.
>
> So face->stream->base is non-NULL and Pango thinks it
> is a
> memory-based stream even if base points to some random
> buffer with
> just a part of the font file.
>
> A quick fix is to make the code in pango_ot_info_get()
> always use the
> "else" branch on Windows, and then indeed for instance in
> GIMP's text
> tool Arabic shaping works again, and hopefully also your
> Telugu
> problem is solved. At least the result looks different.
>
> I now notice that FreeType 2.3.12 has been released, but it
> doesn't
> seem to work any differently.
>
> --tml
>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]