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