shithub: freetype+ttf2subf

Download patch

ref: f6c120f8267ac44e2b8a022e28bbf297b9f310b7
parent: 7fa30ee8793030afc912d84fdf8df9a843498e02
author: Werner Lemberg <[email protected]>
date: Mon Jun 11 00:55:58 EDT 2007

* docs/CHANGES: Document FT_Face_CheckTrueTypePatents).

Formatting, reformulations.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,16 +1,34 @@
+2007-06-11  Werner Lemberg  <[email protected]>
+
+	* docs/CHANGES: Document FT_Face_CheckTrueTypePatents).
+
 2007-06-10  David Turner  <[email protected]>
 
-	* src/truetype/ttgload.c: slight speed-up to the TrueType glyph loader
+	* src/truetype/ttgload.c (TT_Load_Simple_Glyph): Slight speed-up to
+	the TrueType glyph loader.
 
-	* include/freetype/config/ftoption.h: clarify documentation regarding
-	unpatented hinting
+	* include/freetype/config/ftoption.h: Clarify documentation
+	regarding unpatented hinting.
 
-	* include/freetype/freetype.h, src/base/ftpatent.c, src/truetype/ttdriver.c,
-	include/freetype/internal/services/svttglyf.h, modules.cfg,:
-	include/freetype/internal/ftserv.h,:
-	Fonts without a cmap must be handled correctly by FreeType (anything
-	Adding the FT_Face_CheckTrueTypePatents API to FT_FREETYPE_H, it is
-	implemented by the optional src/base/ftpatent.c
+
+	Add new `FT_Face_CheckTrueTypePatents' API.
+
+	* include/freetype/freetype.h (FT_Face_CheckTrueTypePatents): New
+	declaration.
+
+	* include/freetype/internal/services/svttglyf.h,
+	src/base/ftpatent.c: New files.
+
+	* include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_GLYF_H):
+	New macro.
+
+	* src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_GLYF_H and
+	`ttpload.h'.
+	(tt_service_truetype_glyf): New service structure.
+	(tt_services): Register it.
+
+	* modules.cfg (BASE_EXTENSIONS), src/base/Jamfile (_sources): Add
+	`ftpatent.c'.
 
 2007-06-08  Werner Lemberg  <[email protected]>
 
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -28,6 +28,10 @@
       hinting module  as the default instead of the Latin one.  Thanks
       to Rahul Bhalerao for this suggestion.
 
+    - A new API `FT_Face_CheckTrueTypePatents'  has been added to find
+      out  whether  a  given  TrueType  font  uses  patented  bytecode
+      instructions.
+
 
   III. MISCELLANEOUS
 
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -463,26 +463,47 @@
 
   /*************************************************************************/
   /*                                                                       */
-  /* The TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you     */
-  /* have defined TT_CONFIG_OPTION_BYTECODE_INTERPRETER. If not, it will   */
-  /* compile a special work-around TrueType bytecode interpreter that      */
-  /* doesn't implement any of the patented opcodes/algorithms.             */
+  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */
+  /* of the TrueType bytecode interpreter is used that doesn't implement   */
+  /* any of the patented opcodes and algorithms.  Note that the            */
+  /* the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you     */
+  /* define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; with other words,       */
+  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */
+  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */
   /*                                                                       */
-  /* this is only useful for a small number of font files (mostly Asian)   */
-  /* that require bytecode interpretation to properly load glyphs. For all */
-  /* other fonts, this will produce unpleasant results.                    */
+  /* This macro is only useful for a small number of font files (mostly    */
+  /* for Asian scripts) that require bytecode interpretation to properly   */
+  /* load glyphs.  For all other fonts, this produces unpleasant results,  */
+  /* thus the unpatented interpreter is never used to load glyphs from     */
+  /* TrueType fonts unless one of the following two options is used.       */
   /*                                                                       */
-  /* for this reason, the unpatented interpreter is never used by to load  */
-  /* glyphs from TrueType fonts, unless one of the following happens:      */
+  /*   - The unpatented interpreter is explicitly activated by the user    */
+  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */
+  /*     when opening the FT_Face.                                         */
   /*                                                                       */
-  /*   - the unpatented interpreter is explicitely activated by the        */
-  /*     user through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag    */
-  /*     when opening the FT_Face                                          */
-  /*                                                                       */
   /*   - FreeType detects that the FT_Face corresponds to one of the       */
-  /*     'trick' fonts (e.g. Mingliu) it knows about. The font engine      */
+  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */
   /*     contains a hard-coded list of font names and other matching       */
-  /*     parameters.                                                       */
+  /*     parameters (see function `tt_face_init' in file                   */
+  /*     `src/truetype/ttobjs.c').                                         */
+  /*                                                                       */
+  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     FT_Parameter  parameter;                                          */
+  /*     FT_Open_Args  open_args;                                          */
+  /*                                                                       */
+  /*                                                                       */
+  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */
+  /*                                                                       */
+  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */
+  /*     open_args.pathname   = my_font_pathname;                          */
+  /*     open_args.num_params = 1;                                         */
+  /*     open_args.params     = &parameter;                                */
+  /*                                                                       */
+  /*     error = FT_Open_Face( library, &open_args, index, &face );        */
+  /*     ...                                                               */
+  /*   }                                                                   */
   /*                                                                       */
 #define TT_CONFIG_OPTION_UNPATENTED_HINTING
 
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -2738,8 +2738,7 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Retrieve the ASCII name of a given glyph in a face.  This only     */
-  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns      */
-  /*    TRUE.                                                              */
+  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns 1.   */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face        :: A handle to a source face object.                   */
@@ -3375,23 +3374,23 @@
   /*    FT_Face_CheckTrueTypePatents                                       */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Parses the whole content of a TrueType font file and returns       */
-  /*    true if it uses any of the patented opcodes. this is only useful   */
+  /*    Parse all bytecode instructions of a TrueType font file to check   */
+  /*    whether any of the patented opcodes are used.  This is only useful */
   /*    if you want to be able to use the unpatented hinter with           */
   /*    fonts that do *not* use these opcodes.                             */
   /*                                                                       */
-  /*    note that this function parses *all* glyph instructions in the     */
-  /*    font file, and may be *slow*                                       */
+  /*    Note that this function parses *all* glyph instructions in the     */
+  /*    font file, which may be slow.                                      */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    face :: a face handle                                              */
+  /*    face :: A face handle.                                             */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    TRUE if this is a TrueType font that uses one of the patented       */
-  /*    opcodes. FALSE otherwise                                           */
+  /*    1 if this is a TrueType font that uses one of the patented         */
+  /*    opcodes, 0 otherwise.                                              */
   /*                                                                       */
   FT_EXPORT( FT_Bool )
-  FT_Face_CheckTrueTypePatents( FT_Face   face );
+  FT_Face_CheckTrueTypePatents( FT_Face  face );
 
   /* */
 
--- a/include/freetype/ftcache.h
+++ b/include/freetype/ftcache.h
@@ -411,14 +411,14 @@
   /*                                                                       */
   /*    height  :: The character height.                                   */
   /*                                                                       */
-  /*    pixel   :: A Boolean.  If TRUE, the `width' and `height' fields    */
-  /*               are interpreted as integer pixel character sizes.       */
+  /*    pixel   :: A Boolean.  If 1, the `width' and `height' fields are   */
+  /*               interpreted as integer pixel character sizes.           */
   /*               Otherwise, they are expressed as 1/64th of points.      */
   /*                                                                       */
-  /*    x_res   :: Only used when `pixel' is FALSE to indicate the         */
+  /*    x_res   :: Only used when `pixel' is value 0 to indicate the       */
   /*               horizontal resolution in dpi.                           */
   /*                                                                       */
-  /*    y_res   :: Only used when `pixel' is FALSE to indicate the         */
+  /*    y_res   :: Only used when `pixel' is value 0 to indicate the       */
   /*               vertical resolution in dpi.                             */
   /*                                                                       */
   /* <Note>                                                                */
--- a/include/freetype/ftstroke.h
+++ b/include/freetype/ftstroke.h
@@ -297,8 +297,8 @@
    *     The source outline.
    *
    *   opened ::
-   *     A boolean.  If TRUE, the outline is treated as an open path
-   *     instead of a closed one.
+   *     A boolean.  If 1, the outline is treated as an open path instead
+   *     of a closed one.
    *
    * @return:
    *   FreeType error code.  0 means success.
@@ -334,7 +334,7 @@
    *     A pointer to the start vector.
    *
    *   open ::
-   *     A boolean.  If TRUE, the sub-path is treated as an open one.
+   *     A boolean.  If 1, the sub-path is treated as an open one.
    *
    * @return:
    *   FreeType error code.  0 means success.
@@ -649,7 +649,7 @@
    *     A stroker handle.
    *
    *   destroy ::
-   *     A Boolean.  If TRUE, the source glyph object is destroyed
+   *     A Boolean.  If 1, the source glyph object is destroyed
    *     on success.
    *
    * @return:
@@ -682,11 +682,11 @@
    *     A stroker handle.
    *
    *   inside ::
-   *     A Boolean.  If TRUE, return the inside border, otherwise
+   *     A Boolean.  If 1, return the inside border, otherwise
    *     the outside border.
    *
    *   destroy ::
-   *     A Boolean.  If TRUE, the source glyph object is destroyed
+   *     A Boolean.  If 1, the source glyph object is destroyed
    *     on success.
    *
    * @return:
--- a/include/freetype/fttypes.h
+++ b/include/freetype/fttypes.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType simple types definitions (specification only).              */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2004, 2006 by                               */
+/*  Copyright 1996-2001, 2002, 2004, 2006, 2007 by                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -94,7 +94,8 @@
   /*    FT_Bool                                                            */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A typedef of unsigned char, used for simple booleans.              */
+  /*    A typedef of unsigned char, used for simple booleans.  As usual,   */
+  /*    values 1 and 0 represent true and false, respectively.             */
   /*                                                                       */
   typedef unsigned char  FT_Bool;
 
--- a/include/freetype/internal/ftserv.h
+++ b/include/freetype/internal/ftserv.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType services (specification only).                          */
 /*                                                                         */
-/*  Copyright 2003, 2004, 2005, 2006 by                                    */
+/*  Copyright 2003, 2004, 2005, 2006, 2007 by                              */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
--- a/include/freetype/internal/services/svttglyf.h
+++ b/include/freetype/internal/services/svttglyf.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  svsttglyf.h                                                            */
+/*  svttglyf.h                                                             */
 /*                                                                         */
 /*    The FreeType TrueType glyph service.                                 */
 /*                                                                         */
@@ -42,7 +42,7 @@
 
 FT_END_HEADER
 
-#endif /* __SVTTCMAP_H__ */
+#endif /* __SVTTGLYF_H__ */
 
 
 /* END */
--- a/modules.cfg
+++ b/modules.cfg
@@ -220,7 +220,7 @@
 # See include/freetype/ftgasp.h for the API.
 BASE_EXTENSIONS += ftgasp.c
 
-# Support for FT_Face_CheckTrueTypePatents
+# Support for FT_Face_CheckTrueTypePatents.
 #
 # See include/freetype.h for the API.
 BASE_EXTENSIONS += ftpatent.c
--- a/src/base/ftpatent.c
+++ b/src/base/ftpatent.c
@@ -1,3 +1,20 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpatent.c                                                             */
+/*                                                                         */
+/*    FreeType API for checking patented TrueType bytecode instructions    */
+/*    (body).                                                              */
+/*                                                                         */
+/*  Copyright 2007 by David Turner.                                        */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
 #include <ft2build.h>
 #include FT_FREETYPE_H
 #include FT_TRUETYPE_TAGS_H
@@ -6,21 +23,23 @@
 #include FT_SERVICE_SFNT_H
 #include FT_SERVICE_TRUETYPE_GLYF_H
 
+
   static FT_Bool
   _tt_check_patents_in_range( FT_Stream  stream,
                               FT_ULong   size )
   {
-    FT_Bool   result = 0;
+    FT_Bool   result = FALSE;
     FT_Error  error;
     FT_Bytes  p, end;
 
-    if ( FT_FRAME_ENTER(size) )
+
+    if ( FT_FRAME_ENTER( size ) )
       return 0;
 
     p   = stream->cursor;
     end = p + size;
 
-    while (p < end)
+    while ( p < end )
     {
       switch (p[0])
       {
@@ -28,13 +47,13 @@
       case 0x07:  /* SPvTL +  */
       case 0x08:  /* SFvTL // */
       case 0x09:  /* SFvTL +  */
-      case 0x0A:  /* SPvFS */
-      case 0x0B:  /* SFvFS */
-        result = 1;
+      case 0x0A:  /* SPvFS    */
+      case 0x0B:  /* SFvFS    */
+        result = TRUE;
         goto Exit;
 
       case 0x40:
-        if ( p+1 >= end )
+        if ( p + 1 >= end )
           goto Exit;
 
         p += p[1] + 2;
@@ -41,10 +60,10 @@
         break;
 
       case 0x41:
-        if ( p+1 >= end )
+        if ( p + 1 >= end )
           goto Exit;
 
-        p += p[1]*2 + 2;
+        p += p[1] * 2 + 2;
         break;
 
       case 0x71:  /* DELTAP2 */
@@ -52,7 +71,7 @@
       case 0x73:  /* DELTAC0 */
       case 0x74:  /* DELTAC1 */
       case 0x75:  /* DELTAC2 */
-        result = 1;
+        result = TRUE;
         goto Exit;
 
       case 0xB0:
@@ -63,7 +82,7 @@
       case 0xB5:
       case 0xB6:
       case 0xB7:
-        p += (p[0] - 0xB0) + 2;
+        p += ( p[0] - 0xB0 ) + 2;
         break;
 
       case 0xB8:
@@ -74,7 +93,7 @@
       case 0xBD:
       case 0xBE:
       case 0xBF:
-        p += (p[0] - 0xB8) * 2 + 3;
+        p += ( p[0] - 0xB8 ) * 2 + 3;
         break;
 
       default:
@@ -96,14 +115,16 @@
     FT_Stream              stream = face->stream;
     FT_Error               error;
     FT_Service_SFNT_Table  service;
-    FT_Bool                result = 0;
+    FT_Bool                result = FALSE;
 
+
     FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
 
-    if (service)
+    if ( service )
     {
       FT_ULong  offset, size;
 
+
       error = service->table_info( face, tag, &offset, &size );
       if ( error                    ||
            FT_STREAM_SEEK( offset ) )
@@ -111,6 +132,7 @@
 
       result = _tt_check_patents_in_range( stream, size );
     }
+
   Exit:
     return result;
   }
@@ -126,34 +148,36 @@
 
     FT_Service_TTGlyf  service;
 
+
     result = _tt_check_patents_in_table( face, TTAG_fpgm );
-    if (result)
+    if ( result )
       goto Exit;
 
     result = _tt_check_patents_in_table( face, TTAG_prep );
-    if (result)
+    if ( result )
       goto Exit;
 
     FT_FACE_FIND_SERVICE( face, service, TT_GLYF );
-    if (service == NULL)
+    if ( service == NULL )
       goto Exit;
 
-    for (gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++)
+    for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )
     {
       FT_ULong  offset, num_ins, size;
       FT_Int    num_contours;
 
+
       offset = service->get_location( face, gindex, &size );
-      if (size == 0)
+      if ( size == 0 )
         continue;
 
-      if ( FT_STREAM_SEEK(offset)      ||
-           FT_READ_SHORT(num_contours) )
+      if ( FT_STREAM_SEEK( offset )      ||
+           FT_READ_SHORT( num_contours ) )
         continue;
 
-      if (num_contours >= 0)  /* simple glyph */
+      if ( num_contours >= 0 )  /* simple glyph */
       {
-        if ( FT_STREAM_SKIP( 8 + num_contours*2 ) )
+        if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )
           continue;
       }
       else  /* compound glyph */
@@ -160,6 +184,7 @@
       {
         FT_Bool  has_instr = 0;
 
+
         if ( FT_STREAM_SKIP( 8 ) )
           continue;
 
@@ -168,56 +193,65 @@
         {
           FT_UInt  flags, toskip;
 
-          if( FT_READ_USHORT(flags) )
+
+          if( FT_READ_USHORT( flags ) )
             break;
 
           toskip = 2 + 1 + 1;
 
-          if ((flags & (1 << 0)) != 0)  /* ARGS_ARE_WORDS */
+          if ( ( flags & ( 1 << 0 ) ) != 0 )       /* ARGS_ARE_WORDS */
             toskip += 2;
 
-          if ((flags & (1 << 3)) != 0)  /* WE_HAVE_A_SCALE */
+          if ( ( flags & ( 1 << 3 ) ) != 0 )       /* WE_HAVE_A_SCALE */
             toskip += 2;
-          else if ((flags & (1 << 6)) != 0)  /* WE_HAVE_X_Y_SCALE */
+          else if ( ( flags & ( 1 << 6 ) ) != 0 )  /* WE_HAVE_X_Y_SCALE */
             toskip += 4;
-          else if ((flags & (1 << 7)) != 0)  /* WE_HAVE_A_2x2 */
+          else if ( ( flags & ( 1 << 7 ) ) != 0 )  /* WE_HAVE_A_2x2 */
             toskip += 8;
 
-          if ((flags & (1 << 8)) != 0)  /* WE_HAVE_INSTRUCTIONS */
+          if ( ( flags & ( 1 << 8 ) ) != 0 )       /* WE_HAVE_INSTRUCTIONS */
             has_instr = 1;
 
           if ( FT_STREAM_SKIP( toskip ) )
             goto NextGlyph;
 
-          if ((flags & (1 << 5)) == 0)  /* MORE_COMPONENTS */
+          if ( ( flags & ( 1 << 5 ) ) == 0 )       /* MORE_COMPONENTS */
             break;
         }
-        if (!has_instr)
+
+        if ( !has_instr )
           goto NextGlyph;
       }
 
-      if ( FT_READ_USHORT(num_ins) )
+      if ( FT_READ_USHORT( num_ins ) )
         continue;
 
       result = _tt_check_patents_in_range( stream, num_ins );
-      if (result)
+      if ( result )
         goto Exit;
 
     NextGlyph:
       ;
     }
+
   Exit:
     return result;
   }
 
+
+  /* documentation is in freetype.h */
+
   FT_EXPORT_DEF( FT_Bool )
-  FT_Face_CheckTrueTypePatents( FT_Face   face )
+  FT_Face_CheckTrueTypePatents( FT_Face  face )
   {
-    FT_Bool  result = 0;
+    FT_Bool  result = FALSE;
 
-    if ( face && FT_IS_SFNT(face) )
-    {
+  
+    if ( face && FT_IS_SFNT( face ) )
       result = _tt_face_check_patents( face );
-    }
-    return  result;
+
+    return result;
   }
+
+
+/* END */
--- a/src/truetype/ttdriver.c
+++ b/src/truetype/ttdriver.c
@@ -317,7 +317,7 @@
 
   static const FT_Service_TTGlyfRec  tt_service_truetype_glyf =
   {
-    (TT_Glyf_GetLocationFunc)     tt_face_get_location
+    (TT_Glyf_GetLocationFunc)tt_face_get_location
   };
 
   static const FT_ServiceDescRec  tt_services[] =
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -374,7 +374,7 @@
 
       if ( f & 2 )
       {
-        if (p + 1 > limit)
+        if ( p + 1 > limit )
           goto Invalid_Outline;
 
         y = (FT_Pos)FT_NEXT_BYTE( p );
@@ -383,7 +383,7 @@
       }
       else if ( ( f & 16 ) == 0 )
       {
-        if (p + 2 > limit)
+        if ( p + 2 > limit )
           goto Invalid_Outline;
 
         y = (FT_Pos)FT_NEXT_SHORT( p );
@@ -391,7 +391,7 @@
 
       x     += y;
       vec->x = x;
-      *flag  = f & ~(2|16);
+      *flag  = f & ~( 2 | 16 );
     }
 
     /* reading the Y coordinates */
@@ -409,7 +409,7 @@
 
       if ( f & 4 )
       {
-        if (p + 1 > limit)
+        if ( p + 1 > limit )
           goto Invalid_Outline;
 
         y = (FT_Pos)FT_NEXT_BYTE( p );
@@ -418,7 +418,7 @@
       }
       else if ( ( f & 32 ) == 0 )
       {
-        if (p + 2 > limit)
+        if ( p + 2 > limit )
           goto Invalid_Outline;
 
         y = (FT_Pos)FT_NEXT_SHORT( p );
@@ -426,7 +426,7 @@
 
       x     += y;
       vec->y = x;
-      *flag  = f & ~(4|32);
+      *flag  = f & ~( 4 | 32 );
     }
 
     outline->n_points   = (FT_UShort)n_points;