ref: d6ec6eee78ef0d679e87df029638a0b153b297d5
parent: 66cbc209785593cc6080389fac3f0ae5f7b46b6b
author: David Turner <[email protected]>
date: Thu Mar 20 15:58:57 EST 2003
* src/autohint/ahglyph.h, src/autohint/ahglyph.c, src/autohint/ahglobal.c, src/autohint/ahhint.c: fixed blue-scale problem * src/cache/ftccache.c: fixed small bug that could crash the cache in rare circumstances (mostly with broken fonts)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,26 @@
* docs/*: serious rewriting of the documentation
+ * include/freetype/internal/ftobjs.h, src/base/ftobjs.c, src/bdf/bdfdrivr.c,
+ src/pcf/pcfdriver.c, src/pfr/pfrsbit.c, src/sfnt/ttsbit.c,
+ src/type42/t42objs.c, src/winfonts/winfnt.c: introduced three new functions
+ to deal with glyph bitmaps within FT_GlyphSlot objects. these are:
+
+ ft_glyphslot_free_bitmap
+ ft_glyphslot_alloc_bitmap
+ ft_glyphslot_set_bitmap
+
+ these are much more convenient to use than managing the FT_GLYPH_OWN_BITMAP
+ flag manually. the font drivers have been modified to use them as well.
+
+ * src/cache/ftlru.c: fixed an invalid assertion check
+
+ * src/autohint/ahglyph.h, src/autohint/ahglyph.c, src/autohint/ahglobal.c,
+ src/autohint/ahhint.c: fixed blue-scale problem
+
+ * src/cache/ftccache.c: fixed small bug that could crash the cache
+ in rare circumstances (mostly with broken fonts)
+
2003-03-15 David Turner <[email protected]>
--- a/src/autohint/ahglobal.c
+++ b/src/autohint/ahglobal.c
@@ -323,7 +323,7 @@
if ( error )
goto Exit;
- error = ah_outline_load( hinter->glyph, hinter->face );
+ error = ah_outline_load( hinter->glyph, 0x10000L, 0x10000L, hinter->face );
if ( error )
goto Exit;
--- a/src/autohint/ahglyph.c
+++ b/src/autohint/ahglyph.c
@@ -389,6 +389,8 @@
/* */
FT_LOCAL_DEF( FT_Error )
ah_outline_load( AH_Outline outline,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
FT_Face face )
{
FT_Memory memory = outline->memory;
@@ -461,8 +463,8 @@
outline->horz_major_dir = AH_DIR_RIGHT;
}
- outline->x_scale = face->size->metrics.x_scale;
- outline->y_scale = face->size->metrics.y_scale;
+ outline->x_scale = x_scale;
+ outline->y_scale = y_scale;
points = outline->points;
if ( outline->num_points == 0 )
@@ -478,8 +480,6 @@
/* compute coordinates */
{
FT_Vector* vec = source->points;
- FT_Fixed x_scale = outline->x_scale;
- FT_Fixed y_scale = outline->y_scale;
for ( point = points; point < point_limit; vec++, point++ )
--- a/src/autohint/ahglyph.h
+++ b/src/autohint/ahglyph.h
@@ -58,6 +58,8 @@
FT_LOCAL( FT_Error )
ah_outline_load( AH_Outline outline,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
FT_Face face );
FT_LOCAL( void )
--- a/src/autohint/ahhint.c
+++ b/src/autohint/ahhint.c
@@ -1391,7 +1391,7 @@
/* now, load the slot image into the auto-outline, and run the */
/* automatic hinting process */
- error = ah_outline_load( outline, face ); /* XXX: change to slot */
+ error = ah_outline_load( outline, x_scale, y_scale, face );
if ( error )
goto Exit;
--- a/src/cache/ftccache.c
+++ b/src/cache/ftccache.c
@@ -362,7 +362,7 @@
if ( manager->num_nodes == 0 )
FT_ERROR(( "ftc_node_destroy: invalid cache node count! = %d\n",
manager->num_nodes ));
-#endif
+#endif
}
@@ -407,11 +407,14 @@
FT_EXPORT_DEF( void )
ftc_family_done( FTC_Family family )
{
- FTC_Manager manager = family->cache->manager;
+ if ( family && family->cache )
+ {
+ FTC_Manager manager = family->cache->manager;
- /* remove from manager's family table */
- ftc_family_table_free( &manager->families, family->fam_index );
+ /* remove from manager's family table */
+ ftc_family_table_free( &manager->families, family->fam_index );
+ }
}
@@ -592,7 +595,7 @@
FT_LruList list = cache->families;
FT_LruNode fam, *pfam;
FT_LruNode_CompareFunc compare = list->clazz->node_compare;
-
+
pfam = &list->nodes;
for (;;)
{
@@ -602,18 +605,18 @@
error = FT_LruList_Lookup( list, query, &lru );
if ( error )
goto Fail;
-
+
goto Skip;
}
-
+
if ( compare( fam, query, list->data ) )
break;
-
+
pfam = &fam->next;
}
-
+
FT_ASSERT( fam != NULL );
-
+
/* move to top of list when needed */
if ( fam != list->nodes )
{
@@ -621,9 +624,9 @@
fam->next = list->nodes;
list->nodes = fam;
}
-
+
lru = fam;
-
+
Skip:
;
}
@@ -634,15 +637,15 @@
FT_UFast hash = query->hash;
FTC_Node* bucket;
FT_UInt idx;
-
-
+
+
idx = hash & cache->mask;
if ( idx < cache->p )
idx = hash & ( cache->mask * 2 + 1 );
-
+
bucket = cache->buckets + idx;
-
-
+
+
if ( query->family != family ||
family->fam_index >= manager->families.size )
{
@@ -651,22 +654,22 @@
error = FTC_Err_Invalid_Argument;
goto Exit;
}
-
+
if ( *bucket )
{
FTC_Node* pnode = bucket;
FTC_Node_CompareFunc compare = cache->clazz->node_compare;
-
+
for ( ;; )
{
FTC_Node node;
-
-
+
+
node = *pnode;
if ( node == NULL )
break;
-
+
if ( node->hash == hash &&
(FT_UInt)node->fam_index == family->fam_index &&
compare( node, query, cache ) )
@@ -678,33 +681,33 @@
node->link = *bucket;
*bucket = node;
}
-
+
/* move to head of MRU list */
if ( node != manager->nodes_list )
ftc_node_mru_up( node, manager );
-
+
*anode = node;
goto Exit;
}
-
+
pnode = &node->link;
}
}
-
+
/* didn't find a node, create a new one */
{
FTC_Cache_Class clazz = cache->clazz;
FT_Memory memory = cache->memory;
FTC_Node node;
-
-
+
+
if ( FT_ALLOC( node, clazz->node_size ) )
goto Fail;
-
+
node->fam_index = (FT_UShort) family->fam_index;
node->hash = query->hash;
node->ref_count = 0;
-
+
error = clazz->node_init( node, query, cache );
if ( error )
{
@@ -711,7 +714,7 @@
FT_FREE( node );
goto Fail;
}
-
+
error = ftc_node_hash_link( node, cache );
if ( error )
{
@@ -719,11 +722,11 @@
FT_FREE( node );
goto Fail;
}
-
+
ftc_node_mru_link( node, cache->manager );
-
+
cache->manager->cur_weight += clazz->node_weight( node, cache );
-
+
/* now try to compress the node pool when necessary */
if ( manager->cur_weight >= manager->max_weight )
{
@@ -731,19 +734,19 @@
FTC_Manager_Compress( manager );
node->ref_count--;
}
-
+
*anode = node;
}
-
+
/* all is well, exit now
*/
goto Exit;
}
-
+
Fail:
if ( error != FT_Err_Out_Of_Memory )
goto Exit;
-
+
/* there is not enough memory, try to release some unused nodes
* from the cache to make room for a new one.
*/
@@ -757,7 +760,7 @@
goto Exit;
free_count = new_count;
-
+
/* try to remove "new_count" nodes from the list */
{
FTC_Node first = manager->nodes_list;
@@ -781,7 +784,7 @@
/* if there are no unused nodes in the list, we'd better exit */
if ( new_count == free_count )
goto Exit;
-
+
break;
}