| /******************************************************************* |
| * |
| * 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.. |
| * |
| ******************************************************************/ |
| |
| #ifndef T1TOKENS_H |
| #define T1TOKENS_H |
| |
| #include <t1objs.h> |
| |
| /* enum value of first keyword */ |
| #define key_first_ 100 |
| |
| /* enum value of first immediate name */ |
| #define imm_first_ 200 |
| |
| typedef enum T1_TokenType_ |
| { |
| tok_error = 0, |
| |
| tok_eof, /* end of file */ |
| |
| /* simple token types */ |
| |
| tok_keyword, /* keyword */ |
| tok_number, /* number (integer or real) */ |
| tok_string, /* postscript string */ |
| tok_program, /* postscript program */ |
| tok_immediate, /* any immediate name */ |
| tok_array, /* matrix, array, etc.. */ |
| tok_hexarray, /* array of hexadecimal nibbles */ |
| tok_any, /* anything else */ |
| |
| /* Postscript keywords - placed in lexicographical order */ |
| |
| key_RD_alternate = key_first_, /* "-|" = alternate form of RD */ |
| key_ExpertEncoding, |
| key_ND, |
| key_NP, |
| key_RD, |
| key_StandardEncoding, |
| key_array, |
| key_begin, |
| key_closefile, |
| key_currentdict, |
| key_currentfile, |
| key_def, |
| key_dict, |
| key_dup, |
| key_eexec, |
| key_end, |
| key_execonly, |
| key_false, |
| key_for, |
| key_index, |
| key_noaccess, |
| key_put, |
| key_readonly, |
| key_true, |
| key_userdict, |
| 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.. */ |
| |
| imm_RD_alternate = imm_first_, /* "-|" = alternate form of RD */ |
| imm_notdef, /* "/.notdef" immediate */ |
| imm_BlueFuzz, |
| imm_BlueScale, |
| imm_BlueShift, |
| imm_BlueValues, |
| imm_CharStrings, |
| imm_Encoding, |
| imm_FamilyBlues, |
| imm_FamilyName, |
| imm_FamilyOtherBlues, |
| imm_FID, |
| imm_FontBBox, |
| imm_FontID, |
| imm_FontInfo, |
| imm_FontMatrix, |
| imm_FontName, |
| imm_FontType, |
| imm_ForceBold, |
| imm_FullName, |
| imm_ItalicAngle, |
| imm_LanguageGroup, |
| imm_Metrics, |
| imm_MinFeature, |
| imm_ND, |
| imm_NP, |
| imm_Notice, |
| imm_OtherBlues, |
| imm_OtherSubrs, |
| imm_PaintType, |
| imm_Private, |
| imm_RD, |
| imm_RndStemUp, |
| imm_StdHW, |
| imm_StdVW, |
| imm_StemSnapH, |
| imm_StemSnapV, |
| imm_StrokeWidth, |
| imm_Subrs, |
| imm_UnderlinePosition, |
| imm_UnderlineThickness, |
| imm_UniqueID, |
| imm_Weight, |
| |
| imm_isFixedPitch, |
| imm_lenIV, |
| imm_password, |
| imm_version, |
| |
| 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_ |
| { |
| T1_TokenType kind; /* simple type */ |
| T1_TokenType kind2; /* detailed type */ |
| T1_Int start; /* index of first token character */ |
| T1_Int len; /* length of token in chars */ |
| |
| } T1_Token; |
| |
| |
| |
| |
| typedef struct T1_TokenParser_ |
| { |
| FT_Memory memory; |
| FT_Stream stream; |
| |
| T1_Bool in_pfb; /* true if PFB file, PFA otherwise */ |
| T1_Bool in_private; /* true if in private dictionary */ |
| |
| T1_Byte* base; /* base address of current read buffer */ |
| T1_Long cursor; /* current position in read buffer */ |
| T1_Long limit; /* limit of current read buffer */ |
| T1_Long max; /* maximum size of read buffer */ |
| |
| T1_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; |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <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 |
| T1_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 |
| T1_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 |
| T1_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 |
| T1_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 |
| T1_Error Read_CharStrings( T1_Tokenizer tokenizer, |
| T1_Int num_chars, |
| T1_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 |
| void t1_decrypt( T1_Byte* buffer, |
| T1_Int length, |
| T1_UShort seed ); |
| |
| #endif /* T1TOKENS_H */ |