From d23affe1ef8646ce51aa8d94fddccb7c89ba9a13 Mon Sep 17 00:00:00 2001 From: Ewald Hew Date: Mon, 25 Sep 2017 06:22:52 +0200 Subject: [PATCH] Reorganize object fields. Make some fields more generic, so that we can access them the same way regardless of Type 1 or CFF. * include/freetype/internal/psaux.h (PS_Builder): Change `TT_Face' to `FT_Face'. Remove unused fields. * src/psaux/psft.c: Update all accesses of `PS_Builder.face'. Add some asserts to guard against casting `T1_Face' as `TT_Face'. * src/type1/t1objs.h (T1_GlyphSlot): Reorder fields to follow `CFF_GlyphSlot', so that we can pretend they are the same in the interpreter. * src/psaux/psobjs.c (ps_builder_init, ps_builder_add_point): Updated with above changes. --- ChangeLog | 21 ++++++++++++++++++ include/freetype/internal/psaux.h | 5 +---- src/psaux/psft.c | 36 +++++++++++++++++++------------ src/psaux/psobjs.c | 8 +++---- src/type1/t1objs.h | 6 +++--- 5 files changed, 51 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1264e38c2..c75a316e0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2017-09-25 Ewald Hew + + [psaux, type1] Reorganize object fields. + + Make some fields more generic, so that we can access them the same + way regardless of Type 1 or CFF. + + * include/freetype/internal/psaux.h (PS_Builder): Change `TT_Face' + to `FT_Face'. + Remove unused fields. + + * src/psaux/psft.c: Update all accesses of `PS_Builder.face'. + Add some asserts to guard against casting `T1_Face' as `TT_Face'. + + * src/type1/t1objs.h (T1_GlyphSlot): Reorder fields to follow + `CFF_GlyphSlot', so that we can pretend they are the same in the + interpreter. + + * src/psaux/psobjs.c (ps_builder_init, ps_builder_add_point): + Updated with above changes. + 2017-09-25 Ewald Hew [psaux] Prepare for Type 1 mode. diff --git a/include/freetype/internal/psaux.h b/include/freetype/internal/psaux.h index 45013e482..bde0bfac2 100644 --- a/include/freetype/internal/psaux.h +++ b/include/freetype/internal/psaux.h @@ -513,7 +513,7 @@ FT_BEGIN_HEADER struct PS_Builder_ { FT_Memory memory; - TT_Face face; + FT_Face face; CFF_GlyphSlot glyph; FT_GlyphLoader loader; FT_Outline* base; @@ -532,9 +532,6 @@ FT_BEGIN_HEADER FT_Bool metrics_only; - void* hints_funcs; /* hinter-specific */ - void* hints_globals; /* hinter-specific */ - FT_Bool is_t1; PS_Builder_FuncsRec funcs; diff --git a/src/psaux/psft.c b/src/psaux/psft.c index 34ac0b691..25d4a4018 100644 --- a/src/psaux/psft.c +++ b/src/psaux/psft.c @@ -293,9 +293,9 @@ cf2_getUnitsPerEm( PS_Decoder* decoder ) { FT_ASSERT( decoder && decoder->builder.face ); - FT_ASSERT( decoder->builder.face->root.units_per_EM ); + FT_ASSERT( decoder->builder.face->units_per_EM ); - return decoder->builder.face->root.units_per_EM; + return decoder->builder.face->units_per_EM; } @@ -355,7 +355,7 @@ FT_Bool no_stem_darkening_driver = driver->no_stem_darkening; FT_Char no_stem_darkening_font = - builder->face->root.internal->no_stem_darkening; + builder->face->internal->no_stem_darkening; /* local error */ FT_Error error2 = FT_Err_Ok; @@ -384,9 +384,14 @@ &hinted, &scaled ); - /* copy isCFF2 boolean from TT_Face to CF2_Font */ - font->isCFF2 = builder->face->is_cff2; - font->isT1 = is_t1; + if ( is_t1 ) + font->isCFF2 = FALSE; + else + { + /* copy isCFF2 boolean from TT_Face to CF2_Font */ + font->isCFF2 = ((TT_Face)builder->face)->is_cff2; + } + font->isT1 = is_t1; font->renderingFlags = 0; if ( hinted ) @@ -472,10 +477,11 @@ FT_ASSERT( decoder && decoder->builder.face ); FT_ASSERT( vec && len ); - - face = decoder->builder.face; + FT_ASSERT( !decoder->builder.is_t1 ); + + face = (TT_Face)decoder->builder.face; mm = (FT_Service_MultiMasters)face->mm; - + return mm->get_var_blend( FT_FACE( face ), len, NULL, vec, NULL ); } #endif @@ -487,7 +493,7 @@ { FT_ASSERT( decoder && decoder->builder.face && - decoder->builder.face->root.size ); + decoder->builder.face->size ); /* * Note that `y_ppem' can be zero if there wasn't a call to @@ -499,7 +505,7 @@ * */ return cf2_intToFixed( - decoder->builder.face->root.size->metrics.y_ppem ); + decoder->builder.face->size->metrics.y_ppem ); } @@ -650,13 +656,14 @@ FT_ASSERT( decoder ); + FT_ASSERT( !decoder->builder.is_t1 ); FT_ZERO( buf ); #ifdef FT_CONFIG_OPTION_INCREMENTAL /* Incremental fonts don't necessarily have valid charsets. */ /* They use the character code, not the glyph index, in this case. */ - if ( decoder->builder.face->root.internal->incremental_interface ) + if ( decoder->builder.face->internal->incremental_interface ) gid = code; else #endif /* FT_CONFIG_OPTION_INCREMENTAL */ @@ -666,7 +673,7 @@ return FT_THROW( Invalid_Glyph_Format ); } - error = decoder->get_glyph_callback( decoder->builder.face, + error = decoder->get_glyph_callback( (TT_Face)decoder->builder.face, (CF2_UInt)gid, &charstring, &len ); @@ -690,8 +697,9 @@ CF2_Buffer buf ) { FT_ASSERT( decoder ); + FT_ASSERT( !decoder->builder.is_t1 ); - decoder->free_glyph_callback( decoder->builder.face, + decoder->free_glyph_callback( (TT_Face)decoder->builder.face, (FT_Byte**)&buf->start, (FT_ULong)( buf->end - buf->start ) ); } diff --git a/src/psaux/psobjs.c b/src/psaux/psobjs.c index a4dd44865..dcb34747a 100644 --- a/src/psaux/psobjs.c +++ b/src/psaux/psobjs.c @@ -2062,9 +2062,9 @@ { T1_Builder t1builder = (T1_Builder)builder; - ps_builder->face = (TT_Face)t1builder->face; - ps_builder->glyph = t1builder->glyph; ps_builder->memory = t1builder->memory; + ps_builder->face = (FT_Face)t1builder->face; + ps_builder->glyph = (CFF_GlyphSlot)t1builder->glyph; ps_builder->loader = t1builder->loader; ps_builder->base = t1builder->base; ps_builder->current = t1builder->current; @@ -2086,8 +2086,8 @@ { CFF_Builder* cffbuilder = (CFF_Builder*)builder; - ps_builder->face = cffbuilder->face; ps_builder->memory = cffbuilder->memory; + ps_builder->face = (FT_Face)cffbuilder->face; ps_builder->glyph = cffbuilder->glyph; ps_builder->loader = cffbuilder->loader; ps_builder->base = cffbuilder->base; @@ -2172,7 +2172,7 @@ else #endif #ifdef T1_CONFIG_OPTION_OLD_ENGINE - if ( builder->face->is_t1 ) + if ( builder->is_t1 ) { point->x = FIXED_TO_INT( x ); point->y = FIXED_TO_INT( y ); diff --git a/src/type1/t1objs.h b/src/type1/t1objs.h index 39d26bf8b..d009b394b 100644 --- a/src/type1/t1objs.h +++ b/src/type1/t1objs.h @@ -120,12 +120,12 @@ FT_BEGIN_HEADER FT_Bool hint; FT_Bool scaled; - FT_Int max_points; - FT_Int max_contours; - FT_Fixed x_scale; FT_Fixed y_scale; + FT_Int max_points; + FT_Int max_contours; + } T1_GlyphSlotRec;