Index: include/freetype/ftbitmap.h =================================================================== RCS file: /home/cvs/freetype2/include/freetype/ftbitmap.h,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.1.2.2 diff -u -r1.1.1.2 -r1.1.1.1.2.2 --- include/freetype/ftbitmap.h 21 May 2005 00:23:44 -0000 1.1.1.2 +++ include/freetype/ftbitmap.h 21 May 2005 00:38:01 -0000 1.1.1.1.2.2 @@ -75,10 +75,12 @@ /* Copies an bitmap into another one. */ /* */ /* */ - /* source :: A handle to the source bitmap. */ + /* library :: A handle to a library object. */ + /* */ + /* source :: A handle to the source bitmap. */ /* */ /* */ - /* target :: A handle to the target bitmap. */ + /* target :: A handle to the target bitmap. */ /* */ /* */ /* FreeType error code. 0 means success. */ Index: include/freetype/internal/ftobjs.h =================================================================== RCS file: /home/cvs/freetype2/include/freetype/internal/ftobjs.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.1 diff -u -r1.1.1.1 -r1.1.1.1.2.1 --- include/freetype/internal/ftobjs.h 15 May 2005 07:10:28 -0000 1.1.1.1 +++ include/freetype/internal/ftobjs.h 21 May 2005 01:52:22 -0000 1.1.1.1.2.1 @@ -159,7 +159,7 @@ FT_CharMap charmap, FT_CMap *acmap ); - /* destroy a charmap (don't remove it from face's list though) */ + /* destroy a charmap and remove it from face's list */ FT_BASE( void ) FT_CMap_Done( FT_CMap cmap ); Index: src/base/ftobjs.c =================================================================== RCS file: /home/cvs/freetype2/src/base/ftobjs.c,v retrieving revision 1.1.1.3 retrieving revision 1.1.1.1.2.8 diff -u -r1.1.1.3 -r1.1.1.1.2.8 --- src/base/ftobjs.c 21 May 2005 00:23:45 -0000 1.1.1.3 +++ src/base/ftobjs.c 21 May 2005 01:52:22 -0000 1.1.1.1.2.8 @@ -687,6 +687,10 @@ static void + ft_cmap_done_internal( FT_CMap cmap ); + + + static void destroy_charmaps( FT_Face face, FT_Memory memory ) { @@ -698,7 +702,7 @@ FT_CMap cmap = FT_CMAP( face->charmaps[n] ); - FT_CMap_Done( cmap ); + ft_cmap_done_internal( cmap ); face->charmaps[n] = NULL; } @@ -2255,20 +2259,63 @@ } + static void + ft_cmap_done_internal( FT_CMap cmap ) + { + FT_CMap_Class clazz = cmap->clazz; + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY(face); + + + if ( clazz->done ) + clazz->done( cmap ); + + FT_FREE( cmap ); + } + + FT_BASE_DEF( void ) FT_CMap_Done( FT_CMap cmap ) { if ( cmap ) { - FT_CMap_Class clazz = cmap->clazz; - FT_Face face = cmap->charmap.face; - FT_Memory memory = FT_FACE_MEMORY(face); + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY(face); + FT_Error error; + FT_Int i, j; + + for ( i = 0; i < face->num_charmaps; i++ ) + { + if ( (FT_CMap)face->charmaps[i] == cmap ) + { + FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1]; + + + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps - 1 ) ) + return; + + /* remove it from our list of charmaps */ + for ( j = i + 1; j < face->num_charmaps; j++ ) + { + if ( j == face->num_charmaps - 1 ) + face->charmaps[j - 1] = last_charmap; + else + face->charmaps[j - 1] = face->charmaps[j]; + } + + face->num_charmaps--; + + if ( (FT_CMap)face->charmap == cmap ) + face->charmap = NULL; - if ( clazz->done ) - clazz->done( cmap ); + ft_cmap_done_internal( cmap ); - FT_FREE( cmap ); + break; + } + } } } @@ -2319,7 +2366,7 @@ return error; Fail: - FT_CMap_Done( cmap ); + ft_cmap_done_internal( cmap ); cmap = NULL; goto Exit; }