1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  aftypes.h                                                              */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Auto-fitter types (specification only).                              */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki/*  Copyright 2003-2015 by                                                 */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  The auto-fitter is a complete rewrite of the old auto-hinter.
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  Its main feature is the ability to differentiate between different
239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  writing systems and scripts in order to apply specific rules.
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  The code has also been compartmentized into several entities that
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  should make algorithmic experimentation easier than with the old
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  code.
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *************************************************************************/
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef __AFTYPES_H__
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define __AFTYPES_H__
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_FREETYPE_H
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_OUTLINE_H
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
42ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afblue.h"
43ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_BEGIN_HEADER
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                    D E B U G G I N G                          *****/
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
55aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#ifdef FT_DEBUG_AUTOFIT
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
570a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project#include FT_CONFIG_STANDARD_LIBRARY_H
580a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern int    _af_debug_disable_horz_hints;
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern int    _af_debug_disable_vert_hints;
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern int    _af_debug_disable_blue_hints;
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectextern void*  _af_debug_hints;
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
64aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif /* FT_DEBUG_AUTOFIT */
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                 U T I L I T Y   S T U F F                     *****/
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct  AF_WidthRec_
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Pos  org;  /* original position/width in font units              */
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Pos  cur;  /* current/scaled position/width in device sub-pixels */
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Pos  fit;  /* current/fitted position/width in device sub-pixels */
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } AF_WidthRec, *AF_Width;
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( void )
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  af_sort_pos( FT_UInt  count,
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               FT_Pos*  table );
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( void )
89727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  af_sort_and_quantize_widths( FT_UInt*  count,
90727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                               AF_Width  widths,
91727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease                               FT_Pos    threshold );
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                   A N G L E   T Y P E S                       *****/
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  The auto-fitter doesn't need a very high angular accuracy;
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  this allows us to speed up some computations considerably with a
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  light Cordic algorithm (see afangles.c).
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef FT_Int  AF_Angle;
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AF_ANGLE_PI   256
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AF_ANGLE_2PI  ( AF_ANGLE_PI * 2 )
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AF_ANGLE_PI2  ( AF_ANGLE_PI / 2 )
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AF_ANGLE_PI4  ( AF_ANGLE_PI / 4 )
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  compute the angle of a given 2-D vector
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( AF_Angle )
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  af_angle_atan( FT_Pos  dx,
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 FT_Pos  dy );
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  compute `angle2 - angle1'; the result is always within
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( AF_Angle )
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  af_angle_diff( AF_Angle  angle1,
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                 AF_Angle  angle2 );
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* 0 */
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AF_ANGLE_DIFF( result, angle1, angle2 ) \
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_BEGIN_STMNT                                \
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AF_Angle  _delta = (angle2) - (angle1);     \
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
141fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    while ( _delta <= -AF_ANGLE_PI )            \
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      _delta += AF_ANGLE_2PI;                   \
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
144fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki    while ( _delta > AF_ANGLE_PI )              \
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      _delta -= AF_ANGLE_2PI;                   \
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                \
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    result = _delta;                            \
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_END_STMNT
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  opaque handle to glyph-specific hints -- see `afhints.h' for more
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  details
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct AF_GlyphHintsRec_*  AF_GlyphHints;
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                       S C A L E R S                           *****/
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*****                                                               *****/
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  A scaler models the target pixel device that will receive the
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   *  auto-hinted glyph image.
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
170fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define AF_SCALER_FLAG_NO_HORIZONTAL  1U /* disable horizontal hinting */
171fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define AF_SCALER_FLAG_NO_VERTICAL    2U /* disable vertical hinting   */
172fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define AF_SCALER_FLAG_NO_ADVANCE     4U /* disable advance hinting    */
173fb6b5b10aaa74b8c8974714b41bac35bdd1c772dMakoto Onuki#define AF_SCALER_FLAG_NO_WARPER      8U /* disable warper             */
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct  AF_ScalerRec_
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Face         face;        /* source font face                        */
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Fixed        x_scale;     /* from font units to 1/64th device pixels */
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Fixed        y_scale;     /* from font units to 1/64th device pixels */
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Pos          x_delta;     /* in 1/64th device pixels                 */
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Pos          y_delta;     /* in 1/64th device pixels                 */
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Render_Mode  render_mode; /* monochrome, anti-aliased, LCD, etc.     */
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UInt32       flags;       /* additional control flags, see above     */
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } AF_ScalerRec, *AF_Scaler;
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AF_SCALER_EQUAL_SCALES( a, b )      \
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ( (a)->x_scale == (b)->x_scale && \
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            (a)->y_scale == (b)->y_scale && \
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            (a)->x_delta == (b)->x_delta && \
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            (a)->y_delta == (b)->y_delta )
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
1969c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef struct AF_StyleMetricsRec_*  AF_StyleMetrics;
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*  This function parses an FT_Face to compute global metrics for
1999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  a specific style.
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef FT_Error
2029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  (*AF_WritingSystem_InitMetricsFunc)( AF_StyleMetrics  metrics,
2039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                                       FT_Face          face );
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void
2069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  (*AF_WritingSystem_ScaleMetricsFunc)( AF_StyleMetrics  metrics,
2079c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                                        AF_Scaler        scaler );
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void
2109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics  metrics );
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef FT_Error
2149c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints    hints,
2159c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                                     AF_StyleMetrics  metrics );
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef void
2189c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  (*AF_WritingSystem_ApplyHintsFunc)( AF_GlyphHints    hints,
2199c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                                      FT_Outline*      outline,
2209c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                                      AF_StyleMetrics  metrics );
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
223ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
224ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
225ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****                                                               *****/
226ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****                W R I T I N G   S Y S T E M S                  *****/
227ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****                                                               *****/
228ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
229ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
230ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
231ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*
2329c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  For the auto-hinter, a writing system consists of multiple scripts that
2339c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  can be handled similarly *in a typographical way*; the relationship is
2349c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  not based on history.  For example, both the Greek and the unrelated
235ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *  Armenian scripts share the same features like ascender, descender,
236ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *  x-height, etc.  Essentially, a writing system is covered by a
237ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *  submodule of the auto-fitter; it contains
238ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *
2399c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  - a specific global analyzer that computes global metrics specific to
240ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *    the script (based on script-specific characters to identify ascender
241ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *    height, x-height, etc.),
242ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *
243ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *  - a specific glyph analyzer that computes segments and edges for each
244ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *    glyph covered by the script,
245ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *
246ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *  - a specific grid-fitting algorithm that distorts the scaled glyph
247ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *    outline according to the results of the glyph analyzer.
248ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   */
249ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
250ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define __AFWRTSYS_H__  /* don't load header files */
251ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  WRITING_SYSTEM
252ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define WRITING_SYSTEM( ws, WS )    \
253ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          AF_WRITING_SYSTEM_ ## WS,
254ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
255ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* The list of known writing systems. */
256ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  typedef enum  AF_WritingSystem_
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
259ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afwrtsys.h"
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
261ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_WRITING_SYSTEM_MAX   /* do not remove */
262295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
263ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  } AF_WritingSystem;
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
265ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  __AFWRTSYS_H__
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
267ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
268ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  typedef struct  AF_WritingSystemClassRec_
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
270ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_WritingSystem  writing_system;
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2729c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_Offset                          style_metrics_size;
2739c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_WritingSystem_InitMetricsFunc   style_metrics_init;
2749c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_WritingSystem_ScaleMetricsFunc  style_metrics_scale;
2759c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_WritingSystem_DoneMetricsFunc   style_metrics_done;
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
2779c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_WritingSystem_InitHintsFunc     style_hints_init;
2789c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_WritingSystem_ApplyHintsFunc    style_hints_apply;
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
280ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  } AF_WritingSystemClassRec;
281ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
2829c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef const AF_WritingSystemClassRec*  AF_WritingSystemClass;
2839c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
284ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
285ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
286ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
287ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****                                                               *****/
288ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****                        S C R I P T S                          *****/
289ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*****                                                               *****/
290ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
291ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*************************************************************************/
292ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
293ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*
2949c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  Each script is associated with a set of Unicode ranges that gets used
2959c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  to test whether the font face supports the script.
296ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   *
2979c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  We use four-letter script tags from the OpenType specification,
2989c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  extended by `NONE', which indicates `no script'.
299ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease   */
300ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
301ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#undef  SCRIPT
3029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
303ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          AF_SCRIPT_ ## S,
304ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
305ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /* The list of known scripts. */
306ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  typedef enum  AF_Script_
307ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {
308ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
309ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "afscript.h"
310ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
311ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_SCRIPT_MAX   /* do not remove */
312ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
313ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  } AF_Script;
314ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
315ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
316ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  typedef struct  AF_Script_UniRangeRec_
317ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {
318ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_UInt32  first;
319ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    FT_UInt32  last;
320ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
321ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  } AF_Script_UniRangeRec;
322ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
323ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
324ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
325ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  typedef const AF_Script_UniRangeRec*  AF_Script_UniRange;
326ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
327ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
328ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  typedef struct  AF_ScriptClassRec_
329ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {
3309c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_Script  script;
331ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
332ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    AF_Script_UniRange  script_uni_ranges; /* last must be { 0, 0 }        */
3339c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3349c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_UInt32  standard_char1;             /* for default width and height */
3359c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_UInt32  standard_char2;             /* ditto                        */
3369c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_UInt32  standard_char3;             /* ditto                        */
337ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } AF_ScriptClassRec;
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
3409c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef const AF_ScriptClassRec*  AF_ScriptClass;
3419c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3429c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3439c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
3449c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
3459c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                                                               *****/
3469c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                      C O V E R A G E S                        *****/
3479c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                                                               *****/
3489c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
3499c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
3509c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3519c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*
3529c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  Usually, a font contains more glyphs than can be addressed by its
3539c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  character map.
3549c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *
3559c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  In the PostScript font world, encoding vectors specific to a given
3569c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  task are used to select such glyphs, and these glyphs can be often
3579c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  recognized by having a suffix in its glyph names.  For example, a
3589c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  superscript glyph `A' might be called `A.sup'.  Unfortunately, this
3599c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  naming scheme is not standardized and thus unusable for us.
3609c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *
3619c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  In the OpenType world, a better solution was invented, namely
3629c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  `features', which cleanly separate a character's input encoding from
3639c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  the corresponding glyph's appearance, and which don't use glyph names
3649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  at all.  For our purposes, and slightly generalized, an OpenType
3659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  feature is a name of a mapping that maps character codes to
3669c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  non-standard glyph indices (features get used for other things also).
3679c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  For example, the `sups' feature provides superscript glyphs, thus
3689c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  mapping character codes like `A' or `B' to superscript glyph
3699c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  representation forms.  How this mapping happens is completely
3709c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  uninteresting to us.
3719c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *
3729c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  For the auto-hinter, a `coverage' represents all glyphs of an OpenType
3739c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  feature collected in a set (as listed below) that can be hinted
3749c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  together.  To continue the above example, superscript glyphs must not
3759c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  be hinted together with normal glyphs because the blue zones
3769c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  completely differ.
3779c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *
3789c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  Note that FreeType itself doesn't compute coverages; it only provides
3799c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  the glyphs addressable by the default Unicode character map.  Instead,
3809c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  we use the HarfBuzz library (if available), which has many functions
3819c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  exactly for this purpose.
3829c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *
3839c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  AF_COVERAGE_DEFAULT is special: It should cover everything that isn't
3849c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  listed separately (including the glyphs addressable by the character
3859c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  map).  In case HarfBuzz isn't available, it exactly covers the glyphs
3869c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  addressable by the character map.
3879c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *
3889c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   */
3899c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3909c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#undef  COVERAGE
3919c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define COVERAGE( name, NAME, description, \
3929c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod                  tag1, tag2, tag3, tag4 ) \
3939c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          AF_COVERAGE_ ## NAME,
3949c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3959c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
3969c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef enum  AF_Coverage_
3979c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  {
3989c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afcover.h"
3999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4009c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_COVERAGE_DEFAULT
4019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  } AF_Coverage;
4039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4049c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4059c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
4069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
4079c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                                                               *****/
4089c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                         S T Y L E S                           *****/
4099c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                                                               *****/
4109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
4119c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
4129c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4139c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*
4149c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  The topmost structure for modelling the auto-hinter glyph input data
4159c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   *  is a `style class', grouping everything together.
4169c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod   */
4179c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4189c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#undef  STYLE
4199c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define STYLE( s, S, d, ws, sc, ss, c ) \
4209c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          AF_STYLE_ ## S,
4219c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4229c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* The list of known styles. */
4239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef enum  AF_Style_
4249c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  {
4259c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4269c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#include "afstyles.h"
4279c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4289c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_STYLE_MAX   /* do not remove */
4299c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4309c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  } AF_Style;
4319c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4329c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4339c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef struct  AF_StyleClassRec_
4349c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  {
4359c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_Style  style;
4369c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4379c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_WritingSystem   writing_system;
4389c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_Script          script;
4399c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_Blue_Stringset  blue_stringset;
4409c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_Coverage        coverage;
4419c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4429c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  } AF_StyleClassRec;
4439c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4449c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef const AF_StyleClassRec*  AF_StyleClass;
4459c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4469c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4479c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
4489c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
4499c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                                                               *****/
4509c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                   S T Y L E   M E T R I C S                   *****/
4519c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*****                                                               *****/
4529c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
4539c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /*************************************************************************/
4549c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4559c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef struct AF_FaceGlobalsRec_*  AF_FaceGlobals;
4569c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4579c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* This is the main structure that combines everything.  Autofit modules */
4589c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* specific to writing systems derive their structures from it, for      */
4599c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  /* example `AF_LatinMetrics'.                                            */
4609c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4619c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  typedef struct  AF_StyleMetricsRec_
4629c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  {
4639c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_StyleClass   style_class;
4649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_ScalerRec    scaler;
4659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    FT_Bool         digits_have_same_width;
4669c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4679c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    AF_FaceGlobals  globals;    /* to access properties */
4689c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
4699c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  } AF_StyleMetricsRec;
4709c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
471aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
472aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  /* Declare and define vtables for classes */
473295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifndef FT_CONFIG_OPTION_PIC
474295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
475ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \
476ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_CALLBACK_TABLE const AF_WritingSystemClassRec              \
477ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  writing_system_class;
478ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
479ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_DEFINE_WRITING_SYSTEM_CLASS(                  \
480ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          writing_system_class,                          \
481ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          system,                                        \
482ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          m_size,                                        \
483ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          m_init,                                        \
484ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          m_scale,                                       \
485ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          m_done,                                        \
486ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          h_init,                                        \
487ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          h_apply )                                      \
488ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_CALLBACK_TABLE_DEF                                  \
489ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  const AF_WritingSystemClassRec  writing_system_class = \
490ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {                                                      \
491ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    system,                                              \
492ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                                                         \
493ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    m_size,                                              \
494ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                                                         \
495ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    m_init,                                              \
496ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    m_scale,                                             \
497ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    m_done,                                              \
498ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                                                         \
499ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    h_init,                                              \
500ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    h_apply                                              \
501ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  };
502ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
503ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
504aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#define AF_DECLARE_SCRIPT_CLASS( script_class ) \
505aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner  FT_CALLBACK_TABLE const AF_ScriptClassRec     \
506295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  script_class;
507295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
508ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_DEFINE_SCRIPT_CLASS(           \
509ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          script_class,                   \
5109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          script,                         \
511ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          ranges,                         \
5129c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          std_char1,                      \
5139c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          std_char2,                      \
5149c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          std_char3 )                     \
515ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_CALLBACK_TABLE_DEF                   \
516ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  const AF_ScriptClassRec  script_class = \
517ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {                                       \
5189c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    script,                               \
519ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ranges,                               \
5209c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    std_char1,                            \
5219c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    std_char2,                            \
5229c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    std_char3                             \
5239c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  };
5249c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
5259c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
5269c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define AF_DECLARE_STYLE_CLASS( style_class ) \
5279c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  FT_CALLBACK_TABLE const AF_StyleClassRec    \
5289c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  style_class;
5299c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
5309c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define AF_DEFINE_STYLE_CLASS(          \
5319c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          style_class,                  \
5329c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          style,                        \
5339c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          writing_system,               \
5349c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          script,                       \
5359c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          blue_stringset,               \
5369c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          coverage )                    \
5379c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  FT_CALLBACK_TABLE_DEF                 \
5389c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  const AF_StyleClassRec  style_class = \
5399c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  {                                     \
5409c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    style,                              \
5419c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    writing_system,                     \
5429c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    script,                             \
5439c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    blue_stringset,                     \
5449c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    coverage                            \
545295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  };
546295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
547aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#else /* FT_CONFIG_OPTION_PIC */
548aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
549ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class )            \
550ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_LOCAL( void )                                                         \
551ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec*  ac );
552ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
553ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_DEFINE_WRITING_SYSTEM_CLASS(                                   \
554ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          writing_system_class,                                           \
555ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          system,                                                         \
556ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          m_size,                                                         \
557ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          m_init,                                                         \
558ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          m_scale,                                                        \
559ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          m_done,                                                         \
560ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          h_init,                                                         \
561ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          h_apply )                                                       \
562ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_LOCAL_DEF( void )                                                    \
563ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec*  ac ) \
564ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {                                                                       \
5659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->writing_system      = system;                                     \
566ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                                                                          \
5679c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->style_metrics_size  = m_size;                                     \
568ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                                                                          \
5699c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->style_metrics_init  = m_init;                                     \
5709c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->style_metrics_scale = m_scale;                                    \
5719c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->style_metrics_done  = m_done;                                     \
572ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease                                                                          \
5739c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->style_hints_init    = h_init;                                     \
5749c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->style_hints_apply   = h_apply;                                    \
575ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  }
576ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
577ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
578727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define AF_DECLARE_SCRIPT_CLASS( script_class )             \
579727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_LOCAL( void )                                          \
580727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease  FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac );
581aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
582ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define AF_DEFINE_SCRIPT_CLASS(                            \
583ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          script_class,                                    \
584ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          script_,                                         \
585ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease          ranges,                                          \
5869c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          std_char1,                                       \
5879c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          std_char2,                                       \
5889c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          std_char3 )                                      \
589ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_LOCAL_DEF( void )                                     \
590ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac ) \
591ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  {                                                        \
592ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ac->script            = script_;                       \
593ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ac->script_uni_ranges = ranges;                        \
5949c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->standard_char1    = std_char1;                     \
5959c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->standard_char2    = std_char2;                     \
5969c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->standard_char3    = std_char3;                     \
5979c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  }
5989c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
5999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
6009c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define AF_DECLARE_STYLE_CLASS( style_class )             \
6019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  FT_LOCAL( void )                                        \
6029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  FT_Init_Class_ ## style_class( AF_StyleClassRec*  ac );
6039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod
6049c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod#define AF_DEFINE_STYLE_CLASS(                           \
6059c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          style_class,                                   \
6069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          style_,                                        \
6079c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          writing_system_,                               \
6089c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          script_,                                       \
6099c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          blue_stringset_,                               \
6109c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod          coverage_ )                                    \
6119c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  FT_LOCAL_DEF( void )                                   \
6129c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  FT_Init_Class_ ## style_class( AF_StyleClassRec*  ac ) \
6139c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod  {                                                      \
6149c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->style          = style_;                         \
6159c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->writing_system = writing_system_;                \
6169c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->script         = script_;                        \
6179c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->blue_stringset = blue_stringset_;                \
6189c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod    ac->coverage       = coverage_;                      \
619295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner  }
620aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
621aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif /* FT_CONFIG_OPTION_PIC */
622295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner
623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */
625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectFT_END_HEADER
627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* __AFTYPES_H__ */
629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
632