home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 110
/
EnigmaAmiga110CD.iso
/
indispensabili
/
utility
/
apdf
/
xpdf-0.80
/
xpdf
/
gfxfont.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-11-27
|
7KB
|
246 lines
//========================================================================
//
// GfxFont.h
//
// Copyright 1996 Derek B. Noonburg
//
//========================================================================
#ifndef GFXFONT_H
#define GFXFONT_H
#ifdef __GNUC__
#pragma interface
#endif
#include "gtypes.h"
#include "GString.h"
#include "Object.h"
class Dict;
//------------------------------------------------------------------------
// GfxFontEncoding
//------------------------------------------------------------------------
#define gfxFontEncHashSize 419
class GfxFontEncoding {
public:
// Construct an empty encoding.
GfxFontEncoding();
// Construct an encoding from an array of char names.
GfxFontEncoding(char **encoding1, int encSize);
// Destructor.
~GfxFontEncoding();
// Add a char to the encoding.
void addChar(int code, char *name);
// Return the character name associated with <code>.
char *getCharName(int code) { return encoding[code]; }
// Return the code associated with <name>.
int getCharCode(char *name);
private:
int hash(char *name);
void addChar1(int code, char *name);
char **encoding; // code --> name mapping
GBool freeEnc; // should we free the encoding array?
short // name --> code hash table
hashTab[gfxFontEncHashSize];
};
//------------------------------------------------------------------------
// GfxFontCharSet16
//------------------------------------------------------------------------
enum GfxFontCharSet16 {
font16AdobeJapan12 // Adobe-Japan1-2
};
//------------------------------------------------------------------------
// GfxFontEncoding16
//------------------------------------------------------------------------
struct GfxFontEncoding16 {
Guchar codeLen[256]; // length of codes, in bytes, indexed by
// first byte of code
Gushort map1[256]; // one-byte code mapping:
// map1[code] --> 16-bit char selector
Gushort *map2; // two-byte code mapping
// map2[2*i] --> first code in range
// map2[2*i+1] --> 16-bit char selector
// for map2[2*i]
int map2Len; // length of map2 array (divided by 2)
};
//------------------------------------------------------------------------
// GfxFontWidths16
//------------------------------------------------------------------------
struct GfxFontWidthExcep {
int first; // chars <first>..<last> have
int last; // width <width>
double width;
};
struct GfxFontWidths16 {
double defWidth; // default char width
GfxFontWidthExcep *exceps; // exceptions
int numExceps; // number of valid entries in exceps
};
//------------------------------------------------------------------------
// GfxFont
//------------------------------------------------------------------------
#define fontFixedWidth (1 << 0)
#define fontSerif (1 << 1)
#define fontSymbolic (1 << 2)
#define fontItalic (1 << 6)
#define fontBold (1 << 18)
enum GfxFontType {
fontUnknownType,
fontType1,
fontType3,
fontTrueType,
fontType0
};
class GfxFont {
public:
// Constructor.
GfxFont(char *tag1, Ref id1, Dict *fontDict);
// Destructor.
~GfxFont();
// Get font tag.
GString *getTag() { return tag; }
// Get font dictionary ID.
Ref getID() { return id; }
// Does this font match the tag?
GBool matches(char *tag1) { return !tag->cmp(tag1); }
// Get base font name.
GString *getName() { return name; }
// Get font type.
GfxFontType getType() { return type; }
// Does this font use 16-bit characters?
GBool is16Bit() { return is16; }
// Get embedded font ID, i.e., a ref for the font file stream.
// Returns false if there is no embedded font.
GBool getEmbeddedFontID(Ref *embID)
{ *embID = embFontID; return embFontID.num >= 0; }
// Get the PostScript font name for the embedded font. Returns
// NULL if there is no embedded font.
char *getEmbeddedFontName()
{ return embFontName ? embFontName->getCString() : (char *)NULL; }
// Get the name of the external font file. Returns NULL if there
// is no external font file.
char *getExtFontFile()
{ return extFontFile ? extFontFile->getCString() : (char *)NULL; }
// Get font descriptor flags.
GBool isFixedWidth() { return flags & fontFixedWidth; }
GBool isSerif() { return flags & fontSerif; }
GBool isSymbolic() { return flags & fontSymbolic; }
GBool isItalic() { return flags & fontItalic; }
GBool isBold() { return flags & fontBold; }
// Get width of a character or string.
double getWidth(Guchar c) { return widths[c]; }
double getWidth(GString *s);
double getWidth16(int c);
double getWidth16(GString *s);
// Return the character name associated with <code>.
char *getCharName(int code) { return encoding->getCharName(code); }
// Return the code associated with <name>.
int getCharCode(char *charName) { return encoding->getCharCode(charName); }
// Return the 16-bit character set and encoding.
GfxFontCharSet16 getCharSet16() { return enc16.charSet; }
GfxFontEncoding16 *getEncoding16() { return enc16.enc; }
// Return the font matrix.
double *getFontMatrix() { return fontMat; }
private:
void makeEncoding(Dict *fontDict, GfxFontEncoding *builtinEncoding);
GfxFontEncoding *makeEncoding1(Object obj, Dict *fontDesc,
GfxFontEncoding *builtinEncoding);
void getType1Encoding(Stream *str);
void makeWidths(Dict *fontDict, GfxFontEncoding *builtinEncoding,
Gushort *builtinWidths);
void getType0EncAndWidths(Dict *fontDict);
GString *tag; // PDF font tag
Ref id; // reference (used as unique ID)
GString *name; // font name
int flags; // font descriptor flags
GfxFontType type; // type of font
GBool is16; // set if font uses 16-bit chars
GString *embFontName; // name of embedded font
Ref embFontID; // ref to embedded font file stream
GString *extFontFile; // external font file name
double fontMat[6]; // font matrix
union {
GfxFontEncoding *encoding; // 8-bit font encoding
struct {
GfxFontCharSet16 charSet; // 16-bit character set
GfxFontEncoding16 *enc; // 16-bit encoding (CMap)
} enc16;
};
union {
double widths[256]; // width of each char for 8-bit font
GfxFontWidths16 widths16; // char widths for 16-bit font
};
};
//------------------------------------------------------------------------
// GfxFontDict
//------------------------------------------------------------------------
class GfxFontDict {
public:
// Build the font dictionary, given the PDF font dictionary.
GfxFontDict(Dict *fontDict);
// Destructor.
~GfxFontDict();
// Get the specified font.
GfxFont *lookup(char *tag);
// Iterative access.
int getNumFonts() { return numFonts; }
GfxFont *getFont(int i) { return fonts[i]; }
private:
GfxFont **fonts; // list of fonts
int numFonts; // number of fonts
};
#endif