1 /****************************************************************************
   2  *
   3  * afblue.h
   4  *
   5  *   Auto-fitter data for blue strings (specification).
   6  *
   7  * Copyright (C) 2013-2019 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 */