shithub: freetype+ttf2subf

Download patch

ref: 9ca7a157273201e4e40168e7b239e12bb813f9a7
parent: 5f0ee94c06156e1c0d45c6add8a8716262c866d4
author: Werner Lemberg <[email protected]>
date: Tue Apr 30 10:26:49 EDT 2002

* src/base/ftmac.c (p2c_str): Removed.
(file_spec_from_path) [TARGET_API_MAC_CARBON]: Added support for
OS X.
(is_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X.
Handle `nameLen' <= 6 also.
(parse_fond): Remove unused variable `name_table'.
Use functionality of old p2c_str directly.
Add safety checks.
(read_lwfn): Initialize `size_p'.
Check for size_p == NULL.
(new_memory_stream, open_face_from_buffer): Updated to FreeType 2.1.
(FT_New_Face_From_LWFN): Remove unused variable `memory'.
Remove some dead code.
(FT_New_Face_From_SFNT): Remove unused variable `stream'.
(FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Define only for
OS X.
(FT_New_Face_From_FOND): Remove unused variable `error'.
(ResourceForkSize): New function.
(FT_New_Face): Use it.
Handle empty resource forks.
Conditionalize some code for OS X.
Add code to call normal loader as a fallback.

Some more variable renames to avoid troubles on the Mac.

* src/raster/ftraster.c:
s/Unknown|Ascending|Descending|Flat/\1_State/.
* src/smooth/ftgrays.c: s/TScan/TCoord/.

Other changes for the Mac.

* include/freetype/config/ftconfig.h: Define FT_MACINTOSH for
Mac platforms.
* src/base/ftobjs.c: s/macintosh/FT_MACINTOSH/.

* src/raster/ftrend1.c (ft_raster1_render): Make `pitch' always
an even number.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2002-04-30  Wenlin Institute (Tom Bishop) <[email protected]>
+
+	* src/base/ftmac.c (p2c_str): Removed.
+	(file_spec_from_path) [TARGET_API_MAC_CARBON]: Added support for
+	OS X.
+	(is_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X.
+	Handle `nameLen' <= 6 also.
+	(parse_fond): Remove unused variable `name_table'.
+	Use functionality of old p2c_str directly.
+	Add safety checks.
+	(read_lwfn): Initialize `size_p'.
+	Check for size_p == NULL.
+	(new_memory_stream, open_face_from_buffer): Updated to FreeType 2.1.
+	(FT_New_Face_From_LWFN): Remove unused variable `memory'.
+	Remove some dead code.
+	(FT_New_Face_From_SFNT): Remove unused variable `stream'.
+	(FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Define only for
+	OS X.
+	(FT_New_Face_From_FOND): Remove unused variable `error'.
+	(ResourceForkSize): New function.
+	(FT_New_Face): Use it.
+	Handle empty resource forks.
+	Conditionalize some code for OS X.
+	Add code to call normal loader as a fallback.
+
 2002-04-30  Werner Lemberg  <[email protected]>
 
 	`interface' is reserved on the Mac.
@@ -14,6 +39,21 @@
 	* src/smooth/ftgrays.c: s/interface/func_interface/.
 	* src/truetype/ttdriver.c: s/interface/tt_interface/.
 	* src/type1/t1driver.c: s/interface/t1_interface/.
+
+	Some more variable renames to avoid troubles on the Mac.
+
+	* src/raster/ftraster.c:
+	s/Unknown|Ascending|Descending|Flat/\1_State/.
+	* src/smooth/ftgrays.c: s/TScan/TCoord/.
+
+	Other changes for the Mac.
+
+	* include/freetype/config/ftconfig.h: Define FT_MACINTOSH for
+	Mac platforms.
+	* src/base/ftobjs.c: s/macintosh/FT_MACINTOSH/.
+
+	* src/raster/ftrend1.c (ft_raster1_render): Make `pitch' always
+	an even number.
 
 2002-04-29  Jouk Jansen  <[email protected]>
 
--- a/include/freetype/config/ftconfig.h
+++ b/include/freetype/config/ftconfig.h
@@ -103,6 +103,18 @@
 
   /*************************************************************************/
   /*                                                                       */
+  /* Mac support                                                           */
+  /*                                                                       */
+  /*   This is the only necessary change, so it is defined here instead    */
+  /*   providing a new configuration file.                                 */
+  /*                                                                       */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+#define FT_MACINTOSH 1
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
   /* IntN types                                                            */
   /*                                                                       */
   /*   Used to guarantee the size of some specific integers.               */
--- a/src/base/ftmac.c
+++ b/src/base/ftmac.c
@@ -19,18 +19,20 @@
   /*
     Notes
 
-    Mac suitcase files can (and often do!) contain multiple fonts. To
+    Mac suitcase files can (and often do!) contain multiple fonts.  To
     support this I use the face_index argument of FT_(Open|New)_Face()
     functions, and pretend the suitcase file is a collection.
-    Warning: although the FOND driver sets face->num_faces field to the
+
+    Warning: Although the FOND driver sets face->num_faces field to the
     number of available fonts, but the Type 1 driver sets it to 1 anyway.
     So this field is currently not reliable, and I don't see a clean way
-    to  resolve that. The face_index argument translates to
+    to  resolve that.  The face_index argument translates to
+
       Get1IndResource( 'FOND', face_index + 1 );
+
     so clients should figure out the resource index of the FOND.
     (I'll try to provide some example code for this at some point.)
 
-
     The Mac FOND support works roughly like this:
 
     - Check whether the offered stream points to a Mac suitcase file.
@@ -37,10 +39,10 @@
       This is done by checking the file type: it has to be 'FFIL' or 'tfil'.
       The stream that gets passed to our init_face() routine is a stdio
       stream, which isn't usable for us, since the FOND resources live
-      in the resource fork. So we just grab the stream->pathname field.
+      in the resource fork.  So we just grab the stream->pathname field.
 
     - Read the FOND resource into memory, then check whether there is
-      a TrueType font and/or (!) a Type 1 font available.
+      a TrueType font and/or(!) a Type 1 font available.
 
     - If there is a Type 1 font available (as a separate 'LWFN' file),
       read its data into memory, massage it slightly so it becomes
@@ -47,8 +49,8 @@
       PFB data, wrap it into a memory stream, load the Type 1 driver
       and delegate the rest of the work to it by calling FT_Open_Face().
       (XXX TODO: after this has been done, the kerning data from the FOND
-      resource should be appended to the face: on the Mac there are usually
-      no AFM files available. However, this is tricky since we need to map
+      resource should be appended to the face: On the Mac there are usually
+      no AFM files available.  However, this is tricky since we need to map
       Mac char codes to ps glyph names to glyph ID's...)
 
     - If there is a TrueType font (an 'sfnt' resource), read it into
@@ -80,26 +82,25 @@
 #define PREFER_LWFN 1
 #endif
 
-
-  /* Quick'n'dirty Pascal string to C string converter.
-     Warning: this call is not thread safe! Use with caution. */
-  static char*
-  p2c_str( unsigned char*  pstr )
-  {
-    static char  cstr[256];
-
-
-    ft_strncpy( cstr, (char*)pstr + 1, pstr[0] );
-    cstr[pstr[0]] = '\0';
-    return cstr;
-  }
-
-
   /* Given a pathname, fill in a file spec. */
   static int
   file_spec_from_path( const char*  pathname,
                        FSSpec*      spec )
   {
+#if TARGET_API_MAC_CARBON
+
+    OSErr  e;
+    FSRef  ref;
+
+
+    e = FSPathMakeRef( (UInt8 *)pathname, &ref, false /* not a directory */ );
+    if ( e == noErr )
+      e = FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, spec, NULL );
+
+    return ( e == noErr ) ? 0 : (-1);
+
+#else
+
     Str255    p_path;
     FT_ULong  path_len;
 
@@ -115,6 +116,8 @@
       return -1;
     else
       return 0;
+
+#endif
   }
 
 
@@ -132,25 +135,22 @@
   }
 
 
+#if TARGET_API_MAC_CARBON
+
   /* is this a Mac OS X .dfont file */
   static Boolean
   is_dfont( FSSpec*  spec )
   {
-    int nameLen = spec->name[0];
+    int  nameLen = spec->name[0];
 
 
-    if ( spec->name[nameLen - 5] == '.' &&
-         spec->name[nameLen - 4] == 'd' &&
-         spec->name[nameLen - 3] == 'f' &&
-         spec->name[nameLen - 2] == 'o' &&
-         spec->name[nameLen - 1] == 'n' &&
-         spec->name[nameLen    ] == 't'  )
-      return true;
-    else
-      return false;
+    return nameLen >= 6                                   &&
+           !memcmp( spec->name + nameLen - 5, ".dfont", 6 );
   }
 
+#endif
 
+
   /* Given a PostScript font name, create the Macintosh LWFN file name. */
   static void
   create_lwfn_name( char*   ps_name,
@@ -193,12 +193,12 @@
     FCBPBRec  pb;
     OSErr     error;
 
+
     pb.ioNamePtr = file_name;
     pb.ioVRefNum = 0;
     pb.ioRefNum  = ref_num;
     pb.ioFCBIndx = 0;
 
-
     error = PBGetFCBInfoSync( &pb );
     if ( error == noErr )
     {
@@ -280,7 +280,6 @@
       unsigned char*  p = (unsigned char*)fond_data;
       StyleTable*     style;
       unsigned short  string_count;
-      unsigned char*  name_table = 0;
       char            ps_name[256];
       unsigned char*  names[64];
       int             i;
@@ -298,16 +297,43 @@
         p += names[i][0];
         p++;
       }
-      ft_strcpy( ps_name, p2c_str( names[0] ) );  /* Family name */
 
-      if ( style->indexes[0] > 1 )
       {
-        unsigned char*  suffixes = names[style->indexes[0] - 1];
+        size_t  ps_name_len = (size_t)names[0][0];
 
 
-        for ( i = 1; i <= suffixes[0]; i++ )
-          strcat( ps_name, p2c_str( names[suffixes[i] - 1] ) );
+        if ( ps_name_len != 0 )
+        {
+          memcpy(ps_name, names[0] + 1, ps_name_len);
+          ps_name[ps_name_len] = 0;
+        }
+        if ( style->indexes[0] > 1 )
+        {
+          unsigned char*  suffixes = names[style->indexes[0] - 1];
+
+
+          for ( i = 1; i < suffixes[0]; i++ )
+          {
+            unsigned char*  s;
+            size_t          j = suffixes[i] - 1;
+
+
+            if ( j < string_count && ( s = names[j] ) != NULL )
+            {
+              size_t  s_len = (size_t)s[0];
+
+
+              if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )
+              {
+                memcpy( ps_name + ps_name_len, s + 1, s_len );
+                ps_name_len += s_len;
+                ps_name[ps_name_len] = 0;
+              }
+            }
+          }
+        }
       }
+
       create_lwfn_name( ps_name, lwfn_file_name );
     }
   }
@@ -326,7 +352,7 @@
   {
     FT_Error       error = FT_Err_Ok;
     short          res_ref, res_id;
-    unsigned char  *buffer, *p, *size_p;
+    unsigned char  *buffer, *p, *size_p = NULL;
     FT_ULong       total_size = 0;
     FT_ULong       post_size, pfb_chunk_size;
     Handle         post_data;
@@ -340,7 +366,7 @@
 
     /* First pass: load all POST resources, and determine the size of
        the output buffer. */
-    res_id = 501;
+    res_id    = 501;
     last_code = -1;
 
     for (;;)
@@ -368,9 +394,9 @@
 
     /* Second pass: append all POST data to the buffer, add PFB fields.
        Glue all consecutive chunks of the same type together. */
-    p = buffer;
-    res_id = 501;
-    last_code = -1;
+    p              = buffer;
+    res_id         = 501;
+    last_code      = -1;
     pfb_chunk_size = 0;
 
     for (;;)
@@ -387,10 +413,13 @@
         if ( last_code != -1 )
         {
           /* we're done adding a chunk, fill in the size field */
-          *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );
-          *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );
-          *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
-          *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
+          if ( size_p != NULL )
+          {
+            *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
+          }
           pfb_chunk_size = 0;
         }
 
@@ -442,39 +471,36 @@
 
   /* Create a new memory stream from a buffer and a size. */
   static FT_Error
-  new_memory_stream( FT_Library       library,
-                     FT_Byte*         base,
-                     FT_ULong         size,
-                     FT_Stream_Close  close,
-                     FT_Stream*       astream )
+  new_memory_stream( FT_Library           library,
+                     FT_Byte*             base,
+                     FT_ULong             size,
+                     FT_Stream_CloseFunc  close,
+                     FT_Stream           *astream )
   {
-      FT_Error   error;
-      FT_Memory  memory;
-      FT_Stream  stream;
+    FT_Error   error;
+    FT_Memory  memory;
+    FT_Stream  stream;
 
 
-      if ( !library )
-        return FT_Err_Invalid_Library_Handle;
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
 
-      if ( !base )
-        return FT_Err_Invalid_Argument;
+    if ( !base )
+      return FT_Err_Invalid_Argument;
 
-      *astream = 0;
-      memory = library->memory;
-      if ( FT_NEW( stream ) )
-        goto Exit;
+    *astream = 0;
+    memory = library->memory;
+    if ( FT_NEW( stream ) )
+      goto Exit;
 
-      FT_Stream_OpenMemory( library,
-                            base,
-                            size,
-                            stream );
+    FT_Stream_OpenMemory( stream, base, size );
 
-      stream->close = close;
+    stream->close = close;
 
-      *astream = stream;
+    *astream = stream;
 
-    Exit:
-      return error;
+  Exit:
+    return error;
   }
 
 
@@ -485,7 +511,7 @@
                          FT_ULong    size,
                          FT_Long     face_index,
                          char*       driver_name,
-                         FT_Face*    aface )
+                         FT_Face    *aface )
   {
     FT_Open_Args  args;
     FT_Error      error;
@@ -517,9 +543,10 @@
       (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
     else
     {
-      FT_Stream_Close( stream );
+      FT_Stream_CloseFunc( stream );
       FT_FREE( stream );
     }
+
     return error;
   }
 
@@ -529,12 +556,11 @@
   FT_New_Face_From_LWFN( FT_Library  library,
                          FSSpec*     spec,
                          FT_Long     face_index,
-                         FT_Face*    aface )
+                         FT_Face    *aface )
   {
-    FT_Byte*   pfb_data;
-    FT_ULong   pfb_size;
-    FT_Error   error;
-    FT_Memory  memory = library->memory;
+    FT_Byte*  pfb_data;
+    FT_ULong  pfb_size;
+    FT_Error  error;
 
 
     error = read_lwfn( library->memory, spec, &pfb_data, &pfb_size );
@@ -541,23 +567,6 @@
     if ( error )
       return error;
 
-#if 0
-    {
-      FILE*  f;
-      char*  path;
-
-
-      path = p2c_str( spec->name );
-      strcat( path, ".PFB" );
-      f = fopen( path, "wb" );
-      if ( f )
-      {
-        fwrite( pfb_data, 1, pfb_size, f );
-        fclose( f );
-      }
-    }
-#endif
-
     return open_face_from_buffer( library,
                                   pfb_data,
                                   pfb_size,
@@ -572,12 +581,11 @@
   FT_New_Face_From_SFNT( FT_Library  library,
                          short       sfnt_id,
                          FT_Long     face_index,
-                         FT_Face*    aface )
+                         FT_Face    *aface )
   {
     Handle     sfnt = NULL;
     FT_Byte*   sfnt_data;
     size_t     sfnt_size;
-    FT_Stream  stream = NULL;
     FT_Error   error = 0;
     FT_Memory  memory = library->memory;
 
@@ -612,7 +620,7 @@
   FT_New_Face_From_Suitcase( FT_Library  library,
                              FSSpec*     spec,
                              FT_Long     face_index,
-                             FT_Face*    aface )
+                             FT_Face    *aface )
   {
     FT_Error  error = FT_Err_Ok;
     short     res_ref, res_index;
@@ -648,6 +656,8 @@
   }
 
 
+#if TARGET_API_MAC_CARBON
+
   /* Create a new FT_Face from a file spec to a suitcase file. */
   static FT_Error
   FT_New_Face_From_dfont( FT_Library  library,
@@ -694,9 +704,11 @@
     return error;
   }
 
+#endif
 
-  /* documentation in ftmac.h */
 
+  /* documentation is in ftmac.h */
+
   FT_EXPORT_DEF( FT_Error )
   FT_New_Face_From_FOND( FT_Library  library,
                          Handle      fond,
@@ -703,13 +715,12 @@
                          FT_Long     face_index,
                          FT_Face    *aface )
   {
-    short     sfnt_id, have_sfnt, have_lwfn = 0;
-    Str255    lwfn_file_name;
-    short     fond_id;
-    OSType    fond_type;
-    Str255    fond_name;
-    FSSpec    lwfn_spec;
-    FT_Error  error = FT_Err_Unknown_File_Format;
+    short   sfnt_id, have_sfnt, have_lwfn = 0;
+    Str255  lwfn_file_name;
+    short   fond_id;
+    OSType  fond_type;
+    Str255  fond_name;
+    FSSpec  lwfn_spec;
 
 
     GetResInfo( fond, &fond_id, &fond_type, fond_name );
@@ -743,7 +754,7 @@
   }
 
 
-  /* documentation in ftmac.h */
+  /* documentation is in ftmac.h */
 
   FT_EXPORT_DEF( FT_Error )
   FT_GetFile_From_Mac_Name( char*     fontName,
@@ -792,7 +803,7 @@
                                                &style, &size );
           if ( stat2 == 0 && size == 0 )
           {
-            char fullName[256];
+            char  fullName[256];
 
 
             /* build up a complete face name */
@@ -829,6 +840,25 @@
   }
 
 
+  static long
+  ResourceForkSize(FSSpec*  spec)
+  {
+    long   len;
+    short  refNum;
+    OSErr  e;
+
+
+    e = FSpOpenRF( spec, fsRdPerm, &refNum ); /* I.M. Files 2-155 */
+    if ( e == noErr )
+    {
+      e = GetEOF( refNum, &len );
+      FSClose( refNum );
+    }
+
+    return ( e == noErr ) ? len : 0;
+  }
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -858,20 +888,31 @@
     if ( file_spec_from_path( pathname, &spec ) )
       return FT_Err_Invalid_Argument;
 
-    file_type = get_file_type( &spec );
-    if ( file_type == 'FFIL' || file_type == 'tfil' )
-      return FT_New_Face_From_Suitcase( library, &spec, face_index, aface );
-    else if ( file_type == 'LWFN' )
-      return FT_New_Face_From_LWFN( library, &spec, face_index, aface );
-    else if ( is_dfont( &spec ) )
-      return FT_New_Face_From_dfont( library, &spec, face_index, aface );
-    else  /* let it fall through to normal loader (.ttf, .otf, etc.) */
+    /* Regardless of type, don't try to use the resource fork if it is */
+    /* empty.  Some TTF fonts have type `FFIL', for example, but they  */
+    /* only have data forks.                                           */
+
+    if ( ResourceForkSize( &spec ) != 0 )
     {
-      args.flags    = ft_open_pathname;
-      args.pathname = (char*)pathname;
+      file_type = get_file_type( &spec );
+      if ( file_type == 'FFIL' || file_type == 'tfil' )
+        return FT_New_Face_From_Suitcase( library, &spec, face_index, aface );
 
-      return FT_Open_Face( library, &args, face_index, aface );
+      if ( file_type == 'LWFN' )
+        return FT_New_Face_From_LWFN( library, &spec, face_index, aface );
     }
+
+#if TARGET_API_MAC_CARBON
+
+    if ( is_dfont( &spec ) )
+      return FT_New_Face_From_dfont( library, &spec, face_index, aface );
+
+#endif
+
+    /* let it fall through to normal loader (.ttf, .otf, etc.) */
+    args.flags    = ft_open_pathname;
+    args.pathname = (char*)pathname;
+    return FT_Open_Face( library, &args, face_index, aface );
   }
 
 
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -738,7 +738,7 @@
   /* there's a Mac-specific extended implementation of FT_New_Face() */
   /* in src/mac/ftmac.c                                              */
 
-#ifndef macintosh
+#ifndef FT_MACINTOSH
 
   /* documentation is in freetype.h */
 
@@ -761,7 +761,7 @@
     return FT_Open_Face( library, &args, face_index, aface );
   }
 
-#endif  /* !macintosh */
+#endif  /* !FT_MACINTOSH */
 
 
   /* documentation is in freetype.h */
--- a/src/raster/ftraster.c
+++ b/src/raster/ftraster.c
@@ -271,10 +271,10 @@
   /* States of each line, arc, and profile */
   typedef enum  TStates_
   {
-    Unknown,
-    Ascending,
-    Descending,
-    Flat
+    Unknown_State,
+    Ascending_State,
+    Descending_State,
+    Flat_State
 
   } TStates;
 
@@ -579,12 +579,12 @@
 
     switch ( aState )
     {
-    case Ascending:
+    case Ascending_State:
       ras.cProfile->flow = Flow_Up;
       FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile ));
       break;
 
-    case Descending:
+    case Descending_State:
       ras.cProfile->flow = Flow_Down;
       FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile ));
       break;
@@ -1265,34 +1265,34 @@
 
     switch ( ras.state )
     {
-    case Unknown:
+    case Unknown_State:
       if ( y > ras.lastY )
       {
-        if ( New_Profile( RAS_VARS Ascending ) )
+        if ( New_Profile( RAS_VARS Ascending_State ) )
           return FAILURE;
       }
       else
       {
         if ( y < ras.lastY )
-          if ( New_Profile( RAS_VARS Descending ) )
+          if ( New_Profile( RAS_VARS Descending_State ) )
             return FAILURE;
       }
       break;
 
-    case Ascending:
+    case Ascending_State:
       if ( y < ras.lastY )
       {
-        if ( End_Profile( RAS_VAR )             ||
-             New_Profile( RAS_VARS Descending ) )
+        if ( End_Profile( RAS_VAR )                   ||
+             New_Profile( RAS_VARS Descending_State ) )
           return FAILURE;
       }
       break;
 
-    case Descending:
+    case Descending_State:
       if ( y > ras.lastY )
       {
-        if ( End_Profile( RAS_VAR )            ||
-             New_Profile( RAS_VARS Ascending ) )
+        if ( End_Profile( RAS_VAR )                  ||
+             New_Profile( RAS_VARS Ascending_State ) )
           return FAILURE;
       }
       break;
@@ -1305,13 +1305,13 @@
 
     switch ( ras.state )
     {
-    case Ascending:
+    case Ascending_State:
       if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
                     x, y, ras.minY, ras.maxY ) )
         return FAILURE;
       break;
 
-    case Descending:
+    case Descending_State:
       if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
                       x, y, ras.minY, ras.maxY ) )
         return FAILURE;
@@ -1402,11 +1402,11 @@
       {
         /* the arc is y-monotonous, either ascending or descending */
         /* detect a change of direction                            */
-        state_bez = y1 < y3 ? Ascending : Descending;
+        state_bez = y1 < y3 ? Ascending_State : Descending_State;
         if ( ras.state != state_bez )
         {
           /* finalize current profile if any */
-          if ( ras.state != Unknown   &&
+          if ( ras.state != Unknown_State   &&
                End_Profile( RAS_VAR ) )
             goto Fail;
 
@@ -1416,7 +1416,7 @@
         }
 
         /* now call the appropriate routine */
-        if ( state_bez == Ascending )
+        if ( state_bez == Ascending_State )
         {
           if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
             goto Fail;
@@ -1529,12 +1529,12 @@
       }
       else
       {
-        state_bez = ( y1 <= y4 ) ? Ascending : Descending;
+        state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
 
         /* detect a change of direction */
         if ( ras.state != state_bez )
         {
-          if ( ras.state != Unknown   &&
+          if ( ras.state != Unknown_State   &&
                End_Profile( RAS_VAR ) )
             goto Fail;
 
@@ -1543,7 +1543,7 @@
         }
 
         /* compute intersections */
-        if ( state_bez == Ascending )
+        if ( state_bez == Ascending_State )
         {
           if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
             goto Fail;
@@ -1838,7 +1838,7 @@
 
     for ( i = 0; i < ras.outline.n_contours; i++ )
     {
-      ras.state    = Unknown;
+      ras.state    = Unknown_State;
       ras.gProfile = NULL;
 
       if ( Decompose_Curve( RAS_VARS (unsigned short)start,
--- a/src/raster/ftrend1.c
+++ b/src/raster/ftrend1.c
@@ -167,7 +167,7 @@
     }
     else
     {
-      pitch = ( width + 7 ) >> 3;
+      pitch = ( ( width + 15 ) >> 4 ) << 1;
       bitmap->pixel_mode = ft_pixel_mode_mono;
     }
 
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -217,8 +217,8 @@
   /* need to define them to "float" or "double" when experimenting with   */
   /* new algorithms                                                       */
 
-  typedef int   TScan;   /* integer scanline/pixel coordinate */
-  typedef long  TPos;    /* sub-pixel coordinate              */
+  typedef int   TCoord;   /* integer scanline/pixel coordinate */
+  typedef long  TPos;     /* sub-pixel coordinate              */
 
   /* determine the type used to store cell areas.  This normally takes at */
   /* least PIXEL_BYTES*2 + 1.  On 16-bit systems, we need to use `long'   */
@@ -259,10 +259,10 @@
 
   typedef struct  TCell_
   {
-    TScan  x;
-    TScan  y;
-    int    cover;
-    TArea  area;
+    TCoord  x;
+    TCoord  y;
+    int     cover;
+    TArea   area;
 
   } TCell, *PCell;
 
@@ -271,22 +271,22 @@
 
   typedef struct  TRaster_
   {
-    PCell  cells;
-    int    max_cells;
-    int    num_cells;
+    PCell   cells;
+    int     max_cells;
+    int     num_cells;
 
-    TScan  min_ex, max_ex;
-    TScan  min_ey, max_ey;
+    TCoord  min_ex, max_ex;
+    TCoord  min_ey, max_ey;
 
-    TArea  area;
-    int    cover;
-    int    invalid;
+    TArea   area;
+    int     cover;
+    int     invalid;
 
-    TScan  ex, ey;
-    TScan  cx, cy;
-    TPos   x,  y;
+    TCoord  ex, ey;
+    TCoord  cx, cy;
+    TPos    x,  y;
 
-    TScan  last_ey;
+    TCoord  last_ey;
 
     FT_Vector   bez_stack[32 * 3 + 1];
     int         lev_stack[32];
@@ -407,8 +407,8 @@
   /* Set the current cell to a new position.                               */
   /*                                                                       */
   static void
-  gray_set_cell( RAS_ARG_ TScan  ex,
-                          TScan  ey )
+  gray_set_cell( RAS_ARG_ TCoord  ex,
+                          TCoord  ey )
   {
     int  invalid, record, clean;
 
@@ -464,8 +464,8 @@
   /* Start a new contour at a given cell.                                  */
   /*                                                                       */
   static void
-  gray_start_cell( RAS_ARG_  TScan  ex,
-                             TScan  ey )
+  gray_start_cell( RAS_ARG_  TCoord  ex,
+                             TCoord  ey )
   {
     if ( ex < ras.min_ex )
       ex = ras.min_ex - 1;
@@ -486,15 +486,15 @@
   /* Render a scanline as one or more cells.                               */
   /*                                                                       */
   static void
-  gray_render_scanline( RAS_ARG_  TScan  ey,
-                                  TPos   x1,
-                                  TScan  y1,
-                                  TPos   x2,
-                                  TScan  y2 )
+  gray_render_scanline( RAS_ARG_  TCoord  ey,
+                                  TPos    x1,
+                                  TCoord  y1,
+                                  TPos    x2,
+                                  TCoord  y2 )
   {
-    TScan  ex1, ex2, fx1, fx2, delta;
-    long   p, first, dx;
-    int    incr, lift, mod, rem;
+    TCoord  ex1, ex2, fx1, fx2, delta;
+    long    p, first, dx;
+    int     incr, lift, mod, rem;
 
 
     dx = x2 - x1;
@@ -596,9 +596,9 @@
   gray_render_line( RAS_ARG_ TPos  to_x,
                              TPos  to_y )
   {
-    TScan  ey1, ey2, fy1, fy2;
-    TPos   dx, dy, x, x2;
-    int    p, rem, mod, lift, delta, first, incr;
+    TCoord  ey1, ey2, fy1, fy2;
+    TPos    dx, dy, x, x2;
+    int     p, rem, mod, lift, delta, first, incr;
 
 
     ey1 = TRUNC( ras.last_ey );
@@ -614,7 +614,7 @@
 
     /* perform vertical clipping */
     {
-      TScan  min, max;
+      TCoord  min, max;
 
 
       min = ey1;
@@ -640,9 +640,9 @@
 
     if ( dx == 0 )
     {
-      TScan  ex     = TRUNC( ras.x );
-      TScan  two_fx = ( ras.x - SUBPIXELS( ex ) ) << 1;
-      TPos   area;
+      TCoord  ex     = TRUNC( ras.x );
+      TCoord  two_fx = ( ras.x - SUBPIXELS( ex ) ) << 1;
+      TPos    area;
 
 
       first = ONE_PIXEL;
@@ -1332,10 +1332,10 @@
 
 
   static void
-  gray_hline( RAS_ARG_ TScan  x,
-                       TScan  y,
-                       TPos   area,
-                       int    acount )
+  gray_hline( RAS_ARG_ TCoord  x,
+                       TCoord  y,
+                       TPos    area,
+                       int     acount )
   {
     FT_Span*   span;
     int        count;
@@ -1431,11 +1431,12 @@
   static void
   gray_sweep( RAS_ARG_ FT_Bitmap*  target )
   {
-    TScan  x, y, cover;
-    TArea  area;
-    PCell  start, cur, limit;
+    TCoord  x, y, cover;
+    TArea   area;
+    PCell   start, cur, limit;
 
     FT_UNUSED( target );
+
 
     if ( ras.num_cells == 0 )
       return;