From 8c90c22dbe0b89970f0fb878117c3c2a5e2e214c Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sat, 8 Jun 2002 06:47:18 +0000 Subject: [PATCH] * src/cache/ftccache.c (ftc_node_hash_unlink, ftc_node_hash_link) [FTC_CACHE_USE_LINEAR_HASHING]: Fix returned error code. Fix debugging messages. * src/type42/t42error.h: New file. * src/type42/t42drivr.c, src/type42/t42objs.c, src/type42/t42parse.c: Use t42 error codes. * src/type42/rules.mk: Updated. * src/base/ftnames.c: Include FT_INTERNAL_STREAM_H. Formatting, adding copyright messages. --- ChangeLog | 114 ++++++++++++++++++++++---- include/freetype/cache/ftccache.h | 3 +- src/base/ftnames.c | 1 + src/cache/ftccache.c | 76 +++++++++++------ src/cache/ftccache.i | 41 ++++++++-- src/cache/ftccmap.c | 16 ++-- src/cache/ftcsbits.c | 14 ++-- src/type42/rules.mk | 3 +- src/type42/t42drivr.c | 24 +++++- src/type42/t42drivr.h | 10 +-- src/type42/t42objs.c | 131 ++++++++++++++++++------------ src/type42/t42objs.h | 41 ++++++++-- src/type42/t42parse.c | 45 +++++++--- src/type42/t42parse.h | 29 ++++++- src/type42/type42.c | 14 +++- 15 files changed, 411 insertions(+), 151 deletions(-) diff --git a/ChangeLog b/ChangeLog index c7c28cc0e..4158937fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,27 +1,113 @@ +2002-06-08 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_hash_unlink, ftc_node_hash_link) + [FTC_CACHE_USE_LINEAR_HASHING]: Fix returned error code. + Fix debugging messages. + + * src/type42/t42error.h: New file. + * src/type42/t42drivr.c, src/type42/t42objs.c, + src/type42/t42parse.c: Use t42 error codes. + * src/type42/rules.mk: Updated. + + * src/base/ftnames.c: Include FT_INTERNAL_STREAM_H. + +2002-06-08 David Turner + + * src/cache/ftccmap.c: GEN_CACHE_FAMILY_COMPARE, + GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]: + New macros. + (ftc_cmap_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to + ftc_cache_lookup. + (FTC_CMapCache_Lookup): Updated. + 2002-06-07 Graham Asher - * include/freetype/cache/ftccache.h, src/cache/ftccache.c, - src/cache/ftccache.i, src/cache/ftcsbits.c: adding various - experimental optimisations to the cache manager + Adding various experimental optimizations to the cache manager. - * src/type42/t42parse.c: removing duplicate function + * include/freetype/cache/ftccache.h (FTC_CACHE_USE_INLINE, + FTC_CACHE_USE_LINEAR_HASHING): New options. + (FTC_CacheRec) [FTC_CACHE_USE_LINEAR_HASHING]: New elements `p', + `mask', and `slack'. - * src/base/ftobjs.c (FT_Render_Glyph_Internal): changed definition - from FT_EXPORT_DEF to FT_BASE_DEF + * src/cache/ftccache.c (FTC_HASH_MAX_LOAD, FTC_HASH_MIN_LOAD, + FTC_HASH_SUB_LOAD) [FTC_CACHE_USE_LINEAR_HASHING, + FTC_HASH_INITIAL_SIZE]: New macros. + (ftc_node_mru_link, ftc_node_mru_up): Optimized. + (ftc_node_hash_unlink, ftc_node_hash_link) + [FTC_CACHE_USE_LINEAR_HASHING]: New variants. + (FTC_PRIMES_MIN, FTC_PRIMES_MAX, ftc_primes, ftc_prime_closest, + FTC_CACHE_RESIZE_TEST, ftc_cache_resize) + [!FTC_CACHE_USE_LINEAR_HASHING]: Define it conditionally. + (ftc_cache_init, ftc_cache_clear) [FTC_CACHE_USE_LINEAR_HASHING]: + Updated. + (ftc_cache_lookup) [FTC_CACHE_USE_LINEAR_HASHING]: Implement it. -2002-06-07 David Turner + * src/cache/ftccache.i: New file. - * src/type42/t42drivr.c, src/type42/t42drivr.h, src/type42/t42parse.c, - src/type42/t42parse.h, src/type42/t42objs.h, src/type42/t42objs.c, - src/type42/type42.c: + * src/cache/ftcsbits.c (GEN_CACHE_FAMILY_COMPARE, + GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]: + New macros. + (ftc_sbit_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to + ftc_cache_lookup. + (FTC_SBitCache_Lookup): Updated. - updated the Type42 driver by splitting it into several files since - it makes the code easier to read and maintain. Also fixed the bug - that prevented the correct display of fonts with "ftview" + * src/type42/t42parse.c: Removing duplicate function. + + * src/base/ftobjs.c (FT_Render_Glyph_Internal): Changed definition + from FT_EXPORT_DEF to FT_BASE_DEF. + +2002-06-07 David Turner + + Fixed the bug that prevented the correct display of fonts with + "ftview". + + * src/type42/t42drivr.c: Split into... + * src/type42/t42drivr.h, src/type42/t42parse.c, + src/type42/t42parse.h, src/type42/t42objs.h, src/type42/t42objs.c, + src/type42/type42.c: New files. + + (t42_get_glyph_name, t42_get_ps_name, t42_get_name_index): Use + `face->type1'. + + (Get_Interface): Renamed to... + (T42_Get_Interface): This. + Updated. + (T42_Open_Face, T42_Face_Done): Updated. + (T42_Face_Init): Add new cmap support. + Updated. + (T42_Driver_Init, T42_Driver_Done, T42_Size_Init, T42_Size_Done, + T42_GlyphSlot_Init, T42_GlyphSlot_Done): Updated. + (Get_Char_Index, Get_Next_Char): Renamed to... + (T42_CMap_CharIndex, T42_CMap_CharNext): This. + Updated. + (T42_Char_Size, T42_Pixel_Size): Renamed to... + (T42_Size_SetChars, T42_Size_SetPixels): This. + (T42_Load_Glyph): Renamed to... + (T42_GlyphSlot_Load): This. + + (t42_init_loader, t42_done_loader): Renamed to... + (t42_loader_init, t42_loader_done): This. + (T42_New_Parser, T42_Finalize_Parser): Renamed to... + (t42_parser_init, t42_parser_done): This. + (parse_dict): Renamed to... + (t42_parse_dict): This. + (is_alpha, is_space, hexval): Renamed to... + (t42_is_alpha, t42_is_space, t42_hexval): This. + (parse_font_name, parse_font_bbox, parse_font_matrix, + parse_encoding, parse_sfnts, parse_charstrings, parse_dict): + Renamed to... + (t42_parse_font_name, t42_parse_font_bbox, t42_parse_font_matrix, + t42_parse_encoding, t42_parse_sfnts, t42_parse_charstrings, + t42_parse_dict): This. + Updated. + + (t42_keywords): Updated. + + * src/type42/Jamfile, src/type42/descrip.mms: Updated. 2002-06-03 Werner Lemberg - Add 8bpp support. + Add 8bpp support to BDF driver. * src/bdf/bdflib.c (_bdf_parse_start): Handle 8bpp. * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Ditto. diff --git a/include/freetype/cache/ftccache.h b/include/freetype/cache/ftccache.h index d45b223e8..1871a0f19 100644 --- a/include/freetype/cache/ftccache.h +++ b/include/freetype/cache/ftccache.h @@ -4,7 +4,7 @@ /* */ /* FreeType internal cache interface (specification). */ /* */ -/* Copyright 2000-2001 by */ +/* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,6 +26,7 @@ /* define to use linear hash table */ #define FTC_CACHE_USE_LINEAR_HASHING + FT_BEGIN_HEADER /* handle to cache object */ diff --git a/src/base/ftnames.c b/src/base/ftnames.c index 74d70548d..7fde5c40b 100644 --- a/src/base/ftnames.c +++ b/src/base/ftnames.c @@ -22,6 +22,7 @@ #include #include FT_SFNT_NAMES_H #include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_STREAM_H #ifdef TT_CONFIG_OPTION_SFNT_NAMES diff --git a/src/cache/ftccache.c b/src/cache/ftccache.c index d5bcf9275..ca74f4fc7 100644 --- a/src/cache/ftccache.c +++ b/src/cache/ftccache.c @@ -26,12 +26,12 @@ #ifdef FTC_CACHE_USE_LINEAR_HASHING -#define FTC_HASH_MAX_LOAD 2 -#define FTC_HASH_MIN_LOAD 1 -#define FTC_HASH_SUB_LOAD (FTC_HASH_MAX_LOAD-FTC_HASH_MIN_LOAD) +#define FTC_HASH_MAX_LOAD 2 +#define FTC_HASH_MIN_LOAD 1 +#define FTC_HASH_SUB_LOAD ( FTC_HASH_MAX_LOAD - FTC_HASH_MIN_LOAD ) -/* this one _must_ be a power of 2 !! */ -#define FTC_HASH_INITIAL_SIZE 8 +/* this one _must_ be a power of 2! */ +#define FTC_HASH_INITIAL_SIZE 8 #endif /* FTC_CACHE_USE_LINEAR_HASHING */ @@ -72,6 +72,7 @@ { FTC_Node last = first->mru_prev; + FT_ASSERT( last->mru_next == first ); node->mru_prev = last; @@ -102,6 +103,7 @@ FTC_Node prev = node->mru_prev; FTC_Node next = node->mru_next; + FT_ASSERT( first != NULL && manager->num_nodes > 0 ); FT_ASSERT( next->mru_prev == node ); FT_ASSERT( prev->mru_next == node ); @@ -111,6 +113,7 @@ if ( node == first ) { + /* this is the last node in the list; update its head pointer */ if ( node == next ) manager->nodes_list = NULL; else @@ -137,6 +140,7 @@ FTC_Node next = node->mru_next; FTC_Node last; + prev->mru_next = next; next->mru_prev = prev; @@ -162,9 +166,10 @@ FTC_Node *pnode; FT_UInt index, num_buckets; + index = (FT_UInt)( node->hash & cache->mask ); if ( index < cache->p ) - index = (FT_UInt)( node->hash & (2*cache->mask+1) ); + index = (FT_UInt)( node->hash & ( 2 * cache->mask + 1 ) ); pnode = cache->buckets + index; @@ -172,8 +177,8 @@ { if ( *pnode == NULL ) { - FT_ERROR(( "FreeType.cache.hash_unlink: unknown node!\n" )); - return 0; + FT_ERROR(( "ftc_node_hash_unlink: unknown node!\n" )); + return FT_Err_Ok; } if ( *pnode == node ) @@ -186,15 +191,16 @@ pnode = &(*pnode)->link; } - num_buckets = ( cache->p + cache->mask + 1) ; + num_buckets = ( cache->p + cache->mask + 1 ); - if ( ++ cache->slack > (FT_Long)num_buckets*FTC_HASH_SUB_LOAD ) + if ( ++cache->slack > (FT_Long)num_buckets * FTC_HASH_SUB_LOAD ) { FT_UInt p = cache->p; FT_UInt mask = cache->mask; FT_UInt old_index = p + mask; FTC_Node* pold; + FT_ASSERT( old_index >= FTC_HASH_INITIAL_SIZE ); if ( p == 0 ) @@ -205,9 +211,9 @@ cache->mask >>= 1; p = cache->mask; - if ( FT_RENEW_ARRAY( cache->buckets, (mask+1)*2, (mask) ) ) + if ( FT_RENEW_ARRAY( cache->buckets, ( mask + 1 ) * 2, mask ) ) { - FT_ERROR(( "FreeType.cache.hash_unlink: couldn't shunk buckets !\n" )); + FT_ERROR(( "ftc_node_hash_unlink: couldn't shunk buckets!\n" )); goto Exit; } } @@ -239,6 +245,7 @@ { FTC_Node *pnode = cache->buckets + ( node->hash % cache->size ); + for (;;) { if ( *pnode == NULL ) @@ -274,9 +281,10 @@ FT_UInt index; FT_Error error = 0; + index = (FT_UInt)( node->hash & cache->mask ); if ( index < cache->p ) - index = (FT_UInt)( node->hash & (2*cache->mask+1) ); + index = (FT_UInt)( node->hash & (2 * cache->mask + 1 ) ); pnode = cache->buckets + index; @@ -289,16 +297,18 @@ FT_UInt mask = cache->mask; FTC_Node new_list; + /* split a single bucket */ new_list = NULL; pnode = cache->buckets + p; + for (;;) { node = *pnode; if ( node == NULL ) break; - if ( node->hash & (mask+1) ) + if ( node->hash & ( mask + 1 ) ) { *pnode = node->link; node->link = new_list; @@ -308,7 +318,7 @@ pnode = &node->link; } - cache->buckets[ p + mask + 1 ] = new_list; + cache->buckets[p + mask + 1] = new_list; cache->slack += FTC_HASH_MAX_LOAD; @@ -317,13 +327,14 @@ FT_Memory memory = cache->memory; - if ( FT_RENEW_ARRAY( cache->buckets, (mask+1)*2, (mask+1)*4 ) ) + if ( FT_RENEW_ARRAY( cache->buckets, + ( mask + 1 ) * 2, ( mask + 1 ) * 4 ) ) { - FT_ERROR(( "FreeType.cache.hash_unlink: couldn't expand buckets !\n" )); + FT_ERROR(( "ftc_node_hash_link: couldn't expand buckets!\n" )); goto Exit; } - cache->mask = 2*mask + 1; + cache->mask = 2 * mask + 1; cache->p = 0; } else @@ -343,6 +354,7 @@ { FTC_Node *pnode = cache->buckets + ( node->hash % cache->size ); + node->link = *pnode; *pnode = node; @@ -466,6 +478,7 @@ #ifdef FTC_CACHE_USE_LINEAR_HASHING + /* nothing */ #else /* !FTC_CACHE_USE_LINEAR_HASHING */ @@ -583,6 +596,7 @@ #endif /* !FTC_CACHE_USE_LINEAR_HASHING */ + FT_EXPORT_DEF( FT_Error ) ftc_cache_init( FTC_Cache cache ) { @@ -594,13 +608,14 @@ #ifdef FTC_CACHE_USE_LINEAR_HASHING cache->p = 0; - cache->mask = FTC_HASH_INITIAL_SIZE-1; - cache->slack = FTC_HASH_INITIAL_SIZE*FTC_HASH_MAX_LOAD; + cache->mask = FTC_HASH_INITIAL_SIZE - 1; + cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD; - if ( FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE*2 ) ) + if ( FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ) ) goto Exit; #else /* !FTC_CACHE_USE_LINEAR_HASHING */ + cache->nodes = 0; cache->size = FTC_PRIMES_MIN; @@ -728,7 +743,7 @@ FTC_Query query, FTC_Node *anode ) { - FT_Error error = 0; + FT_Error error = FT_Err_Ok; FT_LruNode lru; @@ -740,11 +755,12 @@ query->hash = 0; query->family = NULL; - /* XXX: we break encapsulation for the sake of speed !! */ #if 1 + + /* XXX: we break encapsulation for the sake of speed! */ { /* first of all, find the relevant family */ - FT_LruList list = cache->families; + FT_LruList list = cache->families; FT_LruNode fam, *pfam; FT_LruNode_CompareFunc compare = list->clazz->node_compare; @@ -780,27 +796,35 @@ lru = fam; Skip: + ; } + #else + error = FT_LruList_Lookup( cache->families, query, &lru ); if ( !error ) + #endif { FTC_Family family = (FTC_Family) lru; FT_UFast hash = query->hash; FTC_Node* bucket; - #ifdef FTC_CACHE_USE_LINEAR_HASHING + FT_UInt index; + index = hash & cache->mask; if ( index < cache->p ) - index = hash & (cache->mask*2+1); + index = hash & ( cache->mask * 2 + 1 ); bucket = cache->buckets + index; + #else + bucket = cache->buckets + (hash % cache->size); + #endif diff --git a/src/cache/ftccache.i b/src/cache/ftccache.i index ca7f748b2..48f956893 100644 --- a/src/cache/ftccache.i +++ b/src/cache/ftccache.i @@ -1,11 +1,30 @@ +/***************************************************************************/ +/* */ +/* ftccache.i */ +/* */ +/* FreeType template for generic cache. */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #ifndef GEN_CACHE_FAMILY_COMPARE -#error "GEN_CACHE_FAMILY_COMPARE not defined in template instanciation" +#error "GEN_CACHE_FAMILY_COMPARE not defined in template instantiation" #endif #ifndef GEN_CACHE_NODE_COMPARE -#error "GEN_CACHE_NODE_COMPARE not defined in template instanciation" +#error "GEN_CACHE_NODE_COMPARE not defined in template instantiation" #endif + static FT_Error GEN_CACHE_LOOKUP( FTC_Cache cache, FTC_Query query, @@ -17,11 +36,12 @@ query->hash = 0; query->family = NULL; - /* XXX: we break encapsulation for the sake of speed !! */ + /* XXX: we break encapsulation for the sake of speed! */ { /* first of all, find the relevant family */ - FT_LruList list = cache->families; - FT_LruNode fam, *pfam; + FT_LruList list = cache->families; + FT_LruNode fam, *pfam; + pfam = &list->nodes; for (;;) @@ -51,20 +71,21 @@ { FTC_Family family = (FTC_Family) lru; - FT_UFast hash = query->hash; + FT_UFast hash = query->hash; FTC_Node node, *pnode, *bucket; #ifdef FTC_CACHE_USE_LINEAR_HASHING FT_UInt index; + index = hash & cache->mask; if ( index < cache->p ) - index = hash & (cache->mask*2+1); + index = hash & ( cache->mask * 2 + 1 ); bucket = cache->buckets + index; #else - bucket = cache->buckets + (hash % cache->size); + bucket = cache->buckets + ( hash % cache->size ); #endif #ifdef FT_DEBUG_LEVEL_ERROR @@ -119,6 +140,7 @@ FTC_Node next = node->mru_next; FTC_Node last; + prev->mru_next = next; next->mru_prev = prev; @@ -139,3 +161,6 @@ #undef GEN_CACHE_NODE_COMPARE #undef GEN_CACHE_FAMILY_COMPARE #undef GEN_CACHE_LOOKUP + + +/* END */ diff --git a/src/cache/ftccmap.c b/src/cache/ftccmap.c index 8eb9a84f2..8c982c3d6 100644 --- a/src/cache/ftccmap.c +++ b/src/cache/ftccmap.c @@ -320,21 +320,23 @@ #ifdef FTC_CACHE_USE_INLINE -# define GEN_CACHE_FAMILY_COMPARE(f,q,c) \ - ftc_cmap_family_compare( (FTC_CMapFamily)(f), (FTC_CMapQuery)(q) ) +#define GEN_CACHE_FAMILY_COMPARE( f, q, c ) \ + ftc_cmap_family_compare( (FTC_CMapFamily)(f), (FTC_CMapQuery)(q) ) -# define GEN_CACHE_NODE_COMPARE(n,q,c) \ - ftc_cmap_node_compare( (FTC_CMapNode)(n), (FTC_CMapQuery)(q) ) +#define GEN_CACHE_NODE_COMPARE( n, q, c ) \ + ftc_cmap_node_compare( (FTC_CMapNode)(n), (FTC_CMapQuery)(q) ) -# define GEN_CACHE_LOOKUP ftc_cmap_cache_lookup -# include "ftccache.i" +#define GEN_CACHE_LOOKUP ftc_cmap_cache_lookup + +#include "ftccache.i" #else /* !FTC_CACHE_USE_INLINE */ -# define ftc_cmap_cache_lookup ftc_cache_lookup +#define ftc_cmap_cache_lookup ftc_cache_lookup #endif /* !FTC_CACHE_USE_INLINE */ + /* documentation is in ftccmap.h */ FT_EXPORT_DEF( FT_UInt ) diff --git a/src/cache/ftcsbits.c b/src/cache/ftcsbits.c index 25056e319..5b8ff1e29 100644 --- a/src/cache/ftcsbits.c +++ b/src/cache/ftcsbits.c @@ -464,18 +464,18 @@ #ifdef FTC_CACHE_USE_INLINE -# define GEN_CACHE_FAMILY_COMPARE(f,q,c) \ - ftc_sbit_family_compare( (FTC_SBitFamily)(f), (FTC_SBitQuery)(q) ) +#define GEN_CACHE_FAMILY_COMPARE( f, q, c ) \ + ftc_sbit_family_compare( (FTC_SBitFamily)(f), (FTC_SBitQuery)(q) ) -# define GEN_CACHE_NODE_COMPARE(n,q,c) \ - ftc_sbit_node_compare( (FTC_SBitNode)(n), (FTC_SBitQuery)(q), c ) +#define GEN_CACHE_NODE_COMPARE( n, q, c ) \ + ftc_sbit_node_compare( (FTC_SBitNode)(n), (FTC_SBitQuery)(q), c ) -# define GEN_CACHE_LOOKUP ftc_sbit_cache_lookup -# include "ftccache.i" +#define GEN_CACHE_LOOKUP ftc_sbit_cache_lookup +#include "ftccache.i" #else /* !FTC_CACHE_USE_INLINE */ -# define ftc_sbit_cache_lookup ftc_cache_lookup +#define ftc_sbit_cache_lookup ftc_cache_lookup #endif /* !FTC_CACHE_USE_INLINE */ diff --git a/src/type42/rules.mk b/src/type42/rules.mk index 02cca1f22..f991449f5 100644 --- a/src/type42/rules.mk +++ b/src/type42/rules.mk @@ -32,7 +32,8 @@ T42_DRV_SRC := $(T42_DIR_)t42objs.c \ # Type42 driver headers # -T42_DRV_H := $(T42_DRV_SRC:%.c=%.h) +T42_DRV_H := $(T42_DRV_SRC:%.c=%.h) \ + $(T42_DIR_)t42error.h # Type42 driver object(s) diff --git a/src/type42/t42drivr.c b/src/type42/t42drivr.c index 398367767..3e0149876 100644 --- a/src/type42/t42drivr.c +++ b/src/type42/t42drivr.c @@ -1,10 +1,30 @@ +/***************************************************************************/ +/* */ +/* t42drivr.c */ +/* */ +/* High-level Type 42 driver interface (body). */ +/* */ +/* Copyright 2002 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #include "t42drivr.h" #include "t42objs.h" +#include "t42error.h" #include FT_INTERNAL_DEBUG_H + #undef FT_COMPONENT #define FT_COMPONENT trace_t42 + static FT_Error t42_get_glyph_name( T42_Face face, FT_UInt glyph_index, @@ -28,7 +48,7 @@ ((FT_Byte*)buffer)[len] = 0; } - return FT_Err_Ok; + return T42_Err_Ok; } @@ -127,3 +147,5 @@ (FT_CharMap_CharNextFunc) T42_CMap_CharNext, }; + +/* END */ diff --git a/src/type42/t42drivr.h b/src/type42/t42drivr.h index cfa8fcf94..98b7410b6 100644 --- a/src/type42/t42drivr.h +++ b/src/type42/t42drivr.h @@ -4,8 +4,7 @@ /* */ /* High-level Type 42 driver interface (specification). */ /* */ -/* Copyright 1996-2001, 2002 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* Copyright 2002 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ @@ -16,8 +15,8 @@ /***************************************************************************/ -#ifndef __T42DRIVER_H__ -#define __T42DRIVER_H__ +#ifndef __T42DRIVR_H__ +#define __T42DRIVR_H__ #include @@ -32,7 +31,8 @@ FT_BEGIN_HEADER FT_END_HEADER -#endif /* __T42DRIVER_H__ */ + +#endif /* __T42DRIVR_H__ */ /* END */ diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c index bb9f4bab7..e22d83319 100644 --- a/src/type42/t42objs.c +++ b/src/type42/t42objs.c @@ -1,9 +1,28 @@ +/***************************************************************************/ +/* */ +/* t42objs.c */ +/* */ +/* Type 42 objects manager (body). */ +/* */ +/* Copyright 2002 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #include "t42objs.h" #include "t42parse.h" +#include "t42error.h" #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H #include FT_LIST_H + #undef FT_COMPONENT #define FT_COMPONENT trace_t42 @@ -38,7 +57,7 @@ if ( type1->font_type != 42 ) { - error = FT_Err_Unknown_File_Format; + error = T42_Err_Unknown_File_Format; goto Exit; } @@ -48,18 +67,18 @@ if ( !loader.charstrings.init ) { FT_ERROR(( "T42_Open_Face: no charstrings array in face!\n" )); - error = FT_Err_Invalid_File_Format; + error = T42_Err_Invalid_File_Format; } - loader.charstrings.init = 0; + loader.charstrings.init = 0; type1->charstrings_block = loader.charstrings.block; type1->charstrings = loader.charstrings.elements; type1->charstrings_len = loader.charstrings.lengths; /* we copy the glyph names `block' and `elements' fields; */ /* the `lengths' field must be released later */ - type1->glyph_names_block = loader.glyph_names.block; - type1->glyph_names = (FT_String**)loader.glyph_names.elements; + type1->glyph_names_block = loader.glyph_names.block; + type1->glyph_names = (FT_String**)loader.glyph_names.elements; loader.glyph_names.block = 0; loader.glyph_names.elements = 0; @@ -165,7 +184,7 @@ if ( face_index != 0 ) { FT_ERROR(( "T42_Face_Init: invalid face index\n" )); - error = FT_Err_Invalid_Argument; + error = T42_Err_Invalid_Argument; goto Exit; } @@ -176,7 +195,7 @@ root->num_glyphs = face->type1.num_glyphs; root->num_charmaps = 0; - root->face_index = face_index; + root->face_index = face_index; root->face_flags = FT_FACE_FLAG_SCALABLE; root->face_flags |= FT_FACE_FLAG_HORIZONTAL; @@ -242,7 +261,7 @@ root->descender = face->ttf_face->descender; root->height = face->ttf_face->height; - root->max_advance_width = face->ttf_face->max_advance_width; + root->max_advance_width = face->ttf_face->max_advance_width; root->max_advance_height = face->ttf_face->max_advance_height; root->underline_position = face->type1.font_info.underline_position; @@ -318,9 +337,9 @@ if ( clazz ) FT_CMap_New( clazz, NULL, &charmap, NULL ); - /* Select default charmap */ - if (root->num_charmaps) - root->charmap = root->charmaps[0]; + /* Select default charmap */ + if (root->num_charmaps) + root->charmap = root->charmaps[0]; } } @@ -328,31 +347,32 @@ /* charmap support -- synthetize unicode charmap if possible */ { - FT_CharMap charmap = face->charmaprecs; + FT_CharMap charmap = face->charmaprecs; + /* synthesize a Unicode charmap if there is support in the `PSNames' */ /* module */ if ( psnames && psnames->unicode_value ) { - error = psnames->build_unicodes( root->memory, - face->type1.num_glyphs, - (const char**)face->type1.glyph_names, - &face->unicode_map ); - if ( !error ) - { - root->charmap = charmap; - charmap->face = (FT_Face)face; - charmap->encoding = ft_encoding_unicode; - charmap->platform_id = 3; - charmap->encoding_id = 1; - charmap++; - } - - /* XXX: Is the following code correct? It is used in t1objs.c */ - - /* simply clear the error in case of failure (which really) */ - /* means that out of memory or no unicode glyph names */ - error = FT_Err_Ok; + error = psnames->build_unicodes( root->memory, + face->type1.num_glyphs, + (const char**)face->type1.glyph_names, + &face->unicode_map ); + if ( !error ) + { + root->charmap = charmap; + charmap->face = (FT_Face)face; + charmap->encoding = ft_encoding_unicode; + charmap->platform_id = 3; + charmap->encoding_id = 1; + charmap++; + } + + /* XXX: Is the following code correct? It is used in t1objs.c */ + + /* simply clear the error in case of failure (which really) */ + /* means that out of memory or no unicode glyph names */ + error = T42_Err_Ok; } /* now, support either the standard, expert, or custom encoding */ @@ -362,29 +382,29 @@ switch ( face->type1.encoding_type ) { case T1_ENCODING_TYPE_STANDARD: - charmap->encoding = ft_encoding_adobe_standard; - charmap->encoding_id = 0; - break; - + charmap->encoding = ft_encoding_adobe_standard; + charmap->encoding_id = 0; + break; + case T1_ENCODING_TYPE_EXPERT: - charmap->encoding = ft_encoding_adobe_expert; - charmap->encoding_id = 1; - break; - + charmap->encoding = ft_encoding_adobe_expert; + charmap->encoding_id = 1; + break; + case T1_ENCODING_TYPE_ARRAY: - charmap->encoding = ft_encoding_adobe_custom; - charmap->encoding_id = 2; - break; - + charmap->encoding = ft_encoding_adobe_custom; + charmap->encoding_id = 2; + break; + case T1_ENCODING_TYPE_ISOLATIN1: - charmap->encoding = ft_encoding_latin_1; - charmap->encoding_id = 3; - break; - + charmap->encoding = ft_encoding_latin_1; + charmap->encoding_id = 3; + break; + default: - FT_ERROR(( "T42_Face_Init: invalid encoding\n" )); - error = FT_Err_Invalid_File_Format; - goto Exit; + FT_ERROR(( "T42_Face_Init: invalid encoding\n" )); + error = T42_Err_Invalid_File_Format; + goto Exit; } root->charmaps = face->charmaps; @@ -410,7 +430,7 @@ if ( face ) { - type1 = &face->type1; + type1 = &face->type1; info = &type1->font_info; memory = face->root.memory; @@ -454,6 +474,7 @@ } } + /*************************************************************************/ /* */ /* */ @@ -477,7 +498,7 @@ ttmodule = FT_Get_Module( FT_MODULE(driver)->library, "truetype" ); driver->ttclazz = (FT_Driver_Class)ttmodule->clazz; - return FT_Err_Ok; + return T42_Err_Ok; } @@ -608,7 +629,7 @@ FT_Face face = size->root.face; T42_Face t42face = (T42_Face)face; FT_Size ttsize; - FT_Error error = FT_Err_Ok; + FT_Error error = T42_Err_Ok; error = FT_New_Size( t42face->ttf_face, &ttsize ); @@ -641,7 +662,7 @@ FT_Face face = slot->root.face; T42_Face t42face = (T42_Face)face; FT_GlyphSlot ttslot; - FT_Error error = FT_Err_Ok; + FT_Error error = T42_Err_Ok; if ( face->glyph == NULL ) @@ -879,3 +900,5 @@ return 0; } + +/* END */ diff --git a/src/type42/t42objs.h b/src/type42/t42objs.h index 04db2cd9a..717b10713 100644 --- a/src/type42/t42objs.h +++ b/src/type42/t42objs.h @@ -1,5 +1,22 @@ -#ifndef __TYPE42_OBJS_H__ -#define __TYPE42_OBJS_H__ +/***************************************************************************/ +/* */ +/* t42objs.h */ +/* */ +/* Type 42 objects manager (specification). */ +/* */ +/* Copyright 2002 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42OBJS_H__ +#define __T42OBJS_H__ #include #include FT_FREETYPE_H @@ -10,9 +27,10 @@ #include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H + FT_BEGIN_HEADER - /* Type42 face */ + /* Type42 face */ typedef struct T42_FaceRec_ { FT_FaceRec root; @@ -32,8 +50,7 @@ FT_BEGIN_HEADER } T42_FaceRec, *T42_Face; - - /* Type42 size */ + /* Type42 size */ typedef struct T42_SizeRec_ { FT_SizeRec root; @@ -42,7 +59,7 @@ FT_BEGIN_HEADER } T42_SizeRec, *T42_Size; - /* Type42 slot */ + /* Type42 slot */ typedef struct T42_GlyphSlotRec_ { FT_GlyphSlotRec root; @@ -51,7 +68,7 @@ FT_BEGIN_HEADER } T42_GlyphSlotRec, *T42_GlyphSlot; - /* Type 42 driver */ + /* Type 42 driver */ typedef struct T42_DriverRec_ { FT_DriverRec root; @@ -60,7 +77,9 @@ FT_BEGIN_HEADER } T42_DriverRec, *T42_Driver; - /* */ + + /* */ + FT_LOCAL( FT_Error ) T42_Face_Init( FT_Stream stream, @@ -127,4 +146,8 @@ FT_BEGIN_HEADER FT_END_HEADER -#endif /* __TYPE42_OBJS_H__ */ + +#endif /* __T42OBJS_H__ */ + + +/* END */ diff --git a/src/type42/t42parse.c b/src/type42/t42parse.c index 870d2eeec..5a0e23e1c 100644 --- a/src/type42/t42parse.c +++ b/src/type42/t42parse.c @@ -1,9 +1,28 @@ +/***************************************************************************/ +/* */ +/* t42parse.c */ +/* */ +/* Type 42 font parser (body). */ +/* */ +/* Copyright 2002 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #include "t42parse.h" +#include "t42error.h" #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H #include FT_LIST_H #include FT_INTERNAL_POSTSCRIPT_AUX_H + /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ @@ -13,6 +32,7 @@ #undef FT_COMPONENT #define FT_COMPONENT trace_t42 + static void t42_parse_font_name( T42_Face face, T42_Loader loader ); @@ -118,7 +138,7 @@ FT_Memory memory, PSAux_Service psaux ) { - FT_Error error = FT_Err_Ok; + FT_Error error = T42_Err_Ok; FT_Long size; @@ -165,8 +185,8 @@ else { /* read segment in memory */ - if ( FT_ALLOC( parser->base_dict, size ) || - FT_STREAM_READ( parser->base_dict, size ) ) + if ( FT_ALLOC( parser->base_dict, size ) || + FT_STREAM_READ( parser->base_dict, size ) ) goto Exit; parser->base_len = size; @@ -176,7 +196,7 @@ if (size <= 17 || ( ft_strncmp( (const char*)parser->base_dict, "%!PS-TrueTypeFont", 17) ) ) - error = FT_Err_Unknown_File_Format; + error = T42_Err_Unknown_File_Format; else { parser->root.base = parser->base_dict; @@ -346,7 +366,7 @@ if ( cur >= limit ) { FT_ERROR(( "t42_parse_encoding: out of bounds!\n" )); - parser->root.error = FT_Err_Invalid_File_Format; + parser->root.error = T42_Err_Invalid_File_Format; return; } } @@ -485,7 +505,7 @@ else { FT_ERROR(( "t42_parse_encoding: invalid token!\n" )); - parser->root.error = FT_Err_Invalid_File_Format; + parser->root.error = T42_Err_Invalid_File_Format; } } } @@ -549,7 +569,7 @@ else { FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector!\n" )); - error = FT_Err_Invalid_File_Format; + error = T42_Err_Invalid_File_Format; goto Fail; } @@ -574,7 +594,7 @@ if ( !in_string ) { FT_ERROR(( "t42_parse_sfnts: found unpaired `>'!\n" )); - error = FT_Err_Invalid_File_Format; + error = T42_Err_Invalid_File_Format; goto Fail; } @@ -597,7 +617,7 @@ else { FT_ERROR(( "t42_parse_sfnts: found `%' in string!\n" )); - error = FT_Err_Invalid_File_Format; + error = T42_Err_Invalid_File_Format; goto Fail; } @@ -605,7 +625,7 @@ if ( !ft_xdigit( *cur ) || !ft_xdigit( *(cur + 1) ) ) { FT_ERROR(( "t42_parse_sfnts: found non-hex characters in string" )); - error = FT_Err_Invalid_File_Format; + error = T42_Err_Invalid_File_Format; goto Fail; } @@ -670,7 +690,7 @@ } /* If control reaches this point, the format was not valid */ - error = FT_Err_Invalid_File_Format; + error = T42_Err_Invalid_File_Format; Fail: parser->root.error = error; @@ -780,7 +800,7 @@ if ( ft_strcmp( (char *)name_table->elements[0], ".notdef" ) ) { FT_ERROR(( "t42_parse_charstrings: Index 0 is not `.notdef'!\n" )); - error = FT_Err_Invalid_File_Format; + error = T42_Err_Invalid_File_Format; goto Fail; } @@ -970,3 +990,4 @@ } +/* END */ diff --git a/src/type42/t42parse.h b/src/type42/t42parse.h index 342298f66..9bcb65730 100644 --- a/src/type42/t42parse.h +++ b/src/type42/t42parse.h @@ -1,9 +1,28 @@ -#ifndef __TYPE42_PARSE_H__ -#define __TYPE42_PARSE_H__ +/***************************************************************************/ +/* */ +/* t42parse.h */ +/* */ +/* Type 42 font parser (specification). */ +/* */ +/* Copyright 2002 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42PARSE_H__ +#define __T42PARSE_H__ + #include "t42objs.h" #include FT_INTERNAL_POSTSCRIPT_AUX_H + FT_BEGIN_HEADER typedef struct T42_ParserRec_ @@ -63,4 +82,8 @@ FT_BEGIN_HEADER FT_END_HEADER -#endif /* __TYPE42_PARSE_H__ */ + +#endif /* __T42PARSE_H__ */ + + +/* END */ diff --git a/src/type42/type42.c b/src/type42/type42.c index 46d08edb3..d13df56b1 100644 --- a/src/type42/type42.c +++ b/src/type42/type42.c @@ -1,12 +1,20 @@ /***************************************************************************/ /* */ -/* type42c */ +/* type42.c */ /* */ -/* FreeType Type 42 driver component */ +/* FreeType Type 42 driver component. */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ /* */ /***************************************************************************/ - #define FT_MAKE_OPTION_SINGLE_OBJECT #include