PageRenderTime 25ms CodeModel.GetById 14ms app.highlight 9ms RepoModel.GetById 1ms app.codeStats 0ms

/src/freetype/src/pfr/pfrdrivr.c

https://bitbucket.org/cabalistic/ogredeps/
C | 214 lines | 136 code | 52 blank | 26 comment | 14 complexity | e0ee64b3515cbd5e3519cf2545664288 MD5 | raw file
  1/***************************************************************************/
  2/*                                                                         */
  3/*  pfrdrivr.c                                                             */
  4/*                                                                         */
  5/*    FreeType PFR driver interface (body).                                */
  6/*                                                                         */
  7/*  Copyright 2002-2004, 2006, 2008, 2010, 2011 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_Invalid_Argument;
 70
 71
 72    *anadvance = 0;
 73
 74    if ( !gindex )
 75      goto Exit;
 76
 77    gindex--;
 78
 79    if ( face )
 80    {
 81      PFR_PhyFont  phys = &face->phy_font;
 82
 83
 84      if ( gindex < phys->num_chars )
 85      {
 86        *anadvance = phys->chars[gindex].advance;
 87        error = PFR_Err_Ok;
 88      }
 89    }
 90
 91  Exit:
 92    return error;
 93  }
 94
 95
 96  FT_CALLBACK_DEF( FT_Error )
 97  pfr_get_metrics( FT_Face    pfrface,      /* PFR_Face */
 98                   FT_UInt   *anoutline_resolution,
 99                   FT_UInt   *ametrics_resolution,
100                   FT_Fixed  *ametrics_x_scale,
101                   FT_Fixed  *ametrics_y_scale )
102  {
103    PFR_Face     face = (PFR_Face)pfrface;
104    PFR_PhyFont  phys = &face->phy_font;
105    FT_Fixed     x_scale, y_scale;
106    FT_Size      size = face->root.size;
107
108
109    if ( anoutline_resolution )
110      *anoutline_resolution = phys->outline_resolution;
111
112    if ( ametrics_resolution )
113      *ametrics_resolution = phys->metrics_resolution;
114
115    x_scale = 0x10000L;
116    y_scale = 0x10000L;
117
118    if ( size )
119    {
120      x_scale = FT_DivFix( size->metrics.x_ppem << 6,
121                           phys->metrics_resolution );
122
123      y_scale = FT_DivFix( size->metrics.y_ppem << 6,
124                           phys->metrics_resolution );
125    }
126
127    if ( ametrics_x_scale )
128      *ametrics_x_scale = x_scale;
129
130    if ( ametrics_y_scale )
131      *ametrics_y_scale = y_scale;
132
133    return PFR_Err_Ok;
134  }
135
136
137  FT_CALLBACK_TABLE_DEF
138  const FT_Service_PfrMetricsRec  pfr_metrics_service_rec =
139  {
140    pfr_get_metrics,
141    pfr_face_get_kerning,
142    pfr_get_advance
143  };
144
145
146 /*
147  *  SERVICE LIST
148  *
149  */
150
151  static const FT_ServiceDescRec  pfr_services[] =
152  {
153    { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec },
154    { FT_SERVICE_ID_XF86_NAME,   FT_XF86_FORMAT_PFR },
155    { NULL, NULL }
156  };
157
158
159  FT_CALLBACK_DEF( FT_Module_Interface )
160  pfr_get_service( FT_Module         module,
161                   const FT_String*  service_id )
162  {
163    FT_UNUSED( module );
164
165    return ft_service_list_lookup( pfr_services, service_id );
166  }
167
168
169  FT_CALLBACK_TABLE_DEF
170  const FT_Driver_ClassRec  pfr_driver_class =
171  {
172    {
173      FT_MODULE_FONT_DRIVER     |
174      FT_MODULE_DRIVER_SCALABLE,
175
176      sizeof ( FT_DriverRec ),
177
178      "pfr",
179      0x10000L,
180      0x20000L,
181
182      NULL,
183
184      0,                /* FT_Module_Constructor */
185      0,                /* FT_Module_Destructor  */
186      pfr_get_service
187    },
188
189    sizeof ( PFR_FaceRec ),
190    sizeof ( PFR_SizeRec ),
191    sizeof ( PFR_SlotRec ),
192
193    pfr_face_init,
194    pfr_face_done,
195    0,                  /* FT_Size_InitFunc */
196    0,                  /* FT_Size_DoneFunc */
197    pfr_slot_init,
198    pfr_slot_done,
199
200#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
201    ft_stub_set_char_sizes,
202    ft_stub_set_pixel_sizes,
203#endif
204    pfr_slot_load,
205
206    pfr_get_kerning,
207    0,                  /* FT_Face_AttachFunc      */
208    0,                  /* FT_Face_GetAdvancesFunc */
209    0,                  /* FT_Size_RequestFunc     */
210    0,                  /* FT_Size_SelectFunc      */
211  };
212
213
214/* END */