ftglyph.c revision 41371e1e39c8528eb0c4bc40683c736e6683e60c
1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ftglyph.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* FreeType convenience functions to handle glyphs (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This file contains the definition of several convenience functions */ 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* that can be used by client applications to easily retrieve glyph */ 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* bitmaps and outlines from a given face. */ 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* These functions should be optional if you are writing a font server */ 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* or text layout engine on top of FreeType. However, they are pretty */ 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* handy for many other simple uses of the library. */ 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_GLYPH_H 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_OUTLINE_H 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_BITMAP_H 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 37295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "basepic.h" 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_glyph 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** FT_BitmapGlyph support ****/ 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlot slot ) 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = FT_GLYPH( glyph )->library; 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Invalid_Glyph_Format; 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->left = slot->bitmap_left; 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->top = slot->bitmap_top; 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* do lazy copying whenever possible */ 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->bitmap = slot->bitmap; 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bitmap_New( &glyph->bitmap ); 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_copy( FT_Glyph bitmap_source, 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph bitmap_target ) 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = bitmap_source->library; 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project target->left = source->left; 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project target->top = source->top; 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = FT_GLYPH( glyph )->library; 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bitmap_Done( library, &glyph->bitmap ); 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BBox* cbox ) 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cbox->xMin = glyph->left << 6; 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 ); 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cbox->yMax = glyph->top << 6; 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 ); 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_DEFINE_GLYPH(ft_bitmap_glyph_class, 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sizeof ( FT_BitmapGlyphRec ), 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GLYPH_FORMAT_BITMAP, 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_init, 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_done, 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_copy, 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, /* FT_Glyph_TransformFunc */ 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_bbox, 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0 /* FT_Glyph_PrepareFunc */ 143295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ) 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** FT_OutlineGlyph support ****/ 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_init( FT_Glyph outline_glyph, 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlot slot ) 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = FT_GLYPH( glyph )->library; 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* source = &slot->outline; 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* target = &glyph->outline; 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check format in glyph slot */ 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Invalid_Glyph_Format; 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allocate new outline */ 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Outline_New( library, source->n_points, source->n_contours, 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &glyph->outline ); 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Copy( source, target ); 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_done( FT_Glyph outline_glyph ) 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_copy( FT_Glyph outline_source, 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph outline_target ) 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = FT_GLYPH( source )->library; 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Outline_New( library, source->outline.n_points, 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project source->outline.n_contours, &target->outline ); 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Copy( &source->outline, &target->outline ); 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_transform( FT_Glyph outline_glyph, 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Matrix* matrix, 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Vector* delta ) 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( matrix ) 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Transform( &glyph->outline, matrix ); 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( delta ) 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_bbox( FT_Glyph outline_glyph, 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BBox* bbox ) 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Get_CBox( &glyph->outline, bbox ); 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_prepare( FT_Glyph outline_glyph, 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlot slot ) 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->format = FT_GLYPH_FORMAT_OUTLINE; 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->outline = glyph->outline; 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->outline.flags &= ~FT_OUTLINE_OWNER; 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_DEFINE_GLYPH( ft_outline_glyph_class, 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sizeof ( FT_OutlineGlyphRec ), 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GLYPH_FORMAT_OUTLINE, 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_init, 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_done, 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_copy, 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_transform, 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_bbox, 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_prepare 267295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ) 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** FT_Glyph class and API ****/ 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_new_glyph( FT_Library library, 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz, 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph* aglyph ) 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = library->memory; 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 285aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Glyph glyph = NULL; 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aglyph = 0; 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->library = library; 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->clazz = clazz; 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->format = clazz->glyph_format; 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aglyph = glyph; 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Copy( FT_Glyph source, 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph *target ) 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph copy; 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz; 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check arguments */ 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !target ) 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Invalid_Argument; 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *target = 0; 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !source || !source->clazz ) 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Invalid_Argument; 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz = source->clazz; 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ft_new_glyph( source->library, clazz, © ); 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project copy->advance = source->advance; 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project copy->format = source->format; 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( clazz->glyph_copy ) 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = clazz->glyph_copy( source, copy ); 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( copy ); 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *target = copy; 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Get_Glyph( FT_GlyphSlot slot, 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph *aglyph ) 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library; 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph glyph; 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz = 0; 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !slot ) 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Slot_Handle; 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project library = slot->library; 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !aglyph ) 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Invalid_Argument; 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if it is a bitmap, that's easy :-) */ 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) 373295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner clazz = FT_BITMAP_GLYPH_CLASS_GET; 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 375295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* if it is an outline */ 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) 377295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner clazz = FT_OUTLINE_GLYPH_CLASS_GET; 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* try to find a renderer that supports the glyph image format */ 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( render ) 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz = &render->glyph_class; 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !clazz ) 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Invalid_Glyph_Format; 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create FT_Glyph object */ 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ft_new_glyph( library, clazz, &glyph ); 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* copy advance while converting it to 16.16 format */ 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->advance.x = slot->advance.x << 10; 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->advance.y = slot->advance.y << 10; 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now import the image from the glyph slot */ 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = clazz->glyph_init( glyph, slot ); 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if an error occurred, destroy the glyph */ 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( glyph ); 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aglyph = glyph; 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Transform( FT_Glyph glyph, 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Matrix* matrix, 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* delta ) 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz; 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !glyph || !glyph->clazz ) 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Invalid_Argument; 431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz = glyph->clazz; 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( clazz->glyph_transform ) 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* transform glyph image */ 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz->glyph_transform( glyph, matrix, delta ); 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* transform advance vector */ 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( matrix ) 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector_Transform( &glyph->advance, matrix ); 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Invalid_Glyph_Format; 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Get_CBox( FT_Glyph glyph, 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt bbox_mode, 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BBox *acbox ) 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz; 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !acbox ) 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !glyph || !glyph->clazz ) 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz = glyph->clazz; 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !clazz->glyph_bbox ) 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* retrieve bbox in 26.6 coordinates */ 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz->glyph_bbox( glyph, acbox ); 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* perform grid fitting if needed */ 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bbox_mode == FT_GLYPH_BBOX_PIXELS ) 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->xMax = FT_PIX_CEIL( acbox->xMax ); 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->yMax = FT_PIX_CEIL( acbox->yMax ); 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* convert to integer pixels if needed */ 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bbox_mode == FT_GLYPH_BBOX_PIXELS ) 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->xMin >>= 6; 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->yMin >>= 6; 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->xMax >>= 6; 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->yMax >>= 6; 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Render_Mode render_mode, 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* origin, 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool destroy ) 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlotRec dummy; 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlot_InternalRec dummy_internal; 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph glyph; 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph bitmap = NULL; 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz; 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 51741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* FT_BITMAP_GLYPH_CLASS_GET derefers `library' in PIC mode */ 51841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Library library; 519295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check argument */ 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !the_glyph ) 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph = *the_glyph; 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !glyph ) 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 52841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier clazz = glyph->clazz; 52941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier library = glyph->library; 53041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( !library || !clazz ) 53141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Bad; 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* when called with a bitmap glyph, do nothing and return successfully */ 534295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( clazz == FT_BITMAP_GLYPH_CLASS_GET ) 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 53741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( !clazz->glyph_prepare ) 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 54041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ 54141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* then calling FT_Render_Glyph_Internal() */ 54241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( &dummy, sizeof ( dummy ) ); 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) ); 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dummy.internal = &dummy_internal; 54641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier dummy.library = library; 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dummy.format = clazz->glyph_format; 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create result bitmap glyph */ 55041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_Glyph*)(void*)&bitmap ); 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if `origin' is set, translate the glyph image */ 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( origin ) 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Transform( glyph, 0, origin ); 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( origin ); 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* prepare dummy slot for rendering */ 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = clazz->glyph_prepare( glyph, &dummy ); 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !destroy && origin ) 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector v; 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v.x = -origin->x; 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v.y = -origin->y; 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Transform( glyph, 0, &v ); 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* in case of success, copy the bitmap to the glyph bitmap */ 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* copy advance */ 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bitmap->root.advance = glyph->advance; 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( destroy ) 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( glyph ); 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *the_glyph = FT_GLYPH( bitmap ); 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error && bitmap ) 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( FT_GLYPH( bitmap ) ); 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Bad: 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Err_Invalid_Argument; 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( FT_Glyph glyph ) 612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( glyph ) 614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = glyph->library->memory; 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz = glyph->clazz; 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( clazz->glyph_done ) 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz->glyph_done( glyph ); 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( glyph ); 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 628