ref: ec810f8c6ac41d2ee20505b00fc8033d098d99a1
parent: 21f433cec9c148300db7c1665531320f30eac510
author: Werner Lemberg <[email protected]>
date: Thu Aug 22 02:04:32 EDT 2002
* src/pshinter/pshalgo3.c (psh3_glyph_compute_inflections, psh3_glyph_compute_extrema, psh3_hint_table_find_strong_point): Fix compiler warnings and resolve shadowing of local variables.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2002-08-21 Werner Lemberg <[email protected]>
+
+ * src/pshinter/pshalgo3.c (psh3_glyph_compute_inflections,
+ psh3_glyph_compute_extrema, psh3_hint_table_find_strong_point): Fix
+ compiler warnings and resolve shadowing of local variables.
+
2002-08-21 David Turner <[email protected]>
* src/pshinter/pshalgo3.c, src/autohint/ahangles.c,
@@ -32,11 +38,41 @@
src/autohint/ahmodule.c [DEBUG_HINTER]: Removing compiler warnings
(only used in development builds anyway).
- * src/pshinter/pshalgo3.h, src/pshinter/pshalgo3.c: Removing
- compiler warnings, and improving the support of local extrema
- and stem edge points.
+ Improve support of local extrema and stem edge points.
- * test/gview.c: Small updates to the hinting debugger.
+ * src/pshinter/pshalgo3.h (PSH3_Hint_TableRec): Use PSH3_ZoneRec
+ for `zones'.
+ (PSH3_DIR_UP, PSH3_DIR_DOWN): Exchange values.
+ (PSH3_DIR_HORIZONTAL, PSH3_DIR_VERTICAL): New macros.
+ (PSH3_DIR_COMPARE, PSH3_DIR_IS_HORIZONTAL, PSH3_IS_VERTICAL): New
+ macros.
+ (PSH3_POINT_INFLEX): New enum.
+ (psh3_point_{is,set}_{off,inflex}): New macros.
+ (PSH3_POINT_{EXTREMUM,POSITIVE,NEGATIVE,EDGE_MIN,EDGE_MAX): New
+ enum values.
+ (psh3_point_{is,set}_{extremum,positive,negative,edge_min,edge_max}):
+ New macros.
+ (PSH3_PointRec): New members `flags2' and `org_v'.
+ (PSH3_POINT_EQUAL_ARG, PSH3_POINT_ANGLE): New macros.
+
+ * src/pshinter/pshalgo3.c [DEBUG_HINTER]: Removing compiler
+ warnings.
+ (COMPUTE_INFLEXS): New macro.
+ (psh3_hint_align): Simplify some basic arithmetic computations.
+ (psh3_point_is_extremum): Removed.
+ (psh3_glyph_compute_inflections) [COMPUTE_INFLEXS]: New function.
+ (psh3_glyph_init) [COMPUTE_INFLEXS]: Use it.
+ (psh3_glyph_compute_extrema): New function.
+ (PSH3_STRONG_THRESHOLD): Increased to 30.
+ (psh3_hint_table_find_strong_point): Improved.
+ (psh3_glyph_find_strong_points,
+ psh3_glyph_interpolate_strong_points): Updated.
+ (psh3_hints_apply): Use psh3_glyph_compute_extrema.
+
+ * test/gview.c (draw_ps3_hint, ps3_draw_control_points): New
+ functions.
+ Other small updates.
+
* Jamfile: Small updates.
2002-08-18 Arkadiusz Miskiewicz <[email protected]>
--- a/src/pshinter/pshalgo3.c
+++ b/src/pshinter/pshalgo3.c
@@ -665,12 +665,14 @@
/*************************************************************************/
#ifdef COMPUTE_INFLEXS
- /* compute all inflex points in a given glyph */
+
+ /* compute all inflex points in a given glyph */
static void
psh3_glyph_compute_inflections( PSH3_Glyph glyph )
{
FT_UInt n;
+
for ( n = 0; n < glyph->num_contours; n++ )
{
PSH3_Point first, start, end, before, after;
@@ -678,12 +680,13 @@
FT_Angle diff_in, diff_out;
FT_Int finished = 0;
+
/* we need at least 4 points to create an inflection point */
if ( glyph->contours[n].count < 4 )
continue;
/* compute first segment in contour */
- first = glyph->contours[n].start;
+ first = glyph->contours[n].start;
start = end = first;
do
@@ -691,9 +694,9 @@
end = end->next;
if ( end == first )
goto Skip;
- }
- while ( PSH3_POINT_EQUAL_ORG( end, first ) );
+ } while ( PSH3_POINT_EQUAL_ORG( end, first ) );
+
angle_seg = PSH3_POINT_ANGLE( start, end );
/* extend the segment start whenever possible */
@@ -706,13 +709,13 @@
before = before->prev;
if ( before == first )
goto Skip;
- }
- while ( PSH3_POINT_EQUAL_ORG( before, start ) );
+ } while ( PSH3_POINT_EQUAL_ORG( before, start ) );
+
angle_in = PSH3_POINT_ANGLE( before, start );
- }
- while ( angle_in == angle_seg );
+ } while ( angle_in == angle_seg );
+
first = start;
diff_in = FT_Angle_Diff( angle_in, angle_seg );
@@ -729,13 +732,13 @@
after = after->next;
if ( after == first )
finished = 1;
- }
- while ( PSH3_POINT_EQUAL_ORG( end, after ) );
+ } while ( PSH3_POINT_EQUAL_ORG( end, after ) );
+
angle_out = PSH3_POINT_ANGLE( end, after );
- }
- while ( angle_out == angle_seg );
+ } while ( angle_out == angle_seg );
+
diff_out = FT_Angle_Diff( angle_seg, angle_out );
if ( ( diff_in ^ diff_out ) < 0 )
@@ -757,15 +760,17 @@
end = after;
angle_seg = angle_out;
diff_in = diff_out;
- }
- while ( !finished );
+ } while ( !finished );
+
Skip:
;
}
}
+
#endif /* COMPUTE_INFLEXS */
+
static void
psh3_glyph_done( PSH3_Glyph glyph )
{
@@ -1037,14 +1042,13 @@
}
-
-
- /* compute all extrema in a glyph for a given dimension */
+ /* compute all extrema in a glyph for a given dimension */
static void
psh3_glyph_compute_extrema( PSH3_Glyph glyph )
{
- FT_UInt n;
+ FT_UInt n;
+
/* first of all, compute all local extrema */
for ( n = 0; n < glyph->num_contours; n++ )
{
@@ -1051,6 +1055,7 @@
PSH3_Point first = glyph->contours[n].start;
PSH3_Point point, before, after;
+
point = first;
before = point;
after = point;
@@ -1073,9 +1078,9 @@
after = after->next;
if ( after == first )
goto Next;
- }
- while ( after->org_u == point->org_u );
+ } while ( after->org_u == point->org_u );
+
if ( before->org_u < point->org_u )
{
if ( after->org_u < point->org_u )
@@ -1094,8 +1099,8 @@
{
psh3_point_set_extremum( point );
point = point->next;
- }
- while ( point != after );
+
+ } while ( point != after );
}
}
@@ -1108,16 +1113,17 @@
;
}
- /* for each extrema, determine its direction along the */
- /* orthogonal axis */
+ /* for each extrema, determine its direction along the */
+ /* orthogonal axis */
for ( n = 0; n < glyph->num_points; n++ )
{
PSH3_Point point, before, after;
+
point = &glyph->points[n];
before = point;
after = point;
-
+
if ( psh3_point_is_extremum( point ) )
{
do
@@ -1125,16 +1131,16 @@
before = before->prev;
if ( before == point )
goto Skip;
- }
- while ( before->org_v == point->org_v );
+ } while ( before->org_v == point->org_v );
+
do
{
after = after->next;
if ( after == point )
goto Skip;
- }
- while ( after->org_v == point->org_v );
+
+ } while ( after->org_v == point->org_v );
}
if ( before->org_v < point->org_v &&
@@ -1147,6 +1153,7 @@
{
psh3_point_set_negative( point );
}
+
Skip:
;
}
@@ -1153,24 +1160,23 @@
}
-
-
#define PSH3_STRONG_THRESHOLD 30
- /* major_dir is the direction for points on the bottom/left of the stem;
- * Points on the top/right of the stem will have a direction of
- * -major_dir.
- */
+ /* major_dir is the direction for points on the bottom/left of the stem; */
+ /* Points on the top/right of the stem will have a direction of */
+ /* -major_dir. */
+
static void
psh3_hint_table_find_strong_point( PSH3_Hint_Table table,
PSH3_Point point,
FT_Int major_dir )
{
- PSH3_Hint* sort = table->sort;
- FT_UInt num_hints = table->num_hints;
- FT_Int point_dir = 0;
+ PSH3_Hint* sort = table->sort;
+ FT_UInt num_hints = table->num_hints;
+ FT_Int point_dir = 0;
+
if ( PSH3_DIR_COMPARE( point->dir_in, major_dir ) )
point_dir = point->dir_in;
@@ -1181,15 +1187,18 @@
{
FT_UInt flag;
+
for ( ; num_hints > 0; num_hints--, sort++ )
{
PSH3_Hint hint = sort[0];
FT_Pos d;
+
if ( point_dir == major_dir )
{
flag = PSH3_POINT_EDGE_MIN;
d = point->org_u - hint->org_pos;
+
if ( ABS( d ) < PSH3_STRONG_THRESHOLD )
{
Is_Strong:
@@ -1203,11 +1212,13 @@
{
flag = PSH3_POINT_EDGE_MAX;
d = point->org_u - hint->org_pos - hint->org_len;
+
if ( ABS( d ) < PSH3_STRONG_THRESHOLD )
goto Is_Strong;
}
}
}
+
#if 1
else if ( psh3_point_is_extremum( point ) )
{
@@ -1214,6 +1225,7 @@
/* treat extrema as special cases for stem edge alignment */
FT_UInt min_flag, max_flag;
+
if ( major_dir == PSH3_DIR_HORIZONTAL )
{
min_flag = PSH3_POINT_POSITIVE;
@@ -1230,10 +1242,12 @@
PSH3_Hint hint = sort[0];
FT_Pos d, flag;
+
if ( point->flags2 & min_flag )
{
flag = PSH3_POINT_EDGE_MIN;
d = point->org_u - hint->org_pos;
+
if ( ABS( d ) < PSH3_STRONG_THRESHOLD )
{
Is_Strong2:
@@ -1247,6 +1261,7 @@
{
flag = PSH3_POINT_EDGE_MAX;
d = point->org_u - hint->org_pos - hint->org_len;
+
if ( ABS( d ) < PSH3_STRONG_THRESHOLD )
goto Is_Strong2;
}
@@ -1258,7 +1273,8 @@
}
}
}
-#endif
+
+#endif /* 1 */
}
@@ -1358,6 +1374,7 @@
{
FT_Pos delta;
+
if ( psh3_point_is_edge_min( point ) )
{
point->cur_u = hint->cur_pos;
@@ -1375,11 +1392,12 @@
else if ( delta >= hint->org_len )
point->cur_u = hint->cur_pos + hint->cur_len +
- FT_MulFix( delta - hint->org_len, scale );
+ FT_MulFix( delta - hint->org_len, scale );
else if ( hint->org_len > 0 )
point->cur_u = hint->cur_pos +
- FT_MulDiv( delta, hint->cur_len, hint->org_len );
+ FT_MulDiv( delta, hint->cur_len,
+ hint->org_len );
else
point->cur_u = hint->cur_pos;
}
--- a/src/pshinter/pshalgo3.h
+++ b/src/pshinter/pshalgo3.h
@@ -28,10 +28,10 @@
FT_BEGIN_HEADER
- /* handle to Hint structure */
+ /* handle to Hint structure */
typedef struct PSH3_HintRec_* PSH3_Hint;
- /* hint bit-flags */
+ /* hint bit-flags */
typedef enum
{
PSH3_HINT_GHOST = PS_HINT_FLAG_GHOST,
@@ -50,7 +50,7 @@
#define psh3_hint_deactivate( x ) (x)->flags &= ~PSH3_HINT_ACTIVE
#define psh3_hint_set_fitted( x ) (x)->flags |= PSH3_HINT_FITTED
- /* hint structure */
+ /* hint structure */
typedef struct PSH3_HintRec_
{
FT_Int org_pos;
@@ -105,12 +105,12 @@
PSH3_DIR_RIGHT = 2
};
-#define PSH3_DIR_HORIZONTAL 2
-#define PSH3_DIR_VERTICAL 1
+#define PSH3_DIR_HORIZONTAL 2
+#define PSH3_DIR_VERTICAL 1
-#define PSH3_DIR_COMPARE(d1,d2) ( (d1) == (d2) || (d1) == -(d2) )
-#define PSH3_DIR_IS_HORIZONTAL(d) PSH3_DIR_COMPARE(d,PSH3_DIR_HORIZONTAL)
-#define PSH3_DIR_IS_VERTICAL(d) PSH3_DIR_COMPARE(d,PSH3_DIR_VERTICAL)
+#define PSH3_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) )
+#define PSH3_DIR_IS_HORIZONTAL( d ) PSH3_DIR_COMPARE( d, PSH3_DIR_HORIZONTAL )
+#define PSH3_DIR_IS_VERTICAL( d ) PSH3_DIR_COMPARE( d, PSH3_DIR_VERTICAL )
/* the following bit-flags are computed once by the glyph */
@@ -122,33 +122,33 @@
PSH3_POINT_INFLEX = 4 /* point is inflection */
};
-#define psh3_point_is_smooth( p ) ( (p)->flags & PSH3_POINT_SMOOTH )
-#define psh3_point_is_off( p ) ( (p)->flags & PSH3_POINT_OFF )
-#define psh3_point_is_inflection( p ) ( (p)->flags & PSH3_POINT_INFLEX )
+#define psh3_point_is_smooth( p ) ( (p)->flags & PSH3_POINT_SMOOTH )
+#define psh3_point_is_off( p ) ( (p)->flags & PSH3_POINT_OFF )
+#define psh3_point_is_inflex( p ) ( (p)->flags & PSH3_POINT_INFLEX )
-#define psh3_point_set_smooth( p ) (p)->flags |= PSH3_POINT_SMOOTH
-#define psh3_point_set_off( p ) (p)->flags |= PSH3_POINT_OFF
-#define psh3_point_set_inflex( p ) (p)->flags |= PSH3_POINT_INFLEX
+#define psh3_point_set_smooth( p ) (p)->flags |= PSH3_POINT_SMOOTH
+#define psh3_point_set_off( p ) (p)->flags |= PSH3_POINT_OFF
+#define psh3_point_set_inflex( p ) (p)->flags |= PSH3_POINT_INFLEX
- /* the following bit-flags are re-computed for each dimension */
+ /* the following bit-flags are re-computed for each dimension */
enum
{
- PSH3_POINT_STRONG = 16, /* point is strong */
- PSH3_POINT_FITTED = 32, /* point is already fitted */
- PSH3_POINT_EXTREMUM = 64, /* point is local extremum */
- PSH3_POINT_POSITIVE = 128, /* extremum has positive contour flow */
- PSH3_POINT_NEGATIVE = 256, /* extremum has negative contour flow */
- PSH3_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */
- PSH3_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */
+ PSH3_POINT_STRONG = 16, /* point is strong */
+ PSH3_POINT_FITTED = 32, /* point is already fitted */
+ PSH3_POINT_EXTREMUM = 64, /* point is local extremum */
+ PSH3_POINT_POSITIVE = 128, /* extremum has positive contour flow */
+ PSH3_POINT_NEGATIVE = 256, /* extremum has negative contour flow */
+ PSH3_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */
+ PSH3_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */
};
-#define psh3_point_is_strong( p ) ( (p)->flags2 & PSH3_POINT_STRONG )
-#define psh3_point_is_fitted( p ) ( (p)->flags2 & PSH3_POINT_FITTED )
-#define psh3_point_is_extremum( p ) ( (p)->flags2 & PSH3_POINT_EXTREMUM )
-#define psh3_point_is_positive( p ) ( (p)->flags2 & PSH3_POINT_POSITIVE )
-#define psh3_point_is_negative( p ) ( (p)->flags2 & PSH3_POINT_NEGATIVE )
-#define psh3_point_is_edge_min( p ) ( (p)->flags2 & PSH3_POINT_EDGE_MIN )
-#define psh3_point_is_edge_max( p ) ( (p)->flags2 & PSH3_POINT_EDGE_MAX )
+#define psh3_point_is_strong( p ) ( (p)->flags2 & PSH3_POINT_STRONG )
+#define psh3_point_is_fitted( p ) ( (p)->flags2 & PSH3_POINT_FITTED )
+#define psh3_point_is_extremum( p ) ( (p)->flags2 & PSH3_POINT_EXTREMUM )
+#define psh3_point_is_positive( p ) ( (p)->flags2 & PSH3_POINT_POSITIVE )
+#define psh3_point_is_negative( p ) ( (p)->flags2 & PSH3_POINT_NEGATIVE )
+#define psh3_point_is_edge_min( p ) ( (p)->flags2 & PSH3_POINT_EDGE_MIN )
+#define psh3_point_is_edge_max( p ) ( (p)->flags2 & PSH3_POINT_EDGE_MAX )
#define psh3_point_set_strong( p ) (p)->flags2 |= PSH3_POINT_STRONG
#define psh3_point_set_fitted( p ) (p)->flags2 |= PSH3_POINT_FITTED
@@ -186,11 +186,11 @@
} PSH3_PointRec;
-#define PSH3_POINT_EQUAL_ORG(a,b) ( (a)->org_u == (b)->org_u && \
- (a)->org_v == (b)->org_v )
+#define PSH3_POINT_EQUAL_ORG( a, b ) ( (a)->org_u == (b)->org_u && \
+ (a)->org_v == (b)->org_v )
-#define PSH3_POINT_ANGLE(a,b) FT_Atan2( (b)->org_u - (a)->org_u, \
- (b)->org_v - (a)->org_v )
+#define PSH3_POINT_ANGLE( a, b ) FT_Atan2( (b)->org_u - (a)->org_u, \
+ (b)->org_v - (a)->org_v )
typedef struct PSH3_ContourRec_
{