Hi,

This is yet another (and hopefully last) useless patch, because no
module "done"s a cmap :)

Anyway, as new cmap is always appended to face's list, we should remove
it from the list when it gets done. Otherwise, we get sigsegv when we
try to iterate the list.

BTW, is the changelog entry converted from cvs log or hand-written? I
guess I am supposed to write changelog entry myself, but I don't know
how to do that. Sorry for the inconvenience.


Regards,
olv
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.                                 */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    source :: A handle to the source bitmap.                           */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /*    source  :: A handle to the source bitmap.                          */
   /*                                                                       */
   /* <Output>                                                              */
-  /*    target :: A handle to the target bitmap.                           */
+  /*    target  :: A handle to the target bitmap.                          */
   /*                                                                       */
   /* <Return>                                                              */
   /*    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;
   }
_______________________________________________
Freetype-devel mailing list
Freetype-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/freetype-devel

Reply via email to