Coverage Report

Created: 2021-08-22 09:07

/src/skia/third_party/externals/freetype/src/truetype/ttdriver.c
Line
Count
Source (jump to first uncovered line)
1
/****************************************************************************
2
 *
3
 * ttdriver.c
4
 *
5
 *   TrueType font driver implementation (body).
6
 *
7
 * Copyright (C) 1996-2021 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
19
#include <freetype/internal/ftdebug.h>
20
#include <freetype/internal/ftstream.h>
21
#include <freetype/internal/sfnt.h>
22
#include <freetype/internal/services/svfntfmt.h>
23
24
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
25
#include <freetype/ftmm.h>
26
#include <freetype/internal/services/svmm.h>
27
#include <freetype/internal/services/svmetric.h>
28
#endif
29
30
#include <freetype/internal/services/svtteng.h>
31
#include <freetype/internal/services/svttglyf.h>
32
#include <freetype/internal/services/svprop.h>
33
#include <freetype/ftdriver.h>
34
35
#include "ttdriver.h"
36
#include "ttgload.h"
37
#include "ttpload.h"
38
39
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
40
#include "ttgxvar.h"
41
#endif
42
43
#include "tterrors.h"
44
45
46
  /**************************************************************************
47
   *
48
   * The macro FT_COMPONENT is used in trace mode.  It is an implicit
49
   * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log
50
   * messages during execution.
51
   */
52
#undef  FT_COMPONENT
53
#define FT_COMPONENT  ttdriver
54
55
56
  /*
57
   * PROPERTY SERVICE
58
   *
59
   */
60
  static FT_Error
61
  tt_property_set( FT_Module    module,         /* TT_Driver */
62
                   const char*  property_name,
63
                   const void*  value,
64
                   FT_Bool      value_is_string )
65
  {
66
    FT_Error   error  = FT_Err_Ok;
67
    TT_Driver  driver = (TT_Driver)module;
68
69
#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
70
    FT_UNUSED( value_is_string );
71
#endif
72
73
74
    if ( !ft_strcmp( property_name, "interpreter-version" ) )
75
    {
76
      FT_UInt  interpreter_version;
77
78
79
#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
80
      if ( value_is_string )
81
      {
82
        const char*  s = (const char*)value;
83
84
85
        interpreter_version = (FT_UInt)ft_strtol( s, NULL, 10 );
86
      }
87
      else
88
#endif
89
      {
90
        FT_UInt*  iv = (FT_UInt*)value;
91
92
93
        interpreter_version = *iv;
94
      }
95
96
      if ( interpreter_version == TT_INTERPRETER_VERSION_35
97
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
98
           || interpreter_version == TT_INTERPRETER_VERSION_38
99
#endif
100
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
101
           || interpreter_version == TT_INTERPRETER_VERSION_40
102
#endif
103
         )
104
        driver->interpreter_version = interpreter_version;
105
      else
106
        error = FT_ERR( Unimplemented_Feature );
107
108
      return error;
109
    }
110
111
    FT_TRACE2(( "tt_property_set: missing property `%s'\n",
112
                property_name ));
113
    return FT_THROW( Missing_Property );
114
  }
115
116
117
  static FT_Error
118
  tt_property_get( FT_Module    module,         /* TT_Driver */
119
                   const char*  property_name,
120
                   const void*  value )
121
0
  {
122
0
    FT_Error   error  = FT_Err_Ok;
123
0
    TT_Driver  driver = (TT_Driver)module;
124
125
0
    FT_UInt  interpreter_version = driver->interpreter_version;
126
127
128
0
    if ( !ft_strcmp( property_name, "interpreter-version" ) )
129
0
    {
130
0
      FT_UInt*  val = (FT_UInt*)value;
131
132
133
0
      *val = interpreter_version;
134
135
0
      return error;
136
0
    }
137
138
0
    FT_TRACE2(( "tt_property_get: missing property `%s'\n",
139
0
                property_name ));
140
0
    return FT_THROW( Missing_Property );
141
0
  }
142
143
144
  FT_DEFINE_SERVICE_PROPERTIESREC(
145
    tt_service_properties,
146
147
    (FT_Properties_SetFunc)tt_property_set,     /* set_property */
148
    (FT_Properties_GetFunc)tt_property_get      /* get_property */
149
  )
150
151
152
  /*************************************************************************/
153
  /*************************************************************************/
154
  /*************************************************************************/
155
  /****                                                                 ****/
156
  /****                                                                 ****/
157
  /****                          F A C E S                              ****/
158
  /****                                                                 ****/
159
  /****                                                                 ****/
160
  /*************************************************************************/
161
  /*************************************************************************/
162
  /*************************************************************************/
163
164
165
  /**************************************************************************
166
   *
167
   * @Function:
168
   *   tt_get_kerning
169
   *
170
   * @Description:
171
   *   A driver method used to return the kerning vector between two
172
   *   glyphs of the same face.
173
   *
174
   * @Input:
175
   *   face ::
176
   *     A handle to the source face object.
177
   *
178
   *   left_glyph ::
179
   *     The index of the left glyph in the kern pair.
180
   *
181
   *   right_glyph ::
182
   *     The index of the right glyph in the kern pair.
183
   *
184
   * @Output:
185
   *   kerning ::
186
   *     The kerning vector.  This is in font units for
187
   *     scalable formats, and in pixels for fixed-sizes
188
   *     formats.
189
   *
190
   * @Return:
191
   *   FreeType error code.  0 means success.
192
   *
193
   * @Note:
194
   *   Only horizontal layouts (left-to-right & right-to-left) are
195
   *   supported by this function.  Other layouts, or more sophisticated
196
   *   kernings, are out of scope of this method (the basic driver
197
   *   interface is meant to be simple).
198
   *
199
   *   They can be implemented by format-specific interfaces.
200
   */
201
  static FT_Error
202
  tt_get_kerning( FT_Face     ttface,          /* TT_Face */
203
                  FT_UInt     left_glyph,
204
                  FT_UInt     right_glyph,
205
                  FT_Vector*  kerning )
206
0
  {
207
0
    TT_Face       face = (TT_Face)ttface;
208
0
    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
209
210
211
0
    kerning->x = 0;
212
0
    kerning->y = 0;
213
214
0
    if ( sfnt )
215
0
      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
216
217
0
    return 0;
218
0
  }
219
220
221
  static FT_Error
222
  tt_get_advances( FT_Face    ttface,
223
                   FT_UInt    start,
224
                   FT_UInt    count,
225
                   FT_Int32   flags,
226
                   FT_Fixed  *advances )
227
0
  {
228
0
    FT_UInt  nn;
229
0
    TT_Face  face = (TT_Face)ttface;
230
231
232
    /* XXX: TODO: check for sbits */
233
234
0
    if ( flags & FT_LOAD_VERTICAL_LAYOUT )
235
0
    {
236
0
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
237
      /* no fast retrieval for blended MM fonts without VVAR table */
238
0
      if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
239
0
           !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE )        )
240
0
        return FT_THROW( Unimplemented_Feature );
241
0
#endif
242
243
0
      for ( nn = 0; nn < count; nn++ )
244
0
      {
245
0
        FT_Short   tsb;
246
0
        FT_UShort  ah;
247
248
249
        /* since we don't need `tsb', we use zero for `yMax' parameter */
250
0
        TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah );
251
0
        advances[nn] = ah;
252
0
      }
253
0
    }
254
0
    else
255
0
    {
256
0
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
257
      /* no fast retrieval for blended MM fonts without HVAR table */
258
0
      if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
259
0
           !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE )        )
260
0
        return FT_THROW( Unimplemented_Feature );
261
0
#endif
262
263
0
      for ( nn = 0; nn < count; nn++ )
264
0
      {
265
0
        FT_Short   lsb;
266
0
        FT_UShort  aw;
267
268
269
0
        TT_Get_HMetrics( face, start + nn, &lsb, &aw );
270
0
        advances[nn] = aw;
271
0
      }
272
0
    }
273
274
0
    return FT_Err_Ok;
275
0
  }
276
277
278
  /*************************************************************************/
279
  /*************************************************************************/
280
  /*************************************************************************/
281
  /****                                                                 ****/
282
  /****                                                                 ****/
283
  /****                           S I Z E S                             ****/
284
  /****                                                                 ****/
285
  /****                                                                 ****/
286
  /*************************************************************************/
287
  /*************************************************************************/
288
  /*************************************************************************/
289
290
291
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
292
293
  static FT_Error
294
  tt_size_select( FT_Size   size,
295
                  FT_ULong  strike_index )
296
0
  {
297
0
    TT_Face   ttface = (TT_Face)size->face;
298
0
    TT_Size   ttsize = (TT_Size)size;
299
0
    FT_Error  error  = FT_Err_Ok;
300
301
302
0
    ttsize->strike_index = strike_index;
303
304
0
    if ( FT_IS_SCALABLE( size->face ) )
305
0
    {
306
      /* use the scaled metrics, even when tt_size_reset fails */
307
0
      FT_Select_Metrics( size->face, strike_index );
308
309
0
      tt_size_reset( ttsize, 0 ); /* ignore return value */
310
0
    }
311
0
    else
312
0
    {
313
0
      SFNT_Service      sfnt         = (SFNT_Service)ttface->sfnt;
314
0
      FT_Size_Metrics*  size_metrics = &size->metrics;
315
316
317
0
      error = sfnt->load_strike_metrics( ttface,
318
0
                                         strike_index,
319
0
                                         size_metrics );
320
0
      if ( error )
321
0
        ttsize->strike_index = 0xFFFFFFFFUL;
322
0
    }
323
324
0
    return error;
325
0
  }
326
327
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
328
329
330
  static FT_Error
331
  tt_size_request( FT_Size          size,
332
                   FT_Size_Request  req )
333
0
  {
334
0
    TT_Size   ttsize = (TT_Size)size;
335
0
    FT_Error  error  = FT_Err_Ok;
336
337
338
0
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
339
340
0
    if ( FT_HAS_FIXED_SIZES( size->face ) )
341
0
    {
342
0
      TT_Face       ttface = (TT_Face)size->face;
343
0
      SFNT_Service  sfnt   = (SFNT_Service)ttface->sfnt;
344
0
      FT_ULong      strike_index;
345
346
347
0
      error = sfnt->set_sbit_strike( ttface, req, &strike_index );
348
349
0
      if ( error )
350
0
        ttsize->strike_index = 0xFFFFFFFFUL;
351
0
      else
352
0
        return tt_size_select( size, strike_index );
353
0
    }
354
355
0
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
356
357
0
    FT_Request_Metrics( size->face, req );
358
359
0
    if ( FT_IS_SCALABLE( size->face ) )
360
0
    {
361
0
      error = tt_size_reset( ttsize, 0 );
362
363
0
#ifdef TT_USE_BYTECODE_INTERPRETER
364
      /* for the `MPS' bytecode instruction we need the point size */
365
0
      if ( !error )
366
0
      {
367
0
        FT_UInt  resolution =
368
0
                   ttsize->metrics->x_ppem > ttsize->metrics->y_ppem
369
0
                     ? req->horiResolution
370
0
                     : req->vertResolution;
371
372
373
        /* if we don't have a resolution value, assume 72dpi */
374
0
        if ( req->type == FT_SIZE_REQUEST_TYPE_SCALES ||
375
0
             !resolution                              )
376
0
          resolution = 72;
377
378
0
        ttsize->point_size = FT_MulDiv( ttsize->ttmetrics.ppem,
379
0
                                        64 * 72,
380
0
                                        resolution );
381
0
      }
382
0
#endif
383
0
    }
384
385
0
    return error;
386
0
  }
387
388
389
  /**************************************************************************
390
   *
391
   * @Function:
392
   *   tt_glyph_load
393
   *
394
   * @Description:
395
   *   A driver method used to load a glyph within a given glyph slot.
396
   *
397
   * @Input:
398
   *   slot ::
399
   *     A handle to the target slot object where the glyph
400
   *     will be loaded.
401
   *
402
   *   size ::
403
   *     A handle to the source face size at which the glyph
404
   *     must be scaled, loaded, etc.
405
   *
406
   *   glyph_index ::
407
   *     The index of the glyph in the font file.
408
   *
409
   *   load_flags ::
410
   *     A flag indicating what to load for this glyph.  The
411
   *     FT_LOAD_XXX constants can be used to control the
412
   *     glyph loading process (e.g., whether the outline
413
   *     should be scaled, whether to load bitmaps or not,
414
   *     whether to hint the outline, etc).
415
   *
416
   * @Return:
417
   *   FreeType error code.  0 means success.
418
   */
419
  static FT_Error
420
  tt_glyph_load( FT_GlyphSlot  ttslot,      /* TT_GlyphSlot */
421
                 FT_Size       ttsize,      /* TT_Size      */
422
                 FT_UInt       glyph_index,
423
                 FT_Int32      load_flags )
424
0
  {
425
0
    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;
426
0
    TT_Size       size = (TT_Size)ttsize;
427
0
    FT_Face       face = ttslot->face;
428
0
    FT_Error      error;
429
430
431
0
    if ( !slot )
432
0
      return FT_THROW( Invalid_Slot_Handle );
433
434
0
    if ( !size )
435
0
      return FT_THROW( Invalid_Size_Handle );
436
437
0
    if ( !face )
438
0
      return FT_THROW( Invalid_Face_Handle );
439
440
0
#ifdef FT_CONFIG_OPTION_INCREMENTAL
441
0
    if ( glyph_index >= (FT_UInt)face->num_glyphs &&
442
0
         !face->internal->incremental_interface   )
443
#else
444
    if ( glyph_index >= (FT_UInt)face->num_glyphs )
445
#endif
446
0
      return FT_THROW( Invalid_Argument );
447
448
0
    if ( load_flags & FT_LOAD_NO_HINTING )
449
0
    {
450
      /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT   */
451
      /* are necessary to disable hinting for tricky fonts */
452
453
0
      if ( FT_IS_TRICKY( face ) )
454
0
        load_flags &= ~FT_LOAD_NO_HINTING;
455
456
0
      if ( load_flags & FT_LOAD_NO_AUTOHINT )
457
0
        load_flags |= FT_LOAD_NO_HINTING;
458
0
    }
459
460
0
    if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
461
0
    {
462
0
      load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
463
464
0
      if ( !FT_IS_TRICKY( face ) )
465
0
        load_flags |= FT_LOAD_NO_HINTING;
466
0
    }
467
468
    /* use hinted metrics only if we load a glyph with hinting */
469
0
    size->metrics = ( load_flags & FT_LOAD_NO_HINTING )
470
0
                      ? &ttsize->metrics
471
0
                      : &size->hinted_metrics;
472
473
    /* now fill in the glyph slot with outline/bitmap/layered */
474
0
    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
475
476
    /* force drop-out mode to 2 - irrelevant now */
477
    /* slot->outline.dropout_mode = 2; */
478
479
0
    return error;
480
0
  }
481
482
483
  /*************************************************************************/
484
  /*************************************************************************/
485
  /*************************************************************************/
486
  /****                                                                 ****/
487
  /****                                                                 ****/
488
  /****                D R I V E R  I N T E R F A C E                   ****/
489
  /****                                                                 ****/
490
  /****                                                                 ****/
491
  /*************************************************************************/
492
  /*************************************************************************/
493
  /*************************************************************************/
494
495
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
496
497
  FT_DEFINE_SERVICE_MULTIMASTERSREC(
498
    tt_service_gx_multi_masters,
499
500
    (FT_Get_MM_Func)             NULL,                  /* get_mm              */
501
    (FT_Set_MM_Design_Func)      NULL,                  /* set_mm_design       */
502
    (FT_Set_MM_Blend_Func)       TT_Set_MM_Blend,       /* set_mm_blend        */
503
    (FT_Get_MM_Blend_Func)       TT_Get_MM_Blend,       /* get_mm_blend        */
504
    (FT_Get_MM_Var_Func)         TT_Get_MM_Var,         /* get_mm_var          */
505
    (FT_Set_Var_Design_Func)     TT_Set_Var_Design,     /* set_var_design      */
506
    (FT_Get_Var_Design_Func)     TT_Get_Var_Design,     /* get_var_design      */
507
    (FT_Set_Instance_Func)       TT_Set_Named_Instance, /* set_instance        */
508
    (FT_Set_MM_WeightVector_Func)NULL,                  /* set_mm_weightvector */
509
    (FT_Get_MM_WeightVector_Func)NULL,                  /* get_mm_weightvector */
510
511
    (FT_Get_Var_Blend_Func)      tt_get_var_blend,      /* get_var_blend       */
512
    (FT_Done_Blend_Func)         tt_done_blend          /* done_blend          */
513
  )
514
515
  FT_DEFINE_SERVICE_METRICSVARIATIONSREC(
516
    tt_service_metrics_variations,
517
518
    (FT_HAdvance_Adjust_Func)tt_hadvance_adjust,     /* hadvance_adjust */
519
    (FT_LSB_Adjust_Func)     NULL,                   /* lsb_adjust      */
520
    (FT_RSB_Adjust_Func)     NULL,                   /* rsb_adjust      */
521
522
    (FT_VAdvance_Adjust_Func)tt_vadvance_adjust,     /* vadvance_adjust */
523
    (FT_TSB_Adjust_Func)     NULL,                   /* tsb_adjust      */
524
    (FT_BSB_Adjust_Func)     NULL,                   /* bsb_adjust      */
525
    (FT_VOrg_Adjust_Func)    NULL,                   /* vorg_adjust     */
526
527
    (FT_Metrics_Adjust_Func) tt_apply_mvar           /* metrics_adjust  */
528
  )
529
530
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
531
532
533
  static const FT_Service_TrueTypeEngineRec  tt_service_truetype_engine =
534
  {
535
#ifdef TT_USE_BYTECODE_INTERPRETER
536
537
    FT_TRUETYPE_ENGINE_TYPE_PATENTED
538
539
#else /* !TT_USE_BYTECODE_INTERPRETER */
540
541
    FT_TRUETYPE_ENGINE_TYPE_NONE
542
543
#endif /* TT_USE_BYTECODE_INTERPRETER */
544
  };
545
546
547
  FT_DEFINE_SERVICE_TTGLYFREC(
548
    tt_service_truetype_glyf,
549
550
    (TT_Glyf_GetLocationFunc)tt_face_get_location      /* get_location */
551
  )
552
553
554
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
555
  FT_DEFINE_SERVICEDESCREC6(
556
    tt_services,
557
558
    FT_SERVICE_ID_FONT_FORMAT,        FT_FONT_FORMAT_TRUETYPE,
559
    FT_SERVICE_ID_MULTI_MASTERS,      &tt_service_gx_multi_masters,
560
    FT_SERVICE_ID_METRICS_VARIATIONS, &tt_service_metrics_variations,
561
    FT_SERVICE_ID_TRUETYPE_ENGINE,    &tt_service_truetype_engine,
562
    FT_SERVICE_ID_TT_GLYF,            &tt_service_truetype_glyf,
563
    FT_SERVICE_ID_PROPERTIES,         &tt_service_properties )
564
#else
565
  FT_DEFINE_SERVICEDESCREC4(
566
    tt_services,
567
568
    FT_SERVICE_ID_FONT_FORMAT,     FT_FONT_FORMAT_TRUETYPE,
569
    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
570
    FT_SERVICE_ID_TT_GLYF,         &tt_service_truetype_glyf,
571
    FT_SERVICE_ID_PROPERTIES,      &tt_service_properties )
572
#endif
573
574
575
  FT_CALLBACK_DEF( FT_Module_Interface )
576
  tt_get_interface( FT_Module    driver,    /* TT_Driver */
577
                    const char*  tt_interface )
578
49.9k
  {
579
49.9k
    FT_Library           library;
580
49.9k
    FT_Module_Interface  result;
581
49.9k
    FT_Module            sfntd;
582
49.9k
    SFNT_Service         sfnt;
583
584
585
49.9k
    result = ft_service_list_lookup( tt_services, tt_interface );
586
49.9k
    if ( result )
587
25.0k
      return result;
588
589
24.9k
    if ( !driver )
590
0
      return NULL;
591
24.9k
    library = driver->library;
592
24.9k
    if ( !library )
593
0
      return NULL;
594
595
    /* only return the default interface from the SFNT module */
596
24.9k
    sfntd = FT_Get_Module( library, "sfnt" );
597
24.9k
    if ( sfntd )
598
24.9k
    {
599
24.9k
      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
600
24.9k
      if ( sfnt )
601
24.9k
        return sfnt->get_interface( driver, tt_interface );
602
0
    }
603
604
0
    return 0;
605
0
  }
606
607
608
  /* The FT_DriverInterface structure is defined in ftdriver.h. */
609
610
#ifdef TT_USE_BYTECODE_INTERPRETER
611
#define TT_HINTER_FLAG  FT_MODULE_DRIVER_HAS_HINTER
612
#else
613
#define TT_HINTER_FLAG  0
614
#endif
615
616
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
617
#define TT_SIZE_SELECT  tt_size_select
618
#else
619
#define TT_SIZE_SELECT  0
620
#endif
621
622
  FT_DEFINE_DRIVER(
623
    tt_driver_class,
624
625
      FT_MODULE_FONT_DRIVER     |
626
      FT_MODULE_DRIVER_SCALABLE |
627
      TT_HINTER_FLAG,
628
629
      sizeof ( TT_DriverRec ),
630
631
      "truetype",      /* driver name                           */
632
      0x10000L,        /* driver version == 1.0                 */
633
      0x20000L,        /* driver requires FreeType 2.0 or above */
634
635
      NULL,    /* module-specific interface */
636
637
      tt_driver_init,           /* FT_Module_Constructor  module_init   */
638
      tt_driver_done,           /* FT_Module_Destructor   module_done   */
639
      tt_get_interface,         /* FT_Module_Requester    get_interface */
640
641
    sizeof ( TT_FaceRec ),
642
    sizeof ( TT_SizeRec ),
643
    sizeof ( FT_GlyphSlotRec ),
644
645
    tt_face_init,               /* FT_Face_InitFunc  init_face */
646
    tt_face_done,               /* FT_Face_DoneFunc  done_face */
647
    tt_size_init,               /* FT_Size_InitFunc  init_size */
648
    tt_size_done,               /* FT_Size_DoneFunc  done_size */
649
    tt_slot_init,               /* FT_Slot_InitFunc  init_slot */
650
    NULL,                       /* FT_Slot_DoneFunc  done_slot */
651
652
    tt_glyph_load,              /* FT_Slot_LoadFunc  load_glyph */
653
654
    tt_get_kerning,             /* FT_Face_GetKerningFunc   get_kerning  */
655
    NULL,                       /* FT_Face_AttachFunc       attach_file  */
656
    tt_get_advances,            /* FT_Face_GetAdvancesFunc  get_advances */
657
658
    tt_size_request,            /* FT_Size_RequestFunc  request_size */
659
    TT_SIZE_SELECT              /* FT_Size_SelectFunc   select_size  */
660
  )
661
662
663
/* END */