Compare commits

...

9 Commits

Author SHA1 Message Date
Werner Lemberg d82ba7dd86 Restore inadvertently deleted ftoption.h. 2009-04-28 10:19:32 +02:00
David Turner 675a903548 introduce service and service list template files, modify cff driver to use them 2009-04-13 03:13:29 +02:00
David Turner f9ed3bd40c simplify the 'cff_field_handlers' initialization in the PIC table 2009-04-13 01:28:02 +02:00
David Turner 51ad1c7089 convert cff module to FT_PicData 2009-04-13 01:00:39 +02:00
David Turner 5982d4debc formatting and fixing typos 2009-04-13 00:36:45 +02:00
David Turner 329d42d9eb convert autofit module to FT_PicData 2009-04-13 00:33:12 +02:00
David Turner 929ff6996c Introduce FT_PicDataRec in include/freetype/internal/ftpic.h
Modify a few users to use it.
2009-04-13 00:20:03 +02:00
David Turner 5bac49d830 More formatting/cleanup, avoid using FT_Something_Xxxx for internal functions 2009-04-07 00:47:27 +02:00
David Turner a0bbc06404 Formatting + small cleanup of recent PIC changes.
Replace FT_PIC_Container => FT_PicTableRec, introduce FT_PicTable as pointer to FT_PicTableRec, etc...
2009-04-07 00:30:45 +02:00
53 changed files with 1003 additions and 557 deletions

View File

@ -1,3 +1,34 @@
2009-04-07 David Turner <david@freetype.org>
Formatting + small cleanup of PIC changes
* include/freetype/config/ftoption.h
* include/freetype/internal/ftobjs.h
* include/freetype/internal/ftpic.h
* src/autofit/afpic.c
* src/autofit/afpic.h
* src/base/basepic.c
* src/base/basepic.h
* src/base/ftinit.c
* src/base/ftobjs.c
* src/base/ftpic.c
* src/cff/cffpic.c
* src/cff/cffpic.h
* src/pshinter/pshpic.c
* src/pshinter/pshpic.h
* src/psnames/pspic.c
* src/psnames/pspic.h
* src/raster/rastpic.c
* src/raster/rastpic.h
* src/sfnt/sfntpic.c
* src/sfnt/sfntpic.h
* src/smooth/ftspic.c
* src/smooth/ftspic.h
* src/truetype/ttpic.c
* src/truetype/ttpic.h
2009-04-05 Oran Agra <oran@monfort.co.il> 2009-04-05 Oran Agra <oran@monfort.co.il>
Add #error to modules and files that do not support PIC yet. Add #error to modules and files that do not support PIC yet.

View File

@ -211,7 +211,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \ #define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \
done_global_hints_, load_glyph_) \ done_global_hints_, load_glyph_) \
void \ void \
FT_Init_Class_##class_( FT_Library library, \ ft_pic_init_##class_( FT_Library library, \
FT_AutoHinter_ServiceRec* clazz) \ FT_AutoHinter_ServiceRec* clazz) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \

View File

@ -352,7 +352,7 @@ FT_BEGIN_HEADER
FT_Error class_##_pic_init( FT_Library library ); \ FT_Error class_##_pic_init( FT_Library library ); \
\ \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_Module_Class* clazz ) \ FT_Module_Class* clazz ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \
@ -363,7 +363,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_Module_Class** output_class ) \ FT_Module_Class** output_class ) \
{ \ { \
FT_Driver_Class clazz; \ FT_Driver_Class clazz; \

View File

@ -62,6 +62,11 @@ FT_BEGIN_HEADER
#endif #endif
#define FT_GLUE(x,y) FT_GLUE_(x,y)
#define FT_GLUE_(x,y) x##y
#define FT_GLUE3(x,y,z) FT_GLUE(FT_GLUE(x,y),z)
/*************************************************************************/ /*************************************************************************/
/* */ /* */
/* The min and max functions missing in C. As usual, be careful not to */ /* The min and max functions missing in C. As usual, be careful not to */
@ -223,13 +228,13 @@ FT_BEGIN_HEADER
#else /* FT_CONFIG_OPTION_PIC */ #else /* FT_CONFIG_OPTION_PIC */
#define FT_DECLARE_CMAP_CLASS(class_) \ #define FT_DECLARE_CMAP_CLASS(class_) \
void FT_Init_Class_##class_( FT_Library library, FT_CMap_ClassRec* clazz); void ft_pic_init_##class_( FT_Library library, FT_CMap_ClassRec* clazz);
#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_, \ #define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_, \
char_next_, char_var_index_, char_var_default_, variant_list_, \ char_next_, char_var_index_, char_var_default_, variant_list_, \
charvariant_list_, variantchar_list_) \ charvariant_list_, variantchar_list_) \
void \ void \
FT_Init_Class_##class_( FT_Library library, \ ft_pic_init_##class_( FT_Library library, \
FT_CMap_ClassRec* clazz) \ FT_CMap_ClassRec* clazz) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \
@ -805,7 +810,7 @@ FT_BEGIN_HEADER
/* */ /* */
/* debug_hooks :: XXX */ /* debug_hooks :: XXX */
/* */ /* */
/* pic_container :: Contains global structs and tables, instead */ /* pic_table :: Contains global structs and tables, instead */
/* of defining them globallly. */ /* of defining them globallly. */
/* */ /* */
@ -840,7 +845,7 @@ FT_BEGIN_HEADER
#endif #endif
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
FT_PIC_Container pic_container; FT_PicTableRec pic_table;
#endif #endif
} FT_LibraryRec; } FT_LibraryRec;
@ -996,7 +1001,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_, \ #define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_, \
raster_reset_, raster_set_mode_, raster_render_, raster_done_) \ raster_reset_, raster_set_mode_, raster_render_, raster_done_) \
void \ void \
FT_Init_Class_##class_( FT_Raster_Funcs* clazz ) \ ft_pic_init_##class_( FT_Raster_Funcs* clazz ) \
{ \ { \
clazz->glyph_format = glyph_format_; \ clazz->glyph_format = glyph_format_; \
clazz->raster_new = raster_new_; \ clazz->raster_new = raster_new_; \
@ -1050,7 +1055,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_, \ #define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_, \
transform_, bbox_, prepare_) \ transform_, bbox_, prepare_) \
void \ void \
FT_Init_Class_##class_( FT_Glyph_Class* clazz ) \ ft_pic_init_##class_( FT_Glyph_Class* clazz ) \
{ \ { \
clazz->glyph_size = size_; \ clazz->glyph_size = size_; \
clazz->glyph_format = format_; \ clazz->glyph_format = format_; \
@ -1136,7 +1141,7 @@ FT_BEGIN_HEADER
FT_Error class_##_pic_init( FT_Library library ); \ FT_Error class_##_pic_init( FT_Library library ); \
\ \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_Module_Class* clazz ) \ FT_Module_Class* clazz ) \
{ \ { \
FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \ FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \
@ -1147,7 +1152,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_Module_Class** output_class ) \ FT_Module_Class** output_class ) \
{ \ { \
FT_Renderer_Class* clazz; \ FT_Renderer_Class* clazz; \
@ -1323,10 +1328,10 @@ FT_BEGIN_HEADER
#else /* FT_CONFIG_OPTION_PIC */ #else /* FT_CONFIG_OPTION_PIC */
#define FT_DECLARE_MODULE(class_) \ #define FT_DECLARE_MODULE(class_) \
FT_Error FT_Create_Class_##class_( FT_Library library, \ FT_Error ft_library_pic_alloc_##class_( FT_Library library, \
FT_Module_Class** output_class ); \ FT_Module_Class** output_class ); \
void FT_Destroy_Class_##class_( FT_Library library, \ void ft_library_pic_free_##class_( FT_Library library, \
FT_Module_Class* clazz ); FT_Module_Class* clazz );
#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_, \ #define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_, \
interface_, init_, done_, get_interface_) \ interface_, init_, done_, get_interface_) \
@ -1348,8 +1353,8 @@ FT_BEGIN_HEADER
FT_Error class_##_pic_init( FT_Library library ); \ FT_Error class_##_pic_init( FT_Library library ); \
\ \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_Module_Class* clazz ) \ FT_Module_Class* clazz ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \
class_##_pic_free( library ); \ class_##_pic_free( library ); \
@ -1358,7 +1363,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_Module_Class** output_class ) \ FT_Module_Class** output_class ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \

View File

@ -26,34 +26,125 @@
#ifndef __FTPIC_H__ #ifndef __FTPIC_H__
#define __FTPIC_H__ #define __FTPIC_H__
FT_BEGIN_HEADER FT_BEGIN_HEADER
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
typedef struct FT_PIC_Container_ /* A FT_PicDataRec object models a heap-allocated structure
* used to hold data that, in non-PIC builds of the engine,
* would be constant and contain pointers.
*
* The FT_PicDataRec contains book-keeping information about
* the structure, whose exact fields depend on which module
* is defining/using it. The structure itself can be
* accessed as the 'data' field of a FT_PicDataRec object.
*/
typedef struct FT_PicDataRec_* FT_PicData;
/* A FT_PicTableRec object contains the FT_PicDataRec of all
* PIC structures needed by the library at runtime.
*/
typedef struct FT_PicTableRec_* FT_PicTable;
/* A special callback function call to finalize the structure
* backed by a FT_PicDataRec object. It is called by
* ft_pic_table_done_data and its first parameter is the 'data'
* field of the corresponding FT_PicDataRec. Note that the
* PIC structure itself is allocated by ft_pic_table_init_data
* and freed by ft_pic_table_done_data.
*/
typedef void (*FT_PicDataDoneFunc)( void* data, FT_PicTable pic );
/* A special initialization function called by ft_pic_table_init_data
* to initialize a freshly allocated PIC structure.
*/
typedef FT_Error (*FT_PicDataInitFunc)( void* data, FT_PicTable pic );
/* The FT_PicDataRec itself holds a pointer to heap-allocated
* PIC data, a reference count and an optional finalizer function.
*
* One should call ft_pic_table_init_data() to register a new
* heap-allocated PIC structure, which address will be placed
* into the 'data' field.
*/
typedef struct FT_PicDataRec_
{ {
/* pic containers for base */ void* data;
void* base; FT_Int ref_count;
/* pic containers for modules */ FT_PicDataDoneFunc done;
void* autofit;
void* cff;
void* pshinter;
void* psnames;
void* raster;
void* sfnt;
void* smooth;
void* truetype;
} FT_PIC_Container;
/* Initialize the various function tables, structs, etc. stored in the container. */ } FT_PicDataRec;
/* When FT_CONFIG_OPTION_PIC is defined, the FT_PicTable
* is used to hold all constant structures that normally
* contain pointers in the normal build of FreeType.
*
* Note that the table itself only contains un-typed pointers
* to base or module-specific data, which will be allocated
* on the heap when the corresponding code is initialized.
*/
typedef struct FT_PicTableRec_
{
FT_Library library;
FT_Memory memory;
/* this macro is used to define the list of FT_PicDataRec
* stored in the PIC table. Add new entries here.
*/
#define FT_PIC_ENTRY_LIST \
_FT_PICDATA( base ) \
_FT_PICDATA( autofit ) \
_FT_PICDATA( cff ) \
/* now define the entries in the PIC table itself */
#define _FT_PICDATA(name) FT_PicDataRec name [1];
FT_PIC_ENTRY_LIST
#undef _FT_PICDATA
void* pshinter;
void* psnames;
void* raster;
void* sfnt;
void* smooth;
void* truetype;
} FT_PicTableRec;
#define FT_LIBRARY_GET_PIC_DATA(library_,name_) \
library_->pic_table.name_->data
/* allocate and initialize a PIC structure in the heap.
* This should be called at module initialization time
* before the PIC data can be used.
*
* if the structure already exists, this simply increments
* its reference count.
*/
FT_BASE( FT_Error ) FT_BASE( FT_Error )
ft_pic_container_init( FT_Library library ); ft_pic_table_init_data( FT_PicTable table,
FT_PicData data,
FT_UInt data_size,
FT_PicDataInitFunc data_init,
FT_PicDataDoneFunc data_done );
/* finalize and free a given PIC structure. This really
/* Destroy the contents of the container. */ * decrements the reference count and performs destruction
* if it reaches 0.
*
* this should be called a module exit time.
*/
FT_BASE( void ) FT_BASE( void )
ft_pic_container_destroy( FT_Library library ); ft_pic_table_done_data( FT_PicTable table,
FT_PicData data );
/* Initialize the PIC table's base */
FT_BASE( FT_Error )
ft_library_pic_init( FT_Library library );
/* Destroy the contents of the PIC table. */
FT_BASE( void )
ft_library_pic_done( FT_Library library );
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */

View File

@ -250,7 +250,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ #define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_ServiceDescRec* clazz ) \ FT_ServiceDescRec* clazz ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \
@ -259,7 +259,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_ServiceDescRec** output_class) \ FT_ServiceDescRec** output_class) \
{ \ { \
FT_ServiceDescRec* clazz; \ FT_ServiceDescRec* clazz; \
@ -279,7 +279,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ #define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \
serv_id_2, serv_data_2) \ serv_id_2, serv_data_2) \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_ServiceDescRec* clazz ) \ FT_ServiceDescRec* clazz ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \
@ -288,7 +288,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_ServiceDescRec** output_class) \ FT_ServiceDescRec** output_class) \
{ \ { \
FT_ServiceDescRec* clazz; \ FT_ServiceDescRec* clazz; \
@ -310,7 +310,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ #define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \
serv_id_2, serv_data_2, serv_id_3, serv_data_3) \ serv_id_2, serv_data_2, serv_id_3, serv_data_3) \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_ServiceDescRec* clazz ) \ FT_ServiceDescRec* clazz ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \
@ -319,7 +319,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_ServiceDescRec** output_class) \ FT_ServiceDescRec** output_class) \
{ \ { \
FT_ServiceDescRec* clazz; \ FT_ServiceDescRec* clazz; \
@ -344,7 +344,7 @@ FT_BEGIN_HEADER
serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
serv_id_4, serv_data_4) \ serv_id_4, serv_data_4) \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_ServiceDescRec* clazz ) \ FT_ServiceDescRec* clazz ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \
@ -353,7 +353,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_ServiceDescRec** output_class) \ FT_ServiceDescRec** output_class) \
{ \ { \
FT_ServiceDescRec* clazz; \ FT_ServiceDescRec* clazz; \
@ -380,7 +380,7 @@ FT_BEGIN_HEADER
serv_id_2, serv_data_2, serv_id_3, serv_data_3, serv_id_4, \ serv_id_2, serv_data_2, serv_id_3, serv_data_3, serv_id_4, \
serv_data_4, serv_id_5, serv_data_5) \ serv_data_4, serv_id_5, serv_data_5) \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_ServiceDescRec* clazz ) \ FT_ServiceDescRec* clazz ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \
@ -389,7 +389,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_ServiceDescRec** output_class) \ FT_ServiceDescRec** output_class) \
{ \ { \
FT_ServiceDescRec* clazz; \ FT_ServiceDescRec* clazz; \
@ -419,7 +419,7 @@ FT_BEGIN_HEADER
serv_id_4, serv_data_4, serv_id_5, serv_data_5, \ serv_id_4, serv_data_4, serv_id_5, serv_data_5, \
serv_id_6, serv_data_6) \ serv_id_6, serv_data_6) \
void \ void \
FT_Destroy_Class_##class_( FT_Library library, \ ft_library_pic_free_##class_( FT_Library library, \
FT_ServiceDescRec* clazz ) \ FT_ServiceDescRec* clazz ) \
{ \ { \
FT_Memory memory = library->memory; \ FT_Memory memory = library->memory; \
@ -428,7 +428,7 @@ FT_BEGIN_HEADER
} \ } \
\ \
FT_Error \ FT_Error \
FT_Create_Class_##class_( FT_Library library, \ ft_library_pic_alloc_##class_( FT_Library library, \
FT_ServiceDescRec** output_class) \ FT_ServiceDescRec** output_class) \
{ \ { \
FT_ServiceDescRec* clazz; \ FT_ServiceDescRec* clazz; \

View File

@ -47,5 +47,11 @@
#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h> #define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h>
#define FT_INTERNAL_SERVICE_DECLARE_H <freetype/internal/services/declare.h>
#define FT_INTERNAL_SERVICE_DEFINE_H <freetype/internal/services/define.h>
#define FT_INTERNAL_SERVICE_LIST_DECLARE_H <freetype/internal/services/listdecl.h>
#define FT_INTERNAL_SERVICE_LIST_DEFINE_H <freetype/internal/services/listdef.h>
/* END */ /* END */

View File

@ -692,7 +692,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_, \ #define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_, \
get_t1_funcs_, get_t2_funcs_) \ get_t1_funcs_, get_t2_funcs_) \
void \ void \
FT_Init_Class_##class_( FT_Library library, \ ft_pic_init_##class_( FT_Library library, \
PSHinter_Interface* clazz) \ PSHinter_Interface* clazz) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \

View File

@ -0,0 +1,57 @@
/***************************************************************************/
/* */
/* services/declare.h */
/* */
/* The FreeType PostScript info service (specification). */
/* */
/* Copyright 2009 by David Turner */
/* */
/* 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. */
/* */
/***************************************************************************/
/* this header file can be included multipled times and is used
* to declare the types corresponding to a given service described
* by FT_SERVICE_NAME and FT_SERVICE_FIELDS
*
* FT_SERVICE_NAME is the name of the service
* FT_SERVICE_FIELDS is a list of _FT_SERVICE_FIELD(type,varname)
* statements that will be used to define the corresponding service
* structure and pointer types.
*/
#ifndef FT_SERVICE_FIELDS
#error FT_SERVICE_FIELDS must be defined
#endif
#ifndef FT_SERVICE_NAME
#error FT_SERVICE_NAME must be defined
#endif
/* define the service structure and pointer types */
typedef struct FT_GLUE3(FT_Service_,FT_SERVICE_NAME,Rec_)
FT_GLUE3(FT_Service_,FT_SERVICE_NAME,Rec);
typedef struct FT_GLUE3(FT_Service_,FT_SERVICE_NAME,Rec_) const*
FT_GLUE(FT_Service_,FT_SERVICE_NAME);
struct FT_GLUE3(FT_Service_,FT_SERVICE_NAME,Rec_)
{
#define _FT_SERVICE_FIELD(type_,name_) type_ name_;
FT_SERVICE_FIELDS
#undef _FT_SERVICE_FIELD
};
/* declare initialization function for PIC code */
#ifdef FT_CONFIG_OPTION_PIC
void FT_GLUE(ft_pic_service_init_,FT_SERVICE_NAME)
( FT_GLUE3(FT_Service_,FT_SERVICE_NAME,Rec)* clazz );
#endif /* FT_CONFIG_OPTION_PIC */
#undef FT_SERVICE_NAME
#undef FT_SERVICE_FIELDS

View File

@ -0,0 +1,65 @@
/***************************************************************************/
/* */
/* services/define.h */
/* */
/* The FreeType PostScript info service (specification). */
/* */
/* Copyright 2009 by David Turner */
/* */
/* 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. */
/* */
/***************************************************************************/
/* this header file can be included multipled times and is used
* to declare the types corresponding to a given service described
* by FT_SERVICE_NAME and FT_SERVICE_FIELDS
*
* FT_SERVICE_NAME is the name of the service
* FT_SERVICE_FIELDS is a list of _FT_SERVICE_FIELD(type,varname)
* statements that will be used to define the corresponding service
* structure and pointer types.
*/
#ifndef FT_SERVICE_FIELDS
#error FT_SERVICE_FIELDS must be defined
#endif
#ifndef FT_SERVICE_PREFIX
#error FT_SERVICE_PREFIX must be defined
#endif
#ifndef FT_SERVICE_NAME
#error FT_SERVICE_NAME must be defined
#endif
#ifndef FT_CONFIG_OPTION_PIC
static const FT_GLUE3(FT_Service_,FT_SERVICE_NAME,Rec)
FT_GLUE(ft_service_,FT_SERVICE_NAME) =
{
#define _FT_SERVICE_FIELD(type_,name_) \
FT_GLUE(FT_SERVICE_PREFIX,name_),
FT_SERVICE_FIELDS
#undef _FT_SERVICE_FIELD
};
#else /* FT_CONFIG_OPTION_PIC */
void FT_GLUE(ft_pic_service_init_,FT_SERVICE_NAME)(
FT_GLUE3(FT_Service_,FT_SERVICE_NAME,Rec)* clazz )
{
#define _FT_SERVICE_FIELD(type_,name_) \
clazz->name_ = FT_GLUE(FT_SERVICE_PREFIX,name_);
FT_SERVICE_FIELDS
#undef _FT_SERVICE_FIELD
}
#endif /* FT_CONFIG_OPTION_PIC */
#undef FT_SERVICE_NAME
#undef FT_SERVICE_FIELDS
#undef FT_SERVICE_PREFIX

View File

@ -0,0 +1,58 @@
/***************************************************************************/
/* */
/* services/listdecl.h */
/* */
/* Service list declaration template */
/* */
/* Copyright 2009 by David Turner */
/* */
/* 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. */
/* */
/***************************************************************************/
/* this header file can be included multipled times and is used
* to declare a list of services in a given module. It relies on
* FT_SERVICE_LIST_NAME and FT_SERVICE_LIST_FIELDS being defined
*
* FT_SERVICE_NAME is the name of the service list
* FT_SERVICE_ITEMS is a list of _FT_SERVICE_ITEM(id,value)
* statements that will be used to define the corresponding service
* item in the list
*/
#ifndef FT_SERVICE_ITEMS
#error FT_SERVICE_ITEMS must be defined
#endif
#ifndef FT_SERVICE_NAME
#error FT_SERVICE_NAME must be defined
#endif
#ifdef FT_CONFIG_OPTION_PIC
/* For PIC mode, count the number of items in the list
* and define the appropriate array type.
*/
/* compute number of active items in array */
enum {
FT_GLUE(_ft_service_count_,FT_SERVICE_NAME) = 0
#define _FT_SERVICE_ITEM(x,y) +1
FT_SERVICE_ITEMS
#undef _FT_SERVICE_ITEM
};
typedef FT_ServiceDescRec FT_GLUE(FT_ServiceItems_,FT_SERVICE_NAME)
[ FT_GLUE(_ft_service_count_,FT_SERVICE_NAME)+1 ];
void
FT_GLUE(ft_pic_services_init_,FT_SERVICE_NAME)
( FT_ServiceDescRec* items, FT_Library library );
#endif /* FT_CONFIG_OPTION_PIC */
#undef FT_SERVICE_NAME
#undef FT_SERVICE_ITEMS

View File

@ -0,0 +1,70 @@
/***************************************************************************/
/* */
/* services/listdef.h */
/* */
/* Service list definition template */
/* */
/* Copyright 2009 by David Turner */
/* */
/* 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. */
/* */
/***************************************************************************/
/* this header file can be included multipled times and is used
* to declare a list of services in a given module. It relies on
* FT_SERVICE_LIST_NAME and FT_SERVICE_LIST_FIELDS being defined
*
* FT_SERVICE_NAME is the name of the service list
* FT_SERVICE_ITEMS is a list of _FT_SERVICE_ITEM(id,value)
* statements that will be used to define the corresponding service
* item in the list
*/
#ifndef FT_SERVICE_ITEMS
#error FT_SERVICE_ITEMS must be defined
#endif
#ifndef FT_SERVICE_NAME
#error FT_SERVICE_NAME must be defined
#endif
#ifndef FT_SERVICE_VARNAME
#error FT_SERVICE_VARNAME must be defined
#endif
#ifndef FT_CONFIG_OPTION_PIC
static const FT_ServiceDescRec FT_SERVICE_VARNAME[] =
{
#define _FT_SERVICE_ITEM(id_,value_) { id_, value_ },
FT_SERVICE_ITEMS
#undef _FT_SERVICE_ITEM
{ NULL, NULL }
};
#else /* FT_CONFIG_OPTION_PIC */
void
FT_GLUE(ft_pic_services_init_,FT_SERVICE_NAME)
( FT_ServiceDescRec* items, FT_Library library )
{
FT_ServiceDescRec* desc = items;
#define _FT_SERVICE_ITEM(id_,value_) \
desc->serv_id = FT_GLUE(FT_SERVICE_ID_,id_); \
desc->serv_data = value_; \
desc ++;
FT_SERVICE_ITEMS
#undef _FT_SERVICE_ITEM
desc->serv_id = NULL;
desc->serv_data = NULL;
}
#endif /* FT_CONFIG_OPTION_PIC */
#undef FT_SERVICE_NAME
#undef FT_SERVICE_VARNAME
#undef FT_SERVICE_ITEMS

View File

@ -57,7 +57,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICE_BDFRec(class_, get_charset_id_, get_property_) \ #define FT_DEFINE_SERVICE_BDFRec(class_, get_charset_id_, get_property_) \
void \ void \
FT_Init_Class_##class_( FT_Service_BDFRec* clazz ) \ ft_pic_init_##class_( FT_Service_BDFRec* clazz ) \
{ \ { \
clazz->get_charset_id = get_charset_id_; \ clazz->get_charset_id = get_charset_id_; \
clazz->get_property = get_property_; \ clazz->get_property = get_property_; \

View File

@ -60,7 +60,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICE_CIDREC(class_, get_ros_, \ #define FT_DEFINE_SERVICE_CIDREC(class_, get_ros_, \
get_is_cid_, get_cid_from_glyph_index_ ) \ get_is_cid_, get_cid_from_glyph_index_ ) \
void \ void \
FT_Init_Class_##class_( FT_Library library, \ ft_pic_init_##class_( FT_Library library, \
FT_Service_CIDRec* clazz) \ FT_Service_CIDRec* clazz) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \

View File

@ -63,7 +63,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICE_GLYPHDICTREC(class_, get_name_, name_index_) \ #define FT_DEFINE_SERVICE_GLYPHDICTREC(class_, get_name_, name_index_) \
void \ void \
FT_Init_Class_##class_( FT_Library library, \ ft_pic_init_##class_( FT_Library library, \
FT_Service_GlyphDictRec* clazz) \ FT_Service_GlyphDictRec* clazz) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \

View File

@ -82,7 +82,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICE_MULTIMASTERSREC(class_, get_mm_, set_mm_design_, \ #define FT_DEFINE_SERVICE_MULTIMASTERSREC(class_, get_mm_, set_mm_design_, \
set_mm_blend_, get_mm_var_, set_var_design_) \ set_mm_blend_, get_mm_var_, set_var_design_) \
void \ void \
FT_Init_Class_##class_( FT_Service_MultiMastersRec* clazz ) \ ft_pic_init_##class_( FT_Service_MultiMastersRec* clazz ) \
{ \ { \
clazz->get_mm = get_mm_; \ clazz->get_mm = get_mm_; \
clazz->set_mm_design = set_mm_design_; \ clazz->set_mm_design = set_mm_design_; \

View File

@ -58,7 +58,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICE_PSFONTNAMEREC(class_, get_ps_font_name_) \ #define FT_DEFINE_SERVICE_PSFONTNAMEREC(class_, get_ps_font_name_) \
void \ void \
FT_Init_Class_##class_( FT_Library library, \ ft_pic_init_##class_( FT_Library library, \
FT_Service_PsFontNameRec* clazz) \ FT_Service_PsFontNameRec* clazz) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \

View File

@ -136,7 +136,7 @@ FT_BEGIN_HEADER
unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ unicodes_char_index_, unicodes_char_next_, macintosh_name_, \
adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_) \ adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_) \
void \ void \
FT_Init_Class_##class_( FT_Library library, \ ft_pic_init_##class_( FT_Library library, \
FT_Service_PsCMapsRec* clazz) \ FT_Service_PsCMapsRec* clazz) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \

View File

@ -25,7 +25,6 @@
FT_BEGIN_HEADER FT_BEGIN_HEADER
#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" #define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info"
@ -44,41 +43,16 @@ FT_BEGIN_HEADER
(*PS_GetFontPrivateFunc)( FT_Face face, (*PS_GetFontPrivateFunc)( FT_Face face,
PS_PrivateRec* afont_private ); PS_PrivateRec* afont_private );
#define FT_PSINFO_SERVICE_FIELDS \
_FT_SERVICE_FIELD( PS_GetFontInfoFunc, get_font_info ) \
_FT_SERVICE_FIELD( PS_GetFontExtraFunc, get_font_extra ) \
_FT_SERVICE_FIELD( PS_HasGlyphNamesFunc, has_glyph_names ) \
_FT_SERVICE_FIELD( PS_GetFontPrivateFunc, get_font_private ) \
FT_DEFINE_SERVICE( PsInfo ) #define FT_SERVICE_NAME PsInfo
{ #define FT_SERVICE_FIELDS FT_PSINFO_SERVICE_FIELDS
PS_GetFontInfoFunc ps_get_font_info;
PS_GetFontExtraFunc ps_get_font_extra;
PS_HasGlyphNamesFunc ps_has_glyph_names;
PS_GetFontPrivateFunc ps_get_font_private;
};
#ifndef FT_CONFIG_OPTION_PIC #include FT_INTERNAL_SERVICE_DECLARE_H
#define FT_DEFINE_SERVICE_PSINFOREC(class_, get_font_info_, \
ps_get_font_extra_, has_glyph_names_, get_font_private_) \
static const FT_Service_PsInfoRec class_ = \
{ \
get_font_info_, ps_get_font_extra_, has_glyph_names_, \
get_font_private_ \
};
#else /* FT_CONFIG_OPTION_PIC */
#define FT_DEFINE_SERVICE_PSINFOREC(class_, get_font_info_, \
ps_get_font_extra_, has_glyph_names_, get_font_private_) \
void \
FT_Init_Class_##class_( FT_Library library, \
FT_Service_PsInfoRec* clazz) \
{ \
FT_UNUSED(library); \
clazz->ps_get_font_info = get_font_info_; \
clazz->ps_get_font_extra = ps_get_font_extra_; \
clazz->ps_has_glyph_names = has_glyph_names_; \
clazz->ps_get_font_private = get_font_private_; \
}
#endif /* FT_CONFIG_OPTION_PIC */
/* */ /* */

View File

@ -80,7 +80,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICE_SFNT_TABLEREC(class_, load_, get_, info_) \ #define FT_DEFINE_SERVICE_SFNT_TABLEREC(class_, load_, get_, info_) \
void \ void \
FT_Init_Class_##class_( FT_Service_SFNT_TableRec* clazz ) \ ft_pic_init_##class_( FT_Service_SFNT_TableRec* clazz ) \
{ \ { \
clazz->load_table = load_; \ clazz->load_table = load_; \
clazz->get_table = get_; \ clazz->get_table = get_; \

View File

@ -86,7 +86,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICE_TTCMAPSREC(class_, get_cmap_info_) \ #define FT_DEFINE_SERVICE_TTCMAPSREC(class_, get_cmap_info_) \
void \ void \
FT_Init_Class_##class_( FT_Library library, \ ft_pic_init_##class_( FT_Library library, \
FT_Service_TTCMapsRec* clazz) \ FT_Service_TTCMapsRec* clazz) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \

View File

@ -49,7 +49,7 @@ FT_BEGIN_HEADER
#define FT_DEFINE_SERVICE_TTGLYFREC(class_, get_location_ ) \ #define FT_DEFINE_SERVICE_TTGLYFREC(class_, get_location_ ) \
void \ void \
FT_Init_Class_##class_( FT_Service_TTGlyfRec* clazz ) \ ft_pic_init_##class_( FT_Service_TTGlyfRec* clazz ) \
{ \ { \
clazz->get_location = get_location_; \ clazz->get_location = get_location_; \
} }

View File

@ -842,7 +842,7 @@ FT_BEGIN_HEADER
get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_, \ get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_, \
set_sbit_strike_, load_strike_metrics_, get_metrics_ ) \ set_sbit_strike_, load_strike_metrics_, get_metrics_ ) \
void \ void \
FT_Init_Class_##class_( FT_Library library, SFNT_Interface* clazz ) \ ft_pic_init_##class_( FT_Library library, SFNT_Interface* clazz ) \
{ \ { \
FT_UNUSED(library); \ FT_UNUSED(library); \
FT_INTERNAL(goto_table,goto_table_) \ FT_INTERNAL(goto_table,goto_table_) \

View File

@ -83,7 +83,7 @@
0x10000L, /* version 1.0 of the autofitter */ 0x10000L, /* version 1.0 of the autofitter */
0x20000L, /* requires FreeType 2.0 or above */ 0x20000L, /* requires FreeType 2.0 or above */
(const void*)&AF_AF_AUTOFITTER_SERVICE_GET, (const void*)&AF_AUTOFITTER_SERVICE_GET,
(FT_Module_Constructor)af_autofitter_init, (FT_Module_Constructor)af_autofitter_init,
(FT_Module_Destructor) af_autofitter_done, (FT_Module_Destructor) af_autofitter_done,

View File

@ -24,7 +24,7 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from afmodule.c */ /* forward declaration of PIC init functions from afmodule.c */
void FT_Init_Class_af_autofitter_service( FT_Library, FT_AutoHinter_ServiceRec*); void ft_pic_init_af_autofitter_service( FT_Library, FT_AutoHinter_ServiceRec*);
/* forward declaration of PIC init functions from script classes */ /* forward declaration of PIC init functions from script classes */
#include "aflatin.h" #include "aflatin.h"
@ -33,32 +33,11 @@
#include "afdummy.h" #include "afdummy.h"
#include "afindic.h" #include "afindic.h"
void static FT_Error
autofit_module_class_pic_free( FT_Library library ) pic_autofit_init( void* _autofit, FT_PicTable pic )
{ {
FT_PIC_Container* pic_container = &library->pic_container; AFModulePIC* container = _autofit;
FT_Memory memory = library->memory; FT_UInt ss;
if ( pic_container->autofit )
{
FT_FREE( pic_container->autofit );
pic_container->autofit = NULL;
}
}
FT_Error
autofit_module_class_pic_init( FT_Library library )
{
FT_PIC_Container* pic_container = &library->pic_container;
FT_UInt ss;
FT_Error error = FT_Err_Ok;
AFModulePIC* container;
FT_Memory memory = library->memory;
/* allocate pointer, clear and set global container pointer */
if ( FT_ALLOC ( container, sizeof ( *container ) ) )
return error;
FT_MEM_SET( container, 0, sizeof(*container) );
pic_container->autofit = container;
/* initialize pointer table - this is how the module usually expects this data */ /* initialize pointer table - this is how the module usually expects this data */
for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ ) for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ )
@ -66,26 +45,34 @@
container->af_script_classes[ss] = &container->af_script_classes_rec[ss]; container->af_script_classes[ss] = &container->af_script_classes_rec[ss];
} }
container->af_script_classes[AF_SCRIPT_CLASSES_COUNT-1] = NULL; container->af_script_classes[AF_SCRIPT_CLASSES_COUNT-1] = NULL;
/* add call to initialization function when you add new scripts */ /* add call to initialization function when you add new scripts */
ss = 0; ss = 0;
FT_Init_Class_af_dummy_script_class(&container->af_script_classes_rec[ss++]); ft_pic_init_af_dummy_script_class (&container->af_script_classes_rec[ss++]);
#ifdef FT_OPTION_AUTOFIT2 #ifdef FT_OPTION_AUTOFIT2
FT_Init_Class_af_latin2_script_class(&container->af_script_classes_rec[ss++]); ft_pic_init_af_latin2_script_class(&container->af_script_classes_rec[ss++]);
#endif #endif
FT_Init_Class_af_latin_script_class(&container->af_script_classes_rec[ss++]); ft_pic_init_af_latin_script_class (&container->af_script_classes_rec[ss++]);
FT_Init_Class_af_cjk_script_class(&container->af_script_classes_rec[ss++]); ft_pic_init_af_cjk_script_class (&container->af_script_classes_rec[ss++]);
FT_Init_Class_af_indic_script_class(&container->af_script_classes_rec[ss++]); ft_pic_init_af_indic_script_class (&container->af_script_classes_rec[ss++]);
FT_Init_Class_af_autofitter_service(library, &container->af_autofitter_service); ft_pic_init_af_autofitter_service(pic->library, &container->af_autofitter_service);
/*Exit:*/ return 0;
if(error)
autofit_module_class_pic_free(library);
return error;
} }
FT_Error
autofit_module_class_pic_init( FT_Library library )
{
FT_PicTable pic = &library->pic_table;
return ft_pic_table_init_data( pic, pic->autofit,
sizeof(AFModulePIC),
pic_autofit_init,
NULL );
}
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */

View File

@ -19,38 +19,37 @@
#ifndef __AFPIC_H__ #ifndef __AFPIC_H__
#define __AFPIC_H__ #define __AFPIC_H__
FT_BEGIN_HEADER FT_BEGIN_HEADER
#include FT_INTERNAL_PIC_H #include FT_INTERNAL_PIC_H
#ifndef FT_CONFIG_OPTION_PIC #ifndef FT_CONFIG_OPTION_PIC
#define AF_SCRIPT_CLASSES_GET af_script_classes # define AF_SCRIPT_CLASSES_GET af_script_classes
#define AF_AF_AUTOFITTER_SERVICE_GET af_autofitter_service # define AF_AUTOFITTER_SERVICE_GET af_autofitter_service
#else /* FT_CONFIG_OPTION_PIC */ #else /* FT_CONFIG_OPTION_PIC */
#include "aftypes.h" # include "aftypes.h"
/* increase these when you add new scripts, and update autofit_module_class_pic_init */ /* increase these when you add new scripts, and update autofit_module_class_pic_init */
#ifdef FT_OPTION_AUTOFIT2 # ifdef FT_OPTION_AUTOFIT2
#define AF_SCRIPT_CLASSES_COUNT 6 # define AF_SCRIPT_CLASSES_COUNT 6
#else # else
#define AF_SCRIPT_CLASSES_COUNT 5 # define AF_SCRIPT_CLASSES_COUNT 5
#endif # endif
#define AF_SCRIPT_CLASSES_REC_COUNT (AF_SCRIPT_CLASSES_COUNT-1) # define AF_SCRIPT_CLASSES_REC_COUNT (AF_SCRIPT_CLASSES_COUNT-1)
typedef struct AFModulePIC_ typedef struct AFModulePIC_
{ {
AF_ScriptClass af_script_classes[AF_SCRIPT_CLASSES_COUNT]; AF_ScriptClass af_script_classes[AF_SCRIPT_CLASSES_COUNT];
AF_ScriptClassRec af_script_classes_rec[AF_SCRIPT_CLASSES_REC_COUNT]; AF_ScriptClassRec af_script_classes_rec[AF_SCRIPT_CLASSES_REC_COUNT];
FT_AutoHinter_ServiceRec af_autofitter_service; FT_AutoHinter_ServiceRec af_autofitter_service;
} AFModulePIC; } AFModulePIC;
#define GET_PIC(lib) ((AFModulePIC*)((lib)->pic_container.autofit)) #define AF_GET_PIC(lib) ((AFModulePIC*)FT_LIBRARY_GET_PIC_DATA(lib,autofit))
#define AF_SCRIPT_CLASSES_GET (GET_PIC(FT_FACE_LIBRARY(globals->face))->af_script_classes) #define AF_SCRIPT_CLASSES_GET (AF_GET_PIC(FT_FACE_LIBRARY(globals->face))->af_script_classes)
#define AF_AF_AUTOFITTER_SERVICE_GET (GET_PIC(library)->af_autofitter_service) #define AF_AUTOFITTER_SERVICE_GET (AF_GET_PIC(library)->af_autofitter_service)
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */

View File

@ -368,12 +368,12 @@ extern void* _af_debug_hints;
#define AF_DECLARE_SCRIPT_CLASS(script_class) \ #define AF_DECLARE_SCRIPT_CLASS(script_class) \
FT_LOCAL(void) \ FT_LOCAL(void) \
FT_Init_Class_##script_class(AF_ScriptClassRec* ac); ft_pic_init_##script_class(AF_ScriptClassRec* ac);
#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \ #define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \
m_init, m_scale, m_done, h_init, h_apply) \ m_init, m_scale, m_done, h_init, h_apply) \
FT_LOCAL_DEF(void) \ FT_LOCAL_DEF(void) \
FT_Init_Class_##script_class(AF_ScriptClassRec* ac) \ ft_pic_init_##script_class(AF_ScriptClassRec* ac) \
{ \ { \
ac->script = script_; \ ac->script = script_; \
ac->script_uni_ranges = ranges; \ ac->script_uni_ranges = ranges; \

View File

@ -24,59 +24,54 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from ftglyph.c */ /* forward declaration of PIC init functions from ftglyph.c */
void FT_Init_Class_ft_outline_glyph_class(FT_Glyph_Class*); void ft_pic_init_ft_outline_glyph_class(FT_Glyph_Class*);
void FT_Init_Class_ft_bitmap_glyph_class(FT_Glyph_Class*); void ft_pic_init_ft_bitmap_glyph_class(FT_Glyph_Class*);
/* forward declaration of PIC init functions from ftinit.c */ /* forward declaration of PIC init functions from ftinit.c */
FT_Error ft_create_default_module_classes(FT_Library); FT_Error ft_create_default_module_classes(FT_Library);
void ft_destroy_default_module_classes(FT_Library); void ft_destroy_default_module_classes(FT_Library);
void static void
ft_base_pic_free( FT_Library library ) pic_base_done( void* base, FT_PicTable pic )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_UNUSED(base);
FT_Memory memory = library->memory;
if ( pic_container->base )
{
/* Destroy default module classes (in case FT_Add_Default_Modules was used) */
ft_destroy_default_module_classes( library );
FT_FREE( pic_container->base ); /* Destroy default module classes (in case FT_Add_Default_Modules was used) */
pic_container->base = NULL; ft_destroy_default_module_classes( pic->library );
} }
static FT_Error
pic_base_init( void* data, FT_PicTable pic )
{
BasePIC* base = (BasePIC*)data;
FT_Error error;
/* initialize default modules list and pointers */
error = ft_create_default_module_classes( pic->library );
if ( error )
goto Exit;
/* initialize pointer table - this is how the module usually expects this data */
ft_pic_init_ft_outline_glyph_class(&base->ft_outline_glyph_class);
ft_pic_init_ft_bitmap_glyph_class(&base->ft_bitmap_glyph_class);
Exit:
return error;
} }
FT_Error FT_Error
ft_base_pic_init( FT_Library library ) ft_base_pic_init( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Error error = FT_Err_Ok;
BasePIC* container;
FT_Memory memory = library->memory;
/* allocate pointer, clear and set global container pointer */ return ft_pic_table_init_data( pic_table,
if ( FT_ALLOC ( container, sizeof ( *container ) ) ) pic_table->base,
return error; sizeof(BasePIC),
FT_MEM_SET( container, 0, sizeof(*container) ); pic_base_init,
pic_container->base = container; pic_base_done );
/* initialize default modules list and pointers */
error = ft_create_default_module_classes( library );
if ( error )
goto Exit;
/* initialize pointer table - this is how the module usually expects this data */
FT_Init_Class_ft_outline_glyph_class(&container->ft_outline_glyph_class);
FT_Init_Class_ft_bitmap_glyph_class(&container->ft_bitmap_glyph_class);
Exit:
if(error)
ft_base_pic_free(library);
return error;
} }
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */

View File

@ -40,10 +40,10 @@ FT_BEGIN_HEADER
FT_Glyph_Class ft_bitmap_glyph_class; FT_Glyph_Class ft_bitmap_glyph_class;
} BasePIC; } BasePIC;
#define GET_PIC(lib) ((BasePIC*)((lib)->pic_container.base)) #define GET_PIC(lib) ((BasePIC*)((lib)->pic_table.base))
#define FT_OUTLINE_GLYPH_CLASS_GET (&GET_PIC(library)->ft_outline_glyph_class) #define FT_OUTLINE_GLYPH_CLASS_GET (&GET_PIC(library)->ft_outline_glyph_class)
#define FT_BITMAP_GLYPH_CLASS_GET (&GET_PIC(library)->ft_bitmap_glyph_class) #define FT_BITMAP_GLYPH_CLASS_GET (&GET_PIC(library)->ft_bitmap_glyph_class)
#define FT_DEFAULT_MODULES_GET (GET_PIC(library)->default_module_classes) #define FT_DEFAULT_MODULES_GET (const FT_Module_Class* const*)(GET_PIC(library)->default_module_classes)
void void
ft_base_pic_free( FT_Library library ); ft_base_pic_free( FT_Library library );

View File

@ -38,12 +38,12 @@
FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
if ( service && service->ps_get_font_extra ) if ( service && service->get_font_extra )
{ {
PS_FontExtraRec extra; PS_FontExtraRec extra;
if ( !service->ps_get_font_extra( face, &extra ) && if ( !service->get_font_extra( face, &extra ) &&
extra.fs_type != 0 ) extra.fs_type != 0 )
return extra.fs_type; return extra.fs_type;
} }

View File

@ -88,8 +88,8 @@
/* declare the module's class creation/destruction functions */ /* declare the module's class creation/destruction functions */
#undef FT_USE_MODULE #undef FT_USE_MODULE
#define FT_USE_MODULE( type, x ) \ #define FT_USE_MODULE( type, x ) \
FT_EXTERNC FT_Error FT_Create_Class_##x( FT_Library library, FT_Module_Class** output_class ); \ FT_EXTERNC FT_Error ft_library_pic_alloc_##x( FT_Library library, FT_Module_Class** output_class ); \
FT_EXTERNC void FT_Destroy_Class_##x( FT_Library library, FT_Module_Class* clazz ); FT_EXTERNC void ft_library_pic_free_##x( FT_Library library, FT_Module_Class* clazz );
#include FT_CONFIG_MODULES_H #include FT_CONFIG_MODULES_H
@ -106,7 +106,7 @@
/* destroy all module classes */ /* destroy all module classes */
#undef FT_USE_MODULE #undef FT_USE_MODULE
#define FT_USE_MODULE( type, x ) \ #define FT_USE_MODULE( type, x ) \
if ( classes[i] ) { FT_Destroy_Class_##x(library, classes[i]); } \ if ( classes[i] ) { ft_library_pic_free_##x(library, classes[i]); } \
i++; \ i++; \
FT_BASE_DEF( void ) FT_BASE_DEF( void )
@ -115,28 +115,21 @@
FT_Module_Class** classes; FT_Module_Class** classes;
FT_Memory memory; FT_Memory memory;
FT_UInt i; FT_UInt i;
BasePIC* pic_container = library->pic_container.base; BasePIC* pic_table = FT_LIBRARY_GET_PIC_DATA(library, base);
if ( !pic_container->default_module_classes ) if ( !pic_table->default_module_classes )
return; return;
memory = library->memory; memory = library->memory;
classes = pic_container->default_module_classes; classes = pic_table->default_module_classes;
i = 0; i = 0;
#include FT_CONFIG_MODULES_H #include FT_CONFIG_MODULES_H
FT_FREE( classes ); FT_FREE( classes );
pic_container->default_module_classes = 0; pic_table->default_module_classes = 0;
} }
/* initialize all module classes and the pointer table */
#undef FT_USE_MODULE
#define FT_USE_MODULE( type, x ) \
error = FT_Create_Class_##x(library, &clazz); \
if (error) goto Exit; \
classes[i++] = clazz;
FT_BASE_DEF( FT_Error ) FT_BASE_DEF( FT_Error )
ft_create_default_module_classes( FT_Library library ) ft_create_default_module_classes( FT_Library library )
{ {
@ -145,27 +138,35 @@
FT_Module_Class** classes; FT_Module_Class** classes;
FT_Module_Class* clazz; FT_Module_Class* clazz;
FT_UInt i; FT_UInt i;
BasePIC* pic_container = library->pic_container.base; BasePIC* pic_table = FT_LIBRARY_GET_PIC_DATA(library, base);
memory = library->memory; memory = library->memory;
pic_container->default_module_classes = 0; pic_table->default_module_classes = 0;
if ( FT_ALLOC(classes, sizeof(FT_Module_Class*) * (FT_NUM_MODULE_CLASSES + 1) ) ) if ( FT_NEW_ARRAY(classes, FT_NUM_MODULE_CLASSES + 1 ) )
return error; return error;
/* initialize all pointers to 0, especially the last one */
for (i = 0; i < FT_NUM_MODULE_CLASSES; i++)
classes[i] = 0;
classes[FT_NUM_MODULE_CLASSES] = 0;
i = 0; i = 0;
/* initialize all module classes and the pointer table */
#undef FT_USE_MODULE
#define FT_USE_MODULE( type, x ) \
error = ft_library_pic_alloc_##x(library, &clazz); \
if (error) \
goto Exit; \
\
classes[i++] = clazz;
#include FT_CONFIG_MODULES_H #include FT_CONFIG_MODULES_H
#undef FT_USE_MODULE
Exit: Exit:
if (error) ft_destroy_default_module_classes( library ); if (error)
else pic_container->default_module_classes = classes; ft_destroy_default_module_classes( library );
else
pic_table->default_module_classes = classes;
return error; return error;
} }

View File

@ -4125,7 +4125,7 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* initialize position independent code containers */ /* initialize position independent code containers */
error = ft_pic_container_init( library ); error = ft_library_pic_init( library );
if ( error ) if ( error )
goto Fail; goto Fail;
#endif #endif
@ -4144,7 +4144,7 @@
Fail: Fail:
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
ft_pic_container_destroy( library ); ft_library_pic_done( library );
#endif #endif
FT_FREE( library ); FT_FREE( library );
return error; return error;
@ -4264,7 +4264,7 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* Destroy pic container contents */ /* Destroy pic container contents */
ft_pic_container_destroy( library ); ft_library_pic_done( library );
#endif #endif
FT_FREE( library ); FT_FREE( library );

View File

@ -26,12 +26,74 @@
/* documentation is in ftpic.h */ /* documentation is in ftpic.h */
FT_BASE_DEF( FT_Error ) FT_BASE_DEF( FT_Error )
ft_pic_container_init( FT_Library library ) ft_pic_table_init_data( FT_PicTable pic,
FT_PicData data,
FT_UInt data_size,
FT_PicDataInitFunc data_init,
FT_PicDataDoneFunc data_done )
{ {
FT_PIC_Container* pic_container = &library->pic_container; void* pic_data = data->data;
FT_Error error = FT_Err_Ok; FT_Error error = 0;
FT_Memory memory = pic->memory;
FT_MEM_SET( pic_container, 0, sizeof(*pic_container) ); /* if the PIC structure already exist, just increment its
* reference count
*/
if (pic_data != NULL)
{
data->ref_count += 1;
return 0;
}
if ( FT_ALLOC( pic_data, data_size ) )
goto Exit;
error = data_init( pic_data, pic );
if (error)
{
if (data_done)
data_done( pic_data, pic );
FT_FREE( pic_data );
goto Exit;
}
data->data = pic_data;
data->ref_count = 1;
data->done = data_done;
Exit:
return error;
}
FT_BASE_DEF( void )
ft_pic_table_done_data( FT_PicTable pic,
FT_PicData data )
{
FT_Memory memory = pic->memory;
if ( --data->ref_count != 0 )
return;
if (data->done)
data->done( data->data, pic );
FT_FREE(data->data);
data->done = NULL;
}
FT_BASE_DEF( FT_Error )
ft_library_pic_init( FT_Library library )
{
FT_PicTable pic = &library->pic_table;
FT_Error error = FT_Err_Ok;
FT_ZERO(pic);
pic->library = library;
pic->memory = library->memory;
error = ft_base_pic_init( library ); error = ft_base_pic_init( library );
if(error) if(error)
@ -43,7 +105,7 @@
/* Destroy the contents of the container. */ /* Destroy the contents of the container. */
FT_BASE_DEF( void ) FT_BASE_DEF( void )
ft_pic_container_destroy( FT_Library library ) ft_library_pic_done( FT_Library library )
{ {
ft_base_pic_free( library ); ft_base_pic_free( library );
} }

View File

@ -38,8 +38,8 @@
FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
if ( service && service->ps_get_font_info ) if ( service && service->get_font_info )
error = service->ps_get_font_info( face, afont_info ); error = service->get_font_info( face, afont_info );
} }
return error; return error;
@ -59,8 +59,8 @@
{ {
FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
if ( service && service->ps_has_glyph_names ) if ( service && service->has_glyph_names )
result = service->ps_has_glyph_names( face ); result = service->has_glyph_names( face );
} }
return result; return result;
@ -83,8 +83,8 @@
FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
if ( service && service->ps_get_font_private ) if ( service && service->get_font_private )
error = service->ps_get_font_private( face, afont_private ); error = service->get_font_private( face, afont_private );
} }
return error; return error;

View File

@ -329,9 +329,10 @@
static FT_Error static FT_Error
cff_ps_get_font_info( CFF_Face face, cff_ps_get_font_info( FT_Face face_,
PS_FontInfoRec* afont_info ) PS_FontInfoRec* afont_info )
{ {
CFF_Face face = (CFF_Face)face_;
CFF_Font cff = (CFF_Font)face->extra.data; CFF_Font cff = (CFF_Font)face->extra.data;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
@ -378,13 +379,22 @@
} }
#define FT_SERVICE_FIELDS FT_PSINFO_SERVICE_FIELDS
#define FT_SERVICE_NAME PsInfo
#define FT_SERVICE_PREFIX cff_ps_
#define cff_ps_get_font_extra NULL
#define cff_ps_get_font_private NULL
#include FT_INTERNAL_SERVICE_DEFINE_H
#if 0
FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info, FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info,
(PS_GetFontInfoFunc) cff_ps_get_font_info, (PS_GetFontInfoFunc) cff_ps_get_font_info,
(PS_GetFontExtraFunc) NULL, (PS_GetFontExtraFunc) NULL,
(PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,
(PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */ (PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */
) )
#endif
/* /*
* POSTSCRIPT NAME SERVICE * POSTSCRIPT NAME SERVICE
@ -585,20 +595,20 @@
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES #define FT_SERVICE_ITEMS CFF_SERVICE_ITEMS
#define FT_SERVICE_NAME cff
#define FT_SERVICE_VARNAME cff_services
#include FT_INTERNAL_SERVICE_LIST_DEFINE_H
#if 0
FT_DEFINE_SERVICEDESCREC6(cff_services, FT_DEFINE_SERVICEDESCREC6(cff_services,
FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF,
FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET,
FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET,
FT_SERVICE_ID_GLYPH_DICT, &FT_CFF_SERVICE_GLYPH_DICT_GET, IF_GLYPH_NAMES(
FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, FT_SERVICE_ID_GLYPH_DICT, &FT_CFF_SERVICE_GLYPH_DICT_GET,
FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET )
)
#else
FT_DEFINE_SERVICEDESCREC5(cff_services,
FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF,
FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET,
FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET,
FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET,
FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET
) )

View File

@ -559,20 +559,6 @@
return error; return error;
} }
#define CFF_FIELD_NUM( code, name ) \
CFF_FIELD( code, name, cff_kind_num )
#define CFF_FIELD_FIXED( code, name ) \
CFF_FIELD( code, name, cff_kind_fixed )
#define CFF_FIELD_FIXED_1000( code, name ) \
CFF_FIELD( code, name, cff_kind_fixed_thousand )
#define CFF_FIELD_STRING( code, name ) \
CFF_FIELD( code, name, cff_kind_string )
#define CFF_FIELD_BOOL( code, name ) \
CFF_FIELD( code, name, cff_kind_bool )
#define CFF_FIELD_DELTA( code, name, max ) \
CFF_FIELD( code, name, cff_kind_delta )
#define CFFCODE_TOPDICT 0x1000 #define CFFCODE_TOPDICT 0x1000
#define CFFCODE_PRIVATE 0x2000 #define CFFCODE_PRIVATE 0x2000
@ -587,7 +573,6 @@
0, 0 \ 0, 0 \
}, },
#undef CFF_FIELD
#define CFF_FIELD( code, name, kind ) \ #define CFF_FIELD( code, name, kind ) \
{ \ { \
kind, \ kind, \
@ -597,7 +582,6 @@
0, 0, 0 \ 0, 0, 0 \
}, },
#undef CFF_FIELD_DELTA
#define CFF_FIELD_DELTA( code, name, max ) \ #define CFF_FIELD_DELTA( code, name, max ) \
{ \ { \
cff_kind_delta, \ cff_kind_delta, \
@ -620,82 +604,48 @@
#else /* FT_CONFIG_OPTION_PIC */ #else /* FT_CONFIG_OPTION_PIC */
void FT_Destroy_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler* clazz) void
cff_field_handlers_init( CFF_Field_Handler* clazz )
{ {
FT_Memory memory = library->memory; #define CFF_FIELD_CALLBACK( code_, name_ ) \
if ( clazz ) clazz->kind = cff_kind_callback; \
FT_FREE( clazz ); clazz->code = code_ | CFFCODE; \
} clazz->offset = 0; \
clazz->size = 0; \
clazz->reader = cff_parse_ ## name_; \
clazz->array_max = 0; \
clazz->count_offset = 0; \
clazz++;
FT_Error FT_Create_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler** output_class) #define CFF_FIELD( code_, name_, kind_ ) \
{ clazz->kind = kind_; \
CFF_Field_Handler* clazz; clazz->code = code_ | CFFCODE; \
FT_Error error; clazz->offset = FT_FIELD_OFFSET( name_ ); \
FT_Memory memory = library->memory; clazz->size = FT_FIELD_SIZE( name_ ); \
int i=0; clazz->reader = 0; \
clazz->array_max = 0; \
clazz->count_offset = 0; \
clazz++;
#undef CFF_FIELD #define CFF_FIELD_DELTA( code_, name_, max_ ) \
#undef CFF_FIELD_DELTA clazz->kind = cff_kind_delta; \
#undef CFF_FIELD_CALLBACK clazz->code = code_ | CFFCODE; \
#define CFF_FIELD_CALLBACK( code, name ) i++; clazz->offset = FT_FIELD_OFFSET( name_ ); \
#define CFF_FIELD( code, name, kind ) i++; clazz->size = FT_FIELD_SIZE_DELTA( name_ ); \
#define CFF_FIELD_DELTA( code, name, max ) i++; clazz->reader = 0; \
clazz->array_max = max_; \
#include "cfftoken.h" clazz->count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
i++;/*{ 0, 0, 0, 0, 0, 0, 0 }*/ clazz++;
if ( FT_ALLOC( clazz, sizeof(CFF_Field_Handler)*i ) )
return error;
i=0;
#undef CFF_FIELD
#undef CFF_FIELD_DELTA
#undef CFF_FIELD_CALLBACK
#define CFF_FIELD_CALLBACK( code_, name_ ) \
clazz[i].kind = cff_kind_callback; \
clazz[i].code = code_ | CFFCODE; \
clazz[i].offset = 0; \
clazz[i].size = 0; \
clazz[i].reader = cff_parse_ ## name_; \
clazz[i].array_max = 0; \
clazz[i].count_offset = 0; \
i++;
#undef CFF_FIELD
#define CFF_FIELD( code_, name_, kind_ ) \
clazz[i].kind = kind_; \
clazz[i].code = code_ | CFFCODE; \
clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
clazz[i].size = FT_FIELD_SIZE( name_ ); \
clazz[i].reader = 0; \
clazz[i].array_max = 0; \
clazz[i].count_offset = 0; \
i++; \
#undef CFF_FIELD_DELTA
#define CFF_FIELD_DELTA( code_, name_, max_ ) \
clazz[i].kind = cff_kind_delta; \
clazz[i].code = code_ | CFFCODE; \
clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \
clazz[i].reader = 0; \
clazz[i].array_max = max_; \
clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
i++;
#include "cfftoken.h" #include "cfftoken.h"
clazz[i].kind = 0; clazz->kind = 0;
clazz[i].code = 0; clazz->code = 0;
clazz[i].offset = 0; clazz->offset = 0;
clazz[i].size = 0; clazz->size = 0;
clazz[i].reader = 0; clazz->reader = 0;
clazz[i].array_max = 0; clazz->array_max = 0;
clazz[i].count_offset = 0; clazz->count_offset = 0;
*output_class = clazz;
return FT_Err_Ok;
} }

View File

@ -24,73 +24,56 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from cffdrivr.c */ /* forward declaration of PIC init functions from cffdrivr.c */
FT_Error FT_Create_Class_cff_services( FT_Library, FT_ServiceDescRec**); void ft_pic_init_cff_service_ps_info( FT_Library, FT_Service_PsInfoRec*);
void FT_Destroy_Class_cff_services( FT_Library, FT_ServiceDescRec*); void ft_pic_init_cff_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*);
void FT_Init_Class_cff_service_ps_info( FT_Library, FT_Service_PsInfoRec*); void ft_pic_init_cff_service_ps_name( FT_Library, FT_Service_PsFontNameRec*);
void FT_Init_Class_cff_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*); void ft_pic_init_cff_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*);
void FT_Init_Class_cff_service_ps_name( FT_Library, FT_Service_PsFontNameRec*); void ft_pic_init_cff_service_cid_info( FT_Library, FT_Service_CIDRec*);
void FT_Init_Class_cff_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*);
void FT_Init_Class_cff_service_cid_info( FT_Library, FT_Service_CIDRec*);
/* forward declaration of PIC init functions from cffparse.c */ /* forward declaration of PIC init functions from cffparse.c */
FT_Error FT_Create_Class_cff_field_handlers( FT_Library, CFF_Field_Handler**); void cff_pic_field_handlers_init( CFF_Field_Handler* );
void FT_Destroy_Class_cff_field_handlers( FT_Library, CFF_Field_Handler*);
#if 0 /* defined by cffcmap.h */
/* forward declaration of PIC init functions from cffcmap.c */ /* forward declaration of PIC init functions from cffcmap.c */
void FT_Init_Class_cff_cmap_encoding_class_rec( FT_Library, FT_CMap_ClassRec*); void ft_pic_init_cff_cmap_encoding_class_rec( FT_Library, FT_CMap_ClassRec*);
void FT_Init_Class_cff_cmap_unicode_class_rec( FT_Library, FT_CMap_ClassRec*); void ft_pic_init_cff_cmap_unicode_class_rec( FT_Library, FT_CMap_ClassRec*);
#endif
void static FT_Error
cff_driver_class_pic_free( FT_Library library ) pic_cff_init( void* _cff, FT_PicTable pic )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_Library library = pic->library;
FT_Memory memory = library->memory; FT_Error error = FT_Err_Ok;
if ( pic_container->cff ) CffModulePIC* container = (CffModulePIC*) _cff;
{
CffModulePIC* container = (CffModulePIC*)pic_container->cff; ft_pic_init_cff_service_ps_info (library, &container->cff_service_ps_info);
if(container->cff_services) ft_pic_init_cff_service_glyph_dict (library, &container->cff_service_glyph_dict);
FT_Destroy_Class_cff_services(library, container->cff_services); ft_pic_init_cff_service_ps_name (library, &container->cff_service_ps_name);
container->cff_services = NULL;
if(container->cff_field_handlers) ft_pic_init_cff_service_get_cmap_info(library, &container->cff_service_get_cmap_info);
FT_Destroy_Class_cff_field_handlers(library, container->cff_field_handlers); ft_pic_init_cff_service_cid_info (library, &container->cff_service_cid_info);
container->cff_field_handlers = NULL;
FT_FREE( container ); ft_pic_init_cff_cmap_encoding_class_rec (library,
pic_container->cff = NULL; &container->cff_cmap_encoding_class_rec);
} ft_pic_init_cff_cmap_unicode_class_rec (library,
&container->cff_cmap_unicode_class_rec);
cff_pic_field_handlers_init(container->cff_field_handlers);
ft_pic_services_init_Cff( &container->cff_services, library );
return 0;
} }
FT_Error FT_Error
cff_driver_class_pic_init( FT_Library library ) cff_driver_class_pic_init( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic = &library->pic_table;
FT_Error error = FT_Err_Ok;
CffModulePIC* container;
FT_Memory memory = library->memory;
/* allocate pointer, clear and set global container pointer */ return ft_pic_table_init_data( pic, pic->cff,
if ( FT_ALLOC ( container, sizeof ( *container ) ) ) sizeof(CffModulePIC),
return error; pic_cff_init,
FT_MEM_SET( container, 0, sizeof(*container) ); NULL );
pic_container->cff = container;
/* initialize pointer table - this is how the module usually expects this data */
error = FT_Create_Class_cff_services(library, &container->cff_services);
if(error)
goto Exit;
error = FT_Create_Class_cff_field_handlers(library, &container->cff_field_handlers);
if(error)
goto Exit;
FT_Init_Class_cff_service_ps_info(library, &container->cff_service_ps_info);
FT_Init_Class_cff_service_glyph_dict(library, &container->cff_service_glyph_dict);
FT_Init_Class_cff_service_ps_name(library, &container->cff_service_ps_name);
FT_Init_Class_cff_service_get_cmap_info(library, &container->cff_service_get_cmap_info);
FT_Init_Class_cff_service_cid_info(library, &container->cff_service_cid_info);
FT_Init_Class_cff_cmap_encoding_class_rec(library, &container->cff_cmap_encoding_class_rec);
FT_Init_Class_cff_cmap_unicode_class_rec(library, &container->cff_cmap_unicode_class_rec);
Exit:
if(error)
cff_driver_class_pic_free(library);
return error;
} }
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */

View File

@ -19,21 +19,38 @@
#ifndef __CFFPIC_H__ #ifndef __CFFPIC_H__
#define __CFFPIC_H__ #define __CFFPIC_H__
FT_BEGIN_HEADER FT_BEGIN_HEADER
#include FT_INTERNAL_OBJECTS_H
/* CFF services list */
#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
# define IF_GLYPH_NAMES(x) x
#else
# define IF_GLYPH_NAMES(x) /* nothing */
#endif
#define CFF_SERVICE_ITEMS \
_FT_SERVICE_ITEM( XF86_NAME, FT_XF86_FORMAT_CFF ) \
_FT_SERVICE_ITEM( POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET ) \
_FT_SERVICE_ITEM( POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET ) \
IF_GLYPH_NAMES( \
_FT_SERVICE_ITEM( GLYPH_DICT, &FT_CFF_SERVICE_GLYPH_DICT_GET ) \
) \
_FT_SERVICE_ITEM( TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET ) \
_FT_SERVICE_ITEM( CID, &FT_CFF_SERVICE_CID_INFO_GET ) \
#define FT_SERVICE_NAME Cff
#define FT_SERVICE_ITEMS CFF_SERVICE_ITEMS
#include FT_INTERNAL_SERVICE_LIST_DECLARE_H
#include FT_INTERNAL_PIC_H #include FT_INTERNAL_PIC_H
#ifndef FT_CONFIG_OPTION_PIC #ifndef FT_CONFIG_OPTION_PIC
#define FT_CFF_SERVICE_PS_INFO_GET cff_service_ps_info #define FT_CFF_CONST_(name_) cff_##name_
#define FT_CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict
#define FT_CFF_SERVICE_PS_NAME_GET cff_service_ps_name
#define FT_CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info
#define FT_CFF_SERVICE_CID_INFO_GET cff_service_cid_info
#define FT_CFF_SERVICES_GET cff_services
#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec
#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec
#define FT_CFF_FIELD_HANDLERS_GET cff_field_handlers
#else /* FT_CONFIG_OPTION_PIC */ #else /* FT_CONFIG_OPTION_PIC */
@ -44,32 +61,44 @@ FT_BEGIN_HEADER
#include FT_SERVICE_TT_CMAP_H #include FT_SERVICE_TT_CMAP_H
#include FT_SERVICE_CID_H #include FT_SERVICE_CID_H
/* count the number of items declared by cfftoken.h */
enum {
CFF_FIELD_HANDLER_COUNT = 0
#define CFF_FIELD(x,y,z) +1
#define CFF_FIELD_CALLBACK(x,y) +1
#define CFF_FIELD_DELTA(x,y,z) +1
#include "cfftoken.h"
};
typedef struct CffModulePIC_ typedef struct CffModulePIC_
{ {
FT_ServiceDescRec* cff_services; FT_Service_PsInfoRec cff_service_ps_info;
CFF_Field_Handler* cff_field_handlers; FT_Service_GlyphDictRec cff_service_glyph_dict;
FT_Service_PsInfoRec cff_service_ps_info;
FT_Service_GlyphDictRec cff_service_glyph_dict;
FT_Service_PsFontNameRec cff_service_ps_name; FT_Service_PsFontNameRec cff_service_ps_name;
FT_Service_TTCMapsRec cff_service_get_cmap_info; FT_Service_TTCMapsRec cff_service_get_cmap_info;
FT_Service_CIDRec cff_service_cid_info; FT_Service_CIDRec cff_service_cid_info;
FT_CMap_ClassRec cff_cmap_encoding_class_rec; FT_CMap_ClassRec cff_cmap_encoding_class_rec;
FT_CMap_ClassRec cff_cmap_unicode_class_rec; FT_CMap_ClassRec cff_cmap_unicode_class_rec;
CFF_Field_Handler cff_field_handlers[CFF_FIELD_HANDLER_COUNT+1];
FT_ServiceItems_Cff cff_services;
} CffModulePIC; } CffModulePIC;
#define GET_PIC(lib) ((CffModulePIC*)((lib)->pic_container.cff)) #define CFF_GET_PIC(lib) ((CffModulePIC*)FT_LIBRARY_GET_PIC_DATA(lib,cff))
#define FT_CFF_SERVICE_PS_INFO_GET (GET_PIC(library)->cff_service_ps_info) #define FT_CFF_CONST_(name_) (CFF_GET_PIC(library)->cff_##name_)
#define FT_CFF_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->cff_service_glyph_dict)
#define FT_CFF_SERVICE_PS_NAME_GET (GET_PIC(library)->cff_service_ps_name)
#define FT_CFF_SERVICE_GET_CMAP_INFO_GET (GET_PIC(library)->cff_service_get_cmap_info)
#define FT_CFF_SERVICE_CID_INFO_GET (GET_PIC(library)->cff_service_cid_info)
#define FT_CFF_SERVICES_GET (GET_PIC(library)->cff_services)
#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET (GET_PIC(library)->cff_cmap_encoding_class_rec)
#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET (GET_PIC(library)->cff_cmap_unicode_class_rec)
#define FT_CFF_FIELD_HANDLERS_GET (GET_PIC(library)->cff_field_handlers)
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */
#define FT_CFF_SERVICE_PS_INFO_GET FT_CFF_CONST_(service_ps_info)
#define FT_CFF_SERVICE_GLYPH_DICT_GET FT_CFF_CONST_(service_glyph_dict)
#define FT_CFF_SERVICE_PS_NAME_GET FT_CFF_CONST_(service_ps_name)
#define FT_CFF_SERVICE_GET_CMAP_INFO_GET FT_CFF_CONST_(service_get_cmap_info)
#define FT_CFF_SERVICE_CID_INFO_GET FT_CFF_CONST_(service_cid_info)
#define FT_CFF_SERVICES_GET FT_CFF_CONST_(services)
#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET FT_CFF_CONST_(cmap_encoding_class_rec)
#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET FT_CFF_CONST_(cmap_unicode_class_rec)
#define FT_CFF_FIELD_HANDLERS_GET FT_CFF_CONST_(field_handlers)
/* */ /* */
FT_END_HEADER FT_END_HEADER

View File

@ -15,6 +15,42 @@
/* */ /* */
/***************************************************************************/ /***************************************************************************/
#ifndef CFF_FIELD
#error CFF_FIELD must be defined
#endif
#ifndef CFF_FIELD_DELTA
#error CFF_FIELD_DELTA must be defined
#endif
#ifndef CFF_FIELD_CALLBACK
#error CFF_FIELD_CALLBACK must be defined
#endif
#ifndef CFF_FIELD_NUM
#define CFF_FIELD_NUM( code, name ) \
CFF_FIELD( code, name, cff_kind_num )
#endif
#ifndef CFF_FIELD_FIXED
#define CFF_FIELD_FIXED( code, name ) \
CFF_FIELD( code, name, cff_kind_fixed )
#endif
#ifndef CFF_FIELD_FIXED_1000
#define CFF_FIELD_FIXED_1000( code, name ) \
CFF_FIELD( code, name, cff_kind_fixed_thousand )
#endif
#ifndef CFF_FIELD_STRING
#define CFF_FIELD_STRING( code, name ) \
CFF_FIELD( code, name, cff_kind_string )
#endif
#ifndef CFF_FIELD_BOOL
#define CFF_FIELD_BOOL( code, name ) \
CFF_FIELD( code, name, cff_kind_bool )
#endif
#undef FT_STRUCTURE #undef FT_STRUCTURE
#define FT_STRUCTURE CFF_FontRecDictRec #define FT_STRUCTURE CFF_FontRecDictRec
@ -93,5 +129,14 @@
CFF_FIELD_NUM ( 20, default_width ) CFF_FIELD_NUM ( 20, default_width )
CFF_FIELD_NUM ( 21, nominal_width ) CFF_FIELD_NUM ( 21, nominal_width )
#undef CFF_FIELD_STRING
#undef CFF_FIELD_BOOL
#undef CFF_FIELD_NUM
#undef CFF_FIELD_FIXED
#undef CFF_FIELD_FIXED_1000
#undef CFF_FIELD_DELTA
#undef CFF_FIELD_CALLBACK
#undef CFF_FIELD
/* END */ /* END */

View File

@ -24,44 +24,46 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from pshmod.c */ /* forward declaration of PIC init functions from pshmod.c */
void FT_Init_Class_pshinter_interface( FT_Library, PSHinter_Interface*); void ft_pic_init_pshinter_interface( FT_Library, PSHinter_Interface*);
void void
pshinter_module_class_pic_free( FT_Library library ) pshinter_module_class_pic_free( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Memory memory = library->memory; FT_Memory memory = library->memory;
if ( pic_container->pshinter )
if ( pic_table->pshinter )
{ {
FT_FREE( pic_container->pshinter ); FT_FREE( pic_table->pshinter );
pic_container->pshinter = NULL; pic_table->pshinter = NULL;
} }
} }
FT_Error FT_Error
pshinter_module_class_pic_init( FT_Library library ) pshinter_module_class_pic_init( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
FT_Memory memory = library->memory;
PSHinterPIC* container; PSHinterPIC* container;
FT_Memory memory = library->memory;
/* allocate pointer, clear and set global container pointer */ /* allocate pointer, clear and set global container pointer */
if ( FT_ALLOC ( container, sizeof ( *container ) ) ) if ( FT_NEW ( container ) )
return error; return error;
FT_MEM_SET( container, 0, sizeof(*container) );
pic_container->pshinter = container; pic_table->pshinter = container;
/* add call to initialization function when you add new scripts */ /* add call to initialization function when you add new scripts */
FT_Init_Class_pshinter_interface(library, &container->pshinter_interface); ft_pic_init_pshinter_interface(library, &container->pshinter_interface);
/*Exit:*/ /*Exit:*/
if(error) if(error)
pshinter_module_class_pic_free(library); pshinter_module_class_pic_free(library);
return error; return error;
} }
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */
/* END */ /* END */

View File

@ -37,7 +37,7 @@ FT_BEGIN_HEADER
PSHinter_Interface pshinter_interface; PSHinter_Interface pshinter_interface;
} PSHinterPIC; } PSHinterPIC;
#define GET_PIC(lib) ((PSHinterPIC*)((lib)->pic_container.autofit)) #define GET_PIC(lib) ((PSHinterPIC*)((lib)->pic_table.autofit))
#define FTPSHINTER_INTERFACE_GET (GET_PIC(library)->pshinter_interface) #define FTPSHINTER_INTERFACE_GET (GET_PIC(library)->pshinter_interface)

View File

@ -24,49 +24,58 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from psmodule.c */ /* forward declaration of PIC init functions from psmodule.c */
FT_Error FT_Create_Class_pscmaps_services( FT_Library, FT_ServiceDescRec**); FT_Error ft_library_pic_alloc_pscmaps_services ( FT_Library, FT_ServiceDescRec** );
void FT_Destroy_Class_pscmaps_services( FT_Library, FT_ServiceDescRec*); void ft_library_pic_free_pscmaps_services( FT_Library, FT_ServiceDescRec* );
void FT_Init_Class_pscmaps_interface( FT_Library, FT_Service_PsCMapsRec*); void ft_pic_init_pscmaps_interface ( FT_Library, FT_Service_PsCMapsRec* );
void void
psnames_module_class_pic_free( FT_Library library ) psnames_module_class_pic_free( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Memory memory = library->memory; FT_Memory memory = library->memory;
if ( pic_container->psnames )
if ( pic_table->psnames )
{ {
PSModulePIC* container = (PSModulePIC*)pic_container->psnames; PSModulePIC* container = (PSModulePIC*)pic_table->psnames;
if(container->pscmaps_services) if(container->pscmaps_services)
FT_Destroy_Class_pscmaps_services(library, container->pscmaps_services); ft_library_pic_free_pscmaps_services(library, container->pscmaps_services);
container->pscmaps_services = NULL; container->pscmaps_services = NULL;
FT_FREE( container ); FT_FREE( container );
pic_container->psnames = NULL;
pic_table->psnames = NULL;
} }
} }
FT_Error FT_Error
psnames_module_class_pic_init( FT_Library library ) psnames_module_class_pic_init( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
PSModulePIC* container; FT_Memory memory = library->memory;
FT_Memory memory = library->memory; PSModulePIC* container;
/* allocate pointer, clear and set global container pointer */ /* allocate pointer, clear and set global container pointer */
if ( FT_ALLOC ( container, sizeof ( *container ) ) ) if ( FT_NEW ( container ) )
return error; return error;
FT_MEM_SET( container, 0, sizeof(*container) );
pic_container->psnames = container; pic_table->psnames = container;
/* initialize pointer table - this is how the module usually expects this data */ /* initialize pointer table - this is how the module usually expects this data */
error = FT_Create_Class_pscmaps_services(library, &container->pscmaps_services); error = ft_library_pic_alloc_pscmaps_services(library, &container->pscmaps_services);
if(error) if(error)
goto Exit; goto Exit;
FT_Init_Class_pscmaps_interface(library, &container->pscmaps_interface);
ft_pic_init_pscmaps_interface(library, &container->pscmaps_interface);
Exit: Exit:
if(error) if(error)
psnames_module_class_pic_free(library); psnames_module_class_pic_free(library);
return error; return error;
} }

View File

@ -38,7 +38,7 @@ FT_BEGIN_HEADER
FT_Service_PsCMapsRec pscmaps_interface; FT_Service_PsCMapsRec pscmaps_interface;
} PSModulePIC; } PSModulePIC;
#define GET_PIC(lib) ((PSModulePIC*)((lib)->pic_container.psnames)) #define GET_PIC(lib) ((PSModulePIC*)((lib)->pic_table.psnames))
#define FT_PSCMAPS_SERVICES_GET (GET_PIC(library)->pscmaps_services) #define FT_PSCMAPS_SERVICES_GET (GET_PIC(library)->pscmaps_services)
#define FT_PSCMAPS_INTERFACE_GET (GET_PIC(library)->pscmaps_interface) #define FT_PSCMAPS_INTERFACE_GET (GET_PIC(library)->pscmaps_interface)

View File

@ -24,20 +24,23 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from ftraster.c */ /* forward declaration of PIC init functions from ftraster.c */
void FT_Init_Class_ft_standard_raster(FT_Raster_Funcs*); void ft_pic_init_ft_standard_raster(FT_Raster_Funcs*);
void void
ft_raster1_renderer_class_pic_free( FT_Library library ) ft_raster1_renderer_class_pic_free( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Memory memory = library->memory; FT_Memory memory = library->memory;
if ( pic_container->raster )
if ( pic_table->raster )
{ {
RasterPIC* container = (RasterPIC*)pic_container->raster; RasterPIC* container = (RasterPIC*)pic_table->raster;
if(--container->ref_count) if(--container->ref_count)
return; return;
FT_FREE( container ); FT_FREE( container );
pic_container->raster = NULL; pic_table->raster = NULL;
} }
} }
@ -45,31 +48,32 @@
FT_Error FT_Error
ft_raster1_renderer_class_pic_init( FT_Library library ) ft_raster1_renderer_class_pic_init( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
RasterPIC* container; FT_Memory memory = library->memory;
FT_Memory memory = library->memory; RasterPIC* container;
/* since this function also serve raster5 renderer, /* since this function also serve raster5 renderer,
it implements reference counting */ it implements reference counting */
if(pic_container->raster) if(pic_table->raster)
{ {
((RasterPIC*)pic_container->raster)->ref_count++; ((RasterPIC*)pic_table->raster)->ref_count++;
return error; return error;
} }
/* allocate pointer, clear and set global container pointer */ /* allocate pointer, clear and set global container pointer */
if ( FT_ALLOC ( container, sizeof ( *container ) ) ) if ( FT_NEW ( container ) )
return error; return error;
FT_MEM_SET( container, 0, sizeof(*container) );
pic_container->raster = container; pic_table->raster = container;
container->ref_count = 1; container->ref_count = 1;
/* initialize pointer table - this is how the module usually expects this data */ /* initialize pointer table - this is how the module usually expects this data */
FT_Init_Class_ft_standard_raster(&container->ft_standard_raster); ft_pic_init_ft_standard_raster(&container->ft_standard_raster);
/*Exit:*/ /*Exit:*/
if(error) if(error)
ft_raster1_renderer_class_pic_free(library); ft_raster1_renderer_class_pic_free(library);
return error; return error;
} }
@ -78,6 +82,7 @@
{ {
return ft_raster1_renderer_class_pic_init(library); return ft_raster1_renderer_class_pic_init(library);
} }
void ft_raster5_renderer_class_pic_free(FT_Library library) void ft_raster5_renderer_class_pic_free(FT_Library library)
{ {
ft_raster1_renderer_class_pic_free(library); ft_raster1_renderer_class_pic_free(library);

View File

@ -35,7 +35,7 @@ FT_BEGIN_HEADER
FT_Raster_Funcs ft_standard_raster; FT_Raster_Funcs ft_standard_raster;
} RasterPIC; } RasterPIC;
#define GET_PIC(lib) ((RasterPIC*)((lib)->pic_container.raster)) #define GET_PIC(lib) ((RasterPIC*)((lib)->pic_table.raster))
#define FT_STANDARD_RASTER_GET (GET_PIC(library)->ft_standard_raster) #define FT_STANDARD_RASTER_GET (GET_PIC(library)->ft_standard_raster)
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */

View File

@ -24,35 +24,40 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from sfdriver.c */ /* forward declaration of PIC init functions from sfdriver.c */
FT_Error FT_Create_Class_sfnt_services( FT_Library, FT_ServiceDescRec**); FT_Error ft_library_pic_alloc_sfnt_services( FT_Library, FT_ServiceDescRec**);
void FT_Destroy_Class_sfnt_services( FT_Library, FT_ServiceDescRec*); void ft_library_pic_free_sfnt_services( FT_Library, FT_ServiceDescRec*);
void FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*); void ft_pic_init_sfnt_service_bdf( FT_Service_BDFRec*);
void FT_Init_Class_sfnt_interface( FT_Library, SFNT_Interface*); void ft_pic_init_sfnt_interface( FT_Library, SFNT_Interface*);
void FT_Init_Class_sfnt_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*); void ft_pic_init_sfnt_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*);
void FT_Init_Class_sfnt_service_ps_name( FT_Library, FT_Service_PsFontNameRec*); void ft_pic_init_sfnt_service_ps_name( FT_Library, FT_Service_PsFontNameRec*);
void FT_Init_Class_tt_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*); void ft_pic_init_tt_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*);
void FT_Init_Class_sfnt_service_sfnt_table( FT_Service_SFNT_TableRec*); void ft_pic_init_sfnt_service_sfnt_table( FT_Service_SFNT_TableRec*);
/* forward declaration of PIC init functions from ttcmap.c */ /* forward declaration of PIC init functions from ttcmap.c */
FT_Error FT_Create_Class_tt_cmap_classes( FT_Library, TT_CMap_Class**); FT_Error ft_library_pic_alloc_tt_cmap_classes( FT_Library, TT_CMap_Class**);
void FT_Destroy_Class_tt_cmap_classes( FT_Library, TT_CMap_Class*); void ft_library_pic_free_tt_cmap_classes( FT_Library, TT_CMap_Class*);
void void
sfnt_module_class_pic_free( FT_Library library ) sfnt_module_class_pic_free( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Memory memory = library->memory; FT_Memory memory = library->memory;
if ( pic_container->sfnt )
if ( pic_table->sfnt )
{ {
sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; sfntModulePIC* container = (sfntModulePIC*)pic_table->sfnt;
if(container->sfnt_services) if(container->sfnt_services)
FT_Destroy_Class_sfnt_services(library, container->sfnt_services); ft_library_pic_free_sfnt_services(library, container->sfnt_services);
container->sfnt_services = NULL; container->sfnt_services = NULL;
if(container->tt_cmap_classes) if(container->tt_cmap_classes)
FT_Destroy_Class_tt_cmap_classes(library, container->tt_cmap_classes); {
container->tt_cmap_classes = NULL; ft_library_pic_free_tt_cmap_classes(library, container->tt_cmap_classes);
container->tt_cmap_classes = NULL;
}
FT_FREE( container ); FT_FREE( container );
pic_container->sfnt = NULL; pic_table->sfnt = NULL;
} }
} }
@ -60,36 +65,40 @@
FT_Error FT_Error
sfnt_module_class_pic_init( FT_Library library ) sfnt_module_class_pic_init( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
sfntModulePIC* container; FT_Memory memory = library->memory;
FT_Memory memory = library->memory; sfntModulePIC* container;
/* allocate pointer, clear and set global container pointer */ /* allocate pointer, clear and set global container pointer */
if ( FT_ALLOC ( container, sizeof ( *container ) ) ) if ( FT_NEW ( container ) )
return error; return error;
FT_MEM_SET( container, 0, sizeof(*container) );
pic_container->sfnt = container; pic_table->sfnt = container;
/* initialize pointer table - this is how the module usually expects this data */ /* initialize pointer table - this is how the module usually expects this data */
error = FT_Create_Class_sfnt_services(library, &container->sfnt_services); error = ft_library_pic_alloc_sfnt_services(library, &container->sfnt_services);
if(error) if(error)
goto Exit; goto Exit;
error = FT_Create_Class_tt_cmap_classes(library, &container->tt_cmap_classes);
if(error) error = ft_library_pic_alloc_tt_cmap_classes(library, &container->tt_cmap_classes);
if(error)
goto Exit; goto Exit;
FT_Init_Class_sfnt_service_glyph_dict(library, &container->sfnt_service_glyph_dict);
FT_Init_Class_sfnt_service_ps_name(library, &container->sfnt_service_ps_name); ft_pic_init_sfnt_service_glyph_dict (library, &container->sfnt_service_glyph_dict);
FT_Init_Class_tt_service_get_cmap_info(library, &container->tt_service_get_cmap_info); ft_pic_init_sfnt_service_ps_name (library, &container->sfnt_service_ps_name);
FT_Init_Class_sfnt_service_sfnt_table(&container->sfnt_service_sfnt_table); ft_pic_init_tt_service_get_cmap_info(library, &container->tt_service_get_cmap_info);
ft_pic_init_sfnt_service_sfnt_table(&container->sfnt_service_sfnt_table);
#ifdef TT_CONFIG_OPTION_BDF #ifdef TT_CONFIG_OPTION_BDF
FT_Init_Class_sfnt_service_bdf(&container->sfnt_service_bdf); ft_pic_init_sfnt_service_bdf (&container->sfnt_service_bdf);
#endif #endif
FT_Init_Class_sfnt_interface(library, &container->sfnt_interface); ft_pic_init_sfnt_interface(library, &container->sfnt_interface);
Exit: Exit:
if(error) if(error)
sfnt_module_class_pic_free(library); sfnt_module_class_pic_free(library);
return error; return error;
} }

View File

@ -65,7 +65,7 @@ typedef struct sfntModulePIC_
SFNT_Interface sfnt_interface; SFNT_Interface sfnt_interface;
} sfntModulePIC; } sfntModulePIC;
#define GET_PIC(lib) ((sfntModulePIC*)((lib)->pic_container.sfnt)) #define GET_PIC(lib) ((sfntModulePIC*)((lib)->pic_table.sfnt))
#define FT_SFNT_SERVICES_GET (GET_PIC(library)->sfnt_services) #define FT_SFNT_SERVICES_GET (GET_PIC(library)->sfnt_services)
#define FT_SFNT_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->sfnt_service_glyph_dict) #define FT_SFNT_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->sfnt_service_glyph_dict)
#define FT_SFNT_SERVICE_PS_NAME_GET (GET_PIC(library)->sfnt_service_ps_name) #define FT_SFNT_SERVICE_PS_NAME_GET (GET_PIC(library)->sfnt_service_ps_name)

View File

@ -3339,14 +3339,14 @@
#else /*FT_CONFIG_OPTION_PIC*/ #else /*FT_CONFIG_OPTION_PIC*/
void FT_Destroy_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class* clazz) void ft_library_pic_free_tt_cmap_classes(FT_Library library, TT_CMap_Class* clazz)
{ {
FT_Memory memory = library->memory; FT_Memory memory = library->memory;
if ( clazz ) if ( clazz )
FT_FREE( clazz ); FT_FREE( clazz );
} }
FT_Error FT_Create_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class** output_class) FT_Error ft_library_pic_alloc_tt_cmap_classes(FT_Library library, TT_CMap_Class** output_class)
{ {
TT_CMap_Class* clazz; TT_CMap_Class* clazz;
TT_CMap_ClassRec* recs; TT_CMap_ClassRec* recs;
@ -3367,7 +3367,7 @@
#undef TTCMAPCITEM #undef TTCMAPCITEM
#define TTCMAPCITEM(a) \ #define TTCMAPCITEM(a) \
FT_Init_Class_##a(&recs[i]); \ ft_pic_init_##a(&recs[i]); \
clazz[i] = &recs[i]; \ clazz[i] = &recs[i]; \
i++; i++;
#include "ttcmapc.h" #include "ttcmapc.h"

View File

@ -77,7 +77,7 @@ FT_BEGIN_HEADER
charvariant_list_,variantchar_list_, \ charvariant_list_,variantchar_list_, \
format_, validate_, get_cmap_info_) \ format_, validate_, get_cmap_info_) \
void \ void \
FT_Init_Class_##class_( TT_CMap_ClassRec* clazz ) \ ft_pic_init_##class_( TT_CMap_ClassRec* clazz ) \
{ \ { \
clazz->clazz.size = size_; \ clazz->clazz.size = size_; \
clazz->clazz.init = init_; \ clazz->clazz.init = init_; \

View File

@ -24,20 +24,23 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from ftgrays.c */ /* forward declaration of PIC init functions from ftgrays.c */
void FT_Init_Class_ft_grays_raster(FT_Raster_Funcs*); void ft_pic_init_ft_grays_raster(FT_Raster_Funcs*);
void void
ft_smooth_renderer_class_pic_free( FT_Library library ) ft_smooth_renderer_class_pic_free( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Memory memory = library->memory; FT_Memory memory = library->memory;
if ( pic_container->smooth )
if ( pic_table->smooth )
{ {
SmoothPIC* container = (SmoothPIC*)pic_container->smooth; SmoothPIC* container = (SmoothPIC*)pic_table->smooth;
if(--container->ref_count) if(--container->ref_count)
return; return;
FT_FREE( container ); FT_FREE( container );
pic_container->smooth = NULL; pic_table->smooth = NULL;
} }
} }
@ -45,31 +48,32 @@
FT_Error FT_Error
ft_smooth_renderer_class_pic_init( FT_Library library ) ft_smooth_renderer_class_pic_init( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
SmoothPIC* container; FT_Memory memory = library->memory;
FT_Memory memory = library->memory; SmoothPIC* container;
/* since this function also serve smooth_lcd and smooth_lcdv renderers, /* since this function also serve smooth_lcd and smooth_lcdv renderers,
it implements reference counting */ it implements reference counting */
if(pic_container->smooth) if(pic_table->smooth)
{ {
((SmoothPIC*)pic_container->smooth)->ref_count++; ((SmoothPIC*)pic_table->smooth)->ref_count++;
return error; return error;
} }
/* allocate pointer, clear and set global container pointer */ /* allocate pointer, clear and set global container pointer */
if ( FT_ALLOC ( container, sizeof ( *container ) ) ) if ( FT_NEW ( container ) )
return error; return error;
FT_MEM_SET( container, 0, sizeof(*container) );
pic_container->smooth = container; pic_table->smooth = container;
container->ref_count = 1; container->ref_count = 1;
/* initialize pointer table - this is how the module usually expects this data */ /* initialize pointer table - this is how the module usually expects this data */
FT_Init_Class_ft_grays_raster(&container->ft_grays_raster); ft_pic_init_ft_grays_raster(&container->ft_grays_raster);
/*Exit:*/ /*Exit:*/
if(error) if(error)
ft_smooth_renderer_class_pic_free(library); ft_smooth_renderer_class_pic_free(library);
return error; return error;
} }

View File

@ -35,7 +35,7 @@ FT_BEGIN_HEADER
FT_Raster_Funcs ft_grays_raster; FT_Raster_Funcs ft_grays_raster;
} SmoothPIC; } SmoothPIC;
#define GET_PIC(lib) ((SmoothPIC*)((lib)->pic_container.smooth)) #define GET_PIC(lib) ((SmoothPIC*)((lib)->pic_table.smooth))
#define FT_GRAYS_RASTER_GET (GET_PIC(library)->ft_grays_raster) #define FT_GRAYS_RASTER_GET (GET_PIC(library)->ft_grays_raster)
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */

View File

@ -24,53 +24,52 @@
#ifdef FT_CONFIG_OPTION_PIC #ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from ttdriver.c */ /* forward declaration of PIC init functions from ttdriver.c */
FT_Error FT_Create_Class_tt_services( FT_Library, FT_ServiceDescRec**); FT_Error ft_library_pic_alloc_tt_services( FT_Library, FT_ServiceDescRec**);
void FT_Destroy_Class_tt_services( FT_Library, FT_ServiceDescRec*); void ft_library_pic_free_tt_services( FT_Library, FT_ServiceDescRec*);
void FT_Init_Class_tt_service_gx_multi_masters(FT_Service_MultiMastersRec*); void ft_pic_init_tt_service_gx_multi_masters(FT_Service_MultiMastersRec*);
void FT_Init_Class_tt_service_truetype_glyf(FT_Service_TTGlyfRec*); void ft_pic_init_tt_service_truetype_glyf(FT_Service_TTGlyfRec*);
void static void
tt_driver_class_pic_free( FT_Library library ) pic_tt_driver_done( void* data, FT_PicTable pic )
{ {
FT_PIC_Container* pic_container = &library->pic_container; TTModulePIC* container = (TTModulePIC*) data;
FT_Memory memory = library->memory;
if ( pic_container->truetype ) if (container->tt_services)
{ {
TTModulePIC* container = (TTModulePIC*)pic_container->truetype; ft_library_pic_free_tt_services(pic->library, container->tt_services);
if(container->tt_services)
FT_Destroy_Class_tt_services(library, container->tt_services);
container->tt_services = NULL; container->tt_services = NULL;
FT_FREE( container );
pic_container->truetype = NULL;
} }
} }
static FT_Error
pic_tt_driver_init( void* data, FT_PicTable pic )
{
TTModulePIC* container = (TTModulePIC*) data;
FT_Error error;
error = ft_library_pic_alloc_tt_services(pic->library, &container->tt_services);
if (error)
goto Exit;
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
ft_pic_init_tt_service_gx_multi_masters(&container->tt_service_gx_multi_masters);
#endif
ft_pic_init_tt_service_truetype_glyf(&container->tt_service_truetype_glyf);
Exit:
return error;
}
FT_Error FT_Error
tt_driver_class_pic_init( FT_Library library ) tt_driver_class_pic_init( FT_Library library )
{ {
FT_PIC_Container* pic_container = &library->pic_container; FT_PicTable pic_table = &library->pic_table;
FT_Error error = FT_Err_Ok;
TTModulePIC* container;
FT_Memory memory = library->memory;
/* allocate pointer, clear and set global container pointer */ return ft_pic_table_init_data( pic_table,
if ( FT_ALLOC ( container, sizeof ( *container ) ) ) pic_table->truetype,
return error; sizeof(TTModulePIC),
FT_MEM_SET( container, 0, sizeof(*container) ); pic_tt_driver_init,
pic_container->truetype = container; pic_tt_driver_done );
/* initialize pointer table - this is how the module usually expects this data */
error = FT_Create_Class_tt_services(library, &container->tt_services);
if(error)
goto Exit;
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
FT_Init_Class_tt_service_gx_multi_masters(&container->tt_service_gx_multi_masters);
#endif
FT_Init_Class_tt_service_truetype_glyf(&container->tt_service_truetype_glyf);
Exit:
if(error)
tt_driver_class_pic_free(library);
return error;
} }
#endif /* FT_CONFIG_OPTION_PIC */ #endif /* FT_CONFIG_OPTION_PIC */

View File

@ -42,7 +42,7 @@ FT_BEGIN_HEADER
FT_Service_TTGlyfRec tt_service_truetype_glyf; FT_Service_TTGlyfRec tt_service_truetype_glyf;
} TTModulePIC; } TTModulePIC;
#define GET_PIC(lib) ((TTModulePIC*)((lib)->pic_container.truetype)) #define GET_PIC(lib) ((TTModulePIC*)((lib)->pic_table.truetype))
#define FT_TT_SERVICES_GET (GET_PIC(library)->tt_services) #define FT_TT_SERVICES_GET (GET_PIC(library)->tt_services)
#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET (GET_PIC(library)->tt_service_gx_multi_masters) #define FT_TT_SERVICE_GX_MULTI_MASTERS_GET (GET_PIC(library)->tt_service_gx_multi_masters)
#define FT_TT_SERVICE_TRUETYPE_GLYF_GET (GET_PIC(library)->tt_service_truetype_glyf) #define FT_TT_SERVICE_TRUETYPE_GLYF_GET (GET_PIC(library)->tt_service_truetype_glyf)