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 <t...@iki.fi> wrote:

> From: Tor Lillqvist <t...@iki.fi>
> Subject: Re: PangoF2 in win32 not applying GSUB.
> To: "Ravi Kiran." <kira...@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
> 


      
_______________________________________________
gtk-i18n-list mailing list
gtk-i18n-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-i18n-list

Reply via email to