psaux.h revision ee451cb395940862dad63c85adfe8f2fd55e864c
1fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/***************************************************************************/ 2fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* */ 337c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul/* psaux.h */ 4fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* */ 537c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul/* Auxiliary functions and data structures related to PostScript fonts */ 6fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* (specification). */ 7fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* */ 8fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* Copyright 1996-2004, 2006, 2008, 2009, 2012 by */ 9fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 10fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* */ 11fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* This file is part of the FreeType project, and may only be used, */ 12fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* modified, and distributed under the terms of the FreeType project */ 13fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 14fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* this file you indicate that you have read the license and */ 15fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* understand and accept it fully. */ 16fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* */ 17fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/***************************************************************************/ 18fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 19fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 20fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#ifndef __PSAUX_H__ 21fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#define __PSAUX_H__ 22fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 23fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 24fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "../../ft2build.h" 25fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "ftobjs.h" 26fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "t1types.h" 27fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "services/svpscmap.h" 28c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian 2937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul 309846b0627149e221c9fbd7c3379e33fb68e68511Vinson LeeFT_BEGIN_HEADER 3197dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 32c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian 3314b36cd568b7f3ae963430248fcd7ef0b7a165f6Vinson Lee /*************************************************************************/ 34c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian /*************************************************************************/ 3597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul /***** *****/ 36fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /***** T1_TABLE *****/ 37fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /***** *****/ 3897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul /*************************************************************************/ 39fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /*************************************************************************/ 40fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 41cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu 42cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu typedef struct PS_TableRec_* PS_Table; 43cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; 444b55e3695279daef221669ff063631cf3675da0cBrian Paul 454b55e3695279daef221669ff063631cf3675da0cBrian Paul 46fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /*************************************************************************/ 47fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 48fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* <Struct> */ 49fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* PS_Table_FuncsRec */ 50298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* */ 51298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* <Description> */ 52298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* A set of function pointers to manage PS_Table objects. */ 53298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* */ 54298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* <Fields> */ 55fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* table_init :: Used to initialize a table. */ 56fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 57fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* table_done :: Finalizes resp. destroy a given table. */ 58298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* */ 59298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* table_add :: Adds a new object to a table. */ 60298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* */ 61298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* table_release :: Releases table data, then finalizes it. */ 62298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg /* */ 63298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg typedef struct PS_Table_FuncsRec_ 64298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg { 65298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg FT_Error 66fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell (*init)( PS_Table table, 67fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Int count, 68fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Memory memory ); 69fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 70fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell void 71fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell (*done)( PS_Table table ); 72fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 73fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Error 744b55e3695279daef221669ff063631cf3675da0cBrian Paul (*add)( PS_Table table, 754b55e3695279daef221669ff063631cf3675da0cBrian Paul FT_Int idx, 76fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell void* object, 77fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_PtrDist length ); 78fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 79fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell void 80fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell (*release)( PS_Table table ); 814b55e3695279daef221669ff063631cf3675da0cBrian Paul 824b55e3695279daef221669ff063631cf3675da0cBrian Paul } PS_Table_FuncsRec; 834b55e3695279daef221669ff063631cf3675da0cBrian Paul 84fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 85fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /*************************************************************************/ 864b55e3695279daef221669ff063631cf3675da0cBrian Paul /* */ 87fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* <Struct> */ 88fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* PS_TableRec */ 89fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 90fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* <Description> */ 91fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* A PS_Table is a simple object used to store an array of objects in */ 92c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke /* a single memory block. */ 93fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 94fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* <Fields> */ 95fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* block :: The address in memory of the growheap's block. This */ 96fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* can change between two object adds, due to */ 97c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke /* reallocation. */ 98fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 99fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* cursor :: The current top of the grow heap within its block. */ 100fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 101fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* capacity :: The current size of the heap block. Increments by */ 102c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke /* 1kByte chunks. */ 103fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 104fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* init :: Set to 0xDEADBEEF if `elements' and `lengths' have */ 1054b55e3695279daef221669ff063631cf3675da0cBrian Paul /* been allocated. */ 106fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 1074b55e3695279daef221669ff063631cf3675da0cBrian Paul /* max_elems :: The maximum number of elements in table. */ 108fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 109c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke /* num_elems :: The current number of elements in table. */ 110fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 111fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* elements :: A table of element addresses within the block. */ 112fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 113fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* lengths :: A table of element sizes within the block. */ 114fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 1154b55e3695279daef221669ff063631cf3675da0cBrian Paul /* memory :: The object used for memory operations */ 116fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* (alloc/realloc). */ 1174b55e3695279daef221669ff063631cf3675da0cBrian Paul /* */ 118fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* funcs :: A table of method pointers for this object. */ 119c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke /* */ 120fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell typedef struct PS_TableRec_ 1214b55e3695279daef221669ff063631cf3675da0cBrian Paul { 1224b55e3695279daef221669ff063631cf3675da0cBrian Paul FT_Byte* block; /* current memory block */ 123c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke FT_Offset cursor; /* current cursor in memory block */ 124c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke FT_Offset capacity; /* current size of memory block */ 125fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Long init; 126fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 127fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Int max_elems; 1285970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger FT_Int num_elems; 1295970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger FT_Byte** elements; /* addresses of table elements */ 1305970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger FT_PtrDist* lengths; /* lengths of table elements */ 1315970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger 1325970400476c5c0a1223a49e9ec2eb511ae94b246Roland Scheidegger FT_Memory memory; 133fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell PS_Table_FuncsRec funcs; 134fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 1354b55e3695279daef221669ff063631cf3675da0cBrian Paul } PS_TableRec; 1364b55e3695279daef221669ff063631cf3675da0cBrian Paul 1374b55e3695279daef221669ff063631cf3675da0cBrian Paul 1384b55e3695279daef221669ff063631cf3675da0cBrian Paul /*************************************************************************/ 1394b55e3695279daef221669ff063631cf3675da0cBrian Paul /*************************************************************************/ 1404b55e3695279daef221669ff063631cf3675da0cBrian Paul /***** *****/ 1414b55e3695279daef221669ff063631cf3675da0cBrian Paul /***** T1 FIELDS & TOKENS *****/ 1424b55e3695279daef221669ff063631cf3675da0cBrian Paul /***** *****/ 1434b55e3695279daef221669ff063631cf3675da0cBrian Paul /*************************************************************************/ 144fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /*************************************************************************/ 145fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 146c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke typedef struct PS_ParserRec_* PS_Parser; 147fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 1489acf207277b4de91b917b37a92f6b612f4710c80Brian Paul typedef struct T1_TokenRec_* T1_Token; 149fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 150fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell typedef struct T1_FieldRec_* T1_Field; 151fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 152fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 153fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* simple enumeration type used to identify token types */ 154fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell typedef enum T1_TokenType_ 155fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell { 156fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell T1_TOKEN_TYPE_NONE = 0, 15799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_TOKEN_TYPE_ANY, 158fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell T1_TOKEN_TYPE_STRING, 159fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell T1_TOKEN_TYPE_ARRAY, 1604b55e3695279daef221669ff063631cf3675da0cBrian Paul T1_TOKEN_TYPE_KEY, /* aka `name' */ 161f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg 162fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* do not remove */ 16399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_TOKEN_TYPE_MAX 16499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 165fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } T1_TokenType; 1664b55e3695279daef221669ff063631cf3675da0cBrian Paul 16799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 168fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* a simple structure used to identify tokens */ 169dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich typedef struct T1_TokenRec_ 170fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell { 17199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell FT_Byte* start; /* first character of token in input stream */ 17299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell FT_Byte* limit; /* first character after the token */ 17399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_TokenType type; /* type of token */ 17499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 17599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell } T1_TokenRec; 176ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich 177fa48137f292bbf8cbcd65e9caf33633cddc96600Marek Olšák 17837c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul /* enumeration type used to identify object fields */ 17937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul typedef enum T1_FieldType_ 180ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich { 18197e2f625b8bcba96acde29dcd017031e036f4a24Marek Olšák T1_FIELD_TYPE_NONE = 0, 18297e2f625b8bcba96acde29dcd017031e036f4a24Marek Olšák T1_FIELD_TYPE_BOOL, 18337c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul T1_FIELD_TYPE_INTEGER, 18499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_TYPE_FIXED, 18599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_TYPE_FIXED_1000, 18699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_TYPE_STRING, 18799efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_TYPE_KEY, 18899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_TYPE_BBOX, 18999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_TYPE_MM_BBOX, 19099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_TYPE_INTEGER_ARRAY, 19199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_TYPE_FIXED_ARRAY, 192ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich T1_FIELD_TYPE_CALLBACK, 193fa48137f292bbf8cbcd65e9caf33633cddc96600Marek Olšák 194ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich /* do not remove */ 195ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich T1_FIELD_TYPE_MAX 196ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich 1978c990de0d682bbedfd7e1988d4f8948ea99b0cc3Marek Olšák } T1_FieldType; 1988c990de0d682bbedfd7e1988d4f8948ea99b0cc3Marek Olšák 19937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul 20099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell typedef enum T1_FieldLocation_ 201dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul { 202dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul T1_FIELD_LOCATION_CID_INFO, 203dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul T1_FIELD_LOCATION_FONT_DICT, 204dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul T1_FIELD_LOCATION_FONT_EXTRA, 205dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul T1_FIELD_LOCATION_FONT_INFO, 206dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul T1_FIELD_LOCATION_PRIVATE, 207dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul T1_FIELD_LOCATION_BBOX, 208ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich T1_FIELD_LOCATION_LOADER, 209ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich T1_FIELD_LOCATION_FACE, 210ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich T1_FIELD_LOCATION_BLEND, 211dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul 212dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul /* do not remove */ 21399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell T1_FIELD_LOCATION_MAX 214dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul 215dea0d4d56326f148a42c766bdbaf1b5bb247cc59Brian Paul } T1_FieldLocation; 21699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 217fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 21899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell typedef void 2196f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian (*T1_Field_ParseFunc)( FT_Face face, 22099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell FT_Pointer parser ); 22199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell 2222e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez 2232e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez /* structure type used to model object fields */ 2242e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez typedef struct T1_FieldRec_ 22537c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul { 2261c3f7ab74ce492d6c92f2e3a0f29957fa9a71d96Brian Paul const char* ident; /* field identifier */ 2271c3f7ab74ce492d6c92f2e3a0f29957fa9a71d96Brian Paul T1_FieldLocation location; 22837c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul T1_FieldType type; /* type of field */ 22937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul T1_Field_ParseFunc reader; 230bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul FT_UInt offset; /* offset of field in object */ 2316f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian FT_Byte size; /* size of field in bytes */ 2326f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian FT_UInt array_max; /* maximum number of elements for */ 2336f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian /* array */ 2342e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez FT_UInt count_offset; /* offset of element count for */ 2356f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian /* arrays; must not be zero if in */ 2366f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian /* use -- in other words, a */ 2376f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian /* `num_FOO' element must not */ 2382e64c2209e7f9d5acbcc9d70bf315732f3c403b3Francisco Jerez /* start the used structure if we */ 2396f765fbde42a4f729780aa39d2b0ed9d736dd5a8Brian /* parse a `FOO' array */ 24099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell FT_UInt dict; /* where we expect it */ 241fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } T1_FieldRec; 242fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 243492b69f3be3e355064c67bc6f4a30d40e997ce9dMarek Olšák#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ 244492b69f3be3e355064c67bc6f4a30d40e997ce9dMarek Olšák#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) 245492b69f3be3e355064c67bc6f4a30d40e997ce9dMarek Olšák 246ded949ed06e02ef26b1168b101daba04be78155eBrian Paul 247fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 248204991bf5d29caa3fa54df9e4f6898faa73752cfBrian Paul#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ 24937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul { \ 25037c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul _ident, T1CODE, _type, \ 25137c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul 0, \ 252fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_FIELD_OFFSET( _fname ), \ 253fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_FIELD_SIZE( _fname ), \ 254ed42c2580717527b2005580940fc766d95bb6b0bMathias Fröhlich 0, 0, \ 255fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _dict \ 256fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell }, 2571680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell 2581680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ 259c5e473fbe25b20cb27aac44ff6e269701abd33a8Marek Olšák { \ 260fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ 261fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell (T1_Field_ParseFunc)_reader, \ 262fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 0, 0, \ 263f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul 0, 0, \ 264f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul _dict \ 265f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul }, 2664b55e3695279daef221669ff063631cf3675da0cBrian Paul 2674b55e3695279daef221669ff063631cf3675da0cBrian Paul#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ 268c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell { \ 269bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul _ident, T1CODE, _type, \ 270f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg 0, \ 271cfd5298f240612ef69ae321aebbc425710a8d731José Fonseca FT_FIELD_OFFSET( _fname ), \ 2724b55e3695279daef221669ff063631cf3675da0cBrian Paul FT_FIELD_SIZE_DELTA( _fname ), \ 2738ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca _max, \ 2748ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca FT_FIELD_OFFSET( num_ ## _fname ), \ 2758ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca _dict \ 2764b55e3695279daef221669ff063631cf3675da0cBrian Paul }, 2776183edc070e2d3dce36ab5ee7aee72b0c38775a7Ian Romanick 2788ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ 2798ad65a23d14f82461c00b1d8dcc1393167f36ab0José Fonseca { \ 280c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell _ident, T1CODE, _type, \ 281c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 0, \ 282c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_FIELD_OFFSET( _fname ), \ 283368ca83a3fdfbe8dfe591ab73d29c500d1a91c0aKeith Whitwell FT_FIELD_SIZE_DELTA( _fname ), \ 284368ca83a3fdfbe8dfe591ab73d29c500d1a91c0aKeith Whitwell _max, 0, \ 285368ca83a3fdfbe8dfe591ab73d29c500d1a91c0aKeith Whitwell _dict \ 286368ca83a3fdfbe8dfe591ab73d29c500d1a91c0aKeith Whitwell }, 28756f0c00f125ee75caeadc1c9e8cab8a488635e5eIan Romanick 288c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 289c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ 290c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) 291c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 292c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell#define T1_FIELD_NUM( _ident, _fname, _dict ) \ 293c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) 2944b55e3695279daef221669ff063631cf3675da0cBrian Paul 295f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ 296f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) 297f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul 2984b55e3695279daef221669ff063631cf3675da0cBrian Paul#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ 2994b55e3695279daef221669ff063631cf3675da0cBrian Paul T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ 300c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell _dict ) 301f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg 3026e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca#define T1_FIELD_STRING( _ident, _fname, _dict ) \ 3036e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) 3046e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca 3056e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca#define T1_FIELD_KEY( _ident, _fname, _dict ) \ 3066e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) 3076e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca 308c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ 309bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) 310c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 311c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 3120ba2810e47d68ec24a93c5fc74cf99afe50e8c9bBrian Paul#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ 3130ba2810e47d68ec24a93c5fc74cf99afe50e8c9bBrian Paul T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ 314c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell _fname, _fmax, _dict ) 31528249bd260f4c52badf3eb61ade2744604b21bcaIan Romanick 316f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ 31797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ 31897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul _fname, _fmax, _dict ) 31997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 32097dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ 32197dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ 32297dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul _fname, _fmax, _dict ) 32397dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 32497dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ 32597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ 32697dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul _fname, _fmax, _dict ) 32797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 32897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ 32997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) 330c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 331004d8f11882c6c149a395cf2e86d5d5fb3fa114bJosé Fonseca 332004d8f11882c6c149a395cf2e86d5d5fb3fa114bJosé Fonseca /*************************************************************************/ 333f0c8e7c32766cb78756de24a9ca5e8c28017a682Brian Paul /*************************************************************************/ 334c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /***** *****/ 335c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /***** T1 PARSER *****/ 33697dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul /***** *****/ 33797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul /*************************************************************************/ 33897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul /*************************************************************************/ 33997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 34097dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; 34197dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 34297dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul typedef struct PS_Parser_FuncsRec_ 34397dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul { 34497dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul void 34597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (*init)( PS_Parser parser, 34697dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul FT_Byte* base, 34797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul FT_Byte* limit, 34897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul FT_Memory memory ); 34997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 35097dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul void 351c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell (*done)( PS_Parser parser ); 35297dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 3536e09c1fd085361212c5bfccf6b2810f3f8052231José Fonseca void 35497dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (*skip_spaces)( PS_Parser parser ); 35597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul void 35697dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (*skip_PS_token)( PS_Parser parser ); 35797dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 35897dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul FT_Long 35997dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (*to_int)( PS_Parser parser ); 36097dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul FT_Fixed 36197dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (*to_fixed)( PS_Parser parser, 36297dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul FT_Int power_ten ); 36397dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul 36497dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul FT_Error 36597dedfda5fbb4078db28519e50adeeeb8e1a1dc1Brian Paul (*to_bytes)( PS_Parser parser, 366c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_Byte* bytes, 367c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_Offset max_bytes, 3684b55e3695279daef221669ff063631cf3675da0cBrian Paul FT_Long* pnum_bytes, 369298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg FT_Bool delimiters ); 370c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 371c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_Int 372c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell (*to_coord_array)( PS_Parser parser, 373c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_Int max_coords, 374fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Short* coords ); 375fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Int 3767cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul (*to_fixed_array)( PS_Parser parser, 377fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Int max_values, 3784b55e3695279daef221669ff063631cf3675da0cBrian Paul FT_Fixed* values, 3797cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul FT_Int power_ten ); 380fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 381fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell void 382fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell (*to_token)( PS_Parser parser, 383fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell T1_Token token ); 384fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell void 385fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell (*to_token_array)( PS_Parser parser, 386fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell T1_Token tokens, 387fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_UInt max_tokens, 388fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FT_Int* pnum_tokens ); 389fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 390f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg FT_Error 39133fef8be825ee8ec6abc0c2ffd9a3a967d84df88Keith Whitwell (*load_field)( PS_Parser parser, 392576c8c592a4be7047a00b0c8fe3851b09f10d8d4Marek Olšák const T1_Field field, 393c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell void** objects, 39433fef8be825ee8ec6abc0c2ffd9a3a967d84df88Keith Whitwell FT_UInt max_objects, 39599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell FT_ULong* pflags ); 396fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 3971680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell FT_Error 3981680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell (*load_field_table)( PS_Parser parser, 3991680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const T1_Field field, 400bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul void** objects, 401c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_UInt max_objects, 4026222eb3fcd12147ea2e7ccc20a71a921cebbb0d2Brian Paul FT_ULong* pflags ); 40333fef8be825ee8ec6abc0c2ffd9a3a967d84df88Keith Whitwell 4044b55e3695279daef221669ff063631cf3675da0cBrian Paul } PS_Parser_FuncsRec; 405298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg 406298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg 4079d4ab42f4be3a26f702729cc79ef67f8afc2eca5Keith Whitwell /*************************************************************************/ 408fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 40950f7e75f9e945cfbb2ae868cc961a2205a0b6e73Marek Olšák /* <Struct> */ 410fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* PS_ParserRec */ 411fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 4122708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt /* <Description> */ 413fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ 41414bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák /* */ 41514bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák /* <Fields> */ 41633fef8be825ee8ec6abc0c2ffd9a3a967d84df88Keith Whitwell /* cursor :: The current position in the text. */ 417c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /* */ 418c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /* base :: Start of the processed text. */ 4197cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul /* */ 420c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /* limit :: End of the processed text. */ 4214b55e3695279daef221669ff063631cf3675da0cBrian Paul /* */ 422fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* error :: The last error returned. */ 423fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* */ 424fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* memory :: The object used for memory operations (alloc/realloc). */ 425c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /* */ 426c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell /* funcs :: A table of functions for the parser. */ 4277cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul /* */ 428bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul typedef struct PS_ParserRec_ 429c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell { 430c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_Byte* cursor; 431c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_Byte* base; 432c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_Byte* limit; 4337cba2df4a6f3b4435fe4be277db4a87b2a0f89e3Brian Paul FT_Error error; 434c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell FT_Memory memory; 435c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 436c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell PS_Parser_FuncsRec funcs; 437c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 438c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell } PS_ParserRec; 439c4d1f4607abf3dfbcfcffc5c67bb89d420d3381aKeith Whitwell 440fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 441fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /*************************************************************************/ 442fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /*************************************************************************/ 443cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu /***** *****/ 444cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu /***** T1 BUILDER *****/ 445cef97267d696d37f4dccb22951499ca25d5d87adChia-I Wu /***** *****/ 446 /*************************************************************************/ 447 /*************************************************************************/ 448 449 450 typedef struct T1_BuilderRec_* T1_Builder; 451 452 453 typedef FT_Error 454 (*T1_Builder_Check_Points_Func)( T1_Builder builder, 455 FT_Int count ); 456 457 typedef void 458 (*T1_Builder_Add_Point_Func)( T1_Builder builder, 459 FT_Pos x, 460 FT_Pos y, 461 FT_Byte flag ); 462 463 typedef FT_Error 464 (*T1_Builder_Add_Point1_Func)( T1_Builder builder, 465 FT_Pos x, 466 FT_Pos y ); 467 468 typedef FT_Error 469 (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); 470 471 typedef FT_Error 472 (*T1_Builder_Start_Point_Func)( T1_Builder builder, 473 FT_Pos x, 474 FT_Pos y ); 475 476 typedef void 477 (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); 478 479 480 typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; 481 482 typedef struct T1_Builder_FuncsRec_ 483 { 484 void 485 (*init)( T1_Builder builder, 486 FT_Face face, 487 FT_Size size, 488 FT_GlyphSlot slot, 489 FT_Bool hinting ); 490 491 void 492 (*done)( T1_Builder builder ); 493 494 T1_Builder_Check_Points_Func check_points; 495 T1_Builder_Add_Point_Func add_point; 496 T1_Builder_Add_Point1_Func add_point1; 497 T1_Builder_Add_Contour_Func add_contour; 498 T1_Builder_Start_Point_Func start_point; 499 T1_Builder_Close_Contour_Func close_contour; 500 501 } T1_Builder_FuncsRec; 502 503 504 /* an enumeration type to handle charstring parsing states */ 505 typedef enum T1_ParseState_ 506 { 507 T1_Parse_Start, 508 T1_Parse_Have_Width, 509 T1_Parse_Have_Moveto, 510 T1_Parse_Have_Path 511 512 } T1_ParseState; 513 514 515 /*************************************************************************/ 516 /* */ 517 /* <Structure> */ 518 /* T1_BuilderRec */ 519 /* */ 520 /* <Description> */ 521 /* A structure used during glyph loading to store its outline. */ 522 /* */ 523 /* <Fields> */ 524 /* memory :: The current memory object. */ 525 /* */ 526 /* face :: The current face object. */ 527 /* */ 528 /* glyph :: The current glyph slot. */ 529 /* */ 530 /* loader :: XXX */ 531 /* */ 532 /* base :: The base glyph outline. */ 533 /* */ 534 /* current :: The current glyph outline. */ 535 /* */ 536 /* max_points :: maximum points in builder outline */ 537 /* */ 538 /* max_contours :: Maximum number of contours in builder outline. */ 539 /* */ 540 /* pos_x :: The horizontal translation (if composite glyph). */ 541 /* */ 542 /* pos_y :: The vertical translation (if composite glyph). */ 543 /* */ 544 /* left_bearing :: The left side bearing point. */ 545 /* */ 546 /* advance :: The horizontal advance vector. */ 547 /* */ 548 /* bbox :: Unused. */ 549 /* */ 550 /* parse_state :: An enumeration which controls the charstring */ 551 /* parsing state. */ 552 /* */ 553 /* load_points :: If this flag is not set, no points are loaded. */ 554 /* */ 555 /* no_recurse :: Set but not used. */ 556 /* */ 557 /* metrics_only :: A boolean indicating that we only want to compute */ 558 /* the metrics of a given glyph, not load all of its */ 559 /* points. */ 560 /* */ 561 /* funcs :: An array of function pointers for the builder. */ 562 /* */ 563 typedef struct T1_BuilderRec_ 564 { 565 FT_Memory memory; 566 FT_Face face; 567 FT_GlyphSlot glyph; 568 FT_GlyphLoader loader; 569 FT_Outline* base; 570 FT_Outline* current; 571 572 FT_Pos pos_x; 573 FT_Pos pos_y; 574 575 FT_Vector left_bearing; 576 FT_Vector advance; 577 578 FT_BBox bbox; /* bounding box */ 579 T1_ParseState parse_state; 580 FT_Bool load_points; 581 FT_Bool no_recurse; 582 583 FT_Bool metrics_only; 584 585 void* hints_funcs; /* hinter-specific */ 586 void* hints_globals; /* hinter-specific */ 587 588 T1_Builder_FuncsRec funcs; 589 590 } T1_BuilderRec; 591 592 593 /*************************************************************************/ 594 /*************************************************************************/ 595 /***** *****/ 596 /***** T1 DECODER *****/ 597 /***** *****/ 598 /*************************************************************************/ 599 /*************************************************************************/ 600 601#if 0 602 603 /*************************************************************************/ 604 /* */ 605 /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ 606 /* calls during glyph loading. */ 607 /* */ 608#define T1_MAX_SUBRS_CALLS 8 609 610 611 /*************************************************************************/ 612 /* */ 613 /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ 614 /* minimum of 16 is required. */ 615 /* */ 616#define T1_MAX_CHARSTRINGS_OPERANDS 32 617 618#endif /* 0 */ 619 620 621 typedef struct T1_Decoder_ZoneRec_ 622 { 623 FT_Byte* cursor; 624 FT_Byte* base; 625 FT_Byte* limit; 626 627 } T1_Decoder_ZoneRec, *T1_Decoder_Zone; 628 629 630 typedef struct T1_DecoderRec_* T1_Decoder; 631 typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; 632 633 634 typedef FT_Error 635 (*T1_Decoder_Callback)( T1_Decoder decoder, 636 FT_UInt glyph_index ); 637 638 639 typedef struct T1_Decoder_FuncsRec_ 640 { 641 FT_Error 642 (*init)( T1_Decoder decoder, 643 FT_Face face, 644 FT_Size size, 645 FT_GlyphSlot slot, 646 FT_Byte** glyph_names, 647 PS_Blend blend, 648 FT_Bool hinting, 649 FT_Render_Mode hint_mode, 650 T1_Decoder_Callback callback ); 651 652 void 653 (*done)( T1_Decoder decoder ); 654 655 FT_Error 656 (*parse_charstrings)( T1_Decoder decoder, 657 FT_Byte* base, 658 FT_UInt len ); 659 660 } T1_Decoder_FuncsRec; 661 662 663 typedef struct T1_DecoderRec_ 664 { 665 T1_BuilderRec builder; 666 667 FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; 668 FT_Long* top; 669 670 T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; 671 T1_Decoder_Zone zone; 672 673 FT_Service_PsCMaps psnames; /* for seac */ 674 FT_UInt num_glyphs; 675 FT_Byte** glyph_names; 676 677 FT_Int lenIV; /* internal for sub routine calls */ 678 FT_UInt num_subrs; 679 FT_Byte** subrs; 680 FT_PtrDist* subrs_len; /* array of subrs length (optional) */ 681 682 FT_Matrix font_matrix; 683 FT_Vector font_offset; 684 685 FT_Int flex_state; 686 FT_Int num_flex_vectors; 687 FT_Vector flex_vectors[7]; 688 689 PS_Blend blend; /* for multiple master support */ 690 691 FT_Render_Mode hint_mode; 692 693 T1_Decoder_Callback parse_callback; 694 T1_Decoder_FuncsRec funcs; 695 696 FT_Long* buildchar; 697 FT_UInt len_buildchar; 698 699 FT_Bool seac; 700 701 } T1_DecoderRec; 702 703 704 /*************************************************************************/ 705 /*************************************************************************/ 706 /***** *****/ 707 /***** AFM PARSER *****/ 708 /***** *****/ 709 /*************************************************************************/ 710 /*************************************************************************/ 711 712 typedef struct AFM_ParserRec_* AFM_Parser; 713 714 typedef struct AFM_Parser_FuncsRec_ 715 { 716 FT_Error 717 (*init)( AFM_Parser parser, 718 FT_Memory memory, 719 FT_Byte* base, 720 FT_Byte* limit ); 721 722 void 723 (*done)( AFM_Parser parser ); 724 725 FT_Error 726 (*parse)( AFM_Parser parser ); 727 728 } AFM_Parser_FuncsRec; 729 730 731 typedef struct AFM_StreamRec_* AFM_Stream; 732 733 734 /*************************************************************************/ 735 /* */ 736 /* <Struct> */ 737 /* AFM_ParserRec */ 738 /* */ 739 /* <Description> */ 740 /* An AFM_Parser is a parser for the AFM files. */ 741 /* */ 742 /* <Fields> */ 743 /* memory :: The object used for memory operations (alloc and */ 744 /* realloc). */ 745 /* */ 746 /* stream :: This is an opaque object. */ 747 /* */ 748 /* FontInfo :: The result will be stored here. */ 749 /* */ 750 /* get_index :: A user provided function to get a glyph index by its */ 751 /* name. */ 752 /* */ 753 typedef struct AFM_ParserRec_ 754 { 755 FT_Memory memory; 756 AFM_Stream stream; 757 758 AFM_FontInfo FontInfo; 759 760 FT_Int 761 (*get_index)( const char* name, 762 FT_Offset len, 763 void* user_data ); 764 765 void* user_data; 766 767 } AFM_ParserRec; 768 769 770 /*************************************************************************/ 771 /*************************************************************************/ 772 /***** *****/ 773 /***** TYPE1 CHARMAPS *****/ 774 /***** *****/ 775 /*************************************************************************/ 776 /*************************************************************************/ 777 778 typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; 779 780 typedef struct T1_CMap_ClassesRec_ 781 { 782 FT_CMap_Class standard; 783 FT_CMap_Class expert; 784 FT_CMap_Class custom; 785 FT_CMap_Class unicode; 786 787 } T1_CMap_ClassesRec; 788 789 790 /*************************************************************************/ 791 /*************************************************************************/ 792 /***** *****/ 793 /***** PSAux Module Interface *****/ 794 /***** *****/ 795 /*************************************************************************/ 796 /*************************************************************************/ 797 798 typedef struct PSAux_ServiceRec_ 799 { 800 /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ 801 const PS_Table_FuncsRec* ps_table_funcs; 802 const PS_Parser_FuncsRec* ps_parser_funcs; 803 const T1_Builder_FuncsRec* t1_builder_funcs; 804 const T1_Decoder_FuncsRec* t1_decoder_funcs; 805 806 void 807 (*t1_decrypt)( FT_Byte* buffer, 808 FT_Offset length, 809 FT_UShort seed ); 810 811 T1_CMap_Classes t1_cmap_classes; 812 813 /* fields after this comment line were added after version 2.1.10 */ 814 const AFM_Parser_FuncsRec* afm_parser_funcs; 815 816 } PSAux_ServiceRec, *PSAux_Service; 817 818 /* backwards-compatible type definition */ 819 typedef PSAux_ServiceRec PSAux_Interface; 820 821 822 /*************************************************************************/ 823 /*************************************************************************/ 824 /***** *****/ 825 /***** Some convenience functions *****/ 826 /***** *****/ 827 /*************************************************************************/ 828 /*************************************************************************/ 829 830#define IS_PS_NEWLINE( ch ) \ 831 ( (ch) == '\r' || \ 832 (ch) == '\n' ) 833 834#define IS_PS_SPACE( ch ) \ 835 ( (ch) == ' ' || \ 836 IS_PS_NEWLINE( ch ) || \ 837 (ch) == '\t' || \ 838 (ch) == '\f' || \ 839 (ch) == '\0' ) 840 841#define IS_PS_SPECIAL( ch ) \ 842 ( (ch) == '/' || \ 843 (ch) == '(' || (ch) == ')' || \ 844 (ch) == '<' || (ch) == '>' || \ 845 (ch) == '[' || (ch) == ']' || \ 846 (ch) == '{' || (ch) == '}' || \ 847 (ch) == '%' ) 848 849#define IS_PS_DELIM( ch ) \ 850 ( IS_PS_SPACE( ch ) || \ 851 IS_PS_SPECIAL( ch ) ) 852 853#define IS_PS_DIGIT( ch ) \ 854 ( (ch) >= '0' && (ch) <= '9' ) 855 856#define IS_PS_XDIGIT( ch ) \ 857 ( IS_PS_DIGIT( ch ) || \ 858 ( (ch) >= 'A' && (ch) <= 'F' ) || \ 859 ( (ch) >= 'a' && (ch) <= 'f' ) ) 860 861#define IS_PS_BASE85( ch ) \ 862 ( (ch) >= '!' && (ch) <= 'u' ) 863 864#define IS_PS_TOKEN( cur, limit, token ) \ 865 ( (char)(cur)[0] == (token)[0] && \ 866 ( (cur) + sizeof ( (token) ) == (limit) || \ 867 ( (cur) + sizeof( (token) ) < (limit) && \ 868 IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ 869 ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) 870 871 872FT_END_HEADER 873 874#endif /* __PSAUX_H__ */ 875 876 877/* END */ 878