ref: 54e75749465821066fe3ed533f00d6a2c67fbb37
parent: 76a5f62323d4fe3319d3d5410ded0ff9cab1f8c5
author: David Turner <[email protected]>
date: Fri Nov 3 21:52:02 EST 2000
defining new types to hold "internal" fields of public objects: FT_Face_Internal, FT_Size_Internal, FT_Slot_Internal these contain some fields that may change between releases of FreeType, without affecting the size of FT_FaceRec, FT_SizeRec, FT_GlyphSlotRec, etc.., which means that drivers wouldn't need to be recompiled if we only add new fields to an internal structure.. I plan to hack a few things related to the auto-hinter and I need this move to ensure that we will not break binary compatibility between 2.0 and 2.1 :-) - David
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -393,6 +393,21 @@
/*************************************************************************/
/*************************************************************************/
+ /*********************************************************************
+ *
+ * <Type>
+ * FT_Face_Internal
+ *
+ * <Description>
+ * an opaque handle to a FT_Face_InternalRec structure, used to
+ * model private data of a given FT_Face object.
+ *
+ * this fields might change between releases of FreeType 2 and
+ * are not generally available to client applications
+ *
+ */
+ typedef struct FT_Face_InternalRec_* FT_Face_Internal;
+
/*************************************************************************/
/* */
/* FreeType base face class */
@@ -570,19 +585,11 @@
/* this should be set to 0. Only relevant for */
/* scalable formats. */
/* */
- /* transform_matrix :: A 2x2 matrix of 16.16 coefficients used */
- /* to transform glyph outlines after they are */
- /* loaded from the font. Only used by the */
- /* convenience functions. */
+ /* internal :: a pointer to internal fields of the face */
+ /* object. These fields can change freely */
+ /* between releases of FreeType and are not */
+ /* publicly available.. */
/* */
- /* transform_delta :: A translation vector used to transform */
- /* glyph outlines after they are loaded from */
- /* the font. Only used by the convenience */
- /* functions. */
- /* */
- /* transform_flags :: Some flags used to classify the transform. */
- /* Only used by the convenience functions. */
- /* */
typedef struct FT_FaceRec_
{
FT_Long num_faces;
@@ -620,6 +627,7 @@
FT_GlyphSlot glyph;
FT_Size size;
+ FT_CharMap charmap;
/*@private begin */
@@ -627,19 +635,13 @@
FT_Memory memory;
FT_Stream stream;
- FT_CharMap charmap;
FT_ListRec sizes_list;
FT_Generic autohint;
void* extensions;
- FT_UShort max_points;
- FT_Short max_contours;
+ FT_Face_Internal internal;
- FT_Matrix transform_matrix;
- FT_Vector transform_delta;
- FT_Int transform_flags;
-
/*@private end */
} FT_FaceRec;
@@ -848,6 +850,17 @@
#define FT_STYLE_FLAG_BOLD 2
+ /*********************************************************************
+ *
+ * <Type>
+ * FT_Size_Internal
+ *
+ * <Description>
+ * an opaque handle to a FT_Size_InternalRec structure, used to
+ * model private data of a given FT_Size object.
+ */
+ typedef struct FT_Size_InternalRec_* FT_Size_Internal;
+
/*************************************************************************/
/* */
/* FreeType base size metrics */
@@ -914,16 +927,16 @@
/* */
typedef struct FT_Size_Metrics_
{
- FT_UShort x_ppem; /* horizontal pixels per EM */
- FT_UShort y_ppem; /* vertical pixels per EM */
+ FT_UShort x_ppem; /* horizontal pixels per EM */
+ FT_UShort y_ppem; /* vertical pixels per EM */
- FT_Fixed x_scale; /* two scales used to convert font units */
- FT_Fixed y_scale; /* to 26.6 frac. pixel coordinates.. */
+ FT_Fixed x_scale; /* two scales used to convert font units */
+ FT_Fixed y_scale; /* to 26.6 frac. pixel coordinates.. */
- FT_Pos ascender; /* ascender in 26.6 frac. pixels */
- FT_Pos descender; /* descender in 26.6 frac. pixels */
- FT_Pos height; /* text height in 26.6 frac. pixels */
- FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */
+ FT_Pos ascender; /* ascender in 26.6 frac. pixels */
+ FT_Pos descender; /* descender in 26.6 frac. pixels */
+ FT_Pos height; /* text height in 26.6 frac. pixels */
+ FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */
} FT_Size_Metrics;
@@ -951,9 +964,11 @@
/* */
typedef struct FT_SizeRec_
{
- FT_Face face; /* parent face object */
- FT_Generic generic; /* generic pointer for client uses */
- FT_Size_Metrics metrics; /* size metrics */
+ FT_Face face; /* parent face object */
+ FT_Generic generic; /* generic pointer for client uses */
+ FT_Size_Metrics metrics; /* size metrics */
+ FT_Size_Internal internal;
+
} FT_SizeRec;
@@ -974,20 +989,16 @@
typedef struct FT_SubGlyph_ FT_SubGlyph;
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* FT_GlyphLoader */
- /* */
- /* <Description> */
- /* The glyph loader is an internal object used to load several glyphs */
- /* together (for example, in the case of composites). */
- /* */
- /* <Note> */
- /* The glyph loader implementation is not part of the high-level API, */
- /* hence the forward structure declaration. */
- /* */
- typedef struct FT_GlyphLoader_ FT_GlyphLoader;
+ /*********************************************************************
+ *
+ * <Type>
+ * FT_Slot_Internal
+ *
+ * <Description>
+ * an opaque handle to a FT_Slot_InternalRec structure, used to
+ * model private data of a given FT_GlyphSlot object.
+ */
+ typedef struct FT_Slot_InternalRec_* FT_Slot_Internal;
/*************************************************************************/
@@ -1146,14 +1157,7 @@
void* other;
- /*@private begin */
-
- FT_GlyphLoader* loader;
- FT_Bool glyph_transformed;
- FT_Matrix glyph_matrix;
- FT_Vector glyph_delta;
-
- /*@private end */
+ FT_Slot_Internal internal;
} FT_GlyphSlotRec;
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -75,6 +75,95 @@
#define ABS( a ) ( (a) < 0 ? -(a) : (a) )
#endif
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphLoader */
+ /* */
+ /* <Description> */
+ /* The glyph loader is an internal object used to load several glyphs */
+ /* together (for example, in the case of composites). */
+ /* */
+ /* <Note> */
+ /* The glyph loader implementation is not part of the high-level API, */
+ /* hence the forward structure declaration. */
+ /* */
+ typedef struct FT_GlyphLoader_ FT_GlyphLoader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Face_InternalRec */
+ /* */
+ /* <Description> */
+ /* this structure contains the internal fields of each FT_Face */
+ /* object. These fields may change between different releases */
+ /* of FreeType. */
+ /* */
+ /* <Fields> */
+ /* transform_matrix :: A 2x2 matrix of 16.16 coefficients used */
+ /* to transform glyph outlines after they are */
+ /* loaded from the font. Only used by the */
+ /* convenience functions. */
+ /* */
+ /* transform_delta :: A translation vector used to transform */
+ /* glyph outlines after they are loaded from */
+ /* the font. Only used by the convenience */
+ /* functions. */
+ /* */
+ /* transform_flags :: Some flags used to classify the transform. */
+ /* Only used by the convenience functions. */
+ /* */
+ /* */
+ /* */
+ /* */
+ typedef struct FT_Face_InternalRec_
+ {
+ FT_UShort max_points;
+ FT_Short max_contours;
+
+ FT_Matrix transform_matrix;
+ FT_Vector transform_delta;
+ FT_Int transform_flags;
+
+ } FT_Face_InternalRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Slot_InternalRec */
+ /* */
+ /* <Description> */
+ /* this structure contains the internal fields of each FT_GlyphSlot */
+ /* object. These fields may change between different releases */
+ /* of FreeType. */
+ /* */
+ /* <Fields> */
+ /* loader :: the glyph loader object used to load */
+ /* outlines in the glyph slot */
+ /* */
+ /* glyph_transformed :: boolean. set to TRUE when the loaded glyph */
+ /* must be transformed through a specific */
+ /* font transform. this is _not_ the same as */
+ /* the face transform set through */
+ /* FT_Set_Transform */
+ /* */
+ /* glyph_matrix :: the 2x2 matrix corresponding to the glyph */
+ /* transform, when required */
+ /* */
+ /* glyph_delta :: the 2d translation vector corresponding to */
+ /* the glyph transform, when required */
+ /* */
+ typedef struct FT_Slot_InternalRec_
+ {
+ FT_GlyphLoader* loader;
+ FT_Bool glyph_transformed;
+ FT_Matrix glyph_matrix;
+ FT_Vector glyph_delta;
+
+ } FT_GlyphSlot_InternalRec;
/*************************************************************************/
/*************************************************************************/
--- a/src/autohint/ahhint.c
+++ b/src/autohint/ahhint.c
@@ -1286,12 +1286,12 @@
/* XXX: TO DO - slot->linearHoriAdvance */
/* now copy outline into glyph slot */
- ah_loader_rewind( slot->loader );
- error = ah_loader_copy_points( slot->loader, gloader );
+ ah_loader_rewind( slot->internal->loader );
+ error = ah_loader_copy_points( slot->internal->loader, gloader );
if ( error )
goto Exit;
- slot->outline = slot->loader->base.outline;
+ slot->outline = slot->internal->loader->base.outline;
slot->format = ft_glyph_format_outline;
}
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -674,16 +674,23 @@
FT_Driver_Class* clazz = driver->clazz;
FT_Memory memory = driver->root.memory;
FT_Error error = FT_Err_Ok;
+ FT_Slot_Internal internal;
slot->library = driver->root.library;
+ if ( ALLOC( internal, sizeof( *internal ) ) )
+ goto Exit;
+
+ slot->internal = internal;
+
if ( FT_DRIVER_USES_OUTLINES( driver ) )
- error = FT_GlyphLoader_New( memory, &slot->loader );
+ error = FT_GlyphLoader_New( memory, &internal->loader );
if ( !error && clazz->init_slot )
error = clazz->init_slot( slot );
+ Exit:
return error;
}
@@ -728,6 +735,9 @@
FT_Memory memory = driver->root.memory;
+ if ( clazz->done_slot )
+ clazz->done_slot( slot );
+
/* free bitmap buffer if needed */
if ( slot->flags & ft_glyph_own_bitmap )
FREE( slot->bitmap.buffer );
@@ -735,12 +745,11 @@
/* free glyph loader */
if ( FT_DRIVER_USES_OUTLINES( driver ) )
{
- FT_GlyphLoader_Done( slot->loader );
- slot->loader = 0;
+ FT_GlyphLoader_Done( slot->internal->loader );
+ slot->internal->loader = 0;
}
- if ( clazz->done_slot )
- clazz->done_slot( slot );
+ FREE( slot->internal );
}
@@ -876,40 +885,45 @@
FT_Matrix* matrix,
FT_Vector* delta )
{
+ FT_Face_Internal internal;
+
+
if ( !face )
return;
- face->transform_flags = 0;
+ internal = face->internal;
+ internal->transform_flags = 0;
+
if ( !matrix )
{
- face->transform_matrix.xx = 0x10000L;
- face->transform_matrix.xy = 0;
- face->transform_matrix.yx = 0;
- face->transform_matrix.yy = 0x10000L;
- matrix = &face->transform_matrix;
+ internal->transform_matrix.xx = 0x10000L;
+ internal->transform_matrix.xy = 0;
+ internal->transform_matrix.yx = 0;
+ internal->transform_matrix.yy = 0x10000L;
+ matrix = &internal->transform_matrix;
}
else
- face->transform_matrix = *matrix;
+ internal->transform_matrix = *matrix;
/* set transform_flags bit flag 0 if `matrix' isn't the identity */
if ( ( matrix->xy | matrix->yx ) ||
matrix->xx != 0x10000L ||
matrix->yy != 0x10000L )
- face->transform_flags |= 1;
+ internal->transform_flags |= 1;
if ( !delta )
{
- face->transform_delta.x = 0;
- face->transform_delta.y = 0;
- delta = &face->transform_delta;
+ internal->transform_delta.x = 0;
+ internal->transform_delta.y = 0;
+ delta = &internal->transform_delta;
}
else
- face->transform_delta = *delta;
+ internal->transform_delta = *delta;
/* set transform_flags bit flag 1 if `delta' isn't the null vector */
if ( delta->x | delta->y )
- face->transform_flags |= 2;
+ internal->transform_flags |= 2;
}
@@ -1044,8 +1058,11 @@
if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
{
+ FT_Face_Internal internal = face->internal;
+
+
/* now, transform the glyph image if needed */
- if ( face->transform_flags )
+ if ( internal->transform_flags )
{
/* get renderer */
FT_Renderer renderer = ft_lookup_glyph_renderer( slot );
@@ -1053,10 +1070,10 @@
if ( renderer )
error = renderer->clazz->transform_glyph( renderer, slot,
- &face->transform_matrix,
- &face->transform_delta );
+ &internal->transform_matrix,
+ &internal->transform_delta );
/* transform advance */
- FT_Vector_Transform( &slot->advance, &face->transform_matrix );
+ FT_Vector_Transform( &slot->advance, &internal->transform_matrix );
}
}
@@ -1147,6 +1164,7 @@
if ( driver->clazz->done_size )
driver->clazz->done_size( size );
+ FREE( size->internal );
FREE( size );
}
@@ -1190,6 +1208,7 @@
( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );
/* get rid of it */
+ FREE( face->internal );
FREE( face );
}
@@ -1228,6 +1247,7 @@
FT_Driver_Class* clazz;
FT_Face face = 0;
FT_Error error;
+ FT_Face_Internal internal;
clazz = driver->clazz;
@@ -1237,10 +1257,15 @@
if ( ALLOC( face, clazz->face_object_size ) )
goto Fail;
- face->driver = driver;
- face->memory = memory;
- face->stream = stream;
+ if ( ALLOC( internal, sizeof(*internal) ) )
+ goto Fail;
+
+ face->internal = internal;
+ face->driver = driver;
+ face->memory = memory;
+ face->stream = stream;
+
error = clazz->init_face( stream,
face,
face_index,
@@ -1255,6 +1280,7 @@
if ( error )
{
clazz->done_face( face );
+ FREE( face->internal );
FREE( face );
*aface = 0;
}
@@ -1574,14 +1600,19 @@
face->size = size;
}
- /* initialize transformation for convenience functions */
- face->transform_matrix.xx = 0x10000L;
- face->transform_matrix.xy = 0;
- face->transform_matrix.yx = 0;
- face->transform_matrix.yy = 0x10000L;
+ /* initialize internal face data */
+ {
+ FT_Face_Internal internal = face->internal;
+
- face->transform_delta.x = 0;
- face->transform_delta.y = 0;
+ internal->transform_matrix.xx = 0x10000L;
+ internal->transform_matrix.xy = 0;
+ internal->transform_matrix.yx = 0;
+ internal->transform_matrix.yy = 0x10000L;
+
+ internal->transform_delta.x = 0;
+ internal->transform_delta.y = 0;
+ }
*aface = face;
goto Exit;
@@ -1809,6 +1840,9 @@
goto Exit;
size->face = face;
+
+ /* for now, do not use any internal fields in size objects */
+ size->internal = 0;
if ( clazz->init_size )
error = clazz->init_size( size );
@@ -2037,6 +2071,21 @@
/* */
/* <Return> */
/* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* the values of "pixel_width" and "pixel_height" correspond to */
+ /* the pixel values of the _typographic_ character size, which are */
+ /* NOT necessarily the same as the dimensions of the glyph */
+ /* "bitmap cells". */
+ /* */
+ /* The "character size" is really the size of an abstract square */
+ /* called the "EM", used to design the font. However, depending */
+ /* on the font design, glyphs will be smaller or greater than the */
+ /* EM. */
+ /* */
+ /* this means that setting the pixel size to 8x8 doesn't guarantee */
+ /* in any way that you'll end up with glyph bitmaps that all fit */
+ /* within an 8x8 cell.. far from it.. */
/* */
FT_EXPORT_DEF( FT_Error ) FT_Set_Pixel_Sizes( FT_Face face,
FT_UInt pixel_width,
--- a/src/cff/t2gload.c
+++ b/src/cff/t2gload.c
@@ -243,7 +243,7 @@
if ( glyph )
{
- FT_GlyphLoader* loader = glyph->root.loader;
+ FT_GlyphLoader* loader = glyph->root.internal->loader;
builder->loader = loader;
--- a/src/cid/cidgload.c
+++ b/src/cid/cidgload.c
@@ -264,12 +264,15 @@
/* advance width */
if ( load_flags & FT_LOAD_NO_RECURSE )
{
+ FT_Slot_Internal internal = glyph->root.internal;
+
+
glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
glyph->root.metrics.horiAdvance = decoder.builder.advance.x;
- glyph->root.glyph_matrix = font_matrix;
- glyph->root.glyph_delta = font_offset;
- glyph->root.glyph_transformed = 1;
+ internal->glyph_matrix = font_matrix;
+ internal->glyph_delta = font_offset;
+ internal->glyph_transformed = 1;
}
else
{
@@ -280,7 +283,7 @@
/* copy the _unscaled_ advance width */
metrics->horiAdvance = decoder.builder.advance.x;
glyph->root.linearHoriAdvance = decoder.builder.advance.x;
- glyph->root.glyph_transformed = 0;
+ glyph->root.internal->glyph_transformed = 0;
/* make up vertical metrics */
metrics->vertBearingX = 0;
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -269,8 +269,8 @@
root->underline_position = face->cid.font_info.underline_position;
root->underline_thickness = face->cid.font_info.underline_thickness;
- root->max_points = 0;
- root->max_contours = 0;
+ root->internal->max_points = 0;
+ root->internal->max_contours = 0;
}
}
--- a/src/psaux/psobjs.c
+++ b/src/psaux/psobjs.c
@@ -1076,7 +1076,7 @@
if ( glyph )
{
- FT_GlyphLoader* loader = glyph->loader;
+ FT_GlyphLoader* loader = glyph->internal->loader;
builder->loader = loader;
--- a/src/psaux/t1decode.c
+++ b/src/psaux/t1decode.c
@@ -222,7 +222,7 @@
if ( decoder->builder.no_recurse )
{
FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph;
- FT_GlyphLoader* loader = glyph->loader;
+ FT_GlyphLoader* loader = glyph->internal->loader;
FT_SubGlyph* subg;
--- a/src/sfnt/ttload.c
+++ b/src/sfnt/ttload.c
@@ -583,11 +583,11 @@
face->root.num_glyphs = maxProfile->numGlyphs;
- face->root.max_points = MAX( maxProfile->maxCompositePoints,
- maxProfile->maxPoints );
+ face->root.internal->max_points = MAX( maxProfile->maxCompositePoints,
+ maxProfile->maxPoints );
- face->root.max_contours = MAX( maxProfile->maxCompositeContours,
- maxProfile->maxContours );
+ face->root.internal->max_contours = MAX( maxProfile->maxCompositeContours,
+ maxProfile->maxContours );
face->max_components = (FT_ULong)maxProfile->maxComponentElements +
maxProfile->maxComponentDepth;
@@ -599,8 +599,8 @@
/* We also increase maxPoints and maxContours in order to support */
/* some broken fonts. */
- face->root.max_points += 8;
- face->root.max_contours += 4;
+ face->root.internal->max_points += 8;
+ face->root.internal->max_contours += 4;
FT_TRACE2(( "MAXP loaded.\n" ));
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -1127,8 +1127,8 @@
glyph->outline.flags &= ~ft_outline_single_pass;
/* copy outline to our glyph slot */
- FT_GlyphLoader_Copy_Points( glyph->loader, loader->gloader );
- glyph->outline = glyph->loader->base.outline;
+ FT_GlyphLoader_Copy_Points( glyph->internal->loader, loader->gloader );
+ glyph->outline = glyph->internal->loader->base.outline;
/* translate array so that (0,0) is the glyph's origin */
FT_Outline_Translate( &glyph->outline, -loader->pp1.x, 0 );
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -214,11 +214,14 @@
/* advance width */
if ( load_flags & FT_LOAD_NO_RECURSE )
{
+ FT_Slot_Internal internal = glyph->root.internal;
+
+
glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
glyph->root.metrics.horiAdvance = decoder.builder.advance.x;
- glyph->root.glyph_matrix = font_matrix;
- glyph->root.glyph_delta = font_offset;
- glyph->root.glyph_transformed = 1;
+ internal->glyph_matrix = font_matrix;
+ internal->glyph_delta = font_offset;
+ internal->glyph_transformed = 1;
}
else
{
@@ -229,7 +232,7 @@
/* copy the _unscaled_ advance width */
metrics->horiAdvance = decoder.builder.advance.x;
glyph->root.linearHoriAdvance = decoder.builder.advance.x;
-/* glyph->root.transformed = 0; */
+ glyph->root.internal->glyph_transformed = 0;
/* make up vertical metrics */
metrics->vertBearingX = 0;
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -292,8 +292,8 @@
root->underline_position = face->type1.font_info.underline_position;
root->underline_thickness = face->type1.font_info.underline_thickness;
- root->max_points = 0;
- root->max_contours = 0;
+ root->internal->max_points = 0;
+ root->internal->max_contours = 0;
}
/* charmap support -- synthetize unicode charmap if possible */