Home | History | Annotate | Download | only in autofit
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  afblue.h                                                               */
      4 /*                                                                         */
      5 /*    Auto-fitter data for blue strings (specification).                   */
      6 /*                                                                         */
      7 /*  Copyright 2013-2016 by                                                 */
      8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
      9 /*                                                                         */
     10 /*  This file is part of the FreeType project, and may only be used,       */
     11 /*  modified, and distributed under the terms of the FreeType project      */
     12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
     13 /*  this file you indicate that you have read the license and              */
     14 /*  understand and accept it fully.                                        */
     15 /*                                                                         */
     16 /***************************************************************************/
     17 
     18 
     19 #ifndef AFBLUE_H_
     20 #define AFBLUE_H_
     21 
     22 
     23 FT_BEGIN_HEADER
     24 
     25 
     26   /* an auxiliary macro to decode a UTF-8 character -- since we only use */
     27   /* hard-coded, self-converted data, no error checking is performed     */
     28 #define GET_UTF8_CHAR( ch, p )                      \
     29           do                                        \
     30           {                                         \
     31             ch = (unsigned char)*p++;               \
     32             if ( ch >= 0x80 )                       \
     33             {                                       \
     34               FT_UInt  len_;                        \
     35                                                     \
     36                                                     \
     37               if ( ch < 0xE0 )                      \
     38               {                                     \
     39                 len_ = 1;                           \
     40                 ch  &= 0x1F;                        \
     41               }                                     \
     42               else if ( ch < 0xF0 )                 \
     43               {                                     \
     44                 len_ = 2;                           \
     45                 ch  &= 0x0F;                        \
     46               }                                     \
     47               else                                  \
     48               {                                     \
     49                 len_ = 3;                           \
     50                 ch  &= 0x07;                        \
     51               }                                     \
     52                                                     \
     53               for ( ; len_ > 0; len_-- )            \
     54                 ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
     55             }                                       \
     56           } while ( 0 )
     57 
     58 
     59   /*************************************************************************/
     60   /*************************************************************************/
     61   /*****                                                               *****/
     62   /*****                    B L U E   S T R I N G S                    *****/
     63   /*****                                                               *****/
     64   /*************************************************************************/
     65   /*************************************************************************/
     66 
     67   /* At the bottommost level, we define strings for finding blue zones. */
     68 
     69 
     70 #define AF_BLUE_STRING_MAX_LEN  @AF_BLUE_STRING_MAX_LEN@
     71 
     72   /* The AF_Blue_String enumeration values are offsets into the */
     73   /* `af_blue_strings' array.                                   */
     74 
     75   typedef enum  AF_Blue_String_
     76   {
     77 @AF_BLUE_STRING_ENUM@
     78 
     79     AF_BLUE_STRING_MAX   /* do not remove */
     80 
     81   } AF_Blue_String;
     82 
     83 
     84   FT_LOCAL_ARRAY( char )
     85   af_blue_strings[];
     86 
     87 
     88   /*************************************************************************/
     89   /*************************************************************************/
     90   /*****                                                               *****/
     91   /*****                 B L U E   S T R I N G S E T S                 *****/
     92   /*****                                                               *****/
     93   /*************************************************************************/
     94   /*************************************************************************/
     95 
     96   /* The next level is to group blue strings into style-specific sets. */
     97 
     98 
     99   /* Properties are specific to a writing system.  We assume that a given  */
    100   /* blue string can't be used in more than a single writing system, which */
    101   /* is a safe bet.                                                        */
    102 #define AF_BLUE_PROPERTY_LATIN_TOP       ( 1U << 0 )  /* must have value 1 */
    103 #define AF_BLUE_PROPERTY_LATIN_SUB_TOP   ( 1U << 1 )
    104 #define AF_BLUE_PROPERTY_LATIN_NEUTRAL   ( 1U << 2 )
    105 #define AF_BLUE_PROPERTY_LATIN_X_HEIGHT  ( 1U << 3 )
    106 #define AF_BLUE_PROPERTY_LATIN_LONG      ( 1U << 4 )
    107 
    108 #define AF_BLUE_PROPERTY_CJK_TOP    ( 1U << 0 )       /* must have value 1 */
    109 #define AF_BLUE_PROPERTY_CJK_HORIZ  ( 1U << 1 )       /* must have value 2 */
    110 #define AF_BLUE_PROPERTY_CJK_RIGHT  AF_BLUE_PROPERTY_CJK_TOP
    111 
    112 
    113 #define AF_BLUE_STRINGSET_MAX_LEN  @AF_BLUE_STRINGSET_MAX_LEN@
    114 
    115   /* The AF_Blue_Stringset enumeration values are offsets into the */
    116   /* `af_blue_stringsets' array.                                   */
    117 
    118   typedef enum  AF_Blue_Stringset_
    119   {
    120 @AF_BLUE_STRINGSET_ENUM@
    121 
    122     AF_BLUE_STRINGSET_MAX   /* do not remove */
    123 
    124   } AF_Blue_Stringset;
    125 
    126 
    127   typedef struct  AF_Blue_StringRec_
    128   {
    129     AF_Blue_String  string;
    130     FT_UShort       properties;
    131 
    132   } AF_Blue_StringRec;
    133 
    134 
    135   FT_LOCAL_ARRAY( AF_Blue_StringRec )
    136   af_blue_stringsets[];
    137 
    138 /* */
    139 
    140 FT_END_HEADER
    141 
    142 
    143 #endif /* AFBLUE_H_ */
    144 
    145 
    146 /* END */
    147