source: trunk/poppler/freetype-2.1.10/src/pfr/pfrdrivr.c @ 2

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

First import

File size: 5.3 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  pfrdrivr.c                                                             */
4/*                                                                         */
5/*    FreeType PFR driver interface (body).                                */
6/*                                                                         */
7/*  Copyright 2002, 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_INTERNAL_DEBUG_H
21#include FT_INTERNAL_STREAM_H
22#include FT_SERVICE_PFR_H
23#include FT_SERVICE_XFREE86_NAME_H
24#include "pfrdrivr.h"
25#include "pfrobjs.h"
26
27#include "pfrerror.h"
28
29
30  FT_CALLBACK_DEF( FT_Error )
31  pfr_get_kerning( FT_Face     pfrface,     /* PFR_Face */
32                   FT_UInt     left,
33                   FT_UInt     right,
34                   FT_Vector  *avector )
35  {
36    PFR_Face     face = (PFR_Face)pfrface;
37    PFR_PhyFont  phys = &face->phy_font;
38
39
40    pfr_face_get_kerning( pfrface, left, right, avector );
41
42    /* convert from metrics to outline units when necessary */
43    if ( phys->outline_resolution != phys->metrics_resolution )
44    {
45      if ( avector->x != 0 )
46        avector->x = FT_MulDiv( avector->x, phys->outline_resolution,
47                                            phys->metrics_resolution );
48
49      if ( avector->y != 0 )
50        avector->y = FT_MulDiv( avector->x, phys->outline_resolution,
51                                            phys->metrics_resolution );
52    }
53
54    return PFR_Err_Ok;
55  }
56
57
58 /*
59  *  PFR METRICS SERVICE
60  *
61  */
62
63  FT_CALLBACK_DEF( FT_Error )
64  pfr_get_advance( FT_Face   pfrface,       /* PFR_Face */
65                   FT_UInt   gindex,
66                   FT_Pos   *anadvance )
67  {
68    PFR_Face  face  = (PFR_Face)pfrface;
69    FT_Error  error = PFR_Err_Bad_Argument;
70
71
72    *anadvance = 0;
73    if ( face )
74    {
75      PFR_PhyFont  phys = &face->phy_font;
76
77
78      if ( gindex < phys->num_chars )
79      {
80        *anadvance = phys->chars[gindex].advance;
81        error = 0;
82      }
83    }
84
85    return error;
86  }
87
88
89  FT_CALLBACK_DEF( FT_Error )
90  pfr_get_metrics( FT_Face    pfrface,      /* PFR_Face */
91                   FT_UInt   *anoutline_resolution,
92                   FT_UInt   *ametrics_resolution,
93                   FT_Fixed  *ametrics_x_scale,
94                   FT_Fixed  *ametrics_y_scale )
95  {
96    PFR_Face     face = (PFR_Face)pfrface;
97    PFR_PhyFont  phys = &face->phy_font;
98    FT_Fixed     x_scale, y_scale;
99    FT_Size      size = face->root.size;
100
101
102    if ( anoutline_resolution )
103      *anoutline_resolution = phys->outline_resolution;
104
105    if ( ametrics_resolution )
106      *ametrics_resolution = phys->metrics_resolution;
107
108    x_scale = 0x10000L;
109    y_scale = 0x10000L;
110
111    if ( size )
112    {
113      x_scale = FT_DivFix( size->metrics.x_ppem << 6,
114                           phys->metrics_resolution );
115
116      y_scale = FT_DivFix( size->metrics.y_ppem << 6,
117                           phys->metrics_resolution );
118    }
119
120    if ( ametrics_x_scale )
121      *ametrics_x_scale = x_scale;
122
123    if ( ametrics_y_scale )
124      *ametrics_y_scale = y_scale;
125
126    return PFR_Err_Ok;
127  }
128
129
130  FT_CALLBACK_TABLE_DEF
131  const FT_Service_PfrMetricsRec  pfr_metrics_service_rec =
132  {
133    pfr_get_metrics,
134    pfr_face_get_kerning,
135    pfr_get_advance
136  };
137
138
139 /*
140  *  SERVICE LIST
141  *
142  */
143
144  static const FT_ServiceDescRec  pfr_services[] =
145  {
146    { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec },
147    { FT_SERVICE_ID_XF86_NAME,   FT_XF86_FORMAT_PFR },
148    { NULL, NULL }
149  };
150
151
152  FT_CALLBACK_DEF( FT_Module_Interface )
153  pfr_get_service( FT_Module         module,
154                   const FT_String*  service_id )
155  {
156    FT_UNUSED( module );
157
158    return ft_service_list_lookup( pfr_services, service_id );
159  }
160
161
162  FT_CALLBACK_TABLE_DEF
163  const FT_Driver_ClassRec  pfr_driver_class =
164  {
165    {
166      FT_MODULE_FONT_DRIVER     |
167      FT_MODULE_DRIVER_SCALABLE,
168
169      sizeof( FT_DriverRec ),
170
171      "pfr",
172      0x10000L,
173      0x20000L,
174
175      NULL,
176
177      0,
178      0,
179      pfr_get_service
180    },
181
182    sizeof( PFR_FaceRec ),
183    sizeof( PFR_SizeRec ),
184    sizeof( PFR_SlotRec ),
185
186    pfr_face_init,
187    pfr_face_done,
188    0,                  /* FT_Size_InitFunc */
189    0,                  /* FT_Size_DoneFunc */
190    pfr_slot_init,
191    pfr_slot_done,
192
193    0,                  /* FT_Size_ResetPointsFunc */
194    0,                  /* FT_Size_ResetPixelsFunc */
195    pfr_slot_load,
196
197    pfr_get_kerning,
198    0,                  /* FT_Face_AttachFunc      */
199    0                   /* FT_Face_GetAdvancesFunc */
200  };
201
202
203/* END */
Note: See TracBrowser for help on using the repository browser.