Sync with trunk r47367
[reactos.git] / lib / 3rdparty / freetype / src / autofit / afglobal.c
index 1875f52..ac29361 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter routines to compute global hinting values (body).        */
 /*                                                                         */
-/*  Copyright 2003, 2004, 2005, 2006, 2007 by                              */
+/*  Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by                  */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,6 +21,7 @@
 #include "aflatin.h"
 #include "afcjk.h"
 #include "afindic.h"
+#include "afpic.h"
 
 #include "aferrors.h"
 
 #include "aflatin2.h"
 #endif
 
+#ifndef FT_CONFIG_OPTION_PIC
+
+/* when updating this table, don't forget to update 
+  AF_SCRIPT_CLASSES_COUNT and autofit_module_class_pic_init */
+
   /* populate this list when you add new scripts */
   static AF_ScriptClass const  af_script_classes[] =
   {
 #endif
     &af_latin_script_class,
     &af_cjk_script_class,
-    &af_indic_script_class,
+    &af_indic_script_class, 
     NULL  /* do not remove */
   };
 
+#endif /* FT_CONFIG_OPTION_PIC */
+
   /* index of default script in `af_script_classes' */
 #define AF_SCRIPT_LIST_DEFAULT  2
-  /* indicates an uncovered glyph                   */
-#define AF_SCRIPT_LIST_NONE   255
+  /* a bit mask indicating an uncovered glyph       */
+#define AF_SCRIPT_LIST_NONE     0x7F
+  /* if this flag is set, we have an ASCII digit    */
+#define AF_DIGIT                0x80
 
 
   /*
@@ -55,7 +65,7 @@
   typedef struct  AF_FaceGlobalsRec_
   {
     FT_Face           face;
-    FT_UInt           glyph_count;    /* same as face->num_glyphs */
+    FT_Long           glyph_count;    /* same as face->num_glyphs */
     FT_Byte*          glyph_scripts;
 
     AF_ScriptMetrics  metrics[AF_SCRIPT_MAX];
@@ -72,7 +82,7 @@
     FT_Face     face        = globals->face;
     FT_CharMap  old_charmap = face->charmap;
     FT_Byte*    gscripts    = globals->glyph_scripts;
-    FT_UInt     ss;
+    FT_UInt     ss, i;
 
 
     /* the value 255 means `uncovered glyph' */
     if ( error )
     {
      /*
-      *  Ignore this error; we simply use Latin as the standard
-      *  script.  XXX: Shouldn't we rather disable hinting?
+      *  Ignore this error; we simply use the default script.
+      *  XXX: Shouldn't we rather disable hinting?
       */
       error = AF_Err_Ok;
       goto Exit;
     }
 
     /* scan each script in a Unicode charmap */
-    for ( ss = 0; af_script_classes[ss]; ss++ )
+    for ( ss = 0; AF_SCRIPT_CLASSES_GET[ss]; ss++ )
     {
-      AF_ScriptClass      clazz = af_script_classes[ss];
+      AF_ScriptClass      clazz = AF_SCRIPT_CLASSES_GET[ss];
       AF_Script_UniRange  range;
 
 
         gindex = FT_Get_Char_Index( face, charcode );
 
         if ( gindex != 0                             &&
-             gindex < globals->glyph_count           &&
+             gindex < (FT_ULong)globals->glyph_count &&
              gscripts[gindex] == AF_SCRIPT_LIST_NONE )
         {
           gscripts[gindex] = (FT_Byte)ss;
           if ( gindex == 0 || charcode > range->last )
             break;
 
-          if ( gindex < globals->glyph_count           &&
+          if ( gindex < (FT_ULong)globals->glyph_count &&
                gscripts[gindex] == AF_SCRIPT_LIST_NONE )
           {
             gscripts[gindex] = (FT_Byte)ss;
       }
     }
 
+    /* mark ASCII digits */
+    for ( i = 0x30; i <= 0x39; i++ )
+    {
+      FT_UInt  gindex = FT_Get_Char_Index( face, i );
+
+
+      if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count )
+        gscripts[gindex] |= AF_DIGIT;
+    }
+
   Exit:
     /*
      *  By default, all uncovered glyphs are set to the latin script.
      *  XXX: Shouldn't we disable hinting or do something similar?
      */
     {
-      FT_UInt  nn;
+      FT_Long  nn;
 
 
       for ( nn = 0; nn < globals->glyph_count; nn++ )
       {
         if ( globals->metrics[nn] )
         {
-          AF_ScriptClass  clazz = af_script_classes[nn];
+          AF_ScriptClass  clazz = AF_SCRIPT_CLASSES_GET[nn];
 
 
           FT_ASSERT( globals->metrics[nn]->clazz == clazz );
     FT_UInt           gidx;
     AF_ScriptClass    clazz;
     FT_UInt           script     = options & 15;
-    const FT_UInt     script_max = sizeof ( af_script_classes ) /
-                                     sizeof ( af_script_classes[0] );
+    const FT_Offset   script_max = sizeof ( AF_SCRIPT_CLASSES_GET ) /
+                                     sizeof ( AF_SCRIPT_CLASSES_GET[0] );
     FT_Error          error      = AF_Err_Ok;
 
 
-    if ( gindex >= globals->glyph_count )
+    if ( gindex >= (FT_ULong)globals->glyph_count )
     {
       error = AF_Err_Invalid_Argument;
       goto Exit;
 
     gidx = script;
     if ( gidx == 0 || gidx + 1 >= script_max )
-      gidx = globals->glyph_scripts[gindex];
+      gidx = globals->glyph_scripts[gindex] & AF_SCRIPT_LIST_NONE;
 
-    clazz = af_script_classes[gidx];
+    clazz = AF_SCRIPT_CLASSES_GET[gidx];
     if ( script == 0 )
       script = clazz->script;
 
   }
 
 
+  FT_LOCAL_DEF( FT_Bool )
+  af_face_globals_is_digit( AF_FaceGlobals  globals,
+                            FT_UInt         gindex )
+  {
+    if ( gindex < (FT_ULong)globals->glyph_count )
+      return (FT_Bool)( globals->glyph_scripts[gindex] & AF_DIGIT );
+
+    return (FT_Bool)0;
+  }
+
+
 /* END */