|
|
|
@ -1,43 +1,38 @@ |
|
|
|
|
/*******************************************************************
|
|
|
|
|
* |
|
|
|
|
* t1tokens.h |
|
|
|
|
* |
|
|
|
|
* Type 1 tokenizer |
|
|
|
|
* |
|
|
|
|
* Copyright 1996 David Turner, Robert Wilhelm and Werner Lemberg. |
|
|
|
|
* |
|
|
|
|
* This file is part of the FreeType project, and may only be used |
|
|
|
|
* modified and distributed under the terms of the FreeType project |
|
|
|
|
* license, LICENSE.TXT. By continuing to use, modify or distribute |
|
|
|
|
* this file you indicate that you have read the license and |
|
|
|
|
* understand and accept it fully. |
|
|
|
|
* |
|
|
|
|
* The tokenizer is in charge of loading and reading a Type1 font |
|
|
|
|
* file (either in PFB or PFA format), and extract successive tokens |
|
|
|
|
* and keywords from its two streams (i.e. the font program, and the |
|
|
|
|
* private dictionary). |
|
|
|
|
* |
|
|
|
|
* Eexec decryption is performed automatically when entering the |
|
|
|
|
* private dictionary, or when retrieving char strings.. |
|
|
|
|
* |
|
|
|
|
******************************************************************/ |
|
|
|
|
/***************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* t1tokens.h */ |
|
|
|
|
/* */ |
|
|
|
|
/* Type 1 tokenizer (specification). */ |
|
|
|
|
/* */ |
|
|
|
|
/* Copyright 1996-2000 by */ |
|
|
|
|
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
|
|
|
|
/* */ |
|
|
|
|
/* This file is part of the FreeType project, and may only be used, */ |
|
|
|
|
/* modified, and distributed under the terms of the FreeType project */ |
|
|
|
|
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
|
|
|
|
/* this file you indicate that you have read the license and */ |
|
|
|
|
/* understand and accept it fully. */ |
|
|
|
|
/* */ |
|
|
|
|
/***************************************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef T1TOKENS_H |
|
|
|
|
#define T1TOKENS_H |
|
|
|
|
|
|
|
|
|
#include <t1objs.h> |
|
|
|
|
|
|
|
|
|
/* enum value of first keyword */ |
|
|
|
|
#define key_first_ 100 |
|
|
|
|
/* enum value of first keyword */ |
|
|
|
|
#define key_first_ 100 |
|
|
|
|
|
|
|
|
|
/* enum value of first immediate name */ |
|
|
|
|
#define imm_first_ 200 |
|
|
|
|
|
|
|
|
|
/* enum value of first immediate name */ |
|
|
|
|
#define imm_first_ 200 |
|
|
|
|
|
|
|
|
|
typedef enum T1_TokenType_ |
|
|
|
|
typedef enum T1_TokenType_ |
|
|
|
|
{ |
|
|
|
|
tok_error = 0, |
|
|
|
|
|
|
|
|
|
tok_eof, /* end of file */ |
|
|
|
|
tok_eof, /* end of file */ |
|
|
|
|
|
|
|
|
|
/* simple token types */ |
|
|
|
|
|
|
|
|
@ -50,14 +45,14 @@ |
|
|
|
|
tok_hexarray, /* array of hexadecimal nibbles */ |
|
|
|
|
tok_any, /* anything else */ |
|
|
|
|
|
|
|
|
|
/* Postscript keywords - placed in lexicographical order */ |
|
|
|
|
/* Postscript keywords -- placed in lexicographical order */ |
|
|
|
|
|
|
|
|
|
key_RD_alternate = key_first_, /* "-|" = alternate form of RD */ |
|
|
|
|
key_ExpertEncoding, |
|
|
|
|
key_RD_alternate = key_first_, /* `-|' = alternate form of RD */ |
|
|
|
|
key_ExpertEncoding, |
|
|
|
|
key_ND, |
|
|
|
|
key_NP, |
|
|
|
|
key_RD, |
|
|
|
|
key_StandardEncoding, |
|
|
|
|
key_StandardEncoding, |
|
|
|
|
key_array, |
|
|
|
|
key_begin, |
|
|
|
|
key_closefile, |
|
|
|
@ -77,16 +72,16 @@ |
|
|
|
|
key_readonly, |
|
|
|
|
key_true, |
|
|
|
|
key_userdict, |
|
|
|
|
key_NP_alternate, /* "|" = alternate form of NP */ |
|
|
|
|
key_ND_alternate, /* "|-" = alternate form of ND */ |
|
|
|
|
key_NP_alternate, /* `|' = alternate form of NP */ |
|
|
|
|
key_ND_alternate, /* `|-' = alternate form of ND */ |
|
|
|
|
|
|
|
|
|
key_max, /* always keep this value there */ |
|
|
|
|
|
|
|
|
|
/* Postscript immediate names - other names will be ignored, except */ |
|
|
|
|
/* in charstrings.. */ |
|
|
|
|
/* Postscript immediate names -- other names will be ignored, except */ |
|
|
|
|
/* in charstrings */ |
|
|
|
|
|
|
|
|
|
imm_RD_alternate = imm_first_, /* "-|" = alternate form of RD */ |
|
|
|
|
imm_notdef, /* "/.notdef" immediate */ |
|
|
|
|
imm_RD_alternate = imm_first_, /* `-|' = alternate form of RD */ |
|
|
|
|
imm_notdef, /* `/.notdef' immediate */ |
|
|
|
|
imm_BlendAxisTypes, |
|
|
|
|
imm_BlueFuzz, |
|
|
|
|
imm_BlueScale, |
|
|
|
@ -135,219 +130,109 @@ |
|
|
|
|
imm_password, |
|
|
|
|
imm_version, |
|
|
|
|
|
|
|
|
|
imm_NP_alternate, /* "|" = alternate form of NP */ |
|
|
|
|
imm_ND_alternate, /* "|-" = alternate form of ND */ |
|
|
|
|
imm_NP_alternate, /* `|' = alternate form of NP */ |
|
|
|
|
imm_ND_alternate, /* `|-' = alternate form of ND */ |
|
|
|
|
|
|
|
|
|
imm_max /* always keep this value here */ |
|
|
|
|
|
|
|
|
|
} T1_TokenType; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* these arrays are visible for debugging purposes.. */ |
|
|
|
|
extern const char* t1_keywords[]; |
|
|
|
|
extern const char* t1_immediates[]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Struct> T1_Token */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* A structure used to describe a token in the current input */ |
|
|
|
|
/* stream. Note that the Type1 driver doesn't try to interpret */ |
|
|
|
|
/* tokens until it really needs to.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Fields> */ |
|
|
|
|
/* kind :: token type. Describes the token to the loader */ |
|
|
|
|
/* kind2 :: detailed token type. */ |
|
|
|
|
/* */ |
|
|
|
|
/* start :: index of first character of token in input stream */ |
|
|
|
|
/* */ |
|
|
|
|
/* len :: length of token in characters. */ |
|
|
|
|
/* */ |
|
|
|
|
typedef struct T1_Token_ |
|
|
|
|
/* these arrays are visible for debugging purposes */ |
|
|
|
|
extern const char* t1_keywords[]; |
|
|
|
|
extern const char* t1_immediates[]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Struct> */ |
|
|
|
|
/* T1_Token */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* A structure used to describe a token in the current input stream. */ |
|
|
|
|
/* Note that the Type1 driver doesn't try to interpret tokens until */ |
|
|
|
|
/* it really needs to. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Fields> */ |
|
|
|
|
/* kind :: The token type. Describes the token to the loader. */ |
|
|
|
|
/* */ |
|
|
|
|
/* kind2 :: Detailed token type. */ |
|
|
|
|
/* */ |
|
|
|
|
/* start :: The index of the first character of token in the input */ |
|
|
|
|
/* stream. */ |
|
|
|
|
/* */ |
|
|
|
|
/* len :: The length of the token in characters. */ |
|
|
|
|
/* */ |
|
|
|
|
typedef struct T1_Token_ |
|
|
|
|
{ |
|
|
|
|
T1_TokenType kind; /* simple type */ |
|
|
|
|
T1_TokenType kind2; /* detailed type */ |
|
|
|
|
FT_Int start; /* index of first token character */ |
|
|
|
|
FT_Int len; /* length of token in chars */ |
|
|
|
|
T1_TokenType kind; /* simple type */ |
|
|
|
|
T1_TokenType kind2; /* detailed type */ |
|
|
|
|
FT_Int start; /* index of first token character */ |
|
|
|
|
FT_Int len; /* length of token in chars */ |
|
|
|
|
|
|
|
|
|
} T1_Token; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct T1_TokenParser_ |
|
|
|
|
typedef struct T1_TokenParser_ |
|
|
|
|
{ |
|
|
|
|
FT_Memory memory; |
|
|
|
|
FT_Stream stream; |
|
|
|
|
FT_Memory memory; |
|
|
|
|
FT_Stream stream; |
|
|
|
|
|
|
|
|
|
FT_Bool in_pfb; /* true if PFB file, PFA otherwise */ |
|
|
|
|
FT_Bool in_private; /* true if in private dictionary */ |
|
|
|
|
FT_Bool in_pfb; /* true if PFB file, PFA otherwise */ |
|
|
|
|
FT_Bool in_private; /* true if in private dictionary */ |
|
|
|
|
|
|
|
|
|
FT_Byte* base; /* base address of current read buffer */ |
|
|
|
|
FT_Long cursor; /* current position in read buffer */ |
|
|
|
|
FT_Long limit; /* limit of current read buffer */ |
|
|
|
|
FT_Long max; /* maximum size of read buffer */ |
|
|
|
|
FT_Byte* base; /* base address of current read buffer */ |
|
|
|
|
FT_Long cursor; /* current position in read buffer */ |
|
|
|
|
FT_Long limit; /* limit of current read buffer */ |
|
|
|
|
FT_Long max; /* maximum size of read buffer */ |
|
|
|
|
|
|
|
|
|
FT_Error error; /* last error */ |
|
|
|
|
T1_Token token; /* last token read */ |
|
|
|
|
FT_Error error; /* last error */ |
|
|
|
|
T1_Token token; /* last token read */ |
|
|
|
|
|
|
|
|
|
} T1_TokenParser; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Type> */ |
|
|
|
|
/* T1_Tokenizer */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* A handle to an object used to extract tokens from the input. The */ |
|
|
|
|
/* object is able to perform PFA/PFB recognition, eexec decryption of */ |
|
|
|
|
/* the private dictionary, as well as eexec decryption of the */ |
|
|
|
|
/* charstrings. */ |
|
|
|
|
/* */ |
|
|
|
|
typedef T1_TokenParser* T1_Tokenizer; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error New_Tokenizer( FT_Stream stream, |
|
|
|
|
T1_Tokenizer* tokenizer ); |
|
|
|
|
|
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error Done_Tokenizer( T1_Tokenizer tokenizer ); |
|
|
|
|
|
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error Open_PrivateDict( T1_Tokenizer tokenizer ); |
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Type> T1_Tokenizer */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* A handle to an object used to extract tokens from the input. */ |
|
|
|
|
/* The object is able to perform PFA/PFB recognition, eexec */ |
|
|
|
|
/* decryption of the private dictionary, as well as eexec decryption */ |
|
|
|
|
/* of the charstrings.. */ |
|
|
|
|
/* */ |
|
|
|
|
typedef T1_TokenParser* T1_Tokenizer; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Function> New_Tokenizer */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* Creates a new tokenizer from a given input stream. This function */ |
|
|
|
|
/* automatically recognizes "pfa" or "pfb" files. The function */ |
|
|
|
|
/* "Read_Token" can then be used to extract successive tokens from */ |
|
|
|
|
/* the stream.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Input> */ |
|
|
|
|
/* stream :: input stream */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Output> */ |
|
|
|
|
/* tokenizer :: handle to new tokenizer object.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Return> */ |
|
|
|
|
/* Type1 error code. 0 means success.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Note> */ |
|
|
|
|
/* This function copies the stream handle within the object. Callers */ |
|
|
|
|
/* should not discard "stream". This is done by the Done_Tokenizer */ |
|
|
|
|
/* function.. */ |
|
|
|
|
/* */ |
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error New_Tokenizer( FT_Stream stream, |
|
|
|
|
T1_Tokenizer* tokenizer ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Function> Done_Tokenizer */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* Closes a given tokenizer. This function will also close the */ |
|
|
|
|
/* stream embedded in the object.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Input> */ |
|
|
|
|
/* tokenizer :: target tokenizer object */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Return> */ |
|
|
|
|
/* Type1 error code. 0 means success.. */ |
|
|
|
|
/* */ |
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error Done_Tokenizer( T1_Tokenizer tokenizer ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Function> Open_PrivateDict */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* This function must be called to set the tokenizer to the private */ |
|
|
|
|
/* section of the Type1 file. It recognizes automatically the */ |
|
|
|
|
/* the kind of eexec encryption used (ascii or binary).. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Input> */ |
|
|
|
|
/* tokenizer :: target tokenizer object */ |
|
|
|
|
/* lenIV :: value of the "lenIV" variable.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Return> */ |
|
|
|
|
/* Type1 error code. 0 means success.. */ |
|
|
|
|
/* */ |
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error Open_PrivateDict( T1_Tokenizer tokenizer ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Function> Read_Token */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* Read a new token from the current input stream. This function */ |
|
|
|
|
/* extracts a token from the font program until "Open_PrivateDict" */ |
|
|
|
|
/* has been called. After this, it returns tokens from the */ |
|
|
|
|
/* (eexec-encrypted) private dictionnary.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Input> */ |
|
|
|
|
/* tokenizer :: target tokenizer object */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Return> */ |
|
|
|
|
/* Type1 error code. 0 means success.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Note> */ |
|
|
|
|
/* One should use the function Read_CharStrings to read the binary */ |
|
|
|
|
/* charstrings from the private dict.. */ |
|
|
|
|
/* */ |
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error Read_Token( T1_Tokenizer tokenizer ); |
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error Read_Token( T1_Tokenizer tokenizer ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Function> Read_CharStrings */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* Read a charstrings from the current input stream. These are */ |
|
|
|
|
/* binary bytes that encode each individual glyph outline. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Input> */ |
|
|
|
|
/* tokenizer :: target tokenizer object */ |
|
|
|
|
/* num_chars :: number of binary bytes to read */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Output> */ |
|
|
|
|
/* buffer :: target array of bytes. These are eexec-decrypted.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Return> */ |
|
|
|
|
/* Type1 error code. 0 means success.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Note> */ |
|
|
|
|
/* One should use the function Read_CharStrings to read the binary */ |
|
|
|
|
/* charstrings from the private dict.. */ |
|
|
|
|
/* */ |
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error Read_CharStrings( T1_Tokenizer tokenizer, |
|
|
|
|
FT_Int num_chars, |
|
|
|
|
FT_Byte* buffer ); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Function> t1_decrypt */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* Performs the Type 1 charstring decryption process.. */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Input> */ |
|
|
|
|
/* buffer :: base address of data to decrypt */ |
|
|
|
|
/* length :: number of bytes to decrypt from base address */ |
|
|
|
|
/* seed :: ecnryption seed (4330 for charstrings). */ |
|
|
|
|
/* */ |
|
|
|
|
LOCAL_DEF |
|
|
|
|
FT_Error Read_CharStrings( T1_Tokenizer tokenizer, |
|
|
|
|
FT_Int num_chars, |
|
|
|
|
FT_Byte* buffer ); |
|
|
|
|
#endif /* 0 */ |
|
|
|
|
|
|
|
|
|
LOCAL_DEF |
|
|
|
|
void t1_decrypt( FT_Byte* buffer, |
|
|
|
|
FT_Int length, |
|
|
|
|
FT_UShort seed ); |
|
|
|
|
|
|
|
|
|
#endif /* T1TOKENS_H */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* END */ |
|
|
|
|