afindic.c revision 727dee178a392d20eb050d0c446f2fcc29058fa1
1/***************************************************************************/
2/*                                                                         */
3/*  afindic.c                                                              */
4/*                                                                         */
5/*    Auto-fitter hinting routines for Indic scripts (body).               */
6/*                                                                         */
7/*  Copyright 2007, 2011-2013 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
22
23#ifdef AF_CONFIG_OPTION_INDIC
24
25#include "afindic.h"
26#include "aferrors.h"
27#include "afcjk.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( AF_GlyphHints  hints,
83                        FT_Outline*    outline,
84                        AF_CJKMetrics  metrics )
85  {
86    /* use CJK routines */
87    return af_cjk_hints_apply( hints, outline, metrics );
88  }
89
90
91  /*************************************************************************/
92  /*************************************************************************/
93  /*****                                                               *****/
94  /*****                I N D I C   S C R I P T   C L A S S            *****/
95  /*****                                                               *****/
96  /*************************************************************************/
97  /*************************************************************************/
98
99
100  static const AF_Script_UniRangeRec  af_indic_uniranges[] =
101  {
102#if 0
103    AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ),  /* why this? */
104#endif
105    AF_UNIRANGE_REC( 0x0900UL, 0x0DFFUL),    /* Indic Range */
106    AF_UNIRANGE_REC( 0x0F00UL, 0x0FFFUL),    /* Tibetan */
107    AF_UNIRANGE_REC( 0x1900UL, 0x194FUL),    /* Limbu */
108    AF_UNIRANGE_REC( 0x1B80UL, 0x1BBFUL),    /* Sundanese */
109    AF_UNIRANGE_REC( 0x1C80UL, 0x1CDFUL),    /* Meetei Mayak */
110    AF_UNIRANGE_REC( 0xA800UL, 0xA82FUL),    /* Syloti Nagri */
111    AF_UNIRANGE_REC( 0x11800UL, 0x118DFUL),  /* Sharada */
112    AF_UNIRANGE_REC(      0UL,      0UL)
113  };
114
115
116  AF_DEFINE_SCRIPT_CLASS( af_indic_script_class,
117    AF_SCRIPT_INDIC,
118    af_indic_uniranges,
119    'o', /* XXX */
120
121    sizeof ( AF_CJKMetricsRec ),
122
123    (AF_Script_InitMetricsFunc) af_indic_metrics_init,
124    (AF_Script_ScaleMetricsFunc)af_indic_metrics_scale,
125    (AF_Script_DoneMetricsFunc) NULL,
126
127    (AF_Script_InitHintsFunc)   af_indic_hints_init,
128    (AF_Script_ApplyHintsFunc)  af_indic_hints_apply
129  )
130
131#else /* !AF_CONFIG_OPTION_INDIC */
132
133  static const AF_Script_UniRangeRec  af_indic_uniranges[] =
134  {
135    { 0, 0 }
136  };
137
138
139  AF_DEFINE_SCRIPT_CLASS( af_indic_script_class,
140    AF_SCRIPT_INDIC,
141    af_indic_uniranges,
142    0,
143
144    sizeof ( AF_CJKMetricsRec ),
145
146    (AF_Script_InitMetricsFunc) NULL,
147    (AF_Script_ScaleMetricsFunc)NULL,
148    (AF_Script_DoneMetricsFunc) NULL,
149
150    (AF_Script_InitHintsFunc)   NULL,
151    (AF_Script_ApplyHintsFunc)  NULL
152  )
153
154#endif /* !AF_CONFIG_OPTION_INDIC */
155
156
157/* END */
158