Commit 2ce9203735802a8831f36731310e02fe0f863d98

David Turner 2006-03-23T20:58:20

- added FT_Get_SubGlyph_Info API to freetype.h - small fix to lsb/rsb delta computations - cleaning up Jamfile

diff --git a/ChangeLog b/ChangeLog
index 43b3856..7d616e0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2006-03-23  David Turner <david@freetype.org>
+
+	* include/freetype/freetype.h, include/freetype/internal/ftgloadr.h,
+        src/base/ftobjs.c: adding FT_Get_SubGlyph_Info API to retrieve subglyph
+        data. Note that we do not expose FT_SubGlyphRec here !
+
+	* src/autofit/afloader.c: compute lsb_delta and rsb_delta correctly
+        in edge cases
+
 2006-03-22  Werner Lemberg  <wl@gnu.org>
 
 	* src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup)
diff --git a/Jamfile b/Jamfile
index 48cfd19..e99d4cf 100644
--- a/Jamfile
+++ b/Jamfile
@@ -76,10 +76,8 @@ FT2_COMPONENTS ?= autofit    # auto-fitter
                   cache      # cache sub-system
                   cff        # CFF/CEF font driver
                   cid        # PostScript CID-keyed font driver
-                  #gxvalid    # validation of TrueTypeGX/AAT tables
                   gzip       # support for gzip-compressed files
                   lzw        # support for LZW-compressed files
-                  #otvalid    # validation of OpenType tables
                   pcf        # PCF font driver
                   pfr        # PFR/TrueDoc font driver
                   psaux      # common PostScript routines module
@@ -127,6 +125,7 @@ if $(DEBUG_HINTER)
 #
 HDRS += $(FT2_INCLUDE) ;
 
+
 # We need to #define FT2_BUILD_LIBRARY so that our sources find the
 # internal headers
 #
diff --git a/devel/ftoption.h b/devel/ftoption.h
index da3559a..d326089 100644
--- a/devel/ftoption.h
+++ b/devel/ftoption.h
@@ -436,7 +436,7 @@ FT_BEGIN_HEADER
   /*   Do not #undef this macro here, since the build system might         */
   /*   define it for certain configurations only.                          */
   /*                                                                       */
-#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#define xxTT_CONFIG_OPTION_BYTECODE_INTERPRETER
 
 
   /*************************************************************************/
diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h
index 3bde8a8..488bc54 100644
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -3222,6 +3222,64 @@ FT_BEGIN_HEADER
   FT_Vector_Transform( FT_Vector*        vec,
                        const FT_Matrix*  matrix );
 
+ /**
+  * @macro: FT_SUBGLYPH_FLAG_XXX
+  *
+  * @description:
+  *   a list of constant used to describe each subglyph
+  *
+  * @values:
+  *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
+  *   FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::
+  *   FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::
+  *   FT_SUBGLYPH_FLAG_SCALE ::
+  *   FT_SUBGLYPH_FLAG_XY_SCALE ::
+  *   FT_SUBGLYPH_FLAG_2X2 ::
+  *   FT_SUBGLYPH_FLAG_USE_MY_METRICS ::
+  */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
+#define FT_SUBGLYPH_FLAG_SCALE                   8
+#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
+#define FT_SUBGLYPH_FLAG_2X2                  0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
+
+ /**
+  * @func: FT_Get_SubGlyph_Info
+  *
+  * @description:
+  *   a function used to retrieve a description of a given subglyph.
+  *   only use it when 'glyph->format' is FT_GLYPH_FORMAT_COMPOSITE, or
+  *   an error will be returned
+  *
+  * @input:
+  *   glyph     :: source glyph slot
+  *   sub_index :: index of subglyph. must be less than 'glyph->num_subglyphs'
+  *
+  * @output:
+  *   p_index     :: subglyph glyph index
+  *   p_flags     :: subglyph flags, see @FT_SUBGLYPH_FLAG_XXX
+  *   p_arg1      :: subglyph first argument  (if any)
+  *   p_arg2      :: subglyph second argument (if any)
+  *   p_transform :: subglyph transform (if any)
+  *
+  * @return:
+  *   error code. 0 means success
+  *
+  * @note:
+  *   the values of *p_arg1, *p_arg2 and *p_transform must be interpreted
+  *   depending on the flags returns in *p_flags. See the TrueType specification
+  *   for details
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
+                        FT_UInt       sub_index,
+						FT_Int       *p_index,
+						FT_UInt      *p_flags,
+						FT_Int       *p_arg1,
+						FT_Int       *p_arg2,
+						FT_Matrix    *p_transform );
 
   /* */
 
diff --git a/include/freetype/internal/ftgloadr.h b/include/freetype/internal/ftgloadr.h
index 2aaff0d..1b83c68 100644
--- a/include/freetype/internal/ftgloadr.h
+++ b/include/freetype/internal/ftgloadr.h
@@ -43,6 +43,7 @@ FT_BEGIN_HEADER
   typedef struct FT_GlyphLoaderRec_*  FT_GlyphLoader ;
 
 
+#if 0  /* now in freetype.h since 2.2 */
 #define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
 #define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
 #define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
@@ -50,7 +51,7 @@ FT_BEGIN_HEADER
 #define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
 #define FT_SUBGLYPH_FLAG_2X2                  0x80
 #define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
-
+#endif
 
   typedef struct  FT_SubGlyphRec_
   {
diff --git a/src/autofit/afloader.c b/src/autofit/afloader.c
index 98a4a39..7f110ab 100644
--- a/src/autofit/afloader.c
+++ b/src/autofit/afloader.c
@@ -224,8 +224,14 @@
         else
 #endif /* !AF_USE_WARPER */
         {
+          FT_Pos   pp1x = loader->pp1.x;
+          FT_Pos   pp2x = loader->pp2.x;
+
           loader->pp1.x = FT_PIX_ROUND( loader->pp1.x );
           loader->pp2.x = FT_PIX_ROUND( loader->pp2.x );
+
+          slot->lsb_delta = loader->pp1.x - pp1x;
+          slot->rsb_delta = loader->pp2.x - pp2x;
         }
       }
 
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 821571a..5ebfdf5 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -3861,4 +3861,33 @@
 
 #endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
 
+  
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
+                        FT_UInt       sub_index,
+						FT_Int       *p_index,
+						FT_UInt      *p_flags,
+						FT_Int       *p_arg1,
+						FT_Int       *p_arg2,
+						FT_Matrix    *p_transform )
+  {
+	FT_Error  error = FT_Err_Invalid_Argument;
+	  
+	if ( glyph != NULL                              && 
+		 glyph->format == FT_GLYPH_FORMAT_COMPOSITE &&
+		 sub_index < glyph->num_subglyphs           )
+	{
+      FT_SubGlyph  subg = glyph->subglyphs + sub_index;
+		
+	  *p_index     = subg->index;
+	  *p_flags     = subg->flags;
+	  *p_arg1      = subg->arg1;
+	  *p_arg2      = subg->arg2;
+	  *p_transform = subg->transform;
+	}
+	return error;
+  }
+
+  
+  
 /* END */