1295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/***************************************************************************/ 2295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* */ 3295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* sfntpic.c */ 4295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* */ 5295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* The FreeType position independent code services for sfnt module. */ 6295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* */ 7aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich/* Copyright 2009, 2010 by */ 8295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* Oran Agra and Mickey Gabel. */ 9295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* */ 10295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* This file is part of the FreeType project, and may only be used, */ 11295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* modified, and distributed under the terms of the FreeType project */ 12295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* this file you indicate that you have read the license and */ 14295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* understand and accept it fully. */ 15295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* */ 16295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/***************************************************************************/ 17295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 18295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 19295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include <ft2build.h> 20295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_FREETYPE_H 21295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_INTERNAL_OBJECTS_H 22295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include "sfntpic.h" 2341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#include "sferrors.h" 24295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 25295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef FT_CONFIG_OPTION_PIC 26295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 27295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* forward declaration of PIC init functions from sfdriver.c */ 2841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Error 2941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Create_Class_sfnt_services( FT_Library library, 3041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_ServiceDescRec** ouput_class ); 3141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 3241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier void 3341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Destroy_Class_sfnt_services( FT_Library library, 3441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_ServiceDescRec* clazz ); 3541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 3641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier void 3741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec* clazz ); 3841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 3941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier void 4041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_interface( FT_Library library, 4141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier SFNT_Interface* clazz ); 4241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 4341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier void 4441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_service_glyph_dict( 4541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Library library, 4641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Service_GlyphDictRec* clazz ); 4741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 4841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier void 4941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_service_ps_name( 5041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Library library, 5141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Service_PsFontNameRec* clazz ); 5241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 5341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier void 5441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_tt_service_get_cmap_info( 5541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Library library, 5641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Service_TTCMapsRec* clazz ); 5741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 5841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier void 5941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_service_sfnt_table( 6041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Service_SFNT_TableRec* clazz ); 61295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 62295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* forward declaration of PIC init functions from ttcmap.c */ 6341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Error 6441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Create_Class_tt_cmap_classes( FT_Library library, 6541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier TT_CMap_Class** output_class ); 6641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 6741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier void 6841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Destroy_Class_tt_cmap_classes( FT_Library library, 6941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier TT_CMap_Class* clazz ); 70295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 71295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner void 7241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier sfnt_module_class_pic_free( FT_Library library ) 73295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 7441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_PIC_Container* pic_container = &library->pic_container; 7541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Memory memory = library->memory; 7641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 7741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 78295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( pic_container->sfnt ) 79295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 8041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; 8141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 8241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 8341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( container->sfnt_services ) 8441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Destroy_Class_sfnt_services( library, 8541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier container->sfnt_services ); 86295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner container->sfnt_services = NULL; 8741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( container->tt_cmap_classes ) 8841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Destroy_Class_tt_cmap_classes( library, 8941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier container->tt_cmap_classes ); 90295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner container->tt_cmap_classes = NULL; 91295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_FREE( container ); 92295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner pic_container->sfnt = NULL; 93295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 94295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 95295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 96295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 97295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Error 98295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner sfnt_module_class_pic_init( FT_Library library ) 99295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 100aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_PIC_Container* pic_container = &library->pic_container; 101aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Error error = SFNT_Err_Ok; 102aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich sfntModulePIC* container; 103aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_Memory memory = library->memory; 104aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 105295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 106295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* allocate pointer, clear and set global container pointer */ 107295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( FT_ALLOC ( container, sizeof ( *container ) ) ) 108295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return error; 109aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_MEM_SET( container, 0, sizeof ( *container ) ); 110295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner pic_container->sfnt = container; 111295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 112295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* initialize pointer table - this is how the module usually expects this data */ 11341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier error = FT_Create_Class_sfnt_services( library, 11441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier &container->sfnt_services ); 11541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( error ) 116295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner goto Exit; 11741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier error = FT_Create_Class_tt_cmap_classes( library, 11841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier &container->tt_cmap_classes ); 11941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( error ) 120295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner goto Exit; 12141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 12241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_service_glyph_dict( 12341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier library, &container->sfnt_service_glyph_dict ); 12441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_service_ps_name( 12541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier library, &container->sfnt_service_ps_name ); 12641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_tt_service_get_cmap_info( 12741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier library, &container->tt_service_get_cmap_info ); 12841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_service_sfnt_table( 12941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier &container->sfnt_service_sfnt_table ); 130295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#ifdef TT_CONFIG_OPTION_BDF 13141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf ); 132295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif 13341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Init_Class_sfnt_interface( library, &container->sfnt_interface ); 134295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' TurnerExit: 13641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( error ) 13741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier sfnt_module_class_pic_free( library ); 138295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return error; 139295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 140295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 141295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 142295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 143295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#endif /* FT_CONFIG_OPTION_PIC */ 144295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 145295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 146295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner/* END */ 147