2 |
- |
1 |
/* Copyright (C) 1990, 2000 Aladdin Enterprises. All rights reserved.
|
|
|
2 |
|
|
|
3 |
This software is provided AS-IS with no warranty, either express or
|
|
|
4 |
implied.
|
|
|
5 |
|
|
|
6 |
This software is distributed under license and may not be copied,
|
|
|
7 |
modified or distributed except as expressly authorized under the terms
|
|
|
8 |
of the license contained in the file LICENSE in this distribution.
|
|
|
9 |
|
|
|
10 |
For more information about licensing, please refer to
|
|
|
11 |
http://www.ghostscript.com/licensing/. For information on
|
|
|
12 |
commercial licensing, go to http://www.artifex.com/licensing/ or
|
|
|
13 |
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
|
|
|
14 |
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
|
|
|
15 |
*/
|
|
|
16 |
|
|
|
17 |
/* $Id: gxhintn.h,v 1.24 2005/09/04 20:42:53 leonardo Exp $ */
|
|
|
18 |
/* Type 1 hinter, prototypes */
|
|
|
19 |
|
|
|
20 |
#ifndef gxhintn_INCLUDED
|
|
|
21 |
# define gxhintn_INCLUDED
|
|
|
22 |
|
|
|
23 |
#include "stdint_.h"
|
|
|
24 |
|
|
|
25 |
#define FINE_STEM_COMPLEXES 1 /* A temporary development purpose. */
|
|
|
26 |
#define ALIGN_BY_STEM_MIDDLE 1 /* A temporary development purpose. */
|
|
|
27 |
#define OPPOSITE_STEM_COORD_BUG_FIX 1 /* A temporary development purpose. */
|
|
|
28 |
#define TT_AUTOHINT_TOPZONE_BUG_FIX 1 /* A temporary development purpose. */
|
|
|
29 |
|
|
|
30 |
|
|
|
31 |
#ifndef gs_type1_data_DEFINED
|
|
|
32 |
#define gs_type1_data_DEFINED
|
|
|
33 |
typedef struct gs_type1_data_s gs_type1_data;
|
|
|
34 |
#endif
|
|
|
35 |
|
|
|
36 |
#ifndef gs_type42_data_DEFINED
|
|
|
37 |
#define gs_type42_data_DEFINED
|
|
|
38 |
typedef struct gs_type42_data_s gs_type42_data;
|
|
|
39 |
#endif
|
|
|
40 |
|
|
|
41 |
#ifndef gx_path_DEFINED
|
|
|
42 |
# define gx_path_DEFINED
|
|
|
43 |
typedef struct gx_path_s gx_path;
|
|
|
44 |
#endif
|
|
|
45 |
|
|
|
46 |
#define T1_MAX_STEM_SNAPS 12
|
|
|
47 |
#define T1_MAX_ALIGNMENT_ZONES 6
|
|
|
48 |
#define T1_MAX_CONTOURS 10
|
|
|
49 |
#define T1_MAX_POLES (100 + T1_MAX_CONTOURS) /* Must be grater than 8 for 'flex'. */
|
|
|
50 |
#define T1_MAX_HINTS 30
|
|
|
51 |
|
|
|
52 |
typedef fixed t1_glyph_space_coord; /* measured in original glyph space units */
|
|
|
53 |
typedef int32_t t1_hinter_space_coord; /* measured in internal outliner's space units */
|
|
|
54 |
typedef int32_t int19;
|
|
|
55 |
|
|
|
56 |
enum t1_hint_type
|
|
|
57 |
{ hstem, vstem, dot
|
|
|
58 |
};
|
|
|
59 |
|
|
|
60 |
enum t1_pole_type
|
|
|
61 |
{ offcurve, oncurve, closepath, moveto
|
|
|
62 |
};
|
|
|
63 |
|
|
|
64 |
enum t1_zone_type
|
|
|
65 |
{ topzone, botzone
|
|
|
66 |
};
|
|
|
67 |
|
|
|
68 |
enum t1_align_type
|
|
|
69 |
{ unaligned, weak, aligned, topzn, botzn
|
|
|
70 |
#if !FINE_STEM_COMPLEXES
|
|
|
71 |
/* 'weak' is never used. Defined to simplify a compatibility testing. */
|
|
|
72 |
#endif
|
|
|
73 |
};
|
|
|
74 |
|
|
|
75 |
typedef struct {
|
|
|
76 |
double xx, xy, yx, yy;
|
|
|
77 |
} double_matrix;
|
|
|
78 |
|
|
|
79 |
typedef struct {
|
|
|
80 |
int19 xx, xy, yx, yy;
|
|
|
81 |
int32_t denominator;
|
|
|
82 |
unsigned int bitshift;
|
|
|
83 |
} fraction_matrix;
|
|
|
84 |
|
|
|
85 |
typedef struct t1_pole_s /* a pole of outline */
|
|
|
86 |
{ t1_glyph_space_coord gx,gy; /* source unaligned coords */
|
|
|
87 |
t1_glyph_space_coord ax,ay; /* aligned coords */
|
|
|
88 |
t1_hinter_space_coord ox,oy;
|
|
|
89 |
enum t1_pole_type type;
|
|
|
90 |
int contour_index;
|
|
|
91 |
enum t1_align_type aligned_x, aligned_y;
|
|
|
92 |
} t1_pole;
|
|
|
93 |
|
|
|
94 |
typedef struct t1_hint_s
|
|
|
95 |
{ enum t1_hint_type type;
|
|
|
96 |
t1_glyph_space_coord g0, g1; /* starting and ending transversal coord of the stem */
|
|
|
97 |
t1_glyph_space_coord ag0, ag1; /* starting and ending transversal aligned coord of the stem */
|
|
|
98 |
bool b0, b1; /* g0, g1 correspond to a real stem. */
|
|
|
99 |
#if !FINE_STEM_COMPLEXES
|
|
|
100 |
/* b0, b1 are unused. Defined to simplify a compatibility testing. */
|
|
|
101 |
#endif
|
|
|
102 |
enum t1_align_type aligned0, aligned1; /* ag0, ag1 is aligned */
|
|
|
103 |
int q0, q1; /* Stem quality tangent. */
|
|
|
104 |
unsigned int stem3_index; /* 1,2,3 for stem3 (not used yet), 0 for other types */
|
|
|
105 |
int range_index; /* type 2 only */
|
|
|
106 |
int side_mask;
|
|
|
107 |
} t1_hint;
|
|
|
108 |
|
|
|
109 |
typedef struct t1_hint_range_s
|
|
|
110 |
{ short beg_pole, end_pole;
|
|
|
111 |
int contour_index;
|
|
|
112 |
int next;
|
|
|
113 |
} t1_hint_range; /* type 2 only */
|
|
|
114 |
|
|
|
115 |
typedef struct t1_zone_s /* alignment zone */
|
|
|
116 |
{ enum t1_zone_type type;
|
|
|
117 |
t1_glyph_space_coord y, overshoot_y;
|
|
|
118 |
t1_glyph_space_coord y_min, y_max;
|
|
|
119 |
} t1_zone;
|
|
|
120 |
|
|
|
121 |
typedef struct t1_hinter_s
|
|
|
122 |
{ fraction_matrix ctmf;
|
|
|
123 |
fraction_matrix ctmi;
|
|
|
124 |
unsigned int g2o_fraction_bits;
|
|
|
125 |
unsigned int max_import_coord;
|
|
|
126 |
int32_t g2o_fraction;
|
|
|
127 |
t1_glyph_space_coord orig_gx, orig_gy; /* glyph origin in glyph space */
|
|
|
128 |
t1_glyph_space_coord subglyph_orig_gx, subglyph_orig_gy; /* glyph origin in glyph space */
|
|
|
129 |
fixed orig_dx, orig_dy; /* glyph origin in device space */
|
|
|
130 |
fixed orig_ox, orig_oy; /* glyph origin in hinter space */
|
|
|
131 |
t1_glyph_space_coord width_gx, width_gy; /* glyph space coords of the glyph origin */
|
|
|
132 |
t1_glyph_space_coord cx, cy; /* current point */
|
|
|
133 |
t1_glyph_space_coord bx, by; /* starting point of a contour */
|
|
|
134 |
uint log2_pixels_x, log2_pixels_y; /* log2 of the number of pixels in unit (by an axis) */
|
|
|
135 |
int log2_subpixels_x, log2_subpixels_y; /* log2 of the number of subpixels in unit (may be negative) */
|
|
|
136 |
bool transposed;
|
|
|
137 |
bool align_to_pixels; /* false == "align to (integral) pixels" */
|
|
|
138 |
bool disable_hinting;
|
|
|
139 |
bool grid_fit_x, grid_fit_y;
|
|
|
140 |
bool charpath_flag;
|
|
|
141 |
bool path_opened;
|
|
|
142 |
bool autohinting;
|
|
|
143 |
t1_glyph_space_coord blue_shift, blue_fuzz;
|
|
|
144 |
t1_pole pole0[T1_MAX_POLES], *pole;
|
|
|
145 |
t1_hint hint0[T1_MAX_HINTS], *hint;
|
|
|
146 |
t1_zone zone0[T1_MAX_ALIGNMENT_ZONES], *zone;
|
|
|
147 |
int contour0[T1_MAX_CONTOURS], *contour;
|
|
|
148 |
t1_glyph_space_coord stem_snap0[2][T1_MAX_STEM_SNAPS + 1]; /* StdWH + StemSnapH, StdWV + StemSnapV */
|
|
|
149 |
t1_glyph_space_coord *stem_snap[2];
|
|
|
150 |
t1_hint_range hint_range0[T1_MAX_HINTS], *hint_range;
|
|
|
151 |
int stem_snap_count[2], max_stem_snap_count[2]; /* H, V */
|
|
|
152 |
int contour_count, max_contour_count;
|
|
|
153 |
int zone_count, max_zone_count;
|
|
|
154 |
int pole_count, max_pole_count;
|
|
|
155 |
int hint_count, max_hint_count;
|
|
|
156 |
int hint_range_count, max_hint_range_count;
|
|
|
157 |
int primary_hint_count;
|
|
|
158 |
int flex_count;
|
|
|
159 |
int FontType; /* 1 or 2 */
|
|
|
160 |
bool ForceBold;
|
|
|
161 |
bool seac_flag;
|
|
|
162 |
bool keep_stem_width;
|
|
|
163 |
bool suppress_overshoots;
|
|
|
164 |
double BlueScale;
|
|
|
165 |
double font_size;
|
|
|
166 |
double resolution;
|
|
|
167 |
double heigt_transform_coef;
|
|
|
168 |
double width_transform_coef;
|
|
|
169 |
double base_font_scale;
|
|
|
170 |
int19 width_transform_coef_rat;
|
|
|
171 |
int19 heigt_transform_coef_rat;
|
|
|
172 |
int19 width_transform_coef_inv;
|
|
|
173 |
int19 heigt_transform_coef_inv;
|
|
|
174 |
t1_glyph_space_coord overshoot_threshold;
|
|
|
175 |
t1_glyph_space_coord ymin, ymax, ymid;
|
|
|
176 |
gx_path *output_path;
|
|
|
177 |
gs_memory_t *memory;
|
|
|
178 |
} t1_hinter;
|
|
|
179 |
|
|
|
180 |
void t1_hinter__init(t1_hinter * this, gx_path *output_path);
|
|
|
181 |
int t1_hinter__set_mapping(t1_hinter * this, gs_matrix_fixed * ctm,
|
|
|
182 |
gs_matrix * FontMatrix, gs_matrix * baseFontMatrix,
|
|
|
183 |
int log2_pixels_x, int log2_pixels_y,
|
|
|
184 |
int log2_subpixels_x, int log2_subpixels_y,
|
|
|
185 |
fixed origin_x, fixed origin_y, bool align_to_pixels);
|
|
|
186 |
int t1_hinter__set_font_data(t1_hinter * this, int FontType, gs_type1_data *pdata,
|
|
|
187 |
bool no_grid_fitting);
|
|
|
188 |
int t1_hinter__set_font42_data(t1_hinter * this, int FontType, gs_type42_data *pdata,
|
|
|
189 |
bool no_grid_fitting);
|
|
|
190 |
|
|
|
191 |
int t1_hinter__sbw(t1_hinter * this, fixed sbx, fixed sby, fixed wx, fixed wy);
|
|
|
192 |
int t1_hinter__sbw_seac(t1_hinter * this, fixed sbx, fixed sby);
|
|
|
193 |
int t1_hinter__rmoveto(t1_hinter * this, fixed xx, fixed yy);
|
|
|
194 |
int t1_hinter__rlineto(t1_hinter *, fixed xx, fixed yy);
|
|
|
195 |
int t1_hinter__rcurveto(t1_hinter * this, fixed xx0, fixed yy0, fixed xx1, fixed yy1, fixed xx2, fixed yy2);
|
|
|
196 |
void t1_hinter__setcurrentpoint(t1_hinter * this, fixed xx, fixed yy);
|
|
|
197 |
int t1_hinter__closepath(t1_hinter * this);
|
|
|
198 |
|
|
|
199 |
int t1_hinter__flex_beg(t1_hinter * this);
|
|
|
200 |
int t1_hinter__flex_end(t1_hinter * this, fixed flex_height);
|
|
|
201 |
int t1_hinter__flex_point(t1_hinter * this);
|
|
|
202 |
|
|
|
203 |
int t1_hinter__hint_mask(t1_hinter * this, byte *mask);
|
|
|
204 |
int t1_hinter__drop_hints(t1_hinter * this);
|
|
|
205 |
int t1_hinter__dotsection(t1_hinter * this);
|
|
|
206 |
int t1_hinter__hstem(t1_hinter * this, fixed x0, fixed x1);
|
|
|
207 |
int t1_hinter__vstem(t1_hinter * this, fixed y0, fixed y1);
|
|
|
208 |
int t1_hinter__overall_hstem(t1_hinter * this, fixed x0, fixed x1, int side_mask);
|
|
|
209 |
int t1_hinter__hstem3(t1_hinter * this, fixed x0, fixed y1, fixed x2, fixed y3, fixed x4, fixed y5);
|
|
|
210 |
int t1_hinter__vstem3(t1_hinter * this, fixed y0, fixed y1, fixed y2, fixed y3, fixed y4, fixed y5);
|
|
|
211 |
|
|
|
212 |
int t1_hinter__endchar(t1_hinter * this, bool seac_flag);
|
|
|
213 |
int t1_hinter__endglyph(t1_hinter * this);
|
|
|
214 |
int t1_hinter__is_x_fitting(t1_hinter * this);
|
|
|
215 |
|
|
|
216 |
#endif /* gxhintn_INCLUDED */
|