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/* */ 7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* Copyright 1996-2005, 2007, 2008, 2010, 2012, 2013 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> 32727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_INTERNAL_DEBUG_H 33727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_GLYPH_H 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_OUTLINE_H 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_BITMAP_H 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 39295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "basepic.h" 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_glyph 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** FT_BitmapGlyph support ****/ 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlot slot ) 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = FT_GLYPH( glyph )->library; 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 70727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Glyph_Format ); 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->left = slot->bitmap_left; 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->top = slot->bitmap_top; 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* do lazy copying whenever possible */ 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->bitmap = slot->bitmap; 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bitmap_New( &glyph->bitmap ); 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_copy( FT_Glyph bitmap_source, 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph bitmap_target ) 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = bitmap_source->library; 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project target->left = source->left; 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project target->top = source->top; 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = FT_GLYPH( glyph )->library; 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bitmap_Done( library, &glyph->bitmap ); 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BBox* cbox ) 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cbox->xMin = glyph->left << 6; 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 ); 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cbox->yMax = glyph->top << 6; 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 ); 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_DEFINE_GLYPH(ft_bitmap_glyph_class, 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sizeof ( FT_BitmapGlyphRec ), 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GLYPH_FORMAT_BITMAP, 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_init, 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_done, 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_copy, 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, /* FT_Glyph_TransformFunc */ 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_bitmap_glyph_bbox, 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0 /* FT_Glyph_PrepareFunc */ 145295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ) 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** FT_OutlineGlyph support ****/ 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_init( FT_Glyph outline_glyph, 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlot slot ) 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = FT_GLYPH( glyph )->library; 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* source = &slot->outline; 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline* target = &glyph->outline; 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check format in glyph slot */ 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 171727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Glyph_Format ); 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allocate new outline */ 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Outline_New( library, source->n_points, source->n_contours, 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &glyph->outline ); 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Copy( source, target ); 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_done( FT_Glyph outline_glyph ) 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_copy( FT_Glyph outline_source, 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph outline_target ) 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library = FT_GLYPH( source )->library; 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Outline_New( library, source->outline.n_points, 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project source->outline.n_contours, &target->outline ); 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Copy( &source->outline, &target->outline ); 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_transform( FT_Glyph outline_glyph, 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Matrix* matrix, 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Vector* delta ) 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( matrix ) 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Transform( &glyph->outline, matrix ); 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( delta ) 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_bbox( FT_Glyph outline_glyph, 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BBox* bbox ) 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Outline_Get_CBox( &glyph->outline, bbox ); 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_Error ) 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_prepare( FT_Glyph outline_glyph, 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlot slot ) 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->format = FT_GLYPH_FORMAT_OUTLINE; 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->outline = glyph->outline; 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project slot->outline.flags &= ~FT_OUTLINE_OWNER; 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FT_Err_Ok; 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 25941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_DEFINE_GLYPH( ft_outline_glyph_class, 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sizeof ( FT_OutlineGlyphRec ), 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GLYPH_FORMAT_OUTLINE, 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_init, 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_done, 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_copy, 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_transform, 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_bbox, 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_outline_glyph_prepare 269295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ) 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** FT_Glyph class and API ****/ 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /**** ****/ 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_new_glyph( FT_Library library, 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz, 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph* aglyph ) 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = library->memory; 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 287aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Glyph glyph = NULL; 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aglyph = 0; 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->library = library; 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->clazz = clazz; 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->format = clazz->glyph_format; 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aglyph = glyph; 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Copy( FT_Glyph source, 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph *target ) 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph copy; 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz; 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check arguments */ 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !target ) 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 319727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Argument ); 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *target = 0; 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !source || !source->clazz ) 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 327727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Argument ); 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz = source->clazz; 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ft_new_glyph( source->library, clazz, © ); 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project copy->advance = source->advance; 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project copy->format = source->format; 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( clazz->glyph_copy ) 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = clazz->glyph_copy( source, copy ); 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( copy ); 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *target = copy; 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Get_Glyph( FT_GlyphSlot slot, 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph *aglyph ) 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Library library; 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph glyph; 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz = 0; 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !slot ) 366727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Invalid_Slot_Handle ); 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project library = slot->library; 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !aglyph ) 371727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Invalid_Argument ); 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if it is a bitmap, that's easy :-) */ 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) 375295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner clazz = FT_BITMAP_GLYPH_CLASS_GET; 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 377295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* if it is an outline */ 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) 379295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner clazz = FT_OUTLINE_GLYPH_CLASS_GET; 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* try to find a renderer that supports the glyph image format */ 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( render ) 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz = &render->glyph_class; 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !clazz ) 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 393727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Glyph_Format ); 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create FT_Glyph object */ 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ft_new_glyph( library, clazz, &glyph ); 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* copy advance while converting it to 16.16 format */ 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->advance.x = slot->advance.x << 10; 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph->advance.y = slot->advance.y << 10; 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now import the image from the glyph slot */ 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = clazz->glyph_init( glyph, slot ); 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if an error occurred, destroy the glyph */ 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( glyph ); 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aglyph = glyph; 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Transform( FT_Glyph glyph, 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Matrix* matrix, 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* delta ) 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 427ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FT_Error error = FT_Err_Ok; 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !glyph || !glyph->clazz ) 431727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Argument ); 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 434ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease const FT_Glyph_Class* clazz = glyph->clazz; 435ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 436ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( clazz->glyph_transform ) 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* transform glyph image */ 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz->glyph_transform( glyph, matrix, delta ); 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* transform advance vector */ 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( matrix ) 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector_Transform( &glyph->advance, matrix ); 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 447727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Glyph_Format ); 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Get_CBox( FT_Glyph glyph, 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt bbox_mode, 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BBox *acbox ) 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz; 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !acbox ) 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !glyph || !glyph->clazz ) 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 470ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 471ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease clazz = glyph->clazz; 472ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( !clazz->glyph_bbox ) 473ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return; 474ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 475ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* retrieve bbox in 26.6 coordinates */ 476ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease clazz->glyph_bbox( glyph, acbox ); 477ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 478ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* perform grid fitting if needed */ 479ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || 480ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease bbox_mode == FT_GLYPH_BBOX_PIXELS ) 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 482ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); 483ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); 484ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease acbox->xMax = FT_PIX_CEIL( acbox->xMax ); 485ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease acbox->yMax = FT_PIX_CEIL( acbox->yMax ); 486ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 487ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 488ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* convert to integer pixels if needed */ 489ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || 490ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease bbox_mode == FT_GLYPH_BBOX_PIXELS ) 491ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 492ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease acbox->xMin >>= 6; 493ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease acbox->yMin >>= 6; 494ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease acbox->xMax >>= 6; 495ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease acbox->yMax >>= 6; 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Render_Mode render_mode, 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* origin, 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool destroy ) 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlotRec dummy; 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_GlyphSlot_InternalRec dummy_internal; 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error = FT_Err_Ok; 511727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Glyph b, glyph; 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_BitmapGlyph bitmap = NULL; 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz; 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 51541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* FT_BITMAP_GLYPH_CLASS_GET derefers `library' in PIC mode */ 51641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Library library; 517295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check argument */ 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !the_glyph ) 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project glyph = *the_glyph; 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !glyph ) 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 52641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier clazz = glyph->clazz; 52741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier library = glyph->library; 52841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( !library || !clazz ) 52941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier goto Bad; 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* when called with a bitmap glyph, do nothing and return successfully */ 532295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( clazz == FT_BITMAP_GLYPH_CLASS_GET ) 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 53541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( !clazz->glyph_prepare ) 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Bad; 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 53841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ 53941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* then calling FT_Render_Glyph_Internal() */ 54041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( &dummy, sizeof ( dummy ) ); 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) ); 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dummy.internal = &dummy_internal; 54441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier dummy.library = library; 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dummy.format = clazz->glyph_format; 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create result bitmap glyph */ 548727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b ); 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 551727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease bitmap = (FT_BitmapGlyph)b; 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if `origin' is set, translate the glyph image */ 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( origin ) 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Transform( glyph, 0, origin ); 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( origin ); 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* prepare dummy slot for rendering */ 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = clazz->glyph_prepare( glyph, &dummy ); 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !destroy && origin ) 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector v; 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v.x = -origin->x; 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v.y = -origin->y; 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Glyph_Transform( glyph, 0, &v ); 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* in case of success, copy the bitmap to the glyph bitmap */ 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* copy advance */ 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bitmap->root.advance = glyph->advance; 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( destroy ) 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( glyph ); 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *the_glyph = FT_GLYPH( bitmap ); 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error && bitmap ) 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( FT_GLYPH( bitmap ) ); 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Bad: 601727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Argument ); 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ftglyph.h */ 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( void ) 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Done_Glyph( FT_Glyph glyph ) 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( glyph ) 612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = glyph->library->memory; 614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Glyph_Class* clazz = glyph->clazz; 615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( clazz->glyph_done ) 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project clazz->glyph_done( glyph ); 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( glyph ); 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 626