1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  cffdrivr.c                                                             */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    OpenType font driver implementation (body).                          */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*  Copyright 1996-2015 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
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h>
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_FREETYPE_H
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_STREAM_H
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_SFNT_H
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_CID_H
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_INFO_H
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_NAME_H
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_TT_CMAP_H
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffdrivr.h"
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffgload.h"
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffload.h"
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffcmap.h"
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffparse.h"
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cfferrs.h"
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffpic.h"
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include FT_SERVICE_FONT_FORMAT_H
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_GLYPH_DICT_H
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_PROPERTIES_H
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_CFF_DRIVER_H
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* messages during execution.                                            */
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef  FT_COMPONENT
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT  trace_cffdriver
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                          F A C E S                              ****/
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Function>                                                            */
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    cff_get_kerning                                                    */
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    A driver method used to return the kerning vector between two      */
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    glyphs of the same face.                                           */
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Input>                                                               */
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    face        :: A handle to the source face object.                 */
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    right_glyph :: The index of the right glyph in the kern pair.      */
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Output>                                                              */
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    kerning     :: The kerning vector.  This is in font units for      */
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   scalable formats, and in pixels for fixed-sizes     */
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   formats.                                            */
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Return>                                                              */
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    FreeType error code.  0 means success.                             */
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Note>                                                                */
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    supported by this function.  Other layouts, or more sophisticated  */
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    kernings, are out of scope of this method (the basic driver        */
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    interface is meant to be simple).                                  */
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    They can be implemented by format-specific interfaces.             */
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_CALLBACK_DEF( FT_Error )
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_kerning( FT_Face     ttface,          /* TT_Face */
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_UInt     left_glyph,
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_UInt     right_glyph,
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_Vector*  kerning )
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_Face       face = (TT_Face)ttface;
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    kerning->x = 0;
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    kerning->y = 0;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( sfnt )
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_Err_Ok;
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Function>                                                            */
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    cff_glyph_load                                                     */
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    A driver method used to load a glyph within a given glyph slot.    */
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Input>                                                               */
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    slot        :: A handle to the target slot object where the glyph  */
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   will be loaded.                                     */
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    size        :: A handle to the source face size at which the glyph */
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   must be scaled, loaded, etc.                        */
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    glyph_index :: The index of the glyph in the font file.            */
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   FT_LOAD_??? constants can be used to control the    */
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   glyph loading process (e.g., whether the outline    */
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   should be scaled, whether to load bitmaps or not,   */
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                   whether to hint the outline, etc).                  */
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Return>                                                              */
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    FreeType error code.  0 means success.                             */
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_CALLBACK_DEF( FT_Error )
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_glyph_load( FT_GlyphSlot  cffslot,      /* CFF_GlyphSlot */
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_Size       cffsize,      /* CFF_Size      */
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_UInt       glyph_index,
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_Int32      load_flags )
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error       error;
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_GlyphSlot  slot = (CFF_GlyphSlot)cffslot;
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Size       size = (CFF_Size)cffsize;
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !slot )
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return FT_THROW( Invalid_Slot_Handle );
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index ));
160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* check whether we want a scaled outline or bitmap */
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !size )
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* reset the size object if necessary */
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( load_flags & FT_LOAD_NO_SCALE )
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      size = NULL;
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( size )
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* these two objects must have the same parent */
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( cffsize->face != cffslot->face )
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FT_THROW( Invalid_Face_Handle );
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* now load the glyph outline if necessary */
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = cff_slot_load( slot, size, glyph_index, load_flags );
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* force drop-out mode to 2 - irrelevant now */
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* slot->outline.dropout_mode = 2; */
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_CALLBACK_DEF( FT_Error )
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_advances( FT_Face    face,
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FT_UInt    start,
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FT_UInt    count,
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FT_Int32   flags,
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FT_Fixed*  advances )
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt       nn;
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error      error = FT_Err_Ok;
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_GlyphSlot  slot  = face->glyph;
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if ( FT_IS_SFNT( face ) )
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      /* OpenType 1.7 mandates that the data from `hmtx' table be used; */
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      /* it is no longer necessary that those values are identical to   */
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      /* the values in the `CFF' table                                  */
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      TT_Face   ttface = (TT_Face)face;
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FT_Short  dummy;
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if ( flags & FT_LOAD_VERTICAL_LAYOUT )
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      {
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        /* check whether we have data from the `vmtx' table at all; */
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        /* otherwise we extract the info from the CFF glyphstrings  */
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        /* (instead of synthesizing a global value using the `OS/2' */
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        /* table)                                                   */
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if ( !ttface->vertical_info )
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          goto Missing_Table;
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        for ( nn = 0; nn < count; nn++ )
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        {
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FT_UShort  ah;
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface,
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       1,
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       start + nn,
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       &dummy,
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       &ah );
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FT_TRACE5(( "  idx %d: advance height %d font units\n",
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                      start + nn, ah ));
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          advances[nn] = ah;
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      else
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      {
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        /* check whether we have data from the `hmtx' table at all */
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if ( !ttface->horizontal.number_Of_HMetrics )
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          goto Missing_Table;
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        for ( nn = 0; nn < count; nn++ )
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        {
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FT_UShort  aw;
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface,
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       0,
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       start + nn,
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       &dummy,
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                       &aw );
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FT_TRACE5(( "  idx %d: advance width %d font units\n",
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                      start + nn, aw ));
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          advances[nn] = aw;
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return error;
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Missing_Table:
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for ( nn = 0; nn < count; nn++ )
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      error = cff_glyph_load( slot, face->size, start + nn, flags );
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( error )
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        break;
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     ? slot->linearVertAdvance
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     : slot->linearHoriAdvance;
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  GLYPH DICT SERVICE
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_glyph_name( CFF_Face    face,
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      FT_UInt     glyph_index,
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      FT_Pointer  buffer,
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      FT_UInt     buffer_max )
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Font    font   = (CFF_Font)face->extra.data;
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_String*  gname;
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UShort   sid;
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error    error;
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !font->psnames )
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_ERROR(( "cff_get_glyph_name:"
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 " cannot get glyph name from CFF & CEF fonts\n"
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 "                   "
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 " without the `PSNames' module\n" ));
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      error = FT_THROW( Missing_Module );
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      goto Exit;
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* first, locate the sid in the charset table */
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sid = font->charset.sids[glyph_index];
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* now, lookup the name itself */
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    gname = cff_index_get_sid_string( font, sid );
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( gname )
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_STRCPYN( buffer, gname, buffer_max );
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = FT_Err_Ok;
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Exit:
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_UInt
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_name_index( CFF_Face    face,
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      FT_String*  glyph_name )
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Font            cff;
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Charset         charset;
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Service_PsCMaps  psnames;
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_String*          name;
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UShort           sid;
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt             i;
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff     = (CFF_FontRec *)face->extra.data;
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    charset = &cff->charset;
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !psnames )
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return 0;
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for ( i = 0; i < cff->num_glyphs; i++ )
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      sid = charset->sids[i];
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( sid > 390 )
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        name = cff_index_get_string( cff, sid - 391 );
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      else
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        name = (FT_String *)psnames->adobe_std_strings( sid );
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( !name )
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        continue;
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( !ft_strcmp( glyph_name, name ) )
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return i;
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_GLYPHDICTREC(
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_service_glyph_dict,
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_GlyphDict_GetNameFunc)  cff_get_glyph_name,
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_GlyphDict_NameIndexFunc)cff_get_name_index
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  POSTSCRIPT INFO SERVICE
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Int
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_ps_has_glyph_names( FT_Face  face )
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_ps_get_font_info( CFF_Face         face,
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                        PS_FontInfoRec*  afont_info )
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Font  cff   = (CFF_Font)face->extra.data;
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error = FT_Err_Ok;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( cff && cff->font_info == NULL )
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      CFF_FontRecDict  dict   = &cff->top_font.font_dict;
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      PS_FontInfoRec  *font_info = NULL;
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Memory        memory = face->root.memory;
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        goto Fail;
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      font_info->version     = cff_index_get_sid_string( cff,
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                         dict->version );
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      font_info->notice      = cff_index_get_sid_string( cff,
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                         dict->notice );
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      font_info->full_name   = cff_index_get_sid_string( cff,
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                         dict->full_name );
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      font_info->family_name = cff_index_get_sid_string( cff,
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                         dict->family_name );
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      font_info->weight      = cff_index_get_sid_string( cff,
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                         dict->weight );
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      font_info->italic_angle        = dict->italic_angle;
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      font_info->is_fixed_pitch      = dict->is_fixed_pitch;
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      font_info->underline_position  = (FT_Short)dict->underline_position;
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      font_info->underline_thickness = (FT_UShort)dict->underline_thickness;
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      cff->font_info = font_info;
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( cff )
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *afont_info = *cff->font_info;
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Fail:
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_PSINFOREC(
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_service_ps_info,
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_GetFontInfoFunc)   cff_ps_get_font_info,
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_GetFontExtraFunc)  NULL,
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_GetFontPrivateFunc)NULL,        /* unsupported with CFF fonts */
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (PS_GetFontValueFunc)  NULL         /* not implemented            */
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  POSTSCRIPT NAME SERVICE
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static const char*
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_ps_name( CFF_Face  face )
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFF_Font      cff  = (CFF_Font)face->extra.data;
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    /* following the OpenType specification 1.7, we return the name stored */
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    /* in the `name' table for a CFF wrapped into an SFNT container        */
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if ( sfnt )
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FT_Library             library     = FT_FACE_LIBRARY( face );
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FT_Module              sfnt_module = FT_Get_Module( library, "sfnt" );
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FT_Service_PsFontName  service     =
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        (FT_Service_PsFontName)ft_module_get_service(
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 sfnt_module,
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FT_SERVICE_ID_POSTSCRIPT_FONT_NAME );
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if ( service && service->get_ps_font_name )
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return service->get_ps_font_name( FT_FACE( face ) );
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (const char*)cff->font_name;
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_PSFONTNAMEREC(
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_service_ps_name,
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_PsName_GetFunc)cff_get_ps_name
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * TT CMAP INFO
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * If the charmap is a synthetic Unicode encoding cmap or
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * service defined in SFNT module.
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * Otherwise call the service function in the sfnt module.
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_cmap_info( FT_CharMap    charmap,
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     TT_CMapInfo  *cmap_info )
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_CMap   cmap  = FT_CMAP( charmap );
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error = FT_Err_Ok;
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Face     face    = FT_CMAP_FACE( cmap );
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Library  library = FT_FACE_LIBRARY( face );
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cmap_info->language = 0;
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cmap_info->format   = 0;
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET &&
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET  )
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Module           sfnt    = FT_Get_Module( library, "sfnt" );
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Service_TTCMaps  service =
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        (FT_Service_TTCMaps)ft_module_get_service( sfnt,
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                   FT_SERVICE_ID_TT_CMAP );
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( service && service->get_cmap_info )
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        error = service->get_cmap_info( charmap, cmap_info );
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_TTCMAPSREC(
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_service_get_cmap_info,
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (TT_CMap_Info_GetFunc)cff_get_cmap_info
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  CID INFO SERVICE
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_ros( CFF_Face      face,
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               const char*  *registry,
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               const char*  *ordering,
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               FT_Int       *supplement )
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error = FT_Err_Ok;
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Font  cff   = (CFF_Font)face->extra.data;
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( cff )
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      CFF_FontRecDict  dict = &cff->top_font.font_dict;
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( dict->cid_registry == 0xFFFFU )
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        error = FT_THROW( Invalid_Argument );
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        goto Fail;
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( registry )
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( cff->registry == NULL )
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          cff->registry = cff_index_get_sid_string( cff,
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    dict->cid_registry );
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *registry = cff->registry;
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( ordering )
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( cff->ordering == NULL )
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          cff->ordering = cff_index_get_sid_string( cff,
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    dict->cid_ordering );
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *ordering = cff->ordering;
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /*
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       * XXX: According to Adobe TechNote #5176, the supplement in CFF
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       *      can be a real number. We truncate it to fit public API
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       *      since freetype-2.3.6.
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       */
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( supplement )
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( dict->cid_supplement < FT_INT_MIN ||
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             dict->cid_supplement > FT_INT_MAX )
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n",
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      dict->cid_supplement ));
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *supplement = (FT_Int)dict->cid_supplement;
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Fail:
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_is_cid( CFF_Face  face,
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  FT_Bool  *is_cid )
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error = FT_Err_Ok;
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Font  cff   = (CFF_Font)face->extra.data;
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    *is_cid = 0;
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( cff )
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      CFF_FontRecDict  dict = &cff->top_font.font_dict;
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( dict->cid_registry != 0xFFFFU )
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *is_cid = 1;
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_cid_from_glyph_index( CFF_Face  face,
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FT_UInt   glyph_index,
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                FT_UInt  *cid )
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error = FT_Err_Ok;
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Font  cff;
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff = (CFF_Font)face->extra.data;
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( cff )
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt          c;
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      CFF_FontRecDict  dict = &cff->top_font.font_dict;
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( dict->cid_registry == 0xFFFFU )
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        error = FT_THROW( Invalid_Argument );
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        goto Fail;
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( glyph_index > cff->num_glyphs )
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        error = FT_THROW( Invalid_Argument );
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        goto Fail;
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      c = cff->charset.sids[glyph_index];
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( cid )
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *cid = c;
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Fail:
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_CIDREC(
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_service_cid_info,
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros,
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_CID_GetIsInternallyCIDKeyedFunc)      cff_get_is_cid,
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_CID_GetCIDFromGlyphIndexFunc)         cff_get_cid_from_glyph_index
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *  PROPERTY SERVICE
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   *
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_property_set( FT_Module    module,         /* CFF_Driver */
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    const char*  property_name,
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    const void*  value )
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error    error  = FT_Err_Ok;
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Driver  driver = (CFF_Driver)module;
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int*  darken_params = (FT_Int*)value;
666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int  x1 = darken_params[0];
668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int  y1 = darken_params[1];
669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int  x2 = darken_params[2];
670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int  y2 = darken_params[3];
671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int  x3 = darken_params[4];
672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int  y3 = darken_params[5];
673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int  x4 = darken_params[6];
674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int  y4 = darken_params[7];
675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov           y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov           x1 > x2  || x2 > x3  || x3 > x4              ||
680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov           y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FT_THROW( Invalid_Argument );
682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      driver->darken_params[0] = x1;
684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      driver->darken_params[1] = y1;
685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      driver->darken_params[2] = x2;
686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      driver->darken_params[3] = y2;
687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      driver->darken_params[4] = x3;
688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      driver->darken_params[5] = y3;
689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      driver->darken_params[6] = x4;
690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      driver->darken_params[7] = y4;
691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return error;
693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt*  hinting_engine = (FT_UInt*)value;
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef CFF_CONFIG_OPTION_OLD_ENGINE
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( *hinting_engine != FT_CFF_HINTING_ADOBE )
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        error = FT_ERR( Unimplemented_Feature );
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      else
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        driver->hinting_engine = *hinting_engine;
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Bool*  no_stem_darkening = (FT_Bool*)value;
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      driver->no_stem_darkening = *no_stem_darkening;
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_TRACE0(( "cff_property_set: missing property `%s'\n",
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                property_name ));
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_THROW( Missing_Property );
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_property_get( FT_Module    module,         /* CFF_Driver */
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    const char*  property_name,
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    const void*  value )
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error    error  = FT_Err_Ok;
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_Driver  driver = (CFF_Driver)module;
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {
735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int*  darken_params = driver->darken_params;
736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Int*  val           = (FT_Int*)value;
737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      val[0] = darken_params[0];
740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      val[1] = darken_params[1];
741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      val[2] = darken_params[2];
742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      val[3] = darken_params[3];
743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      val[4] = darken_params[4];
744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      val[5] = darken_params[5];
745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      val[6] = darken_params[6];
746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      val[7] = darken_params[7];
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return error;
749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_UInt   hinting_engine    = driver->hinting_engine;
753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_UInt*  val               = (FT_UInt*)value;
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *val = hinting_engine;
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Bool   no_stem_darkening = driver->no_stem_darkening;
763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      FT_Bool*  val               = (FT_Bool*)value;
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      *val = no_stem_darkening;
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_TRACE0(( "cff_property_get: missing property `%s'\n",
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                property_name ));
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FT_THROW( Missing_Property );
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICE_PROPERTIESREC(
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_service_properties,
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Properties_SetFunc)cff_property_set,
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (FT_Properties_GetFunc)cff_property_get )
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                D R I V E R  I N T E R F A C E                   ****/
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /****                                                                 ****/
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICEDESCREC7(
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_services,
798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_SERVICEDESCREC6(
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_services,
809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_CALLBACK_DEF( FT_Module_Interface )
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cff_get_interface( FT_Module    driver,       /* CFF_Driver */
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     const char*  module_interface )
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Library           library;
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Module            sfnt;
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Module_Interface  result;
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    /* CFF_SERVICES_GET dereferences `library' in PIC mode */
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_PIC
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !driver )
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    library = driver->library;
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !library )
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface );
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( result != NULL )
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return result;
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* `driver' is not yet evaluated in non-PIC mode */
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CONFIG_OPTION_PIC
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !driver )
844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    library = driver->library;
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( !library )
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return NULL;
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* we pass our request to the `sfnt' module */
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sfnt = FT_Get_Module( library, "sfnt" );
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* The FT_DriverInterface structure is defined in ftdriver.h. */
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CFF_SIZE_SELECT cff_size_select
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CFF_SIZE_SELECT 0
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_DEFINE_DRIVER(
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_driver_class,
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_MODULE_FONT_DRIVER       |
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_MODULE_DRIVER_SCALABLE   |
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_MODULE_DRIVER_HAS_HINTER,
871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      sizeof ( CFF_DriverRec ),
873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      "cff",
874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      0x10000L,
875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      0x20000L,
876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      0,   /* module-specific interface */
878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      cff_driver_init,
880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      cff_driver_done,
881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      cff_get_interface,
882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* now the specific driver fields */
884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( TT_FaceRec ),
885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( CFF_SizeRec ),
886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    sizeof ( CFF_GlyphSlotRec ),
887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_face_init,
889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_face_done,
890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_size_init,
891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_size_done,
892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_slot_init,
893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_slot_done,
894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_glyph_load,
896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_get_kerning,
898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    0,                       /* FT_Face_AttachFunc */
899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_get_advances,
900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    cff_size_request,
902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFF_SIZE_SELECT
904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  )
905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
908