1 | /**************************************************************************** |
2 | * |
3 | * psblues.h |
4 | * |
5 | * Adobe's code for handling Blue Zones (specification). |
6 | * |
7 | * Copyright 2009-2013 Adobe Systems Incorporated. |
8 | * |
9 | * This software, and all works of authorship, whether in source or |
10 | * object code form as indicated by the copyright notice(s) included |
11 | * herein (collectively, the "Work") is made available, and may only be |
12 | * used, modified, and distributed under the FreeType Project License, |
13 | * LICENSE.TXT. Additionally, subject to the terms and conditions of the |
14 | * FreeType Project License, each contributor to the Work hereby grants |
15 | * to any individual or legal entity exercising permissions granted by |
16 | * the FreeType Project License and this section (hereafter, "You" or |
17 | * "Your") a perpetual, worldwide, non-exclusive, no-charge, |
18 | * royalty-free, irrevocable (except as stated in this section) patent |
19 | * license to make, have made, use, offer to sell, sell, import, and |
20 | * otherwise transfer the Work, where such license applies only to those |
21 | * patent claims licensable by such contributor that are necessarily |
22 | * infringed by their contribution(s) alone or by combination of their |
23 | * contribution(s) with the Work to which such contribution(s) was |
24 | * submitted. If You institute patent litigation against any entity |
25 | * (including a cross-claim or counterclaim in a lawsuit) alleging that |
26 | * the Work or a contribution incorporated within the Work constitutes |
27 | * direct or contributory patent infringement, then any patent licenses |
28 | * granted to You under this License for that Work shall terminate as of |
29 | * the date such litigation is filed. |
30 | * |
31 | * By using, modifying, or distributing the Work you indicate that you |
32 | * have read and understood the terms and conditions of the |
33 | * FreeType Project License as well as those provided in this section, |
34 | * and you accept them fully. |
35 | * |
36 | */ |
37 | |
38 | |
39 | /* |
40 | * A `CF2_Blues' object stores the blue zones (horizontal alignment |
41 | * zones) of a font. These are specified in the CFF private dictionary |
42 | * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'. |
43 | * Each zone is defined by a top and bottom edge in character space. |
44 | * Further, each zone is either a top zone or a bottom zone, as recorded |
45 | * by `bottomZone'. |
46 | * |
47 | * The maximum number of `BlueValues' and `FamilyBlues' is 7 each. |
48 | * However, these are combined to produce a total of 7 zones. |
49 | * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues' |
50 | * is 5 and these are combined to produce an additional 5 zones. |
51 | * |
52 | * Blue zones are used to `capture' hints and force them to a common |
53 | * alignment point. This alignment is recorded in device space in |
54 | * `dsFlatEdge'. Except for this value, a `CF2_Blues' object could be |
55 | * constructed independently of scaling. Construction may occur once |
56 | * the matrix is known. Other features implemented in the Capture |
57 | * method are overshoot suppression, overshoot enforcement, and Blue |
58 | * Boost. |
59 | * |
60 | * Capture is determined by `BlueValues' and `OtherBlues', but the |
61 | * alignment point may be adjusted to the scaled flat edge of |
62 | * `FamilyBlues' or `FamilyOtherBlues'. No alignment is done to the |
63 | * curved edge of a zone. |
64 | * |
65 | */ |
66 | |
67 | |
68 | #ifndef PSBLUES_H_ |
69 | #define PSBLUES_H_ |
70 | |
71 | |
72 | #include "psglue.h" |
73 | |
74 | |
75 | FT_BEGIN_HEADER |
76 | |
77 | |
78 | /* |
79 | * `CF2_Hint' is shared by `cf2hints.h' and |
80 | * `cf2blues.h', but `cf2blues.h' depends on |
81 | * `cf2hints.h', so define it here. Note: The typedef is in |
82 | * `cf2glue.h'. |
83 | * |
84 | */ |
85 | enum |
86 | { |
87 | CF2_GhostBottom = 0x1, /* a single bottom edge */ |
88 | CF2_GhostTop = 0x2, /* a single top edge */ |
89 | CF2_PairBottom = 0x4, /* the bottom edge of a stem hint */ |
90 | CF2_PairTop = 0x8, /* the top edge of a stem hint */ |
91 | CF2_Locked = 0x10, /* this edge has been aligned */ |
92 | /* by a blue zone */ |
93 | CF2_Synthetic = 0x20 /* this edge was synthesized */ |
94 | }; |
95 | |
96 | |
97 | /* |
98 | * Default value for OS/2 typoAscender/Descender when their difference |
99 | * is not equal to `unitsPerEm'. The default is based on -250 and 1100 |
100 | * in `CF2_Blues', assuming 1000 units per em here. |
101 | * |
102 | */ |
103 | enum |
104 | { |
105 | CF2_ICF_Top = cf2_intToFixed( 880 ), |
106 | CF2_ICF_Bottom = cf2_intToFixed( -120 ) |
107 | }; |
108 | |
109 | |
110 | /* |
111 | * Constant used for hint adjustment and for synthetic em box hint |
112 | * placement. |
113 | */ |
114 | #define CF2_MIN_COUNTER cf2_doubleToFixed( 0.5 ) |
115 | |
116 | |
117 | /* shared typedef is in cf2glue.h */ |
118 | struct CF2_HintRec_ |
119 | { |
120 | CF2_UInt flags; /* attributes of the edge */ |
121 | size_t index; /* index in original stem hint array */ |
122 | /* (if not synthetic) */ |
123 | CF2_Fixed csCoord; |
124 | CF2_Fixed dsCoord; |
125 | CF2_Fixed scale; |
126 | }; |
127 | |
128 | |
129 | typedef struct CF2_BlueRec_ |
130 | { |
131 | CF2_Fixed csBottomEdge; |
132 | CF2_Fixed csTopEdge; |
133 | CF2_Fixed csFlatEdge; /* may be from either local or Family zones */ |
134 | CF2_Fixed dsFlatEdge; /* top edge of bottom zone or bottom edge */ |
135 | /* of top zone (rounded) */ |
136 | FT_Bool bottomZone; |
137 | |
138 | } CF2_BlueRec; |
139 | |
140 | |
141 | /* max total blue zones is 12 */ |
142 | enum |
143 | { |
144 | CF2_MAX_BLUES = 7, |
145 | CF2_MAX_OTHERBLUES = 5 |
146 | }; |
147 | |
148 | |
149 | typedef struct CF2_BluesRec_ |
150 | { |
151 | CF2_Fixed scale; |
152 | CF2_UInt count; |
153 | FT_Bool suppressOvershoot; |
154 | FT_Bool doEmBoxHints; |
155 | |
156 | CF2_Fixed blueScale; |
157 | CF2_Fixed blueShift; |
158 | CF2_Fixed blueFuzz; |
159 | |
160 | CF2_Fixed boost; |
161 | |
162 | CF2_HintRec emBoxTopEdge; |
163 | CF2_HintRec emBoxBottomEdge; |
164 | |
165 | CF2_BlueRec zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES]; |
166 | |
167 | } CF2_BluesRec, *CF2_Blues; |
168 | |
169 | |
170 | FT_LOCAL( void ) |
171 | cf2_blues_init( CF2_Blues blues, |
172 | CF2_Font font ); |
173 | FT_LOCAL( FT_Bool ) |
174 | cf2_blues_capture( const CF2_Blues blues, |
175 | CF2_Hint bottomHintEdge, |
176 | CF2_Hint topHintEdge ); |
177 | |
178 | |
179 | FT_END_HEADER |
180 | |
181 | |
182 | #endif /* PSBLUES_H_ */ |
183 | |
184 | |
185 | /* END */ |
186 | |