1 |
|
/***************************************************************************/ |
2 |
|
/* */ |
3 |
|
/* aflatin.c */ |
4 |
|
/* */ |
5 |
|
/* Auto-fitter hinting routines for latin script (body). */ |
6 |
|
/* */ |
7 |
|
/* Copyright 2003, 2004, 2005 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 |
#include "aflatin.h" |
#include "aflatin.h" |
20 |
|
|
21 |
|
|
44 |
{ |
{ |
45 |
FT_Error error; |
FT_Error error; |
46 |
FT_UInt glyph_index; |
FT_UInt glyph_index; |
47 |
AF_Dimension dim; |
int dim; |
48 |
AF_ScriptMetricsRec dummy[1]; |
AF_ScriptMetricsRec dummy[1]; |
49 |
AF_Scaler scaler = &dummy->scaler; |
AF_Scaler scaler = &dummy->scaler; |
50 |
|
|
62 |
scaler->x_scale = scaler->y_scale = 0x10000L; |
scaler->x_scale = scaler->y_scale = 0x10000L; |
63 |
scaler->x_delta = scaler->y_delta = 0; |
scaler->x_delta = scaler->y_delta = 0; |
64 |
scaler->face = face; |
scaler->face = face; |
65 |
scaler->render_mode = 0; |
scaler->render_mode = FT_RENDER_MODE_NORMAL; |
66 |
scaler->flags = 0; |
scaler->flags = 0; |
67 |
|
|
68 |
af_glyph_hints_rescale( hints, dummy ); |
af_glyph_hints_rescale( hints, dummy ); |
81 |
FT_Pos edge_distance_threshold = 32000; |
FT_Pos edge_distance_threshold = 32000; |
82 |
|
|
83 |
|
|
84 |
error = af_latin_hints_compute_segments( hints, dim ); |
error = af_latin_hints_compute_segments( hints, |
85 |
|
(AF_Dimension)dim ); |
86 |
if ( error ) |
if ( error ) |
87 |
goto Exit; |
goto Exit; |
88 |
|
|
89 |
af_latin_hints_link_segments( hints, dim ); |
af_latin_hints_link_segments( hints, |
90 |
|
(AF_Dimension)dim ); |
91 |
|
|
92 |
seg = axhints->segments; |
seg = axhints->segments; |
93 |
limit = seg + axhints->num_segments; |
limit = seg + axhints->num_segments; |
419 |
delta = scaler->y_delta; |
delta = scaler->y_delta; |
420 |
} |
} |
421 |
|
|
422 |
axis = & metrics->axis[dim]; |
axis = &metrics->axis[dim]; |
423 |
|
|
424 |
if ( axis->org_scale == scale && axis->org_delta == delta ) |
if ( axis->org_scale == scale && axis->org_delta == delta ) |
425 |
return; |
return; |
432 |
* letters to the pixel grid |
* letters to the pixel grid |
433 |
*/ |
*/ |
434 |
{ |
{ |
435 |
AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; |
AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; |
436 |
AF_LatinBlue blue = NULL; |
AF_LatinBlue blue = NULL; |
|
FT_UInt nn; |
|
437 |
|
|
438 |
|
|
439 |
for ( nn = 0; nn < axis->blue_count; nn++ ) |
for ( nn = 0; nn < Axis->blue_count; nn++ ) |
440 |
{ |
{ |
441 |
if ( axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) |
if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) |
442 |
{ |
{ |
443 |
blue = &axis->blues[nn]; |
blue = &Axis->blues[nn]; |
444 |
break; |
break; |
445 |
} |
} |
446 |
} |
} |
509 |
dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); |
dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); |
510 |
if ( dist <= 48 && dist >= -48 ) |
if ( dist <= 48 && dist >= -48 ) |
511 |
{ |
{ |
512 |
FT_Pos delta, delta2; |
FT_Pos delta1, delta2; |
513 |
|
|
514 |
|
|
515 |
delta = blue->shoot.org - blue->ref.org; |
delta1 = blue->shoot.org - blue->ref.org; |
516 |
delta2 = delta; |
delta2 = delta1; |
517 |
if ( delta < 0 ) |
if ( delta1 < 0 ) |
518 |
delta2 = -delta2; |
delta2 = -delta2; |
519 |
|
|
520 |
delta2 = FT_MulFix( delta2, scale ); |
delta2 = FT_MulFix( delta2, scale ); |
526 |
else |
else |
527 |
delta2 = FT_PIX_ROUND( delta2 ); |
delta2 = FT_PIX_ROUND( delta2 ); |
528 |
|
|
529 |
if ( delta < 0 ) |
if ( delta1 < 0 ) |
530 |
delta2 = -delta2; |
delta2 = -delta2; |
531 |
|
|
532 |
blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); |
blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); |
575 |
FT_Pos max_coord = -32000; |
FT_Pos max_coord = -32000; |
576 |
#endif |
#endif |
577 |
|
|
578 |
major_dir = FT_ABS( axis->major_dir ); |
major_dir = (AF_Direction)FT_ABS( axis->major_dir ); |
579 |
segment_dir = major_dir; |
segment_dir = major_dir; |
580 |
|
|
581 |
axis->num_segments = 0; |
axis->num_segments = 0; |
709 |
if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) |
if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) |
710 |
{ |
{ |
711 |
/* this is the start of a new segment! */ |
/* this is the start of a new segment! */ |
712 |
segment_dir = point->out_dir; |
segment_dir = (AF_Direction)point->out_dir; |
713 |
|
|
714 |
/* clear all segment fields */ |
/* clear all segment fields */ |
715 |
error = af_axis_hints_new_segment( axis, memory, &segment ); |
error = af_axis_hints_new_segment( axis, memory, &segment ); |
1527 |
{ |
{ |
1528 |
FT_Pos dist = stem_edge->opos - base_edge->opos; |
FT_Pos dist = stem_edge->opos - base_edge->opos; |
1529 |
|
|
1530 |
FT_Pos fitted_width = af_latin_compute_stem_width( hints, |
FT_Pos fitted_width = af_latin_compute_stem_width( |
1531 |
dim, |
hints, dim, dist, |
1532 |
dist, |
(AF_Edge_Flags)base_edge->flags, |
1533 |
base_edge->flags, |
(AF_Edge_Flags)stem_edge->flags ); |
|
stem_edge->flags ); |
|
1534 |
|
|
1535 |
|
|
1536 |
stem_edge->pos = base_edge->pos + fitted_width; |
stem_edge->pos = base_edge->pos + fitted_width; |
1653 |
|
|
1654 |
|
|
1655 |
org_len = edge2->opos - edge->opos; |
org_len = edge2->opos - edge->opos; |
1656 |
cur_len = af_latin_compute_stem_width( hints, dim, org_len, |
cur_len = af_latin_compute_stem_width( |
1657 |
edge->flags, edge2->flags ); |
hints, dim, org_len, |
1658 |
|
(AF_Edge_Flags)edge->flags, |
1659 |
|
(AF_Edge_Flags)edge2->flags ); |
1660 |
if ( cur_len <= 64 ) |
if ( cur_len <= 64 ) |
1661 |
u_off = d_off = 32; |
u_off = d_off = 32; |
1662 |
else |
else |
1707 |
org_len = edge2->opos - edge->opos; |
org_len = edge2->opos - edge->opos; |
1708 |
org_center = org_pos + ( org_len >> 1 ); |
org_center = org_pos + ( org_len >> 1 ); |
1709 |
|
|
1710 |
cur_len = af_latin_compute_stem_width( hints, dim, org_len, |
cur_len = af_latin_compute_stem_width( |
1711 |
edge->flags, edge2->flags ); |
hints, dim, org_len, |
1712 |
|
(AF_Edge_Flags)edge->flags, |
1713 |
|
(AF_Edge_Flags)edge2->flags ); |
1714 |
|
|
1715 |
if ( cur_len < 96 ) |
if ( cur_len < 96 ) |
1716 |
{ |
{ |
1750 |
org_center = org_pos + ( org_len >> 1 ); |
org_center = org_pos + ( org_len >> 1 ); |
1751 |
|
|
1752 |
cur_len = af_latin_compute_stem_width( |
cur_len = af_latin_compute_stem_width( |
1753 |
hints, dim, org_len, edge->flags, edge2->flags ); |
hints, dim, org_len, |
1754 |
|
(AF_Edge_Flags)edge->flags, |
1755 |
|
(AF_Edge_Flags)edge2->flags ); |
1756 |
|
|
1757 |
cur_pos1 = FT_PIX_ROUND( org_pos ); |
cur_pos1 = FT_PIX_ROUND( org_pos ); |
1758 |
delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; |
delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; |
1879 |
FT_Outline* outline, |
FT_Outline* outline, |
1880 |
AF_LatinMetrics metrics ) |
AF_LatinMetrics metrics ) |
1881 |
{ |
{ |
1882 |
FT_Error error; |
FT_Error error; |
1883 |
AF_Dimension dim; |
int dim; |
1884 |
|
|
1885 |
|
|
1886 |
error = af_glyph_hints_reload( hints, outline ); |
error = af_glyph_hints_reload( hints, outline ); |
1910 |
if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || |
if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || |
1911 |
( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) |
( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) |
1912 |
{ |
{ |
1913 |
af_latin_hint_edges( hints, dim ); |
af_latin_hint_edges( hints, (AF_Dimension)dim ); |
1914 |
af_glyph_hints_align_edge_points( hints, dim ); |
af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); |
1915 |
af_glyph_hints_align_strong_points( hints, dim ); |
af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); |
1916 |
af_glyph_hints_align_weak_points( hints, dim ); |
af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); |
1917 |
} |
} |
1918 |
} |
} |
1919 |
af_glyph_hints_save( hints, outline ); |
af_glyph_hints_save( hints, outline ); |