1 /****************************************************************************
   2  *
   3  * afindic.c
   4  *
   5  *   Auto-fitter hinting routines for Indic writing system (body).
   6  *
   7  * Copyright (C) 2007-2019 by
   8  * Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>.
   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 #include "aftypes.h"
  20 #include "aflatin.h"
  21 #include "afcjk.h"
  22 
  23 
  24 #ifdef AF_CONFIG_OPTION_INDIC
  25 
  26 #include "afindic.h"
  27 #include "aferrors.h"
  28 
  29 
  30 #ifdef AF_CONFIG_OPTION_USE_WARPER
  31 #include "afwarp.h"
  32 #endif
  33 
  34 
  35   static FT_Error
  36   af_indic_metrics_init( AF_CJKMetrics  metrics,
  37                          FT_Face        face )
  38   {
  39     /* skip blue zone init in CJK routines */
  40     FT_CharMap  oldmap = face->charmap;
  41 
  42 
  43     metrics->units_per_em = face->units_per_EM;
  44 
  45     if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) )
  46       face->charmap = NULL;
  47     else
  48     {
  49       af_cjk_metrics_init_widths( metrics, face );
  50 #if 0
  51       /* either need indic specific blue_chars[] or just skip blue zones */
  52       af_cjk_metrics_init_blues( metrics, face, af_cjk_blue_chars );
  53 #endif
  54       af_cjk_metrics_check_digits( metrics, face );
  55     }
  56 
  57     FT_Set_Charmap( face, oldmap );
  58 
  59     return FT_Err_Ok;
  60   }
  61 
  62 
  63   static void
  64   af_indic_metrics_scale( AF_CJKMetrics  metrics,
  65                           AF_Scaler      scaler )
  66   {
  67     /* use CJK routines */
  68     af_cjk_metrics_scale( metrics, scaler );
  69   }
  70 
  71 
  72   static FT_Error
  73   af_indic_hints_init( AF_GlyphHints  hints,
  74                        AF_CJKMetrics  metrics )
  75   {
  76     /* use CJK routines */
  77     return af_cjk_hints_init( hints, metrics );
  78   }
  79 
  80 
  81   static FT_Error
  82   af_indic_hints_apply( FT_UInt        glyph_index,
  83                         AF_GlyphHints  hints,
  84                         FT_Outline*    outline,
  85                         AF_CJKMetrics  metrics )
  86   {
  87     /* use CJK routines */
  88     return af_cjk_hints_apply( glyph_index, hints, outline, metrics );
  89   }
  90 
  91 
  92   /* Extract standard_width from writing system/script specific */
  93   /* metrics class.                                             */
  94 
  95   static void
  96   af_indic_get_standard_widths( AF_CJKMetrics  metrics,
  97                                 FT_Pos*        stdHW,
  98                                 FT_Pos*        stdVW )
  99   {
 100     if ( stdHW )
 101       *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width;
 102 
 103     if ( stdVW )
 104       *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width;
 105   }
 106 
 107 
 108   /*************************************************************************/
 109   /*************************************************************************/
 110   /*****                                                               *****/
 111   /*****                I N D I C   S C R I P T   C L A S S            *****/
 112   /*****                                                               *****/
 113   /*************************************************************************/
 114   /*************************************************************************/
 115 
 116 
 117   AF_DEFINE_WRITING_SYSTEM_CLASS(
 118     af_indic_writing_system_class,
 119 
 120     AF_WRITING_SYSTEM_INDIC,
 121 
 122     sizeof ( AF_CJKMetricsRec ),
 123 
 124     (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init,        /* style_metrics_init    */
 125     (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale,       /* style_metrics_scale   */
 126     (AF_WritingSystem_DoneMetricsFunc) NULL,                         /* style_metrics_done    */
 127     (AF_WritingSystem_GetStdWidthsFunc)af_indic_get_standard_widths, /* style_metrics_getstdw */
 128 
 129     (AF_WritingSystem_InitHintsFunc)   af_indic_hints_init,          /* style_hints_init      */
 130     (AF_WritingSystem_ApplyHintsFunc)  af_indic_hints_apply          /* style_hints_apply     */
 131   )
 132 
 133 
 134 #else /* !AF_CONFIG_OPTION_INDIC */
 135 
 136 
 137   AF_DEFINE_WRITING_SYSTEM_CLASS(
 138     af_indic_writing_system_class,
 139 
 140     AF_WRITING_SYSTEM_INDIC,
 141 
 142     sizeof ( AF_CJKMetricsRec ),
 143 
 144     (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init    */
 145     (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale   */
 146     (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done    */
 147     (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */
 148 
 149     (AF_WritingSystem_InitHintsFunc)   NULL, /* style_hints_init      */
 150     (AF_WritingSystem_ApplyHintsFunc)  NULL  /* style_hints_apply     */
 151   )
 152 
 153 
 154 #endif /* !AF_CONFIG_OPTION_INDIC */
 155 
 156 
 157 /* END */