source: trunk/poppler/freetype-2.1.10/src/cache/ftcimage.c @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

File size: 4.1 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  ftcimage.c                                                             */
4/*                                                                         */
5/*    FreeType Image cache (body).                                         */
6/*                                                                         */
7/*  Copyright 2000-2001, 2003, 2004 by                                     */
8/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9/*                                                                         */
10/*  This file is part of the FreeType project, and may only be used,       */
11/*  modified, and distributed under the terms of the FreeType project      */
12/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13/*  this file you indicate that you have read the license and              */
14/*  understand and accept it fully.                                        */
15/*                                                                         */
16/***************************************************************************/
17
18
19#include <ft2build.h>
20#include FT_CACHE_H
21#include FT_CACHE_INTERNAL_IMAGE_H
22#include FT_INTERNAL_MEMORY_H
23
24#include "ftccback.h"
25#include "ftcerror.h"
26
27
28  /* finalize a given glyph image node */
29  FT_LOCAL_DEF( void )
30  ftc_inode_free( FTC_Node   ftcinode,
31                  FTC_Cache  cache )
32  {
33    FTC_INode  inode = (FTC_INode)ftcinode;
34    FT_Memory  memory = cache->memory;
35
36
37    if ( inode->glyph )
38    {
39      FT_Done_Glyph( inode->glyph );
40      inode->glyph = NULL;
41    }
42
43    FTC_GNode_Done( FTC_GNODE( inode ), cache );
44    FT_FREE( inode );
45  }
46
47
48  FT_EXPORT_DEF( void )
49  FTC_INode_Free( FTC_INode  inode,
50                  FTC_Cache  cache )
51  {
52    ftc_inode_free( FTC_NODE( inode ), cache );
53  }
54
55
56  /* initialize a new glyph image node */
57  FT_EXPORT_DEF( FT_Error )
58  FTC_INode_New( FTC_INode   *pinode,
59                 FTC_GQuery   gquery,
60                 FTC_Cache    cache )
61  {
62    FT_Memory  memory = cache->memory;
63    FT_Error   error;
64    FTC_INode  inode;
65
66
67    if ( !FT_NEW( inode ) )
68    {
69      FTC_GNode         gnode  = FTC_GNODE( inode );
70      FTC_Family        family = gquery->family;
71      FT_UInt           gindex = gquery->gindex;
72      FTC_IFamilyClass  clazz  = FTC_CACHE__IFAMILY_CLASS( cache );
73
74
75      /* initialize its inner fields */
76      FTC_GNode_Init( gnode, gindex, family );
77
78      /* we will now load the glyph image */
79      error = clazz->family_load_glyph( family, gindex, cache,
80                                        &inode->glyph );
81    }
82
83    *pinode = inode;
84    return error;
85  }
86
87
88  FT_LOCAL_DEF( FT_Error )
89  ftc_inode_new( FTC_Node   *ftcpinode,
90                 FT_Pointer  ftcgquery,
91                 FTC_Cache   cache )
92  {
93    FTC_INode  *pinode = (FTC_INode*)ftcpinode;
94    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;
95
96
97    return FTC_INode_New( pinode, gquery, cache );
98  }
99
100
101  FT_LOCAL_DEF( FT_ULong )
102  ftc_inode_weight( FTC_Node   ftcinode,
103                    FTC_Cache  ftccache )
104  {
105    FTC_INode  inode = (FTC_INode)ftcinode;
106    FT_ULong   size  = 0;
107    FT_Glyph   glyph = inode->glyph;
108
109    FT_UNUSED( ftccache );
110
111
112    switch ( glyph->format )
113    {
114    case FT_GLYPH_FORMAT_BITMAP:
115      {
116        FT_BitmapGlyph  bitg;
117
118
119        bitg = (FT_BitmapGlyph)glyph;
120        size = bitg->bitmap.rows * labs( bitg->bitmap.pitch ) +
121               sizeof ( *bitg );
122      }
123      break;
124
125    case FT_GLYPH_FORMAT_OUTLINE:
126      {
127        FT_OutlineGlyph  outg;
128
129
130        outg = (FT_OutlineGlyph)glyph;
131        size = outg->outline.n_points *
132                 ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) +
133               outg->outline.n_contours * sizeof ( FT_Short ) +
134               sizeof ( *outg );
135      }
136      break;
137
138    default:
139      ;
140    }
141
142    size += sizeof ( *inode );
143    return size;
144  }
145
146
147  FT_EXPORT_DEF( FT_ULong )
148  FTC_INode_Weight( FTC_INode  inode )
149  {
150    return ftc_inode_weight( FTC_NODE( inode ), NULL );
151  }
152
153
154/* END */
Note: See TracBrowser for help on using the repository browser.