ref: b9ee7370f60304da99ba3424edbfd36502e0d391
parent: 8ae1dceb94effa59a307c0b778b37483f808f3d4
author: Werner Lemberg <[email protected]>
date: Fri May 20 17:52:19 EDT 2005
* docs/CHANGES: Updated. * src/base/ftbitmap.c: Don't include FT_FREETYPE_H and FT_IMAGE_H but FT_BITMAP_H. (FT_Bitmap_Copy): New function (from ftglyph.c). * include/freetype/ftbitmap.h (FT_Bitmap_Copy): New public definition. * src/base/ftglyph.c: Include FT_BITMAP_H. (ft_bitmap_copy): Move to ftbitmap.c. (ft_bitmap_glyph_init): Remove `memory' variable. Create new bitmap object if FT_GLYPH_OWN_BITMAP isn't set. (ft_bitmap_glyph_copy): Use FT_Bitmap_Copy. (ft_bitmap_glyph_done): Use FT_Bitmap_Done. (ft_outline_glyph_init): Use FT_Outline_Copy. * src/base/ftoutln.c (FT_Outline_Copy): Handle source == target. (FT_Outline_Done_Internal): Check for valid `memory' pointer. (FT_Outline_Translate, FT_Outline_Reverse, FT_Outline_Render, FT_Outline_Transform): Check for valid `outline' pointer. * src/base/ftobjs.c (FT_New_GlyphSlot): Prepend glyph slot to face->glyph, otherwise a new second glyph slot cannot be created. (FT_Done_GlyphSlot): Fix memory leak. (FT_Open_Face): Updated -- face->glyph is already managed by FT_New_GlyphSlot. * src/type42/t42objs.c (T42_GlyphSlot_Done): Updated.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,37 @@
+2005-05-20 Werner Lemberg <[email protected]>
+
+ * docs/CHANGES: Updated.
+
+2005-05-20 Chia I Wu <[email protected]>
+
+ * src/base/ftbitmap.c: Don't include FT_FREETYPE_H and FT_IMAGE_H
+ but FT_BITMAP_H.
+ (FT_Bitmap_Copy): New function (from ftglyph.c).
+
+ * include/freetype/ftbitmap.h (FT_Bitmap_Copy): New public
+ definition.
+
+ * src/base/ftglyph.c: Include FT_BITMAP_H.
+ (ft_bitmap_copy): Move to ftbitmap.c.
+ (ft_bitmap_glyph_init): Remove `memory' variable.
+ Create new bitmap object if FT_GLYPH_OWN_BITMAP isn't set.
+ (ft_bitmap_glyph_copy): Use FT_Bitmap_Copy.
+ (ft_bitmap_glyph_done): Use FT_Bitmap_Done.
+ (ft_outline_glyph_init): Use FT_Outline_Copy.
+
+ * src/base/ftoutln.c (FT_Outline_Copy): Handle source == target.
+ (FT_Outline_Done_Internal): Check for valid `memory' pointer.
+ (FT_Outline_Translate, FT_Outline_Reverse, FT_Outline_Render,
+ FT_Outline_Transform): Check for valid `outline' pointer.
+
+ * src/base/ftobjs.c (FT_New_GlyphSlot): Prepend glyph slot to
+ face->glyph, otherwise a new second glyph slot cannot be created.
+ (FT_Done_GlyphSlot): Fix memory leak.
+ (FT_Open_Face): Updated -- face->glyph is already managed by
+ FT_New_GlyphSlot.
+
+ * src/type42/t42objs.c (T42_GlyphSlot_Done): Updated.
+
2005-05-20 Kirill Smelkov <[email protected]>
* include/freetype/ftimage.h (FT_Raster_Params),
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -60,9 +60,10 @@
for errors in those tables while accessing them.
- A new API in FT_BITMAP_H (`FT_Bitmap_New', `FT_Bitmap_Convert',
- `FT_Bitmap_Done') has been added. Its use is to convert
- an FT_Bitmap structure in 1bpp, 2bpp, 4bpp, or 8bpp format into
- another 8bpp FT_Bitmap, probably using a different pitch.
+ `FT_Bitmap_Copy', `FT_Bitmap_Done') has been added. Its use is
+ to convert an FT_Bitmap structure in 1bpp, 2bpp, 4bpp, or 8bpp
+ format into another 8bpp FT_Bitmap, probably using a different
+ pitch.
- The method how BDF and PCF bitmap fonts are accessed has been
refined. Formerly, FT_Set_Pixel_Sizes and FT_Set_Char_Size
--- a/include/freetype/ftbitmap.h
+++ b/include/freetype/ftbitmap.h
@@ -5,7 +5,7 @@
/* FreeType utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp */
/* bitmaps into 8bpp format (specification). */
/* */
-/* Copyright 2004 by */
+/* Copyright 2004, 2005 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -64,6 +64,29 @@
/* */
FT_EXPORT( void )
FT_Bitmap_New( FT_Bitmap *abitmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Copy */
+ /* */
+ /* <Description> */
+ /* Copies an bitmap into another one. */
+ /* */
+ /* <Input> */
+ /* source :: A handle to the source bitmap. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Copy( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target);
/*************************************************************************/
--- a/src/base/ftbitmap.c
+++ b/src/base/ftbitmap.c
@@ -5,7 +5,7 @@
/* FreeType utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp */
/* bitmaps into 8bpp format (body). */
/* */
-/* Copyright 2004 by */
+/* Copyright 2004, 2005 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -18,8 +18,7 @@
#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_IMAGE_H
+#include FT_BITMAP_H
#include FT_INTERNAL_OBJECTS_H
@@ -33,6 +32,65 @@
FT_Bitmap_New( FT_Bitmap *abitmap )
{
*abitmap = null_bitmap;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Copy( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target)
+ {
+ FT_Memory memory = library->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Int pitch = source->pitch;
+ FT_ULong size;
+
+
+ if ( source == target )
+ return FT_Err_Ok;
+
+ if ( source->buffer == NULL )
+ {
+ *target = *source;
+
+ return FT_Err_Ok;
+ }
+
+ if ( pitch < 0 )
+ pitch = -pitch;
+ size = (FT_ULong)( pitch * source->rows );
+
+ if ( target->buffer )
+ {
+ FT_Int target_pitch = target->pitch;
+ FT_ULong target_size;
+
+
+ if ( target_pitch < 0 )
+ target_pitch = -target_pitch;
+ target_size = (FT_ULong)( target_pitch * target->rows );
+
+ if ( target_size != size )
+ FT_QREALLOC( target->buffer, target_size, size );
+ }
+ else
+ FT_QALLOC( target->buffer, size );
+
+ if ( !error )
+ {
+ unsigned char *p;
+
+
+ p = target->buffer;
+ *target = *source;
+ target->buffer = p;
+
+ FT_MEM_COPY( target->buffer, source->buffer, size );
+ }
+
+ return error;
}
--- a/src/base/ftglyph.c
+++ b/src/base/ftglyph.c
@@ -31,6 +31,7 @@
#include <ft2build.h>
#include FT_GLYPH_H
#include FT_OUTLINE_H
+#include FT_BITMAP_H
#include FT_INTERNAL_OBJECTS_H
@@ -114,30 +115,6 @@
/*************************************************************************/
/*************************************************************************/
- static FT_Error
- ft_bitmap_copy( FT_Memory memory,
- FT_Bitmap* source,
- FT_Bitmap* target )
- {
- FT_Error error;
- FT_Int pitch = source->pitch;
- FT_ULong size;
-
-
- *target = *source;
-
- if ( pitch < 0 )
- pitch = -pitch;
-
- size = (FT_ULong)( pitch * source->rows );
-
- if ( !FT_ALLOC( target->buffer, size ) )
- FT_MEM_COPY( target->buffer, source->buffer, size );
-
- return error;
- }
-
-
FT_CALLBACK_DEF( FT_Error )
ft_bitmap_glyph_init( FT_Glyph bitmap_glyph,
FT_GlyphSlot slot )
@@ -145,7 +122,6 @@
FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
FT_Error error = FT_Err_Ok;
FT_Library library = FT_GLYPH( glyph )->library;
- FT_Memory memory = library->memory;
if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
@@ -154,17 +130,19 @@
goto Exit;
}
- /* grab the bitmap in the slot - do lazy copying whenever possible */
- glyph->bitmap = slot->bitmap;
- glyph->left = slot->bitmap_left;
- glyph->top = slot->bitmap_top;
+ glyph->left = slot->bitmap_left;
+ glyph->top = slot->bitmap_top;
+ /* do lazy copying whenever possible */
if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ {
+ glyph->bitmap = slot->bitmap;
slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
else
{
- /* copy the bitmap into a new buffer */
- error = ft_bitmap_copy( memory, &slot->bitmap, &glyph->bitmap );
+ FT_Bitmap_New( &glyph->bitmap );
+ error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
}
Exit:
@@ -176,15 +154,15 @@
ft_bitmap_glyph_copy( FT_Glyph bitmap_source,
FT_Glyph bitmap_target )
{
- FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source;
- FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target;
- FT_Memory memory = bitmap_source->library->memory;
+ FT_Library library = bitmap_source->library;
+ FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source;
+ FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target;
target->left = source->left;
target->top = source->top;
- return ft_bitmap_copy( memory, &source->bitmap, &target->bitmap );
+ return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );
}
@@ -191,11 +169,11 @@
FT_CALLBACK_DEF( void )
ft_bitmap_glyph_done( FT_Glyph bitmap_glyph )
{
- FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
- FT_Memory memory = FT_GLYPH( glyph )->library->memory;
+ FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
+ FT_Library library = FT_GLYPH( glyph )->library;
- FT_FREE( glyph->bitmap.buffer );
+ FT_Bitmap_Done( library, &glyph->bitmap );
}
@@ -261,15 +239,7 @@
if ( error )
goto Exit;
- /* copy it */
- FT_ARRAY_COPY( target->points, source->points, source->n_points );
-
- FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
-
- FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );
-
- /* copy all flags, except the `FT_OUTLINE_OWNER' one */
- target->flags = source->flags | FT_OUTLINE_OWNER;
+ FT_Outline_Copy( source, target );
Exit:
return error;
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -348,11 +348,9 @@
FT_GlyphSlot slot;
- if ( !face || !aslot || !face->driver )
+ if ( !face || !face->driver )
return FT_Err_Invalid_Argument;
- *aslot = 0;
-
driver = face->driver;
clazz = driver->clazz;
memory = driver->root.memory;
@@ -370,9 +368,16 @@
goto Exit;
}
- *aslot = slot;
+ slot->next = face->glyph;
+ face->glyph = slot;
+
+ if ( aslot )
+ *aslot = slot;
}
+ else if ( aslot )
+ *aslot = 0;
+
Exit:
FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error ));
return error;
@@ -386,26 +391,31 @@
{
if ( slot )
{
- FT_Driver driver = slot->face->driver;
- FT_Memory memory = driver->root.memory;
- FT_GlyphSlot* parent;
- FT_GlyphSlot cur;
+ FT_Driver driver = slot->face->driver;
+ FT_Memory memory = driver->root.memory;
+ FT_GlyphSlot prev;
+ FT_GlyphSlot cur;
/* Remove slot from its parent face's list */
- parent = &slot->face->glyph;
- cur = *parent;
+ prev = NULL;
+ cur = slot->face->glyph;
while ( cur )
{
if ( cur == slot )
{
- *parent = cur->next;
+ if ( !prev )
+ slot->face->glyph = cur->next;
+ else
+ prev->next = cur->next;
+
ft_glyphslot_done( slot );
FT_FREE( slot );
break;
}
- cur = cur->next;
+ prev = cur;
+ cur = cur->next;
}
}
}
@@ -1677,18 +1687,11 @@
FT_List_Add( &face->driver->faces_list, node );
/* now allocate a glyph slot object for the face */
- {
- FT_GlyphSlot slot;
+ FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" ));
-
- FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" ));
-
- error = FT_New_GlyphSlot( face, &slot );
- if ( error )
- goto Fail;
-
- face->glyph = slot;
- }
+ error = FT_New_GlyphSlot( face, NULL );
+ if ( error )
+ goto Fail;
/* finally, allocate a size object for the face */
{
--- a/src/base/ftoutln.c
+++ b/src/base/ftoutln.c
@@ -358,6 +358,9 @@
source->n_contours != target->n_contours )
return FT_Err_Invalid_Argument;
+ if ( source == target )
+ return FT_Err_Ok;
+
FT_ARRAY_COPY( target->points, source->points, source->n_points );
FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
@@ -379,7 +382,7 @@
FT_Outline_Done_Internal( FT_Memory memory,
FT_Outline* outline )
{
- if ( outline )
+ if ( memory && outline )
{
if ( outline->flags & FT_OUTLINE_OWNER )
{
@@ -472,6 +475,9 @@
FT_Vector* vec = outline->points;
+ if ( !outline )
+ return;
+
for ( n = 0; n < outline->n_points; n++ )
{
vec->x += xOffset;
@@ -490,6 +496,9 @@
FT_Int first, last;
+ if ( !outline )
+ return;
+
first = 0;
for ( n = 0; n < outline->n_contours; n++ )
@@ -553,7 +562,7 @@
if ( !library )
return FT_Err_Invalid_Library_Handle;
- if ( !params )
+ if ( !outline || !params )
return FT_Err_Invalid_Argument;
renderer = library->cur_renderer;
@@ -644,9 +653,15 @@
FT_Outline_Transform( const FT_Outline* outline,
const FT_Matrix* matrix )
{
- FT_Vector* vec = outline->points;
- FT_Vector* limit = vec + outline->n_points;
+ FT_Vector* vec;
+ FT_Vector* limit;
+
+ if ( !outline || !matrix )
+ return;
+
+ vec = outline->points;
+ limit = vec + outline->n_points;
for ( ; vec < limit; vec++ )
FT_Vector_Transform( vec, matrix );
--- a/src/type42/t42objs.c
+++ b/src/type42/t42objs.c
@@ -4,7 +4,7 @@
/* */
/* Type 42 objects manager (body). */
/* */
-/* Copyright 2002, 2003, 2004 by Roberto Alameda. */
+/* Copyright 2002, 2003, 2004, 2005 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 */
@@ -515,21 +515,7 @@
FT_LOCAL_DEF( void )
T42_GlyphSlot_Done( T42_GlyphSlot slot )
{
- FT_Face face = slot->root.face;
- T42_Face t42face = (T42_Face)face;
- FT_GlyphSlot cur = t42face->ttf_face->glyph;
-
-
- while ( cur )
- {
- if ( cur == slot->ttslot )
- {
- FT_Done_GlyphSlot( slot->ttslot );
- break;
- }
-
- cur = cur->next;
- }
+ FT_Done_GlyphSlot( slot->ttslot );
}