afpic.c 5.0 KB
Newer Older
M
Ming, Bai 已提交
1 2 3 4 5 6
/***************************************************************************/
/*                                                                         */
/*  afpic.c                                                                */
/*                                                                         */
/*    The FreeType position independent code services for autofit module.  */
/*                                                                         */
G
Grissiom 已提交
7
/*  Copyright 2009-2014 by                                                 */
M
Ming, Bai 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*  Oran Agra and Mickey Gabel.                                            */
/*                                                                         */
/*  This file is part of the FreeType project, and may only be used,       */
/*  modified, and distributed under the terms of the FreeType project      */
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
/*  this file you indicate that you have read the license and              */
/*  understand and accept it fully.                                        */
/*                                                                         */
/***************************************************************************/


#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_INTERNAL_OBJECTS_H
#include "afpic.h"
G
Grissiom 已提交
23 24 25
#include "afglobal.h"
#include "aferrors.h"

M
Ming, Bai 已提交
26 27 28 29

#ifdef FT_CONFIG_OPTION_PIC

  /* forward declaration of PIC init functions from afmodule.c */
G
Grissiom 已提交
30 31 32
  FT_Error
  FT_Create_Class_af_services( FT_Library           library,
                               FT_ServiceDescRec**  output_class );
M
Ming, Bai 已提交
33

G
Grissiom 已提交
34 35 36
  void
  FT_Destroy_Class_af_services( FT_Library          library,
                                FT_ServiceDescRec*  clazz );
M
Ming, Bai 已提交
37 38

  void
G
Grissiom 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
  FT_Init_Class_af_service_properties( FT_Service_PropertiesRec*  clazz );

  void FT_Init_Class_af_autofitter_interface(
    FT_Library                   library,
    FT_AutoHinter_InterfaceRec*  clazz );


  /* forward declaration of PIC init functions from writing system classes */
#undef  WRITING_SYSTEM
#define WRITING_SYSTEM( ws, WS )  /* empty */

#include "afwrtsys.h"


  void
  autofit_module_class_pic_free( FT_Library  library )
M
Ming, Bai 已提交
55
  {
G
Grissiom 已提交
56 57 58 59
    FT_PIC_Container*  pic_container = &library->pic_container;
    FT_Memory          memory        = library->memory;


M
Ming, Bai 已提交
60 61
    if ( pic_container->autofit )
    {
G
Grissiom 已提交
62 63 64 65 66 67 68 69 70
      AFModulePIC*  container = (AFModulePIC*)pic_container->autofit;


      if ( container->af_services )
        FT_Destroy_Class_af_services( library,
                                      container->af_services );
      container->af_services = NULL;

      FT_FREE( container );
M
Ming, Bai 已提交
71 72 73 74
      pic_container->autofit = NULL;
    }
  }

G
Grissiom 已提交
75

M
Ming, Bai 已提交
76
  FT_Error
G
Grissiom 已提交
77
  autofit_module_class_pic_init( FT_Library  library )
M
Ming, Bai 已提交
78
  {
G
Grissiom 已提交
79 80 81 82 83 84
    FT_PIC_Container*  pic_container = &library->pic_container;
    FT_UInt            ss;
    FT_Error           error         = FT_Err_Ok;
    AFModulePIC*       container     = NULL;
    FT_Memory          memory        = library->memory;

M
Ming, Bai 已提交
85 86 87 88

    /* allocate pointer, clear and set global container pointer */
    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
      return error;
G
Grissiom 已提交
89
    FT_MEM_SET( container, 0, sizeof ( *container ) );
M
Ming, Bai 已提交
90 91
    pic_container->autofit = container;

G
Grissiom 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
    /* initialize pointer table -                       */
    /* this is how the module usually expects this data */
    error = FT_Create_Class_af_services( library,
                                         &container->af_services );
    if ( error )
      goto Exit;

    FT_Init_Class_af_service_properties( &container->af_service_properties );

    for ( ss = 0; ss < AF_WRITING_SYSTEM_MAX; ss++ )
      container->af_writing_system_classes[ss] =
        &container->af_writing_system_classes_rec[ss];
    container->af_writing_system_classes[AF_WRITING_SYSTEM_MAX] = NULL;

    for ( ss = 0; ss < AF_SCRIPT_MAX; ss++ )
      container->af_script_classes[ss] =
        &container->af_script_classes_rec[ss];
    container->af_script_classes[AF_SCRIPT_MAX] = NULL;

    for ( ss = 0; ss < AF_STYLE_MAX; ss++ )
      container->af_style_classes[ss] =
        &container->af_style_classes_rec[ss];
    container->af_style_classes[AF_STYLE_MAX] = NULL;

#undef  WRITING_SYSTEM
#define WRITING_SYSTEM( ws, WS )                             \
        FT_Init_Class_af_ ## ws ## _writing_system_class(    \
          &container->af_writing_system_classes_rec[ss++] );

M
Ming, Bai 已提交
121
    ss = 0;
G
Grissiom 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
#include "afwrtsys.h"

#undef  SCRIPT
#define SCRIPT( s, S, d, h, sc1, sc2, sc3 )          \
        FT_Init_Class_af_ ## s ## _script_class(     \
          &container->af_script_classes_rec[ss++] );

    ss = 0;
#include "afscript.h"

#undef  STYLE
#define STYLE( s, S, d, ws, sc, bss, c )            \
        FT_Init_Class_af_ ## s ## _style_class(     \
          &container->af_style_classes_rec[ss++] );

    ss = 0;
#include "afstyles.h"

    FT_Init_Class_af_autofitter_interface(
      library, &container->af_autofitter_interface );

  Exit:
    if ( error )
      autofit_module_class_pic_free( library );
M
Ming, Bai 已提交
146 147 148 149 150 151 152
    return error;
  }

#endif /* FT_CONFIG_OPTION_PIC */


/* END */