Remove ABI-breaking field in public PS_InfoFontRec definition.
    Instead, we define a new internal PS_FontExtraRec structure to
    hold the additionnal field, then place it in various internal
    positions of the corresponding FT_Face derived objects.
diff --git a/ChangeLog b/ChangeLog
index c4efb2e..b14357b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+2009-03-03  David Turner  <david@freetype.org>
+
+	Remove ABI-breaking field in public PS_InfoFontRec definition.
+	Instead, we define a new internal PS_FontExtraRec structure to
+	hold the additionnal field, then place it in various internal
+	positions of the corresponding FT_Face derived objects.
+	
+	* include/freetype/t1tables.h (PS_FontInfoRec): Remove the
+	`fs_type' field from the public structure.
+
+	* include/freetype/internal/psaux.h (T1_FieldLocation),
+	include/freetype/internal/t1types.h (T1_FontRec, CID_FaceRec),
+	src/type1/t1load.c, src/type1/t1tokens.h,
+	src/cid/cidload.c, src/cid/cidtoken.h,
+	src/type42/t42parse.c: modify the various font parsers to store
+	the `fs_type' field in a different places, instead of the public
+	PS_FontInfoRec.
+
+	* include/freetype/internal/services/svpsinfo.h (PsInfo service),
+	src/base/ftfstype.c (FT_Get_FSType_Flags), src/cff/cffdrivr.c,
+	src/cid/cidriver.c, src/type1/t1driver.c, src/type42/t42drivr.c:
+	Modify the PsInfo service to add a GetExtra function, use it in
+	FT_Get_FSType_Flags() and modify the drivers accordingly.
+
 2009-03-02  Alexey Kryukov  <anagnost@yandex.ru>
 
 	Fix handling of EBDT formats 8 and 9.
diff --git a/include/freetype/internal/psaux.h b/include/freetype/internal/psaux.h
index 832d63d..7fb4c99 100644
--- a/include/freetype/internal/psaux.h
+++ b/include/freetype/internal/psaux.h
@@ -197,6 +197,7 @@
   {
     T1_FIELD_LOCATION_CID_INFO,
     T1_FIELD_LOCATION_FONT_DICT,
+    T1_FIELD_LOCATION_FONT_EXTRA,
     T1_FIELD_LOCATION_FONT_INFO,
     T1_FIELD_LOCATION_PRIVATE,
     T1_FIELD_LOCATION_BBOX,
diff --git a/include/freetype/internal/services/svpsinfo.h b/include/freetype/internal/services/svpsinfo.h
index 63f5db9..8217769 100644
--- a/include/freetype/internal/services/svpsinfo.h
+++ b/include/freetype/internal/services/svpsinfo.h
@@ -33,6 +33,10 @@
   (*PS_GetFontInfoFunc)( FT_Face          face,
                          PS_FontInfoRec*  afont_info );
 
+  typedef FT_Error
+  (*PS_GetFontExtraFunc)( FT_Face           face,
+                          PS_FontExtraRec*  afont_extra );
+
   typedef FT_Int
   (*PS_HasGlyphNamesFunc)( FT_Face   face );
 
@@ -44,6 +48,7 @@
   FT_DEFINE_SERVICE( PsInfo )
   {
     PS_GetFontInfoFunc     ps_get_font_info;
+    PS_GetFontExtraFunc    ps_get_font_extra;
     PS_HasGlyphNamesFunc   ps_has_glyph_names;
     PS_GetFontPrivateFunc  ps_get_font_private;
   };
diff --git a/include/freetype/internal/t1types.h b/include/freetype/internal/t1types.h
index 4b05fa3..fdf766d 100644
--- a/include/freetype/internal/t1types.h
+++ b/include/freetype/internal/t1types.h
@@ -87,9 +87,21 @@
   } T1_EncodingType;
 
 
+  /* used to hold extra data of PS_FontInfoRec that
+   * cannot be stored in the publicly defined structure.
+   *
+   * Note these can't be blended with multiple-masters.
+   */
+  typedef struct PS_FontExtraRec_
+  {
+    FT_UShort   fs_type;
+
+  } PS_FontExtraRec;
+
   typedef struct  T1_FontRec_
   {
     PS_FontInfoRec   font_info;         /* font info dictionary */
+    PS_FontExtraRec  font_extra;        /* font info extra fields */
     PS_PrivateRec    private_dict;      /* private dictionary   */
     FT_String*       font_name;         /* top-level dictionary */
 
@@ -231,6 +243,7 @@
     void*            psnames;
     void*            psaux;
     CID_FaceInfoRec  cid;
+    PS_FontExtraRec  font_extra;
 #if 0
     void*            afm_data;
 #endif
diff --git a/include/freetype/t1tables.h b/include/freetype/t1tables.h
index 12832e7..5e2a393 100644
--- a/include/freetype/t1tables.h
+++ b/include/freetype/t1tables.h
@@ -78,10 +78,6 @@
     FT_Short    underline_position;
     FT_UShort   underline_thickness;
 
-    /* since 2.3.8 */
-
-    FT_UShort   fs_type;
-
   } PS_FontInfoRec;
 
 
diff --git a/src/base/ftfstype.c b/src/base/ftfstype.c
index 0d4e533..7060ac9 100644
--- a/src/base/ftfstype.c
+++ b/src/base/ftfstype.c
@@ -18,6 +18,8 @@
 #include <ft2build.h>
 #include FT_TYPE1_TABLES_H
 #include FT_TRUETYPE_TABLES_H
+#include FT_INTERNAL_SERVICE_H
+#include FT_SERVICE_POSTSCRIPT_INFO_H
 
 
   /* documentation is in freetype.h */
@@ -25,16 +27,31 @@
   FT_EXPORT_DEF( FT_UShort )
   FT_Get_FSType_Flags( FT_Face  face )
   {
-    PS_FontInfoRec  font_info;
-    TT_OS2*         os2;
+    TT_OS2*  os2;
 
 
+    /* first, try to get the fs_type directly from the font */
+    if ( face )
+    {
+      FT_Service_PsInfo  service = NULL;
+
+
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_extra )
+      {
+        PS_FontExtraRec  extra;
+
+        if ( !service->ps_get_font_extra( face, &extra ) &&
+             extra.fs_type != 0 )
+        {
+          return extra.fs_type;
+        }
+      }
+    }
+
     /* look at FSType before fsType for Type42 */
 
-    if ( !FT_Get_PS_Font_Info( face, &font_info ) &&
-         font_info.fs_type != 0                   )
-      return font_info.fs_type;
-
     if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL &&
          os2->version != 0xFFFFU                                           )
       return os2->fsType;
diff --git a/src/cff/cffdrivr.c b/src/cff/cffdrivr.c
index a7f433a..286c0b3 100644
--- a/src/cff/cffdrivr.c
+++ b/src/cff/cffdrivr.c
@@ -380,6 +380,7 @@
   static const FT_Service_PsInfoRec  cff_service_ps_info =
   {
     (PS_GetFontInfoFunc)   cff_ps_get_font_info,
+    (PS_GetFontExtraFunc)  NULL,
     (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,
     (PS_GetFontPrivateFunc)NULL         /* unsupported with CFF fonts */
   };
diff --git a/src/cid/cidload.c b/src/cid/cidload.c
index ec24710..8541d06 100644
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -97,6 +97,10 @@
       object = (FT_Byte*)&cid->font_info;
       break;
 
+    case T1_FIELD_LOCATION_FONT_EXTRA:
+      object = (FT_Byte*)&face->font_extra;
+      break;
+
     case T1_FIELD_LOCATION_BBOX:
       object = (FT_Byte*)&cid->font_bbox;
       break;
diff --git a/src/cid/cidriver.c b/src/cid/cidriver.c
index 85ee6cf..42bd298 100644
--- a/src/cid/cidriver.c
+++ b/src/cid/cidriver.c
@@ -77,10 +77,18 @@
     return 0;
   }
 
+  static FT_Error
+  cid_ps_get_font_extra( FT_Face          face,
+                        PS_FontExtraRec*  afont_extra )
+  {
+    *afont_extra = ((CID_Face)face)->font_extra;
+    return 0;
+  }
 
   static const FT_Service_PsInfoRec  cid_service_ps_info =
   {
     (PS_GetFontInfoFunc)   cid_ps_get_font_info,
+    (PS_GetFontExtraFunc)  cid_ps_get_font_extra,
     (PS_HasGlyphNamesFunc) NULL,        /* unsupported with CID fonts */
     (PS_GetFontPrivateFunc)NULL         /* unsupported                */
   };
diff --git a/src/cid/cidtoken.h b/src/cid/cidtoken.h
index 0795f05..f734322 100644
--- a/src/cid/cidtoken.h
+++ b/src/cid/cidtoken.h
@@ -48,6 +48,12 @@
   T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,      0 )
   T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,  0 )
   T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness, 0 )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontExtraRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
+
   T1_FIELD_NUM   ( "FSType",             fs_type,             0 )
 
 
diff --git a/src/type1/t1driver.c b/src/type1/t1driver.c
index 42302e5..c22d8df 100644
--- a/src/type1/t1driver.c
+++ b/src/type1/t1driver.c
@@ -138,6 +138,13 @@
     return 0;
   }
 
+  static FT_Error
+  t1_ps_get_font_extra( FT_Face           face,
+                        PS_FontExtraRec*  afont_extra )
+  {
+    *afont_extra = ((T1_Face)face)->type1.font_extra;
+    return 0;
+  }
 
   static FT_Int
   t1_ps_has_glyph_names( FT_Face  face )
@@ -159,6 +166,7 @@
   static const FT_Service_PsInfoRec  t1_service_ps_info =
   {
     (PS_GetFontInfoFunc)   t1_ps_get_font_info,
+    (PS_GetFontExtraFunc)  t1_ps_get_font_extra,
     (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,
     (PS_GetFontPrivateFunc)t1_ps_get_font_private,
   };
diff --git a/src/type1/t1load.c b/src/type1/t1load.c
index 3afbeb8..50a0b2d 100644
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -948,6 +948,12 @@
       }
       break;
 
+    case T1_FIELD_LOCATION_FONT_EXTRA:
+      dummy_object = &face->type1.font_extra;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+
     case T1_FIELD_LOCATION_PRIVATE:
       dummy_object = &face->type1.private_dict;
       objects      = &dummy_object;
diff --git a/src/type1/t1tokens.h b/src/type1/t1tokens.h
index db08e04..bfbd0ef 100644
--- a/src/type1/t1tokens.h
+++ b/src/type1/t1tokens.h
@@ -41,6 +41,12 @@
                    T1_FIELD_DICT_FONTDICT )
   T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness,
                    T1_FIELD_DICT_FONTDICT )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontExtraRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
+
   T1_FIELD_NUM   ( "FSType", fs_type,
                    T1_FIELD_DICT_FONTDICT )
 
diff --git a/src/type42/t42drivr.c b/src/type42/t42drivr.c
index a6e4cf4..92b40e1 100644
--- a/src/type42/t42drivr.c
+++ b/src/type42/t42drivr.c
@@ -127,6 +127,13 @@
     return T42_Err_Ok;
   }
 
+  static FT_Error
+  t42_ps_get_font_extra( FT_Face           face,
+                         PS_FontExtraRec*  afont_extra )
+  {
+    *afont_extra = ((T42_Face)face)->type1.font_extra;
+    return T42_Err_Ok;
+  }
 
   static FT_Int
   t42_ps_has_glyph_names( FT_Face  face )
@@ -148,6 +155,7 @@
   static const FT_Service_PsInfoRec  t42_service_ps_info =
   {
     (PS_GetFontInfoFunc)   t42_ps_get_font_info,
+    (PS_GetFontExtraFunc)   t42_ps_get_font_extra,
     (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names,
     (PS_GetFontPrivateFunc)t42_ps_get_font_private
   };
diff --git a/src/type42/t42parse.c b/src/type42/t42parse.c
index b5e257d..88d7a44 100644
--- a/src/type42/t42parse.c
+++ b/src/type42/t42parse.c
@@ -68,6 +68,12 @@
     T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,      0 )
     T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,  0 )
     T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness, 0 )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontExtraRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
+
     T1_FIELD_NUM   ( "FSType",             fs_type,             0 )
 
 #undef  FT_STRUCTURE