4 * Copyright (C) 2011-2012 by Werner Lemberg.
6 * This file is part of the ttfautohint library, and may only be used,
7 * modified, and distributed under the terms given in `COPYING'. By
8 * continuing to use, modify, or distribute this file you indicate that you
9 * have read `COPYING' and understand and accept it fully.
11 * The file `COPYING' mentioned in the previous paragraph is distributed
12 * with the ttfautohint library.
19 #define PREP(snippet_name) prep_ ## snippet_name
22 unsigned char PREP(hinting_limit_a
) [] =
25 /* first of all, check whether we do hinting at all */
32 /* %d, hinting size limit */
34 unsigned char PREP(hinting_limit_b
) [] =
40 1, /* switch off hinting */
47 /* we often need 0x10000 which can't be pushed directly onto the stack, */
48 /* thus we provide it in the CVT as `cvtl_0x10000'; */
49 /* at the same time, we store it in CVT index `cvtl_funits_to_pixels' also */
50 /* as a scaled value to have a conversion factor from FUnits to pixels */
52 unsigned char PREP(store_0x10000
) [] =
70 cvtl_funits_to_pixels
,
72 WCVTF
, /* store value 1 in 16.16 format, scaled */
76 unsigned char PREP(align_top_a
) [] =
79 /* optimize the alignment of the top of small letters to the pixel grid */
85 /* %c, index of alignment blue zone */
87 unsigned char PREP(align_top_b
) [] =
96 unsigned char PREP(align_top_c1
) [] =
99 /* this is for option `increase_x_height': */
100 /* apply much `stronger' rounding up of x height for 5 < PPEM < 15 */
112 52, /* threshold = 52 */
116 40, /* threshold = 40 */
120 FLOOR
, /* fitted = FLOOR(scaled + threshold) */
124 unsigned char PREP(align_top_c2
) [] =
130 FLOOR
, /* fitted = FLOOR(scaled + 40) */
134 unsigned char PREP(align_top_d
) [] =
137 DUP
, /* s: scaled scaled fitted fitted */
140 IF
, /* s: scaled fitted */
144 SUB
, /* s: scaled (fitted-scaled) */
148 MUL
, /* (fitted-scaled) in 16.16 format */
150 DIV
, /* ((fitted-scaled) / scaled) in 16.16 format */
159 unsigned char PREP(loop_cvt_a
) [] =
162 /* loop over vertical CVT entries */
167 /* %c, first vertical index */
168 /* %c, last vertical index */
170 unsigned char PREP(loop_cvt_b
) [] =
177 /* loop over blue refs */
182 /* %c, first blue ref index */
183 /* %c, last blue ref index */
185 unsigned char PREP(loop_cvt_c
) [] =
192 /* loop over blue shoots */
197 /* %c, first blue shoot index */
198 /* %c, last blue shoot index */
200 unsigned char PREP(loop_cvt_d
) [] =
210 unsigned char PREP(compute_extra_light_a
) [] =
213 /* compute (vertical) `extra_light' flag */
220 /* %c, index of vertical standard_width */
222 unsigned char PREP(compute_extra_light_b
) [] =
226 GT
, /* standard_width < 40 */
231 unsigned char PREP(round_blues_a
) [] =
234 /* use discrete values for blue zone widths */
239 /* %c, first blue ref index */
240 /* %c, last blue ref index */
242 unsigned char PREP(round_blues_b
) [] =
251 unsigned char PREP(set_dropout_mode
) [] =
255 0x01, /* 0x01FF, activate dropout handling unconditionally */
259 4, /* smart dropout include stubs */
264 unsigned char PREP(reset_component_counter
) [] =
267 /* In case an application tries to render `.ttfautohint' */
268 /* (which it should never do), */
269 /* hinting of all glyphs rendered afterwards is disabled */
270 /* because the `cvtl_is_subglyph' counter gets incremented, */
271 /* but there is no counterpart to decrement it. */
272 /* Font inspection tools like the FreeType demo programs */
273 /* are an exception to that rule, however, */
274 /* since they can directly access a font by glyph indices. */
275 /* The following guard alleviates the problem a bit: */
276 /* Any change of the graphics state */
277 /* (for example, rendering at a different size or with a different mode) */
278 /* resets the counter to zero. */
287 #define COPY_PREP(snippet_name) \
289 memcpy(buf_p, prep_ ## snippet_name, \
290 sizeof (prep_ ## snippet_name)); \
291 buf_p += sizeof (prep_ ## snippet_name); \
295 TA_table_build_prep(FT_Byte
** prep
,
300 TA_LatinBlue blue_adjustment
= NULL
;
309 if (font
->loader
->hints
.metrics
->clazz
->script
== TA_SCRIPT_NONE
)
313 vaxis
= &((TA_LatinMetrics
)font
->loader
->hints
.metrics
)->axis
[1];
315 for (i
= 0; i
< vaxis
->blue_count
; i
++)
317 if (vaxis
->blues
[i
].flags
& TA_LATIN_BLUE_ADJUSTMENT
)
319 blue_adjustment
= &vaxis
->blues
[i
];
325 if (font
->hinting_limit
)
326 buf_len
+= sizeof (PREP(hinting_limit_a
))
328 + sizeof (PREP(hinting_limit_b
));
330 buf_len
+= sizeof (PREP(store_0x10000
));
333 buf_len
+= sizeof (PREP(align_top_a
))
335 + sizeof (PREP(align_top_b
))
336 + (font
->increase_x_height
? sizeof (PREP(align_top_c1
))
337 : sizeof (PREP(align_top_c2
)))
338 + sizeof (PREP(align_top_d
))
339 + sizeof (PREP(loop_cvt_a
))
341 + sizeof (PREP(loop_cvt_b
))
343 + sizeof (PREP(loop_cvt_c
))
345 + sizeof (PREP(loop_cvt_d
));
347 buf_len
+= sizeof (PREP(compute_extra_light_a
))
349 + sizeof (PREP(compute_extra_light_b
));
351 if (CVT_BLUES_SIZE(font
))
352 buf_len
+= sizeof (PREP(round_blues_a
))
354 + sizeof (PREP(round_blues_b
));
356 buf_len
+= sizeof (PREP(set_dropout_mode
));
357 buf_len
+= sizeof (PREP(reset_component_counter
));
359 /* buffer length must be a multiple of four */
360 len
= (buf_len
+ 3) & ~3;
361 buf
= (FT_Byte
*)malloc(len
);
363 return FT_Err_Out_Of_Memory
;
365 /* pad end of buffer with zeros */
370 /* copy cvt program into buffer and fill in the missing variables */
373 if (font
->hinting_limit
)
375 COPY_PREP(hinting_limit_a
);
376 *(buf_p
++) = HIGH(font
->hinting_limit
);
377 *(buf_p
++) = LOW(font
->hinting_limit
);
378 COPY_PREP(hinting_limit_b
);
381 COPY_PREP(store_0x10000
);
385 COPY_PREP(align_top_a
);
386 *(buf_p
++) = (unsigned char)(CVT_BLUE_SHOOTS_OFFSET(font
)
387 + blue_adjustment
- vaxis
->blues
);
388 COPY_PREP(align_top_b
);
389 if (font
->increase_x_height
)
390 COPY_PREP(align_top_c1
);
392 COPY_PREP(align_top_c2
);
393 COPY_PREP(align_top_d
);
395 COPY_PREP(loop_cvt_a
);
396 *(buf_p
++) = (unsigned char)CVT_VERT_WIDTHS_OFFSET(font
);
397 *(buf_p
++) = (unsigned char)(CVT_VERT_WIDTHS_OFFSET(font
)
398 + CVT_VERT_WIDTHS_SIZE(font
) - 1);
399 COPY_PREP(loop_cvt_b
);
400 *(buf_p
++) = (unsigned char)CVT_BLUE_REFS_OFFSET(font
);
401 *(buf_p
++) = (unsigned char)(CVT_BLUE_REFS_OFFSET(font
)
402 + CVT_BLUES_SIZE(font
) - 1);
403 COPY_PREP(loop_cvt_c
);
404 *(buf_p
++) = (unsigned char)CVT_BLUE_SHOOTS_OFFSET(font
);
405 *(buf_p
++) = (unsigned char)(CVT_BLUE_SHOOTS_OFFSET(font
)
406 + CVT_BLUES_SIZE(font
) - 1);
407 COPY_PREP(loop_cvt_d
);
410 COPY_PREP(compute_extra_light_a
);
411 *(buf_p
++) = (unsigned char)CVT_VERT_STANDARD_WIDTH_OFFSET(font
);
412 COPY_PREP(compute_extra_light_b
);
414 if (CVT_BLUES_SIZE(font
))
416 COPY_PREP(round_blues_a
);
417 *(buf_p
++) = (unsigned char)CVT_BLUE_REFS_OFFSET(font
);
418 *(buf_p
++) = (unsigned char)(CVT_BLUE_REFS_OFFSET(font
)
419 + CVT_BLUES_SIZE(font
) - 1);
420 COPY_PREP(round_blues_b
);
423 COPY_PREP(set_dropout_mode
);
424 COPY_PREP(reset_component_counter
);
434 TA_sfnt_build_prep_table(SFNT
* sfnt
,
443 error
= TA_sfnt_add_table_info(sfnt
);
447 error
= TA_table_build_prep(&prep_buf
, &prep_len
, font
);
452 /* ttfautohint's bytecode in `fpgm' is larger */
453 /* than the bytecode in `prep'; */
454 /* this commented out code here is just for completeness */
455 if (prep_len
> sfnt
->max_instructions
)
456 sfnt
->max_instructions
= prep_len
;
459 /* in case of success, `prep_buf' gets linked */
460 /* and is eventually freed in `TA_font_unload' */
461 error
= TA_font_add_table(font
,
462 &sfnt
->table_infos
[sfnt
->num_table_infos
- 1],
463 TTAG_prep
, prep_len
, prep_buf
);
473 /* end of taprep.c */