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, &copy );
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