xref: /aosp_15_r20/external/freetype/src/autofit/afindic.c (revision 63949dbd25bcc50c4e1178497ff9e9574d44fc5a)
1 /****************************************************************************
2  *
3  * afindic.c
4  *
5  *   Auto-fitter hinting routines for Indic writing system (body).
6  *
7  * Copyright (C) 2007-2023 by
8  * Rahul Bhalerao <[email protected]>, <[email protected]>.
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_StyleMetrics metrics_,FT_Face face)31   af_indic_metrics_init( AF_StyleMetrics  metrics_, /* AF_CJKMetrics */
32                          FT_Face          face )
33   {
34     AF_CJKMetrics  metrics = (AF_CJKMetrics)metrics_;
35 
36 
37     /* skip blue zone init in CJK routines */
38     FT_CharMap  oldmap = face->charmap;
39 
40 
41     metrics->units_per_em = face->units_per_EM;
42 
43     if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) )
44       face->charmap = NULL;
45     else
46     {
47       af_cjk_metrics_init_widths( metrics, face );
48 #if 0
49       /* either need indic specific blue_chars[] or just skip blue zones */
50       af_cjk_metrics_init_blues( metrics, face, af_cjk_blue_chars );
51 #endif
52       af_cjk_metrics_check_digits( metrics, face );
53     }
54 
55     face->charmap = oldmap;
56     return FT_Err_Ok;
57   }
58 
59 
60   static void
af_indic_metrics_scale(AF_StyleMetrics metrics,AF_Scaler scaler)61   af_indic_metrics_scale( AF_StyleMetrics  metrics,
62                           AF_Scaler        scaler )
63   {
64     /* use CJK routines */
65     af_cjk_metrics_scale( metrics, scaler );
66   }
67 
68 
69   static FT_Error
af_indic_hints_init(AF_GlyphHints hints,AF_StyleMetrics metrics)70   af_indic_hints_init( AF_GlyphHints    hints,
71                        AF_StyleMetrics  metrics )
72   {
73     /* use CJK routines */
74     return af_cjk_hints_init( hints, metrics );
75   }
76 
77 
78   static FT_Error
af_indic_hints_apply(FT_UInt glyph_index,AF_GlyphHints hints,FT_Outline * outline,AF_StyleMetrics metrics)79   af_indic_hints_apply( FT_UInt          glyph_index,
80                         AF_GlyphHints    hints,
81                         FT_Outline*      outline,
82                         AF_StyleMetrics  metrics )
83   {
84     /* use CJK routines */
85     return af_cjk_hints_apply( glyph_index, hints, outline, metrics );
86   }
87 
88 
89   /* Extract standard_width from writing system/script specific */
90   /* metrics class.                                             */
91 
92   static void
af_indic_get_standard_widths(AF_StyleMetrics metrics_,FT_Pos * stdHW,FT_Pos * stdVW)93   af_indic_get_standard_widths( AF_StyleMetrics  metrics_, /* AF_CJKMetrics */
94                                 FT_Pos*          stdHW,
95                                 FT_Pos*          stdVW )
96   {
97     AF_CJKMetrics  metrics = (AF_CJKMetrics)metrics_;
98 
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 */
158