ref: 2e8482b31dbff31a620506aef08bd99469ea735d
dir: /src/type1/t1tokens.h/
/******************************************************************* * * 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 ); /*************************************************************************/ /* */ /* <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 ); /*************************************************************************/ /* */ /* <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 */