static FT_Error tt_size_select( FT_Size size, FT_ULong strike_index ) { TT_Face ttface = (TT_Face)size->face; TT_Size ttsize = (TT_Size)size; FT_Error error = FT_Err_Ok; ttsize->strike_index = strike_index; if ( FT_IS_SCALABLE( size->face ) ) { /* use the scaled metrics, even when tt_size_reset fails */ FT_Select_Metrics( size->face, strike_index ); tt_size_reset( ttsize ); } else { SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; FT_Size_Metrics* metrics = &size->metrics; error = sfnt->load_strike_metrics( ttface, strike_index, metrics ); if ( error ) ttsize->strike_index = 0xFFFFFFFFUL; } return error; }
static FT_Error tt_size_request( FT_Size size, FT_Size_Request req ) { TT_Size ttsize = (TT_Size)size; FT_Error error = TT_Err_Ok; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS if ( FT_HAS_FIXED_SIZES( size->face ) ) { TT_Face ttface = (TT_Face)size->face; SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; FT_ULong strike_index; error = sfnt->set_sbit_strike( ttface, req, &strike_index ); if ( error ) ttsize->strike_index = 0xFFFFFFFFUL; else return tt_size_select( size, strike_index ); } #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ FT_Request_Metrics( size->face, req ); if ( FT_IS_SCALABLE( size->face ) ) error = tt_size_reset( ttsize ); return error; }
static FT_Error tt_size_request( FT_Size size, FT_Size_Request req ) { TT_Size ttsize = (TT_Size)size; FT_Error error = FT_Err_Ok; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS if ( FT_HAS_FIXED_SIZES( size->face ) ) { TT_Face ttface = (TT_Face)size->face; SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; FT_ULong strike_index; error = sfnt->set_sbit_strike( ttface, req, &strike_index ); if ( error ) ttsize->strike_index = 0xFFFFFFFFUL; else return tt_size_select( size, strike_index ); } #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ FT_Request_Metrics( size->face, req ); if ( FT_IS_SCALABLE( size->face ) ) { error = tt_size_reset( ttsize ); ttsize->root.metrics = ttsize->metrics; #ifdef TT_USE_BYTECODE_INTERPRETER /* for the `MPS' bytecode instruction we need the point size */ { FT_UInt resolution = ttsize->metrics.x_ppem > ttsize->metrics.y_ppem ? req->horiResolution : req->vertResolution; /* if we don't have a resolution value, assume 72dpi */ if ( req->type == FT_SIZE_REQUEST_TYPE_SCALES || !resolution ) resolution = 72; ttsize->point_size = FT_MulDiv( ttsize->ttmetrics.ppem, 64 * 72, resolution ); } #endif } return error; }
static FT_Error Set_Char_Sizes( FT_Size ttsize, /* TT_Size */ FT_F26Dot6 char_width, FT_F26Dot6 char_height, FT_UInt horz_resolution, FT_UInt vert_resolution ) { TT_Size size = (TT_Size)ttsize; FT_Size_Metrics* metrics = &size->root.metrics; FT_Size_Metrics* metrics2 = &size->metrics; TT_Face face = (TT_Face)size->root.face; FT_Long dim_x, dim_y; *metrics2 = *metrics; /* This bit flag, when set, indicates that the pixel size must be */ /* truncated to an integer. Nearly all TrueType fonts have this */ /* bit set, as hinting won't work really well otherwise. */ /* */ if ( ( face->header.Flags & 8 ) != 0 ) { /* we need to use rounding in the following computations. Otherwise, * the resulting hinted outlines will be very slightly distorted */ dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & ~63; dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & ~63; } else { dim_x = ( ( char_width * horz_resolution + 36 ) / 72 ); dim_y = ( ( char_height * vert_resolution + 36 ) / 72 ); } /* we only modify "metrics2", not "metrics", so these changes have */ /* no effect on the result of the auto-hinter when it is used */ /* */ metrics2->x_ppem = (FT_UShort)( dim_x >> 6 ); metrics2->y_ppem = (FT_UShort)( dim_y >> 6 ); metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM ); metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM ); size->ttmetrics.valid = FALSE; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS size->strike_index = 0xFFFFU; #endif return tt_size_reset( size ); }
static FT_Error Load_Glyph( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ FT_Size ttsize, /* TT_Size */ FT_UInt glyph_index, FT_Int32 load_flags ) { TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; TT_Size size = (TT_Size)ttsize; FT_Error error; if ( !slot ) return TT_Err_Invalid_Slot_Handle; /* check whether we want a scaled outline or bitmap */ if ( !size ) load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; if ( load_flags & FT_LOAD_NO_SCALE ) size = NULL; /* reset the size object if necessary */ if ( size ) { /* these two object must have the same parent */ if ( size->root.face != slot->face ) return TT_Err_Invalid_Face_Handle; if ( !size->ttmetrics.valid ) { if ( FT_SET_ERROR( tt_size_reset( size ) ) ) return error; } } /* now load the glyph outline if necessary */ error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); /* force drop-out mode to 2 - irrelevant now */ /* slot->outline.dropout_mode = 2; */ return error; }
static FT_Error Set_Pixel_Sizes( FT_Size ttsize, /* TT_Size */ FT_UInt pixel_width, FT_UInt pixel_height ) { TT_Size size = (TT_Size)ttsize; FT_UNUSED( pixel_width ); FT_UNUSED( pixel_height ); /* many things have been pre-computed by the base layer */ size->metrics = size->root.metrics; size->ttmetrics.valid = FALSE; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS size->strike_index = 0xFFFFU; #endif return tt_size_reset( size ); }