FT_EXPORT_DEF( FT_Error ) FT_Glyph_Copy( FT_Glyph source, FT_Glyph *target ) { FT_Glyph copy; FT_Error error; const FT_Glyph_Class* clazz; /* check arguments */ if ( !target || !source || !source->clazz ) { error = FT_Err_Invalid_Argument; goto Exit; } *target = 0; clazz = source->clazz; error = ft_new_glyph( source->library, clazz, © ); if ( error ) goto Exit; if ( clazz->glyph_copy ) error = clazz->glyph_copy( source, copy ); if ( error ) FT_Done_Glyph( copy ); else *target = copy; Exit: return error; }
FT_Glyph_Copy( FT_Glyph source, FT_Glyph *target ) { FT_Glyph copy; FT_Error error; const FT_Glyph_Class* clazz; /* check arguments */ if ( !target || !source || !source->clazz ) { error = FT_THROW( Invalid_Argument ); goto Exit; } *target = NULL; if ( !source || !source->clazz ) { error = FT_THROW( Invalid_Argument ); goto Exit; } clazz = source->clazz; error = ft_new_glyph( source->library, clazz, © ); if ( error ) goto Exit; copy->advance = source->advance; copy->format = source->format; if ( clazz->glyph_copy ) error = clazz->glyph_copy( source, copy ); if ( error ) FT_Done_Glyph( copy ); else *target = copy; Exit: return error; }
FT_Get_Glyph( FT_GlyphSlot slot, FT_Glyph *aglyph ) { FT_Library library; FT_Error error; FT_Glyph glyph; const FT_Glyph_Class* clazz = 0; if ( !slot ) return FT_Err_Invalid_Slot_Handle; library = slot->library; if ( !aglyph ) return FT_Err_Invalid_Argument; /* if it is a bitmap, that's easy :-) */ if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) clazz = FT_BITMAP_GLYPH_CLASS_GET; /* if it is an outline */ else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) clazz = FT_OUTLINE_GLYPH_CLASS_GET; else { /* try to find a renderer that supports the glyph image format */ FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); if ( render ) clazz = &render->glyph_class; } if ( !clazz ) { error = FT_Err_Invalid_Glyph_Format; goto Exit; } /* create FT_Glyph object */ error = ft_new_glyph( library, clazz, &glyph ); if ( error ) goto Exit; /* copy advance while converting it to 16.16 format */ glyph->advance.x = slot->advance.x << 10; glyph->advance.y = slot->advance.y << 10; /* now import the image from the glyph slot */ error = clazz->glyph_init( glyph, slot ); /* if an error occurred, destroy the glyph */ if ( error ) FT_Done_Glyph( glyph ); else *aglyph = glyph; Exit: return error; }
FT_EXPORT_FUNC(FT_Error) FT_Get_Glyph(FT_GlyphSlot slot, FT_Glyph *aglyph) { FT_Library library = slot->library; FT_Error error; FT_Glyph glyph; const FT_Glyph_Class *clazz = 0; if(!slot) { return FT_Err_Invalid_Slot_Handle; } if(!aglyph) { return FT_Err_Invalid_Argument; } /* if it is a bitmap, that's easy :-) */ if(slot->format == ft_glyph_format_bitmap) { clazz = &ft_bitmap_glyph_class; } /* it it is an outline too */ else if(slot->format == ft_glyph_format_outline) { clazz = &ft_outline_glyph_class; } else { /* try to find a renderer that supports the glyph image format */ FT_Renderer render = FT_Lookup_Renderer(library, slot->format, 0); if(render) { clazz = &render->glyph_class; } } if(!clazz) { error = FT_Err_Invalid_Glyph_Format; goto Exit; } /* create FT_Glyph object */ error = ft_new_glyph(library, clazz, &glyph); if(error) { goto Exit; } /* copy advance while converting it to 16.16 format */ glyph->advance.x = slot->advance.x << 10; glyph->advance.y = slot->advance.y << 10; /* now import the image from the glyph slot */ error = clazz->glyph_init(glyph, slot); /* if an error occurred, destroy the glyph */ if(error) { FT_Done_Glyph(glyph); } else { *aglyph = glyph; } Exit: return error; }
FT_Get_Glyph( FT_GlyphSlot slot, FT_Glyph *aglyph ) { FT_Library library; FT_Error error; FT_Glyph glyph; const FT_Glyph_Class* clazz = NULL; if ( !slot ) return FT_THROW( Invalid_Slot_Handle ); library = slot->library; if ( !aglyph ) return FT_THROW( Invalid_Argument ); /* if it is a bitmap, that's easy :-) */ if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) clazz = FT_BITMAP_GLYPH_CLASS_GET; /* if it is an outline */ else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) clazz = FT_OUTLINE_GLYPH_CLASS_GET; else { /* try to find a renderer that supports the glyph image format */ FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); if ( render ) clazz = &render->glyph_class; } if ( !clazz ) { error = FT_THROW( Invalid_Glyph_Format ); goto Exit; } /* create FT_Glyph object */ error = ft_new_glyph( library, clazz, &glyph ); if ( error ) goto Exit; /* copy advance while converting 26.6 to 16.16 format */ if ( slot->advance.x >= 0x8000L * 64 || slot->advance.x <= -0x8000L * 64 ) { FT_ERROR(( "FT_Get_Glyph: advance width too large\n" )); error = FT_THROW( Invalid_Argument ); goto Exit2; } if ( slot->advance.y >= 0x8000L * 64 || slot->advance.y <= -0x8000L * 64 ) { FT_ERROR(( "FT_Get_Glyph: advance height too large\n" )); error = FT_THROW( Invalid_Argument ); goto Exit2; } glyph->advance.x = slot->advance.x * 1024; glyph->advance.y = slot->advance.y * 1024; /* now import the image from the glyph slot */ error = clazz->glyph_init( glyph, slot ); Exit2: /* if an error occurred, destroy the glyph */ if ( error ) FT_Done_Glyph( glyph ); else *aglyph = glyph; Exit: return error; }