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