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