1/***************************************************************************/
2/*                                                                         */
3/*  ftpfr.c                                                                */
4/*                                                                         */
5/*    FreeType API for accessing PFR-specific data (body).                 */
6/*                                                                         */
7/*  Copyright 2002-2004, 2008, 2010, 2013, 2014 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#include <ft2build.h>
19#include FT_INTERNAL_DEBUG_H
20
21#include FT_INTERNAL_OBJECTS_H
22#include FT_SERVICE_PFR_H
23
24
25  /* check the format */
26  static FT_Service_PfrMetrics
27  ft_pfr_check( FT_Face  face )
28  {
29    FT_Service_PfrMetrics  service = NULL;
30
31
32    if ( face )
33      FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );
34
35    return service;
36  }
37
38
39  /* documentation is in ftpfr.h */
40
41  FT_EXPORT_DEF( FT_Error )
42  FT_Get_PFR_Metrics( FT_Face    face,
43                      FT_UInt   *aoutline_resolution,
44                      FT_UInt   *ametrics_resolution,
45                      FT_Fixed  *ametrics_x_scale,
46                      FT_Fixed  *ametrics_y_scale )
47  {
48    FT_Error               error = FT_Err_Ok;
49    FT_Service_PfrMetrics  service;
50
51
52    if ( !face )
53      return FT_THROW( Invalid_Face_Handle );
54
55    service = ft_pfr_check( face );
56    if ( service )
57    {
58      error = service->get_metrics( face,
59                                    aoutline_resolution,
60                                    ametrics_resolution,
61                                    ametrics_x_scale,
62                                    ametrics_y_scale );
63    }
64    else
65    {
66      FT_Fixed  x_scale, y_scale;
67
68
69      /* this is not a PFR font */
70      if ( aoutline_resolution )
71        *aoutline_resolution = face->units_per_EM;
72
73      if ( ametrics_resolution )
74        *ametrics_resolution = face->units_per_EM;
75
76      x_scale = y_scale = 0x10000L;
77      if ( face->size )
78      {
79        x_scale = face->size->metrics.x_scale;
80        y_scale = face->size->metrics.y_scale;
81      }
82
83      if ( ametrics_x_scale )
84        *ametrics_x_scale = x_scale;
85
86      if ( ametrics_y_scale )
87        *ametrics_y_scale = y_scale;
88
89      error = FT_THROW( Unknown_File_Format );
90    }
91
92    return error;
93  }
94
95
96  /* documentation is in ftpfr.h */
97
98  FT_EXPORT_DEF( FT_Error )
99  FT_Get_PFR_Kerning( FT_Face     face,
100                      FT_UInt     left,
101                      FT_UInt     right,
102                      FT_Vector  *avector )
103  {
104    FT_Error               error;
105    FT_Service_PfrMetrics  service;
106
107
108    if ( !face )
109      return FT_THROW( Invalid_Face_Handle );
110
111    if ( !avector )
112      return FT_THROW( Invalid_Argument );
113
114    service = ft_pfr_check( face );
115    if ( service )
116      error = service->get_kerning( face, left, right, avector );
117    else
118      error = FT_Get_Kerning( face, left, right,
119                              FT_KERNING_UNSCALED, avector );
120
121    return error;
122  }
123
124
125  /* documentation is in ftpfr.h */
126
127  FT_EXPORT_DEF( FT_Error )
128  FT_Get_PFR_Advance( FT_Face   face,
129                      FT_UInt   gindex,
130                      FT_Pos   *aadvance )
131  {
132    FT_Error               error;
133    FT_Service_PfrMetrics  service;
134
135
136    if ( !face )
137      return FT_THROW( Invalid_Face_Handle );
138
139    if ( !aadvance )
140      return FT_THROW( Invalid_Argument );
141
142    service = ft_pfr_check( face );
143    if ( service )
144      error = service->get_advance( face, gindex, aadvance );
145    else
146      /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
147      error = FT_THROW( Invalid_Argument );
148
149    return error;
150  }
151
152
153/* END */
154