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