1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
|
//========================================================================
//
// GfxFont.h
//
// Copyright 1996-2003 Glyph & Cog, LLC
//
//========================================================================
#ifndef GFXFONT_H
#define GFXFONT_H
#include <aconf.h>
#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif
#include "gtypes.h"
#include "GString.h"
#include "Object.h"
#include "CharTypes.h"
class Dict;
class CMap;
class CharCodeToUnicode;
struct GfxFontCIDWidths;
//------------------------------------------------------------------------
// GfxFontType
//------------------------------------------------------------------------
enum GfxFontType {
//----- Gfx8BitFont
fontUnknownType,
fontType1,
fontType1C,
fontType3,
fontTrueType,
//----- GfxCIDFont
fontCIDType0,
fontCIDType0C,
fontCIDType2
};
//------------------------------------------------------------------------
// GfxFontCIDWidths
//------------------------------------------------------------------------
struct GfxFontCIDWidthExcep {
CID first; // this record applies to
CID last; // CIDs <first>..<last>
double width; // char width
};
struct GfxFontCIDWidthExcepV {
CID first; // this record applies to
CID last; // CIDs <first>..<last>
double height; // char height
double vx, vy; // origin position
};
struct GfxFontCIDWidths {
double defWidth; // default char width
double defHeight; // default char height
double defVY; // default origin position
GfxFontCIDWidthExcep *exceps; // exceptions
int nExceps; // number of valid entries in exceps
GfxFontCIDWidthExcepV * // exceptions for vertical font
excepsV;
int nExcepsV; // number of valid entries in excepsV
};
//------------------------------------------------------------------------
// GfxFont
//------------------------------------------------------------------------
#define fontFixedWidth (1 << 0)
#define fontSerif (1 << 1)
#define fontSymbolic (1 << 2)
#define fontItalic (1 << 6)
#define fontBold (1 << 18)
class GfxFont {
public:
// Build a GfxFont object.
static GfxFont *makeFont(XRef *xref, char *tagA, Ref idA, Dict *fontDict);
GfxFont(char *tagA, Ref idA, GString *nameA);
virtual ~GfxFont();
GBool isOk() { return ok; }
// Get font tag.
GString *getTag() { return tag; }
// Get font dictionary ID.
Ref *getID() { return &id; }
// Does this font match the tag?
GBool matches(char *tagA) { return !tag->cmp(tagA); }
// Get base font name.
GString *getName() { return name; }
// Get font type.
GfxFontType getType() { return type; }
virtual GBool isCIDFont() { return gFalse; }
// 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.
GString *getEmbeddedFontName() { return embFontName; }
// Get the name of the external font file. Returns NULL if there
// is no external font file.
GString *getExtFontFile() { return extFontFile; }
// 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; }
// Return the font matrix.
double *getFontMatrix() { return fontMat; }
// Return the font bounding box.
double *getFontBBox() { return fontBBox; }
// Return the ascent and descent values.
double getAscent() { return ascent; }
double getDescent() { return descent; }
// Return the writing mode (0=horizontal, 1=vertical).
virtual int getWMode() { return 0; }
// Read an external or embedded font file into a buffer.
char *readExtFontFile(int *len);
char *readEmbFontFile(XRef *xref, int *len);
// Get the next char from a string <s> of <len> bytes, returning the
// char <code>, its Unicode mapping <u>, its displacement vector
// (<dx>, <dy>), and its origin offset vector (<ox>, <oy>). <uSize>
// is the number of entries available in <u>, and <uLen> is set to
// the number actually used. Returns the number of bytes used by
// the char code.
virtual int getNextChar(char *s, int len, CharCode *code,
Unicode *u, int uSize, int *uLen,
double *dx, double *dy, double *ox, double *oy) = 0;
protected:
void readFontDescriptor(XRef *xref, Dict *fontDict);
CharCodeToUnicode *readToUnicodeCMap(Dict *fontDict, int nBits);
void findExtFontFile();
GString *tag; // PDF font tag
Ref id; // reference (used as unique ID)
GString *name; // font name
GfxFontType type; // type of font
int flags; // font descriptor flags
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 (Type 3 only)
double fontBBox[4]; // font bounding box (Type 3 only)
double missingWidth; // "default" width
double ascent; // max height above baseline
double descent; // max depth below baseline
GBool ok;
};
//------------------------------------------------------------------------
// Gfx8BitFont
//------------------------------------------------------------------------
class Gfx8BitFont: public GfxFont {
public:
Gfx8BitFont(XRef *xref, char *tagA, Ref idA, GString *nameA,
GfxFontType typeA, Dict *fontDict);
virtual ~Gfx8BitFont();
virtual int getNextChar(char *s, int len, CharCode *code,
Unicode *u, int uSize, int *uLen,
double *dx, double *dy, double *ox, double *oy);
// Return the encoding.
char **getEncoding() { return enc; }
// Return the Unicode map.
CharCodeToUnicode *getToUnicode();
// Return the character name associated with <code>.
char *getCharName(int code) { return enc[code]; }
// Returns true if the PDF font specified an encoding.
GBool getHasEncoding() { return hasEncoding; }
// Get width of a character or string.
double getWidth(Guchar c) { return widths[c]; }
// Return the Type 3 CharProc dictionary, or NULL if none.
Dict *getCharProcs();
// Return the Type 3 CharProc for the character associated with <code>.
Object *getCharProc(int code, Object *proc);
// Return the Type 3 Resources dictionary, or NULL if none.
Dict *getResources();
private:
char *enc[256]; // char code --> char name
char encFree[256]; // boolean for each char name: if set,
// the string is malloc'ed
CharCodeToUnicode *ctu; // char code --> Unicode
GBool hasEncoding;
double widths[256]; // character widths
Object charProcs; // Type 3 CharProcs dictionary
Object resources; // Type 3 Resources dictionary
};
//------------------------------------------------------------------------
// GfxCIDFont
//------------------------------------------------------------------------
class GfxCIDFont: public GfxFont {
public:
GfxCIDFont(XRef *xref, char *tagA, Ref idA, GString *nameA,
Dict *fontDict);
virtual ~GfxCIDFont();
virtual GBool isCIDFont() { return gTrue; }
virtual int getNextChar(char *s, int len, CharCode *code,
Unicode *u, int uSize, int *uLen,
double *dx, double *dy, double *ox, double *oy);
// Return the writing mode (0=horizontal, 1=vertical).
virtual int getWMode();
// Return the Unicode map.
CharCodeToUnicode *getToUnicode();
// Get the collection name (<registry>-<ordering>).
GString *getCollection();
// Return the CID-to-GID mapping table. These should only be called
// if type is fontCIDType2.
Gushort *getCIDToGID() { return cidToGID; }
int getCIDToGIDLen() { return cidToGIDLen; }
private:
CMap *cMap; // char code --> CID
CharCodeToUnicode *ctu; // CID --> Unicode
GfxFontCIDWidths widths; // character widths
Gushort *cidToGID; // CID --> GID mapping (for embedded
// TrueType fonts)
int cidToGIDLen;
};
//------------------------------------------------------------------------
// GfxFontDict
//------------------------------------------------------------------------
class GfxFontDict {
public:
// Build the font dictionary, given the PDF font dictionary.
GfxFontDict(XRef *xref, 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
|