From 8ef4183690ab7a8f5fef0eb9ae64b0958aecc6b8 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Tue, 22 Jun 2004 12:28:17 +0000 Subject: [PATCH] * src/bdf/bdfdrivr.h (BDF_FaceRec): New element `default_glyph'. * src/bdf/bdflib.c (_bdf_add_property, _bdf_parse_start), src/bdf/bdf.h (bdf_font_t): s/default_glyph/default_char/. * src/bdf/bdfdrivr.c (BDF_Face_Init): Fix number of glyphs. Set `default_glyph'. (BDF_Glyph_Load): Use `default_glyph' for undefined glyph. * docs/CHANGES: Updated. --- ChangeLog | 11 +++++++++++ docs/CHANGES | 7 ++++++- src/bdf/bdf.h | 4 ++-- src/bdf/bdfdrivr.c | 20 +++++++++++++++++--- src/bdf/bdfdrivr.h | 4 +++- src/bdf/bdflib.c | 6 +++--- 6 files changed, 42 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 459df6f59..65891bdf9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,17 @@ * src/pcf/pcfdrivr.c (FT_COMPOMENT): Move up. (PCF_Face_Init): Simplify code. + * src/bdf/bdfdrivr.h (BDF_FaceRec): New element `default_glyph'. + + * src/bdf/bdflib.c (_bdf_add_property, _bdf_parse_start), + src/bdf/bdf.h (bdf_font_t): s/default_glyph/default_char/. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Fix number of glyphs. + Set `default_glyph'. + (BDF_Glyph_Load): Use `default_glyph' for undefined glyph. + + * docs/CHANGES: Updated. + 2004-06-21 Werner Lemberg * docs/CHANGES: Updated. diff --git a/docs/CHANGES b/docs/CHANGES index 62b56cc8f..fdb9ce33d 100644 --- a/docs/CHANGES +++ b/docs/CHANGES @@ -9,7 +9,7 @@ LATEST CHANGES BETWEEN 2.1.9 and 2.1.8 cmap caches.) - `FT_Outline_Get_BBox' sometimes returned incorrect values for - conic outlines (e.g. for TrueType fonts). + conic outlines (e.g., for TrueType fonts). - Handling of `bhed' table has been fixed. @@ -17,6 +17,11 @@ LATEST CHANGES BETWEEN 2.1.9 and 2.1.8 returned artifacts due to incorrect rounding. This bug has been introduced after version 2.1.4. + - The BDF driver dropped the last glyph in the font. + + - The BDF driver now uses the DEFAULT_CHAR property (if available) + to select a glyph shape for the undefined glyph. + II. IMPORTANT CHANGES diff --git a/src/bdf/bdf.h b/src/bdf/bdf.h index 4dab5ae9d..b42baa6e0 100644 --- a/src/bdf/bdf.h +++ b/src/bdf/bdf.h @@ -1,6 +1,6 @@ /* * Copyright 2000 Computing Research Labs, New Mexico State University - * Copyright 2001, 2002, 2003 Francesco Zappa Nardelli + * Copyright 2001, 2002, 2003, 2004 Francesco Zappa Nardelli * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -202,7 +202,7 @@ FT_BEGIN_HEADER unsigned short monowidth; /* Logical width for monowidth font. */ - long default_glyph; /* Encoding of the default glyph. */ + long default_char; /* Encoding of the default glyph. */ long font_ascent; /* Font ascent. */ long font_descent; /* Font descent. */ diff --git a/src/bdf/bdfdrivr.c b/src/bdf/bdfdrivr.c index a7c3eaf47..8f33d537e 100644 --- a/src/bdf/bdfdrivr.c +++ b/src/bdf/bdfdrivr.c @@ -109,6 +109,8 @@ THE SOFTWARE. if ( charcode == code ) { + /* increase glyph index by 1 -- */ + /* we reserve slot 0 for the undefined glyph */ result = encodings[mid].glyph + 1; break; } @@ -147,6 +149,8 @@ THE SOFTWARE. if ( charcode == code ) { + /* increase glyph index by 1 -- */ + /* we reserve slot 0 for the undefined glyph */ result = encodings[mid].glyph + 1; goto Exit; } @@ -397,7 +401,9 @@ THE SOFTWARE. if ( ( error = bdf_interpret_style( face ) ) != 0 ) goto Exit; - bdfface->num_glyphs = font->glyphs_size; /* unencoded included */ + /* the number of glyphs (with one slot for the undefined glyph */ + /* at position 0 and all unencoded glyphs) */ + bdfface->num_glyphs = font->glyphs_size + 1; bdfface->num_fixed_sizes = 1; if ( FT_NEW_ARRAY( bdfface->available_sizes, 1 ) ) @@ -457,11 +463,15 @@ THE SOFTWARE. if ( FT_NEW_ARRAY( face->en_table, font->glyphs_size ) ) goto Exit; + face->default_glyph = 0; for ( n = 0; n < font->glyphs_size; n++ ) { (face->en_table[n]).enc = cur[n].encoding; FT_TRACE4(( "idx %d, val 0x%lX\n", n, cur[n].encoding )); (face->en_table[n]).glyph = (FT_Short)n; + + if ( cur[n].encoding == font->default_char ) + face->default_glyph = n; } } @@ -556,7 +566,7 @@ THE SOFTWARE. bdfface->charmap = bdfface->charmaps[0]; } } - } + } Exit: return error; @@ -636,7 +646,10 @@ THE SOFTWARE. goto Exit; } - if ( glyph_index > 0 ) + /* index 0 is the undefined glyph */ + if ( glyph_index == 0 ) + glyph_index = face->default_glyph; + else glyph_index--; /* slot, bitmap => freetype, glyph => bdflib */ @@ -813,6 +826,7 @@ THE SOFTWARE. return BDF_Err_Invalid_Argument; } + static FT_Error bdf_get_charset_id( BDF_Face face, const char* *acharset_encoding, diff --git a/src/bdf/bdfdrivr.h b/src/bdf/bdfdrivr.h index 148041ff2..86f40ee4a 100644 --- a/src/bdf/bdfdrivr.h +++ b/src/bdf/bdfdrivr.h @@ -2,7 +2,7 @@ FreeType font driver for bdf fonts - Copyright (C) 2001, 2002, 2003 by + Copyright (C) 2001, 2002, 2003, 2004 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy @@ -59,6 +59,8 @@ FT_BEGIN_HEADER FT_CharMap charmap_handle; FT_CharMapRec charmap; /* a single charmap per face */ + FT_UInt default_glyph; + } BDF_FaceRec, *BDF_Face; diff --git a/src/bdf/bdflib.c b/src/bdf/bdflib.c index be0e3987e..825385e1d 100644 --- a/src/bdf/bdflib.c +++ b/src/bdf/bdflib.c @@ -1404,7 +1404,7 @@ /* present, and the SPACING property should override the default */ /* spacing. */ if ( ft_memcmp( name, "DEFAULT_CHAR", 12 ) == 0 ) - font->default_glyph = fp->value.int32; + font->default_char = fp->value.int32; else if ( ft_memcmp( name, "FONT_ASCENT", 11 ) == 0 ) font->font_ascent = fp->value.int32; else if ( ft_memcmp( name, "FONT_DESCENT", 12 ) == 0 ) @@ -2048,8 +2048,8 @@ error = hash_init( (hashtable *)p->font->internal,memory ); if ( error ) goto Exit; - p->font->spacing = p->opts->font_spacing; - p->font->default_glyph = -1; + p->font->spacing = p->opts->font_spacing; + p->font->default_char = -1; goto Exit; }