[bdf] Adjust parsing flow and CHARS handling.

* src/bdf/bdflib.c (bdf_readstream_): Remove CHARS exception.
(bdf_parse_glyphs_): Move glyphs allocation...
(bdf_parse_properties_): and missing ascent and descent handling...
(bdf_parse_start_): ...to here under CHARS.
master
Alexei Podtelezhnikov 2 months ago
parent 0864367ada
commit a05c22103d
  1. 214
      src/bdf/bdflib.c

@ -631,10 +631,6 @@
{
error = (*cb)( buf + start, end - start, lineno,
(void*)&cb, client_data );
/* Redo if we have encountered CHARS without properties. */
if ( error == -1 )
error = (*cb)( buf + start, end - start, lineno,
(void*)&cb, client_data );
if ( error )
break;
}
@ -1267,7 +1263,15 @@
}
/* Line function prototype. */
/* Line function prototypes. */
static FT_Error
bdf_parse_start_( char* line,
unsigned long linelen,
unsigned long lineno,
void* call_data,
void* client_data );
static FT_Error
bdf_parse_glyphs_( char* line,
unsigned long linelen,
@ -1367,49 +1371,6 @@
goto Exit;
}
/* The very first thing expected is the number of glyphs. */
if ( !( p->flags & BDF_GLYPHS_ ) )
{
if ( _bdf_strncmp( line, "CHARS", 5 ) != 0 )
{
FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG1, lineno, "CHARS" ));
error = FT_THROW( Missing_Chars_Field );
goto Exit;
}
error = bdf_list_split_( &p->list, " +", line, linelen );
if ( error )
goto Exit;
p->cnt = font->glyphs_size = bdf_atoul_( p->list.field[1] );
/* We need at least 20 bytes per glyph. */
if ( p->cnt > p->size / 20 )
{
p->cnt = font->glyphs_size = p->size / 20;
FT_TRACE2(( "bdf_parse_glyphs_: " ACMSG17, p->cnt ));
}
/* Make sure the number of glyphs is non-zero. */
if ( p->cnt == 0 )
font->glyphs_size = 64;
/* Limit ourselves to 1,114,112 glyphs in the font (this is the */
/* number of code points available in Unicode). */
if ( p->cnt >= 0x110000UL )
{
FT_ERROR(( "bdf_parse_glyphs_: " ERRMSG5, lineno, "CHARS" ));
error = FT_THROW( Invalid_Argument );
goto Exit;
}
if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) )
goto Exit;
p->flags |= BDF_GLYPHS_;
goto Exit;
}
/* Check for the ENDFONT field. */
if ( _bdf_strncmp( line, "ENDFONT", 7 ) == 0 )
{
@ -1747,7 +1708,6 @@
unsigned long vlen;
char* name;
char* value;
char nbuf[BUFSIZE];
FT_UNUSED( lineno );
@ -1755,38 +1715,8 @@
/* Check for the end of the properties. */
if ( _bdf_strncmp( line, "ENDPROPERTIES", 13 ) == 0 )
{
/* If the FONT_ASCENT or FONT_DESCENT properties have not been */
/* encountered yet, then make sure they are added as properties and */
/* make sure they are set from the font bounding box info. */
/* */
/* This is *always* done regardless of the options, because X11 */
/* requires these two fields to compile fonts. */
if ( bdf_get_font_property( p->font, "FONT_ASCENT" ) == 0 )
{
p->font->font_ascent = p->font->bbx.ascent;
ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.ascent );
error = bdf_add_property_( p->font, "FONT_ASCENT",
nbuf, lineno );
if ( error )
goto Exit;
FT_TRACE2(( "bdf_parse_properties_: " ACMSG1, p->font->bbx.ascent ));
}
if ( bdf_get_font_property( p->font, "FONT_DESCENT" ) == 0 )
{
p->font->font_descent = p->font->bbx.descent;
ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.descent );
error = bdf_add_property_( p->font, "FONT_DESCENT",
nbuf, lineno );
if ( error )
goto Exit;
FT_TRACE2(( "bdf_parse_properties_: " ACMSG2, p->font->bbx.descent ));
}
p->flags &= ~BDF_PROPS_;
*next = bdf_parse_glyphs_;
*next = bdf_parse_start_;
goto Exit;
}
@ -1843,6 +1773,7 @@
{
bdf_line_func_t_* next = (bdf_line_func_t_ *)call_data;
bdf_parse_t_* p = (bdf_parse_t_ *) client_data;
bdf_font_t* font;
FT_Memory memory = p->memory;
FT_Error error = FT_Err_Ok;
@ -1917,6 +1848,9 @@
goto Exit;
}
/* Point at the font being constructed. */
font = p->font;
/* Check for the start of the properties. */
if ( _bdf_strncmp( line, "STARTPROPERTIES", 15 ) == 0 )
{
@ -1932,21 +1866,20 @@
if ( error )
goto Exit;
/* at this point, `p->font' can't be NULL */
p->cnt = p->font->props_size = bdf_atoul_( p->list.field[1] );
p->cnt = font->props_size = bdf_atoul_( p->list.field[1] );
/* We need at least 4 bytes per property. */
if ( p->cnt > p->size / 4 )
{
p->font->props_size = 0;
font->props_size = 0;
FT_ERROR(( "bdf_parse_start_: " ERRMSG5, lineno, "STARTPROPERTIES" ));
error = FT_THROW( Invalid_Argument );
goto Exit;
}
if ( FT_NEW_ARRAY( p->font->props, p->cnt ) )
if ( FT_NEW_ARRAY( font->props, p->cnt ) )
{
p->font->props_size = 0;
font->props_size = 0;
goto Exit;
}
@ -1971,16 +1904,16 @@
if ( error )
goto Exit;
p->font->bbx.width = bdf_atous_( p->list.field[1] );
p->font->bbx.height = bdf_atous_( p->list.field[2] );
font->bbx.width = bdf_atous_( p->list.field[1] );
font->bbx.height = bdf_atous_( p->list.field[2] );
p->font->bbx.x_offset = bdf_atos_( p->list.field[3] );
p->font->bbx.y_offset = bdf_atos_( p->list.field[4] );
font->bbx.x_offset = bdf_atos_( p->list.field[3] );
font->bbx.y_offset = bdf_atos_( p->list.field[4] );
p->font->bbx.ascent = (short)( p->font->bbx.height +
p->font->bbx.y_offset );
font->bbx.ascent = (short)( font->bbx.height +
font->bbx.y_offset );
p->font->bbx.descent = (short)( -p->font->bbx.y_offset );
font->bbx.descent = (short)( -font->bbx.y_offset );
p->flags |= BDF_FONT_BBX_;
@ -2005,14 +1938,14 @@
}
/* Allowing multiple `FONT' lines (which is invalid) doesn't hurt... */
FT_FREE( p->font->name );
FT_FREE( font->name );
if ( FT_DUP( p->font->name, s, slen + 1 ) )
if ( FT_DUP( font->name, s, slen + 1 ) )
goto Exit;
/* If the font name is an XLFD name, set the spacing to the one in */
/* the font name. If there is no spacing fall back on the default. */
error = bdf_set_default_spacing_( p->font, p->opts, lineno );
error = bdf_set_default_spacing_( font, p->opts, lineno );
if ( error )
goto Exit;
@ -2036,9 +1969,9 @@
if ( error )
goto Exit;
p->font->point_size = bdf_atoul_( p->list.field[1] );
p->font->resolution_x = bdf_atoul_( p->list.field[2] );
p->font->resolution_y = bdf_atoul_( p->list.field[3] );
font->point_size = bdf_atoul_( p->list.field[1] );
font->resolution_x = bdf_atoul_( p->list.field[2] );
font->resolution_y = bdf_atoul_( p->list.field[3] );
/* Check for the bits per pixel field. */
if ( p->list.used == 5 )
@ -2050,26 +1983,26 @@
/* Only values 1, 2, 4, 8 are allowed for greymap fonts. */
if ( bpp > 4 )
p->font->bpp = 8;
font->bpp = 8;
else if ( bpp > 2 )
p->font->bpp = 4;
font->bpp = 4;
else if ( bpp > 1 )
p->font->bpp = 2;
font->bpp = 2;
else
p->font->bpp = 1;
font->bpp = 1;
if ( p->font->bpp != bpp )
FT_TRACE2(( "bdf_parse_start_: " ACMSG11, p->font->bpp ));
if ( font->bpp != bpp )
FT_TRACE2(( "bdf_parse_start_: " ACMSG11, font->bpp ));
}
else
p->font->bpp = 1;
font->bpp = 1;
p->flags |= BDF_SIZE_;
goto Exit;
}
/* Check for the CHARS field -- font properties are optional */
/* Check for the CHARS field */
if ( _bdf_strncmp( line, "CHARS", 5 ) == 0 )
{
char nbuf[BUFSIZE];
@ -2083,28 +2016,65 @@
goto Exit;
}
/* Add the two standard X11 properties which are required */
/* for compiling fonts. */
p->font->font_ascent = p->font->bbx.ascent;
ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.ascent );
error = bdf_add_property_( p->font, "FONT_ASCENT",
nbuf, lineno );
/* If the FONT_ASCENT or FONT_DESCENT properties have not been */
/* encountered yet, then make sure they are added as properties and */
/* make sure they are set from the font bounding box info. */
/* */
/* This is *always* done regardless of the options, because X11 */
/* requires these two fields to compile fonts. */
if ( bdf_get_font_property( font, "FONT_ASCENT" ) == 0 )
{
font->font_ascent = font->bbx.ascent;
ft_snprintf( nbuf, BUFSIZE, "%hd", font->bbx.ascent );
error = bdf_add_property_( font, "FONT_ASCENT", nbuf, lineno );
if ( error )
goto Exit;
FT_TRACE2(( "bdf_parse_start_: " ACMSG1, font->bbx.ascent ));
}
if ( bdf_get_font_property( font, "FONT_DESCENT" ) == 0 )
{
font->font_descent = font->bbx.descent;
ft_snprintf( nbuf, BUFSIZE, "%hd", font->bbx.descent );
error = bdf_add_property_( font, "FONT_DESCENT", nbuf, lineno );
if ( error )
goto Exit;
FT_TRACE2(( "bdf_parse_start_: " ACMSG2, font->bbx.descent ));
}
error = bdf_list_split_( &p->list, " +", line, linelen );
if ( error )
goto Exit;
FT_TRACE2(( "bdf_parse_start_: " ACMSG1, p->font->bbx.ascent ));
p->cnt = font->glyphs_size = bdf_atoul_( p->list.field[1] );
p->font->font_descent = p->font->bbx.descent;
ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.descent );
error = bdf_add_property_( p->font, "FONT_DESCENT",
nbuf, lineno );
if ( error )
/* We need at least 20 bytes per glyph. */
if ( p->cnt > p->size / 20 )
{
p->cnt = font->glyphs_size = p->size / 20;
FT_TRACE2(( "bdf_parse_start_: " ACMSG17, p->cnt ));
}
/* Make sure the number of glyphs is non-zero. */
if ( p->cnt == 0 )
font->glyphs_size = 64;
/* Limit ourselves to 1,114,112 glyphs in the font (this is the */
/* number of code points available in Unicode). */
if ( p->cnt >= 0x110000UL )
{
FT_ERROR(( "bdf_parse_start_: " ERRMSG5, lineno, "CHARS" ));
error = FT_THROW( Invalid_Argument );
goto Exit;
FT_TRACE2(( "bdf_parse_start_: " ACMSG2, p->font->bbx.descent ));
}
*next = bdf_parse_glyphs_;
if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) )
goto Exit;
p->flags |= BDF_GLYPHS_;
*next = bdf_parse_glyphs_;
/* A special return value. */
error = -1;
goto Exit;
}

Loading…
Cancel
Save