xref: /inferno-os/libfreetype/pfrdrivr.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  pfrdrivr.c                                                             */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    FreeType PFR driver interface (body).                                */
6*37da2899SCharles.Forsyth /*                                                                         */
7*37da2899SCharles.Forsyth /*  Copyright 2002 by                                                      */
8*37da2899SCharles.Forsyth /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9*37da2899SCharles.Forsyth /*                                                                         */
10*37da2899SCharles.Forsyth /*  This file is part of the FreeType project, and may only be used,       */
11*37da2899SCharles.Forsyth /*  modified, and distributed under the terms of the FreeType project      */
12*37da2899SCharles.Forsyth /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13*37da2899SCharles.Forsyth /*  this file you indicate that you have read the license and              */
14*37da2899SCharles.Forsyth /*  understand and accept it fully.                                        */
15*37da2899SCharles.Forsyth /*                                                                         */
16*37da2899SCharles.Forsyth /***************************************************************************/
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth 
19*37da2899SCharles.Forsyth #include <ft2build.h>
20*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H
21*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H
22*37da2899SCharles.Forsyth #include FT_INTERNAL_PFR_H
23*37da2899SCharles.Forsyth #include "pfrdrivr.h"
24*37da2899SCharles.Forsyth #include "pfrobjs.h"
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth 
27*37da2899SCharles.Forsyth   static FT_Error
pfr_get_kerning(PFR_Face face,FT_UInt left,FT_UInt right,FT_Vector * avector)28*37da2899SCharles.Forsyth   pfr_get_kerning( PFR_Face    face,
29*37da2899SCharles.Forsyth                    FT_UInt     left,
30*37da2899SCharles.Forsyth                    FT_UInt     right,
31*37da2899SCharles.Forsyth                    FT_Vector  *avector )
32*37da2899SCharles.Forsyth   {
33*37da2899SCharles.Forsyth     FT_Error  error;
34*37da2899SCharles.Forsyth 
35*37da2899SCharles.Forsyth     error = pfr_face_get_kerning( face, left, right, avector );
36*37da2899SCharles.Forsyth     if ( !error )
37*37da2899SCharles.Forsyth     {
38*37da2899SCharles.Forsyth       PFR_PhyFont  phys = &face->phy_font;
39*37da2899SCharles.Forsyth 
40*37da2899SCharles.Forsyth       /* convert from metrics to outline units when necessary */
41*37da2899SCharles.Forsyth       if ( phys->outline_resolution != phys->metrics_resolution )
42*37da2899SCharles.Forsyth       {
43*37da2899SCharles.Forsyth         if ( avector->x != 0 )
44*37da2899SCharles.Forsyth           avector->x = FT_MulDiv( avector->x, phys->outline_resolution,
45*37da2899SCharles.Forsyth                                               phys->metrics_resolution );
46*37da2899SCharles.Forsyth 
47*37da2899SCharles.Forsyth         if ( avector->y != 0 )
48*37da2899SCharles.Forsyth           avector->y = FT_MulDiv( avector->x, phys->outline_resolution,
49*37da2899SCharles.Forsyth                                               phys->metrics_resolution );
50*37da2899SCharles.Forsyth       }
51*37da2899SCharles.Forsyth     }
52*37da2899SCharles.Forsyth     return error;
53*37da2899SCharles.Forsyth   }
54*37da2899SCharles.Forsyth 
55*37da2899SCharles.Forsyth 
56*37da2899SCharles.Forsyth   static FT_Error
pfr_get_advance(PFR_Face face,FT_UInt gindex,FT_Pos * aadvance)57*37da2899SCharles.Forsyth   pfr_get_advance( PFR_Face   face,
58*37da2899SCharles.Forsyth                    FT_UInt    gindex,
59*37da2899SCharles.Forsyth                    FT_Pos    *aadvance )
60*37da2899SCharles.Forsyth   {
61*37da2899SCharles.Forsyth     FT_Error     error = FT_Err_Bad_Argument;
62*37da2899SCharles.Forsyth 
63*37da2899SCharles.Forsyth     *aadvance = 0;
64*37da2899SCharles.Forsyth     if ( face )
65*37da2899SCharles.Forsyth     {
66*37da2899SCharles.Forsyth       PFR_PhyFont  phys  = &face->phy_font;
67*37da2899SCharles.Forsyth 
68*37da2899SCharles.Forsyth       if ( gindex < phys->num_chars )
69*37da2899SCharles.Forsyth       {
70*37da2899SCharles.Forsyth         *aadvance = phys->chars[ gindex ].advance;
71*37da2899SCharles.Forsyth         error = 0;
72*37da2899SCharles.Forsyth       }
73*37da2899SCharles.Forsyth     }
74*37da2899SCharles.Forsyth 
75*37da2899SCharles.Forsyth     return error;
76*37da2899SCharles.Forsyth   }
77*37da2899SCharles.Forsyth 
78*37da2899SCharles.Forsyth 
79*37da2899SCharles.Forsyth   static FT_Error
pfr_get_metrics(PFR_Face face,FT_UInt * aoutline_resolution,FT_UInt * ametrics_resolution,FT_Fixed * ametrics_x_scale,FT_Fixed * ametrics_y_scale)80*37da2899SCharles.Forsyth   pfr_get_metrics( PFR_Face   face,
81*37da2899SCharles.Forsyth                    FT_UInt   *aoutline_resolution,
82*37da2899SCharles.Forsyth                    FT_UInt   *ametrics_resolution,
83*37da2899SCharles.Forsyth                    FT_Fixed  *ametrics_x_scale,
84*37da2899SCharles.Forsyth                    FT_Fixed  *ametrics_y_scale )
85*37da2899SCharles.Forsyth   {
86*37da2899SCharles.Forsyth     PFR_PhyFont  phys  = &face->phy_font;
87*37da2899SCharles.Forsyth     FT_Fixed     x_scale, y_scale;
88*37da2899SCharles.Forsyth     FT_Size      size = face->root.size;
89*37da2899SCharles.Forsyth 
90*37da2899SCharles.Forsyth     if ( aoutline_resolution )
91*37da2899SCharles.Forsyth       *aoutline_resolution = phys->outline_resolution;
92*37da2899SCharles.Forsyth 
93*37da2899SCharles.Forsyth     if ( ametrics_resolution )
94*37da2899SCharles.Forsyth       *ametrics_resolution = phys->metrics_resolution;
95*37da2899SCharles.Forsyth 
96*37da2899SCharles.Forsyth     x_scale = 0x10000L;
97*37da2899SCharles.Forsyth     y_scale = 0x10000L;
98*37da2899SCharles.Forsyth 
99*37da2899SCharles.Forsyth     if ( size )
100*37da2899SCharles.Forsyth     {
101*37da2899SCharles.Forsyth       x_scale = FT_DivFix( size->metrics.x_ppem << 6,
102*37da2899SCharles.Forsyth                            phys->metrics_resolution );
103*37da2899SCharles.Forsyth 
104*37da2899SCharles.Forsyth       y_scale = FT_DivFix( size->metrics.y_ppem << 6,
105*37da2899SCharles.Forsyth                            phys->metrics_resolution );
106*37da2899SCharles.Forsyth     }
107*37da2899SCharles.Forsyth 
108*37da2899SCharles.Forsyth     if ( ametrics_x_scale )
109*37da2899SCharles.Forsyth       *ametrics_x_scale = x_scale;
110*37da2899SCharles.Forsyth 
111*37da2899SCharles.Forsyth     if ( ametrics_y_scale )
112*37da2899SCharles.Forsyth       *ametrics_y_scale = y_scale;
113*37da2899SCharles.Forsyth 
114*37da2899SCharles.Forsyth     return 0;
115*37da2899SCharles.Forsyth   }
116*37da2899SCharles.Forsyth 
117*37da2899SCharles.Forsyth 
118*37da2899SCharles.Forsyth   FT_CALLBACK_TABLE_DEF
119*37da2899SCharles.Forsyth   const FT_PFR_ServiceRec  pfr_service_rec =
120*37da2899SCharles.Forsyth   {
121*37da2899SCharles.Forsyth     (FT_PFR_GetMetricsFunc)  pfr_get_metrics,
122*37da2899SCharles.Forsyth     (FT_PFR_GetKerningFunc)  pfr_get_kerning,
123*37da2899SCharles.Forsyth     (FT_PFR_GetAdvanceFunc)  pfr_get_advance
124*37da2899SCharles.Forsyth   };
125*37da2899SCharles.Forsyth 
126*37da2899SCharles.Forsyth 
127*37da2899SCharles.Forsyth   FT_CALLBACK_TABLE_DEF
128*37da2899SCharles.Forsyth   const FT_Driver_ClassRec  pfr_driver_class =
129*37da2899SCharles.Forsyth   {
130*37da2899SCharles.Forsyth     {
131*37da2899SCharles.Forsyth       ft_module_font_driver      |
132*37da2899SCharles.Forsyth       ft_module_driver_scalable,
133*37da2899SCharles.Forsyth 
134*37da2899SCharles.Forsyth       sizeof( FT_DriverRec ),
135*37da2899SCharles.Forsyth 
136*37da2899SCharles.Forsyth       "pfr",
137*37da2899SCharles.Forsyth       0x10000L,
138*37da2899SCharles.Forsyth       0x20000L,
139*37da2899SCharles.Forsyth 
140*37da2899SCharles.Forsyth       (FT_PFR_Service)  &pfr_service_rec,   /* format interface */
141*37da2899SCharles.Forsyth 
142*37da2899SCharles.Forsyth       (FT_Module_Constructor)NULL,
143*37da2899SCharles.Forsyth       (FT_Module_Destructor) NULL,
144*37da2899SCharles.Forsyth       (FT_Module_Requester)  NULL
145*37da2899SCharles.Forsyth     },
146*37da2899SCharles.Forsyth 
147*37da2899SCharles.Forsyth     sizeof( PFR_FaceRec ),
148*37da2899SCharles.Forsyth     sizeof( PFR_SizeRec ),
149*37da2899SCharles.Forsyth     sizeof( PFR_SlotRec ),
150*37da2899SCharles.Forsyth 
151*37da2899SCharles.Forsyth     (FT_Face_InitFunc)        pfr_face_init,
152*37da2899SCharles.Forsyth     (FT_Face_DoneFunc)        pfr_face_done,
153*37da2899SCharles.Forsyth     (FT_Size_InitFunc)        NULL,
154*37da2899SCharles.Forsyth     (FT_Size_DoneFunc)        NULL,
155*37da2899SCharles.Forsyth     (FT_Slot_InitFunc)        pfr_slot_init,
156*37da2899SCharles.Forsyth     (FT_Slot_DoneFunc)        pfr_slot_done,
157*37da2899SCharles.Forsyth 
158*37da2899SCharles.Forsyth     (FT_Size_ResetPointsFunc) NULL,
159*37da2899SCharles.Forsyth     (FT_Size_ResetPixelsFunc) NULL,
160*37da2899SCharles.Forsyth     (FT_Slot_LoadFunc)        pfr_slot_load,
161*37da2899SCharles.Forsyth 
162*37da2899SCharles.Forsyth     (FT_Face_GetKerningFunc)  pfr_get_kerning,
163*37da2899SCharles.Forsyth     (FT_Face_AttachFunc)      0,
164*37da2899SCharles.Forsyth     (FT_Face_GetAdvancesFunc) 0
165*37da2899SCharles.Forsyth   };
166*37da2899SCharles.Forsyth 
167*37da2899SCharles.Forsyth 
168*37da2899SCharles.Forsyth /* END */
169