[truetype] Improve legibility of `glyf' parsing.

* src/truetype/ttgload.c (ON_CURVE_POINT, X_SHORT_VECTOR,
Y_SHORT_VECTOR, REPEAT_FLAG, X_POSITIVE, SAME_X, Y_POSITIVE, SAME_Y,
OVERLAP_SIMPLE): New macros.
(TT_Load_Simple_Glyph): Use new macros to make code more readable.
Remove useless adjustment of `outline->tags' elements.
This commit is contained in:
Werner Lemberg 2018-08-22 10:31:05 +02:00
parent a3e842f9c6
commit 45524679c6
2 changed files with 50 additions and 26 deletions

View File

@ -1,3 +1,13 @@
2018-08-22 Werner Lemberg <wl@gnu.org>
[truetype] Improve legibility of `glyf' parsing.
* src/truetype/ttgload.c (ON_CURVE_POINT, X_SHORT_VECTOR,
Y_SHORT_VECTOR, REPEAT_FLAG, X_POSITIVE, SAME_X, Y_POSITIVE, SAME_Y,
OVERLAP_SIMPLE): New macros.
(TT_Load_Simple_Glyph): Use new macros to make code more readable.
Remove useless adjustment of `outline->tags' elements.
2018-08-21 Werner Lemberg <wl@gnu.org> 2018-08-21 Werner Lemberg <wl@gnu.org>
* src/sfnt/ttcpal.c (tt_face_load_cpal): Add missing safety check. * src/sfnt/ttcpal.c (tt_face_load_cpal): Add missing safety check.

View File

@ -48,6 +48,21 @@
#define FT_COMPONENT ttgload #define FT_COMPONENT ttgload
/**************************************************************************
*
* Simple glyph flags.
*/
#define ON_CURVE_POINT 0x01 /* same value as FT_CURVE_TAG_ON */
#define X_SHORT_VECTOR 0x02
#define Y_SHORT_VECTOR 0x04
#define REPEAT_FLAG 0x08
#define X_POSITIVE 0x10 /* two meanings depending on X_SHORT_VECTOR */
#define SAME_X 0x10
#define Y_POSITIVE 0x20 /* two meanings depending on Y_SHORT_VECTOR */
#define SAME_Y 0x20
#define OVERLAP_SIMPLE 0x40 /* we ignore this value */
/************************************************************************** /**************************************************************************
* *
* Composite glyph flags. * Composite glyph flags.
@ -62,7 +77,7 @@
#define WE_HAVE_A_2X2 0x0080 #define WE_HAVE_A_2X2 0x0080
#define WE_HAVE_INSTR 0x0100 #define WE_HAVE_INSTR 0x0100
#define USE_MY_METRICS 0x0200 #define USE_MY_METRICS 0x0200
#define OVERLAP_COMPOUND 0x0400 #define OVERLAP_COMPOUND 0x0400 /* we ignore this value */
#define SCALED_COMPONENT_OFFSET 0x0800 #define SCALED_COMPONENT_OFFSET 0x0800
#define UNSCALED_COMPONENT_OFFSET 0x1000 #define UNSCALED_COMPONENT_OFFSET 0x1000
@ -337,7 +352,7 @@
FT_Byte *flag, *flag_limit; FT_Byte *flag, *flag_limit;
FT_Byte c, count; FT_Byte c, count;
FT_Vector *vec, *vec_limit; FT_Vector *vec, *vec_limit;
FT_Pos x; FT_Pos x, y;
FT_Short *cont, *cont_limit, prev_cont; FT_Short *cont, *cont_limit, prev_cont;
FT_Int xy_size = 0; FT_Int xy_size = 0;
@ -454,7 +469,7 @@
goto Invalid_Outline; goto Invalid_Outline;
*flag++ = c = FT_NEXT_BYTE( p ); *flag++ = c = FT_NEXT_BYTE( p );
if ( c & 8 ) if ( c & REPEAT_FLAG )
{ {
if ( p + 1 > limit ) if ( p + 1 > limit )
goto Invalid_Outline; goto Invalid_Outline;
@ -480,31 +495,29 @@
for ( ; vec < vec_limit; vec++, flag++ ) for ( ; vec < vec_limit; vec++, flag++ )
{ {
FT_Pos y = 0; FT_Pos delta = 0;
FT_Byte f = *flag; FT_Byte f = *flag;
if ( f & 2 ) if ( f & X_SHORT_VECTOR )
{ {
if ( p + 1 > limit ) if ( p + 1 > limit )
goto Invalid_Outline; goto Invalid_Outline;
y = (FT_Pos)FT_NEXT_BYTE( p ); delta = (FT_Pos)FT_NEXT_BYTE( p );
if ( ( f & 16 ) == 0 ) if ( !( f & X_POSITIVE ) )
y = -y; delta = -delta;
} }
else if ( ( f & 16 ) == 0 ) else if ( !( f & SAME_X ) )
{ {
if ( p + 2 > limit ) if ( p + 2 > limit )
goto Invalid_Outline; goto Invalid_Outline;
y = (FT_Pos)FT_NEXT_SHORT( p ); delta = (FT_Pos)FT_NEXT_SHORT( p );
} }
x += y; x += delta;
vec->x = x; vec->x = x;
/* the cast is for stupid compilers */
*flag = (FT_Byte)( f & ~( 2 | 16 ) );
} }
/* reading the Y coordinates */ /* reading the Y coordinates */
@ -512,35 +525,36 @@
vec = gloader->current.outline.points; vec = gloader->current.outline.points;
vec_limit = vec + n_points; vec_limit = vec + n_points;
flag = (FT_Byte*)outline->tags; flag = (FT_Byte*)outline->tags;
x = 0; y = 0;
for ( ; vec < vec_limit; vec++, flag++ ) for ( ; vec < vec_limit; vec++, flag++ )
{ {
FT_Pos y = 0; FT_Pos delta = 0;
FT_Byte f = *flag; FT_Byte f = *flag;
if ( f & 4 ) if ( f & Y_SHORT_VECTOR )
{ {
if ( p + 1 > limit ) if ( p + 1 > limit )
goto Invalid_Outline; goto Invalid_Outline;
y = (FT_Pos)FT_NEXT_BYTE( p ); delta = (FT_Pos)FT_NEXT_BYTE( p );
if ( ( f & 32 ) == 0 ) if ( !( f & Y_POSITIVE ) )
y = -y; delta = -delta;
} }
else if ( ( f & 32 ) == 0 ) else if ( !( f & SAME_Y ) )
{ {
if ( p + 2 > limit ) if ( p + 2 > limit )
goto Invalid_Outline; goto Invalid_Outline;
y = (FT_Pos)FT_NEXT_SHORT( p ); delta = (FT_Pos)FT_NEXT_SHORT( p );
} }
x += y; y += delta;
vec->y = x; vec->y = y;
/* the cast is for stupid compilers */ /* the cast is for stupid compilers */
*flag = (FT_Byte)( f & FT_CURVE_TAG_ON ); *flag = (FT_Byte)( f & ON_CURVE_POINT );
} }
outline->n_points = (FT_Short)n_points; outline->n_points = (FT_Short)n_points;