[FREETYPE]
[reactos.git] / reactos / 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-2004, 2008, 2010, 2013 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_Argument );
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_Argument );
110
111 service = ft_pfr_check( face );
112 if ( service )
113 error = service->get_kerning( face, left, right, avector );
114 else
115 error = FT_Get_Kerning( face, left, right,
116 FT_KERNING_UNSCALED, avector );
117
118 return error;
119 }
120
121
122 /* documentation is in ftpfr.h */
123
124 FT_EXPORT_DEF( FT_Error )
125 FT_Get_PFR_Advance( FT_Face face,
126 FT_UInt gindex,
127 FT_Pos *aadvance )
128 {
129 FT_Error error;
130 FT_Service_PfrMetrics service;
131
132
133 service = ft_pfr_check( face );
134 if ( service )
135 {
136 error = service->get_advance( face, gindex, aadvance );
137 }
138 else
139 /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
140 error = FT_THROW( Invalid_Argument );
141
142 return error;
143 }
144
145
146 /* END */