From c1a59318ba2e72dffe6b67819df87985085d0485 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Thu, 3 Mar 2005 23:05:29 +0000 Subject: [PATCH] * src/base/ftutil.c: Include FT_INTERNAL_OBJECTS_H. --- ChangeLog | 58 +++++++++---- include/freetype/internal/ftmemory.h | 123 +++++++++++++++------------ include/freetype/internal/ftobjs.h | 10 ++- include/freetype/internal/ftserv.h | 86 ++++++++++--------- src/autofit/afhints.h | 2 +- src/base/ftutil.c | 13 +-- src/pfr/pfrload.c | 28 +++--- src/pfr/pfrobjs.c | 63 ++++++++------ src/pfr/pfrtypes.h | 13 +-- 9 files changed, 230 insertions(+), 166 deletions(-) diff --git a/ChangeLog b/ChangeLog index b2fb719a8..5102593da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,20 +1,6 @@ -2005-03-04 David Turner +2005-03-04 Werner Lemberg - * include/freetype/internal/{ftmemory.h,ftserv.h}: removing - compiler warnings with GCC 3.3 and above... - - * include/freetype/internal/ftobjs.h, src/base/ftutil.c (ft_highpow2), - src/pfr/pfrload.c, src/pfr/pfrobjs.c, src/pfr/pfrtypes.h: implement - FT_OPTIMIZE_MEMORY, the kerning table is not loaded into the heap - anymore. - - * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Introduce - temporary variable to avoid gcc warning. - (tt_face_load_sbit_image): Mark unused variables with FT_UNUSED. - - * include/freetype/config/ftmodule.h: moving the order of drivers to - speed up font loading. the pcf and bdf loaders are still slow and - eat memory like crazy. + * src/base/ftutil.c: Include FT_INTERNAL_OBJECTS_H. 2005-03-03 Werner Lemberg @@ -48,9 +34,49 @@ * src/truetype/ttgload.c: Include `ttpload.h'. +2005-03-03 David Turner + + * include/freetype/internal/ftmemory.h (FT_ALLOC, FT_REALLOC, + FT_QALLOC, FT_QREALLOC) [gcc >= 3.3]: Provide macro versions which + avoid compiler warnings. + (FT_NEW, FT_NEW_ARRAY, FT_RENEW_ARRAY, FT_QNEW, FT_QNEW_ARRAY, + FT_QRENEW_ARRAY, FT_ALLOC_ARRAY, FT_REALLOC_ARRAY): Updated. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_FIND_GLOBAL_SERVICE, FT_FACE_LOOKUP_SERVICE) [__cpluscplus]: + Provide macro versions which avoid compiler warnings. + + * src/base/ftutil.c (ft_highpow2): New utility function. + + * include/freetype/internal/ftobjs.h: Updated. + + * src/pfr/pfrload.c (pfr_get_gindex, pfr_compare_kern_pairs, + pfr_sort_kerning_pairs): Don't define if FT_OPTIMIZE_MEMORY is set. + (pfr_phy_font_done): Don't handle `kern_pairs' if FT_OPTIMIZE_MEMORY + is set. + (pfr_phy_font_load): Don't call `pfr_sort_kerning_pairs' if + FT_OPTIMIZE_MEMORY is set. + + * src/pfr/pfrobjs.c (pfr_slot_load): Comment out some code which + doesn't work with broken fonts. + (pfr_face_get_kerning) [FT_OPTIMIZE_MEMORY]: Implement. + + * src/pfr/pfrtypes.h (PFR_KernItemRec): Optimize member types. + (PFR_NEXT_KPAIR): New macro. + (PFR_PhyFontRec): Don't define `kern_pairs' if FT_OPTIMIZE_MEMORY is + set. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Introduce + temporary variable to avoid gcc warning. + (tt_face_load_sbit_image): Mark unused variables with FT_UNUSED. + * src/truetype/ttpload.c (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]: Remove redundant variable. + * include/freetype/config/ftmodule.h: Moving the order of drivers to + speed up font loading. The PCF and BDF loaders are still slow and + consume far too much memory. + 2005-03-03 Werner Lemberg * devel/ftoption.h: Updated to recent changes. diff --git a/include/freetype/internal/ftmemory.h b/include/freetype/internal/ftmemory.h index 0715b5726..f0df054e8 100644 --- a/include/freetype/internal/ftmemory.h +++ b/include/freetype/internal/ftmemory.h @@ -369,46 +369,58 @@ FT_BEGIN_HEADER /* */ -/* GCC 3.3 and beyond will generate tons of _stupid_ warnings if we - * don't take special measures. - */ -#if defined(__GNUC__) && ( __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) ) - -#define FT_ALLOC( _pointer_, _size_ ) \ - ({ \ - void* _tmp_ = NULL; \ - error = FT_MEM_ALLOC( _tmp_, _size_ ); \ - _pointer_ = _tmp_; \ - error != 0; \ - }) - -#define FT_REALLOC( _pointer_, _cursize_, _newsize_ ) \ - ({ \ - void* _tmp_ = _pointer_; \ - error = FT_MEM_REALLOC( _tmp_, _cursize_, _newsize_ ); \ - _pointer_ = _tmp_; \ - error != 0; \ - }) - -#define FT_QALLOC( _pointer_, _size_ ) \ - ({ \ - void* _tmp_; \ - error = FT_MEM_QALLOC( _tmp_, _size_ ); \ - _pointer_ = _tmp_; \ - error != 0; \ - }) - -#define FT_QREALLOC( _pointer_, _cursize_, _newsize_ ) \ - ({ \ - void* _tmp_ = _pointer_; \ - error = FT_MEM_QREALLOC( _tmp_, _cursize_, _newsize_ ); \ - _pointer_ = _tmp_; \ - error != 0; \ - }) + /* + * gcc 3.3 and newer will generate tons of _stupid_ warnings if we + * don't take special measures. + */ +#if defined ( __GNUC__ ) && \ + ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 3 ) ) + + +#define FT_ALLOC( _pointer_, _size_ ) \ + ({ \ + void* _tmp_ = NULL; \ + \ + \ + error = FT_MEM_ALLOC( _tmp_, _size_ ); \ + _pointer_ = _tmp_; \ + error != 0; \ + }) + +#define FT_REALLOC( _pointer_, _cursize_, _newsize_ ) \ + ({ \ + void* _tmp_ = _pointer_; \ + \ + \ + error = FT_MEM_REALLOC( _tmp_, _cursize_, _newsize_ ); \ + _pointer_ = _tmp_; \ + error != 0; \ + }) + +#define FT_QALLOC( _pointer_, _size_ ) \ + ({ \ + void* _tmp_; \ + \ + \ + error = FT_MEM_QALLOC( _tmp_, _size_ ); \ + _pointer_ = _tmp_; \ + error != 0; \ + }) + +#define FT_QREALLOC( _pointer_, _cursize_, _newsize_ ) \ + ({ \ + void* _tmp_ = _pointer_; \ + \ + \ + error = FT_MEM_QREALLOC( _tmp_, _cursize_, _newsize_ ); \ + _pointer_ = _tmp_; \ + error != 0; \ + }) #else /* !GCC || GCC < 3.3 */ + #define FT_ALLOC( _pointer_, _size_ ) \ FT_SET_ERROR( FT_MEM_ALLOC( _pointer_, _size_ ) ) @@ -423,37 +435,38 @@ FT_BEGIN_HEADER #endif /* !GCC || GCC < 3.3 */ + #define FT_FREE( _pointer_ ) \ FT_MEM_FREE( _pointer_ ) -#define FT_NEW( _pointer_ ) \ - FT_ALLOC( _pointer_, sizeof(*(_pointer_)) ) +#define FT_NEW( _pointer_ ) \ + FT_ALLOC( _pointer_, sizeof ( *(_pointer_) ) ) -#define FT_NEW_ARRAY( _pointer_, _count_ ) \ - FT_ALLOC( _pointer_, sizeof(*(_pointer_))*(_count_) ) +#define FT_NEW_ARRAY( _pointer_, _count_ ) \ + FT_ALLOC( _pointer_, sizeof ( *(_pointer_) ) * (_count_) ) -#define FT_RENEW_ARRAY( _pointer_, _old_, _new_ ) \ - FT_REALLOC( _pointer_, sizeof(*(_pointer_))*(_old_), \ - sizeof(*(_pointer_))*(_new_) ) +#define FT_RENEW_ARRAY( _pointer_, _old_, _new_ ) \ + FT_REALLOC( _pointer_, sizeof ( *(_pointer_) ) * (_old_), \ + sizeof ( *(_pointer_) ) * (_new_) ) -#define FT_QNEW( _pointer_ ) \ - FT_QALLOC( _pointer_, sizeof(*(_pointer_)) ) +#define FT_QNEW( _pointer_ ) \ + FT_QALLOC( _pointer_, sizeof ( *(_pointer_) ) ) -#define FT_QNEW_ARRAY( _pointer_, _count_ ) \ - FT_QALLOC( _pointer_, sizeof(*(_pointer_))*(_count_) ) +#define FT_QNEW_ARRAY( _pointer_, _count_ ) \ + FT_QALLOC( _pointer_, sizeof ( *(_pointer_) ) * (_count_) ) -#define FT_QRENEW_ARRAY( _pointer_, _old_, _new_ ) \ - FT_QREALLOC( _pointer_, sizeof(*(_pointer_))*(_old_), \ - sizeof(*(_pointer_))*(_new_) ) +#define FT_QRENEW_ARRAY( _pointer_, _old_, _new_ ) \ + FT_QREALLOC( _pointer_, sizeof ( *(_pointer_) ) * (_old_), \ + sizeof ( *(_pointer_) ) * (_new_) ) -#define FT_ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ - FT_ALLOC( _pointer_, (_count_)*sizeof( _type_ ) ) +#define FT_ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ + FT_ALLOC( _pointer_, (_count_) * sizeof ( _type_ ) ) -#define FT_REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \ - FT_REALLOC( _pointer, (_old_) * sizeof ( _type_ ), \ - (_new_) * sizeof ( _type_ ) ) +#define FT_REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \ + FT_REALLOC( _pointer, (_old_) * sizeof ( _type_ ), \ + (_new_) * sizeof ( _type_ ) ) /* */ diff --git a/include/freetype/internal/ftobjs.h b/include/freetype/internal/ftobjs.h index 1a6130c86..4b92aed05 100644 --- a/include/freetype/internal/ftobjs.h +++ b/include/freetype/internal/ftobjs.h @@ -4,7 +4,7 @@ /* */ /* The FreeType private base classes (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -80,12 +80,14 @@ FT_BEGIN_HEADER #define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) - /* returns the highest power of 2 that is <= value, this correspond to - * the highest bit in a given 32-bit value - */ + /* + * Return the highest power of 2 that is <= value; this correspond to + * the highest bit in a given 32-bit value. + */ FT_BASE( FT_UInt32 ) ft_highpow2( FT_UInt32 value ); + /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ diff --git a/include/freetype/internal/ftserv.h b/include/freetype/internal/ftserv.h index fbf865437..9db9fa792 100644 --- a/include/freetype/internal/ftserv.h +++ b/include/freetype/internal/ftserv.h @@ -4,7 +4,7 @@ /* */ /* The FreeType services (specification only). */ /* */ -/* Copyright 2003, 2004 by */ +/* Copyright 2003, 2004, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -61,10 +61,11 @@ FT_BEGIN_HEADER #define FT_FACE_FIND_SERVICE( face, ptr, id ) \ FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ FT_Pointer _tmp_ = NULL; \ FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ \ + \ if ( module->clazz->get_interface ) \ _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ *_pptr_ = _tmp_; \ @@ -74,8 +75,8 @@ FT_BEGIN_HEADER #define FT_FACE_FIND_SERVICE( face, ptr, id ) \ FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \ - FT_Pointer _tmp_ = NULL; \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ \ if ( module->clazz->get_interface ) \ _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ @@ -110,10 +111,11 @@ FT_BEGIN_HEADER #define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ FT_Pointer _tmp_; \ FT_Pointer _pptr_ = (FT_Pointer*)&(ptr); \ \ + \ _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ *_pptr_ = _tmp_; \ FT_END_STMNT @@ -122,15 +124,17 @@ FT_BEGIN_HEADER #define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ FT_Pointer _tmp_; \ \ + \ _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ ptr = _tmp_; \ FT_END_STMNT #endif /* !C++ */ + /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -229,45 +233,45 @@ FT_BEGIN_HEADER */ #ifdef __cplusplus -#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Pointer svc; \ - FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ - \ - \ - svc = FT_FACE(face)->internal->services. service_ ## id; \ - if ( svc == FT_SERVICE_UNAVAILABLE ) \ - svc = NULL; \ - else if ( svc == NULL ) \ - { \ - FT_FACE_FIND_SERVICE( face, svc, id ); \ - \ - FT_FACE(face)->internal->services. service_ ## id = \ - (FT_Pointer)( svc != NULL ? svc \ - : FT_SERVICE_UNAVAILABLE ); \ - } \ - *Pptr = svc; \ +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + *Pptr = svc; \ FT_END_STMNT #else /* !C++ */ -#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Pointer svc; \ - \ - \ - svc = FT_FACE(face)->internal->services. service_ ## id; \ - if ( svc == FT_SERVICE_UNAVAILABLE ) \ - svc = NULL; \ - else if ( svc == NULL ) \ - { \ - FT_FACE_FIND_SERVICE( face, svc, id ); \ - \ - FT_FACE(face)->internal->services. service_ ## id = \ - (FT_Pointer)( svc != NULL ? svc \ - : FT_SERVICE_UNAVAILABLE ); \ - } \ - ptr = svc; \ +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + ptr = svc; \ FT_END_STMNT #endif /* !C++ */ diff --git a/src/autofit/afhints.h b/src/autofit/afhints.h index ca211f028..6f1a8a59a 100644 --- a/src/autofit/afhints.h +++ b/src/autofit/afhints.h @@ -283,4 +283,4 @@ FT_END_HEADER #endif /* __AFHINTS_H__ */ -/* END */ \ No newline at end of file +/* END */ diff --git a/src/base/ftutil.c b/src/base/ftutil.c index 317cd95fb..5b3aa8b66 100644 --- a/src/base/ftutil.c +++ b/src/base/ftutil.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file for memory and list management (body). */ /* */ -/* Copyright 2002, 2004 by */ +/* Copyright 2002, 2004, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,6 +19,7 @@ #include #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H #include FT_LIST_H @@ -403,12 +404,14 @@ { FT_UInt32 value2; - /* we simply clear the lowest bit in each iteration. when - * we reach 0, we now that the previous value was our result - */ + + /* + * We simply clear the lowest bit in each iteration. When + * we reach 0, we know that the previous value was our result. + */ for ( ;; ) { - value2 = value & (value-1); /* clear lowest bit */ + value2 = value & (value - 1); /* clear lowest bit */ if ( value2 == 0 ) break; diff --git a/src/pfr/pfrload.c b/src/pfr/pfrload.c index 38a10c19d..6961dc499 100644 --- a/src/pfr/pfrload.c +++ b/src/pfr/pfrload.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR loader (body). */ /* */ -/* Copyright 2002, 2003, 2004 by */ +/* Copyright 2002, 2003, 2004, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -610,11 +610,12 @@ #ifndef FT_OPTIMIZE_MEMORY - /* - * The kerning data embedded in a PFR font are (charcode,charcode) - * pairs; we need to translate them to (gindex,gindex) and sort - * the resulting array. - */ + + /* + * The kerning data embedded in a PFR font are (charcode,charcode) + * pairs; we need to translate them to (gindex,gindex) and sort + * the resulting array. + */ static FT_UInt pfr_get_gindex( PFR_Char chars, FT_UInt count, @@ -671,14 +672,14 @@ FT_UInt count; - /* create kerning pairs array - */ + /* create kerning pairs array */ if ( FT_NEW_ARRAY( phy_font->kern_pairs, phy_font->num_kern_pairs ) ) goto Exit; - /* load all kerning items into the array, - * converting character codes into glyph indices - */ + /* + * load all kerning items into the array, + * converting character codes into glyph indices + */ pairs = phy_font->kern_pairs; item = phy_font->kern_items; count = 0; @@ -732,8 +733,7 @@ FT_FRAME_EXIT(); } - /* sort the resulting array - */ + /* sort the resulting array */ ft_qsort( pairs, count, sizeof ( PFR_KernPairRec ), pfr_compare_kern_pairs ); @@ -748,8 +748,10 @@ return error; } + #endif /* !FT_OPTIMIZE_MEMORY */ + static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = { { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info }, diff --git a/src/pfr/pfrobjs.c b/src/pfr/pfrobjs.c index 68e1bd944..a4eefb0da 100644 --- a/src/pfr/pfrobjs.c +++ b/src/pfr/pfrobjs.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR object methods (body). */ /* */ -/* Copyright 2002, 2003, 2004 by */ +/* Copyright 2002, 2003, 2004, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -361,7 +361,7 @@ metrics->vertBearingX = 0; metrics->vertBearingY = 0; -#if 0 /* some fonts seem to be broken here !! */ +#if 0 /* some fonts seem to be broken here! */ /* Apply the font matrix, if any. */ /* TODO: Test existing fonts with unusual matrix */ @@ -423,16 +423,18 @@ /*************************************************************************/ #ifdef FT_OPTIMIZE_MEMORY + FT_LOCAL_DEF( FT_Error ) pfr_face_get_kerning( FT_Face pfrface, /* PFR_Face */ FT_UInt glyph1, FT_UInt glyph2, FT_Vector* kerning ) { - PFR_Face face = (PFR_Face)pfrface; - FT_Error error = PFR_Err_Ok; - PFR_PhyFont phy_font = &face->phy_font; - FT_UInt32 code1, code2, pair; + PFR_Face face = (PFR_Face)pfrface; + FT_Error error = PFR_Err_Ok; + PFR_PhyFont phy_font = &face->phy_font; + FT_UInt32 code1, code2, pair; + kerning->x = 0; kerning->y = 0; @@ -450,13 +452,14 @@ code1 = phy_font->chars[glyph1].char_code; code2 = phy_font->chars[glyph2].char_code; - pair = PFR_KERN_INDEX(code1,code2); + pair = PFR_KERN_INDEX( code1, code2 ); /* now search the list of kerning items */ { PFR_KernItem item = phy_font->kern_items; FT_Stream stream = pfrface->stream; + for ( ; item; item = item->next ) { if ( pair >= item->pair1 && pair <= item->pair2 ) @@ -465,28 +468,30 @@ goto Exit; FoundPair: /* we found an item, now parse it and find the value if any */ - if ( FT_STREAM_SEEK( item->offset ) || - FT_FRAME_ENTER( item->pair_count*item->pair_size ) ) + if ( FT_STREAM_SEEK( item->offset ) || + FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) goto Exit; { - FT_UInt count = item->pair_count; - FT_UInt size = item->pair_size; - FT_UInt power = (FT_UInt)ft_highpow2( (FT_UInt32)count ); - FT_UInt probe = power*size; - FT_UInt extra = count - power; - FT_Byte* base = stream->cursor; - FT_Bool twobytes = item->flags & 1; - FT_Byte* p; - FT_UInt32 cpair; + FT_UInt count = item->pair_count; + FT_UInt size = item->pair_size; + FT_UInt power = (FT_UInt)ft_highpow2( (FT_UInt32)count ); + FT_UInt probe = power * size; + FT_UInt extra = count - power; + FT_Byte* base = stream->cursor; + FT_Bool twobytes = item->flags & 1; + FT_Byte* p; + FT_UInt32 cpair; + if ( extra > 0 ) { - p = base + extra*size; + p = base + extra * size; + if ( twobytes ) - cpair = FT_NEXT_ULONG(p); + cpair = FT_NEXT_ULONG( p ); else - cpair = PFR_NEXT_KPAIR(p); + cpair = PFR_NEXT_KPAIR( p ); if ( cpair == pair ) goto Found; @@ -499,10 +504,11 @@ { probe >>= 1; p = base + probe; + if ( twobytes ) - cpair = FT_NEXT_ULONG(p); + cpair = FT_NEXT_ULONG( p ); else - cpair = PFR_NEXT_KPAIR(p); + cpair = PFR_NEXT_KPAIR( p ); if ( cpair == pair ) goto Found; @@ -512,18 +518,20 @@ } p = base; + if ( twobytes ) - cpair = FT_NEXT_ULONG(p); + cpair = FT_NEXT_ULONG( p ); else - cpair = PFR_NEXT_KPAIR(p); + cpair = PFR_NEXT_KPAIR( p ); if ( cpair == pair ) { FT_Int value; + Found: if ( item->flags & 2 ) - value = FT_PEEK_SHORT(p); + value = FT_PEEK_SHORT( p ); else value = p[0]; @@ -539,6 +547,7 @@ } #else /* !FT_OPTIMIZE_MEMORY */ + FT_LOCAL_DEF( FT_Error ) pfr_face_get_kerning( FT_Face pfrface, /* PFR_Face */ FT_UInt glyph1, @@ -580,6 +589,8 @@ return error; } + #endif /* !FT_OPTIMIZE_MEMORY */ + /* END */ diff --git a/src/pfr/pfrtypes.h b/src/pfr/pfrtypes.h index db593f024..b8bd557b2 100644 --- a/src/pfr/pfrtypes.h +++ b/src/pfr/pfrtypes.h @@ -4,7 +4,7 @@ /* */ /* FreeType PFR data structures (specification only). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002, 2003, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -206,13 +206,16 @@ FT_BEGIN_HEADER } PFR_KernItemRec; -#define PFR_KERN_INDEX( g1, g2 ) \ - ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) ) -#define PFR_KERN_PAIR_INDEX( pair ) \ +#define PFR_KERN_INDEX( g1, g2 ) \ + ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) ) + +#define PFR_KERN_PAIR_INDEX( pair ) \ PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 ) -#define PFR_NEXT_KPAIR(p) ( p+=2, ((FT_UInt32)p[-2] << 16) | p[-1] ) +#define PFR_NEXT_KPAIR( p ) ( p += 2, \ + ( (FT_UInt32)p[-2] << 16 ) | p[-1] ) + typedef struct PFR_KernPairRec_ {