XFA: merge patch from CL 815103002
[pdfium.git] / third_party / freetype / include / ftcffdrv.h
1 /***************************************************************************/
2 /*                                                                         */
3 /*  ftcffdrv.h                                                             */
4 /*                                                                         */
5 /*    FreeType API for controlling the CFF driver (specification only).    */
6 /*                                                                         */
7 /*  Copyright 2013, 2014 by                                                */
8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
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 #ifndef __FTCFFDRV_H__
20 #define __FTCFFDRV_H__
21
22 #include <ft2build.h>
23 #include FT_FREETYPE_H
24
25 #ifdef FREETYPE_H
26 #error "freetype.h of FreeType 1 has been loaded!"
27 #error "Please fix the directory search order for header files"
28 #error "so that freetype.h of FreeType 2 is found first."
29 #endif
30
31
32 FT_BEGIN_HEADER
33
34
35   /**************************************************************************
36    *
37    * @section:
38    *   cff_driver
39    *
40    * @title:
41    *   The CFF driver
42    *
43    * @abstract:
44    *   Controlling the CFF driver module.
45    *
46    * @description:
47    *   While FreeType's CFF driver doesn't expose API functions by itself,
48    *   it is possible to control its behaviour with @FT_Property_Set and
49    *   @FT_Property_Get.  The list below gives the available properties
50    *   together with the necessary macros and structures.
51    *
52    *   The CFF driver's module name is `cff'.
53    *
54    *   *Hinting* *and* *antialiasing* *principles* *of* *the* *new* *engine*
55    *
56    *   The rasterizer is positioning horizontal features (e.g., ascender
57    *   height & x-height, or crossbars) on the pixel grid and minimizing the
58    *   amount of antialiasing applied to them, while placing vertical
59    *   features (vertical stems) on the pixel grid without hinting, thus
60    *   representing the stem position and weight accurately.  Sometimes the
61    *   vertical stems may be only partially black.  In this context,
62    *   `antialiasing' means that stems are not positioned exactly on pixel
63    *   borders, causing a fuzzy appearance.
64    *
65    *   There are two principles behind this approach.
66    *
67    *   1) No hinting in the horizontal direction: Unlike `superhinted'
68    *   TrueType, which changes glyph widths to accommodate regular
69    *   inter-glyph spacing, Adobe's approach is `faithful to the design' in
70    *   representing both the glyph width and the inter-glyph spacing
71    *   designed for the font.  This makes the screen display as close as it
72    *   can be to the result one would get with infinite resolution, while
73    *   preserving what is considered the key characteristics of each glyph.
74    *   Note that the distances between unhinted and grid-fitted positions at
75    *   small sizes are comparable to kerning values and thus would be
76    *   noticeable (and distracting) while reading if hinting were applied.
77    *
78    *   One of the reasons to not hint horizontally is antialiasing for LCD
79    *   screens: The pixel geometry of modern displays supplies three
80    *   vertical sub-pixels as the eye moves horizontally across each visible
81    *   pixel.  On devices where we can be certain this characteristic is
82    *   present a rasterizer can take advantage of the sub-pixels to add
83    *   increments of weight.  In Western writing systems this turns out to
84    *   be the more critical direction anyway; the weights and spacing of
85    *   vertical stems (see above) are central to Armenian, Cyrillic, Greek,
86    *   and Latin type designs.  Even when the rasterizer uses greyscale
87    *   antialiasing instead of color (a necessary compromise when one
88    *   doesn't know the screen characteristics), the unhinted vertical
89    *   features preserve the design's weight and spacing much better than
90    *   aliased type would.
91    *
92    *   2) Aligment in the vertical direction: Weights and spacing along the
93    *   y~axis are less critical; what is much more important is the visual
94    *   alignment of related features (like cap-height and x-height).  The
95    *   sense of alignment for these is enhanced by the sharpness of grid-fit
96    *   edges, while the cruder vertical resolution (full pixels instead of
97    *   1/3 pixels) is less of a problem.
98    *
99    *   On the technical side, horizontal alignment zones for ascender,
100    *   x-height, and other important height values (traditionally called
101    *   `blue zones') as defined in the font are positioned independently,
102    *   each being rounded to the nearest pixel edge, taking care of
103    *   overshoot suppression at small sizes, stem darkening, and scaling.
104    *
105    *   Hstems (this is, hint values defined in the font to help align
106    *   horizontal features) that fall within a blue zone are said to be
107    *   `captured' and are aligned to that zone.  Uncaptured stems are moved
108    *   in one of four ways, top edge up or down, bottom edge up or down.
109    *   Unless there are conflicting hstems, the smallest movement is taken
110    *   to minimize distortion.
111    *
112    * @order:
113    *   hinting-engine
114    *   no-stem-darkening
115    *   darkening-parameters
116    *
117    */
118
119
120   /**************************************************************************
121    *
122    * @property:
123    *   hinting-engine
124    *
125    * @description:
126    *   Thanks to Adobe, which contributed a new hinting (and parsing)
127    *   engine, an application can select between `freetype' and `adobe' if
128    *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration
129    *   macro isn't defined, `hinting-engine' does nothing.
130    *
131    *   The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
132    *   defined, and `adobe' otherwise.
133    *
134    *   The following example code demonstrates how to select Adobe's hinting
135    *   engine (omitting the error handling).
136    *
137    *   {
138    *     FT_Library  library;
139    *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
140    *
141    *
142    *     FT_Init_FreeType( &library );
143    *
144    *     FT_Property_Set( library, "cff",
145    *                               "hinting-engine", &hinting_engine );
146    *   }
147    *
148    * @note:
149    *   This property can be used with @FT_Property_Get also.
150    *
151    */
152
153
154   /**************************************************************************
155    *
156    * @enum:
157    *   FT_CFF_HINTING_XXX
158    *
159    * @description:
160    *   A list of constants used for the @hinting-engine property to select
161    *   the hinting engine for CFF fonts.
162    *
163    * @values:
164    *   FT_CFF_HINTING_FREETYPE ::
165    *     Use the old FreeType hinting engine.
166    *
167    *   FT_CFF_HINTING_ADOBE ::
168    *     Use the hinting engine contributed by Adobe.
169    *
170    */
171 #define FT_CFF_HINTING_FREETYPE  0
172 #define FT_CFF_HINTING_ADOBE     1
173
174
175   /**************************************************************************
176    *
177    * @property:
178    *   no-stem-darkening
179    *
180    * @description:
181    *   By default, the Adobe CFF engine darkens stems at smaller sizes,
182    *   regardless of hinting, to enhance contrast.  This feature requires
183    *   a rendering system with proper gamma correction.  Setting this
184    *   property, stem darkening gets switched off.
185    *
186    *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
187    *
188    *   {
189    *     FT_Library  library;
190    *     FT_Bool     no_stem_darkening = TRUE;
191    *
192    *
193    *     FT_Init_FreeType( &library );
194    *
195    *     FT_Property_Set( library, "cff",
196    *                               "no-stem-darkening", &no_stem_darkening );
197    *   }
198    *
199    * @note:
200    *   This property can be used with @FT_Property_Get also.
201    *
202    */
203
204
205   /**************************************************************************
206    *
207    * @property:
208    *   darkening-parameters
209    *
210    * @description:
211    *   By default, the Adobe CFF engine darkens stems as follows (if the
212    *   `no-stem-darkening' property isn't set):
213    *
214    *   {
215    *     stem width <= 0.5px:   darkening amount = 0.4px
216    *     stem width  = 1px:     darkening amount = 0.275px
217    *     stem width  = 1.667px: darkening amount = 0.275px
218    *     stem width >= 2.333px: darkening amount = 0px
219    *   }
220    *
221    *   and piecewise linear in-between.  At configuration time, these four
222    *   control points can be set with the macro
223    *   `CFF_CONFIG_OPTION_DARKENING_PARAMETERS'.  At runtime, the control
224    *   points can be changed using the `darkening-parameters' property, as
225    *   the following example demonstrates.
226    *
227    *   {
228    *     FT_Library  library;
229    *     FT_Int      darken_params[8] = {  500, 300,   // x1, y1
230    *                                      1000, 200,   // x2, y2
231    *                                      1500, 100,   // x3, y3
232    *                                      2000,   0 }; // x4, y4
233    *
234    *
235    *     FT_Init_FreeType( &library );
236    *
237    *     FT_Property_Set( library, "cff",
238    *                               "darkening-parameters", darken_params );
239    *   }
240    *
241    *   The x~values give the stem width, and the y~values the darkening
242    *   amount.  The unit is 1000th of pixels.  All coordinate values must be
243    *   positive; the x~values must be monotonically increasing; the
244    *   y~values must be monotonically decreasing and smaller than or
245    *   equal to 500 (corresponding to half a pixel); the slope of each
246    *   linear piece must be shallower than -1 (e.g., -.4).
247    *
248    * @note:
249    *   This property can be used with @FT_Property_Get also.
250    *
251    */
252
253   /* */
254
255
256 FT_END_HEADER
257
258
259 #endif /* __FTCFFDRV_H__ */
260
261
262 /* END */