FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, FT_GlyphLoader source ) { FT_Error error; FT_UInt num_points = source->base.outline.n_points; FT_UInt num_contours = source->base.outline.n_contours; error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); if ( !error ) { FT_Outline* out = &target->base.outline; FT_Outline* in = &source->base.outline; FT_ARRAY_COPY( out->points, in->points, num_points ); FT_ARRAY_COPY( out->tags, in->tags, num_points ); FT_ARRAY_COPY( out->contours, in->contours, num_contours ); /* do we need to copy the extra points? */ if ( target->use_extra && source->use_extra ) FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, num_points ); out->n_points = (short)num_points; out->n_contours = (short)num_contours; FT_GlyphLoader_Adjust_Points( target ); } return error; }
FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) { FT_GlyphLoad current = &loader->current; current->outline.n_points = 0; current->outline.n_contours = 0; current->num_subglyphs = 0; FT_GlyphLoader_Adjust_Points ( loader ); FT_GlyphLoader_Adjust_Subglyphs( loader ); }
FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, FT_UInt n_points, FT_UInt n_contours ) { FT_Memory memory = loader->memory; FT_Error error = FT_Err_Ok; FT_Outline* base = &loader->base.outline; FT_Outline* current = &loader->current.outline; FT_Bool adjust = 0; FT_UInt new_max, old_max; /* check points & tags */ new_max = base->n_points + current->n_points + n_points; old_max = loader->max_points; if ( new_max > old_max ) { new_max = FT_PAD_CEIL( new_max, 8 ); if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) goto Exit; if ( loader->use_extra && FT_RENEW_ARRAY( loader->base.extra_points, old_max, new_max ) ) goto Exit; adjust = 1; loader->max_points = new_max; } /* check contours */ old_max = loader->max_contours; new_max = base->n_contours + current->n_contours + n_contours; if ( new_max > old_max ) { new_max = FT_PAD_CEIL( new_max, 4 ); if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) goto Exit; adjust = 1; loader->max_contours = new_max; } if ( adjust ) FT_GlyphLoader_Adjust_Points( loader ); Exit: return error; }
FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) { FT_Error error; FT_Memory memory = loader->memory; if ( !FT_NEW_ARRAY( loader->base.extra_points, loader->max_points ) ) { loader->use_extra = 1; FT_GlyphLoader_Adjust_Points( loader ); } return error; }
FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, FT_UInt n_points, FT_UInt n_contours ) { FT_Memory memory = loader->memory; FT_Error error = FT_Err_Ok; FT_Outline* base = &loader->base.outline; FT_Outline* current = &loader->current.outline; FT_Bool adjust = 0; FT_UInt new_max, old_max; /* check points & tags */ new_max = base->n_points + current->n_points + n_points; old_max = loader->max_points; if ( new_max > old_max ) { new_max = FT_PAD_CEIL( new_max, 8 ); if ( new_max > FT_OUTLINE_POINTS_MAX ) return FT_Err_Array_Too_Large; if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) goto Exit; if ( loader->use_extra ) { if ( FT_RENEW_ARRAY( loader->base.extra_points, old_max * 2, new_max * 2 ) ) goto Exit; FT_ARRAY_MOVE( loader->base.extra_points + new_max, loader->base.extra_points + old_max, old_max ); loader->base.extra_points2 = loader->base.extra_points + new_max; } adjust = 1; loader->max_points = new_max; } /* check contours */ old_max = loader->max_contours; new_max = base->n_contours + current->n_contours + n_contours; if ( new_max > old_max ) { new_max = FT_PAD_CEIL( new_max, 4 ); if ( new_max > FT_OUTLINE_CONTOURS_MAX ) return FT_Err_Array_Too_Large; if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) goto Exit; adjust = 1; loader->max_contours = new_max; } if ( adjust ) FT_GlyphLoader_Adjust_Points( loader ); Exit: return error; }