dvi2bitmap dvi2bitmap1.0

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List
- File Members

PkFont.h
Go to the documentation of this file.
1 /* This file is part of dvi2bitmap; see README for copyrights and licence */
2
3 #ifndef PK_FONT_HEADER_READ
4 #define PK_FONT_HEADER_READ 1
5
6 #include <config.h>
7
8 #include <string>
9 // We only need to include <ostream> here, but <iostream> is on more machines
10 #include <iostream>
11 #include <FileByteStream.h>
12 #include <Byte.h>
13 #include <DviError.h>
14 #include <verbosity.h>
15
17 class PkFont;
18
19 class PkError : public DviError {
20 public:
21 PkError(string s) : DviError(s) { }
22 };
23
24 class PkRasterdata {
25 public:
26 PkRasterdata(Byte opcode,
27 const Byte *rasterdata, unsigned int len,
28 unsigned int w, unsigned int h);
34 const Byte *bitmap()
35 { if (bitmap_ == 0) construct_bitmap(); return bitmap_; }
41 static verbosities verbosity (const verbosities level) {
42 enum verbosities oldv = verbosity_;
43 verbosity_ = level;
44 return oldv;
45 }
46 private:
47 Byte *rasterdata_, *eob_;
48 const unsigned int len_, w_, h_;
49 Byte dyn_f_;
50 bool start_black_;
51 Byte *bitmap_;
52 bool highnybble_;
53 unsigned int repeatcount_;
54 unsigned int unpackpk();
55 Byte nybble();
56 void construct_bitmap ();
57 static verbosities verbosity_;
58 };
59
60 class PkGlyph {
61 public:
62 PkGlyph(unsigned int cc,
63 unsigned int tfmwidth, unsigned int dm,
64 unsigned int w, unsigned int h,
65 int hoff, int voff,
66 PkRasterdata *rasterdata, PkFont *f);
67 PkGlyph(unsigned int cc,
68 unsigned int tfmwidth, unsigned int dx, unsigned int dy,
69 unsigned int w, unsigned int h,
70 int hoff, int voff,
71 PkRasterdata *rasterdata, PkFont *f);
72 PkGlyph(int resolution, PkFont *f);
76 inline unsigned int characterCode() const { return cc_; }
82 inline char characterChar() const
83 { return (cc_ >= ' ' && cc_ < 127
84 ? static_cast<char>(cc_) : '?'); }
85
86 const Byte *bitmap();
92 inline unsigned int w() const { return w_; }
98 inline unsigned int h() const { return h_; }
109 inline int hoff() const { return -hoff_; }
122 inline int voff() const { return -voff_; }
127 double tfmWidth() const { return tfmwidth_; }
132 int hEscapement() const { return dx_; }
137 int vEscapement() const { return dy_; }
143 static verbosities verbosity (const verbosities level) {
144 enum verbosities oldv = verbosity_;
145 verbosity_ = level;
146 return oldv;
147 }
148
149 private:
150 unsigned int cc_, dx_, dy_, w_, h_;
151 double tfmwidth_;
152 int hoff_, voff_;
153 PkFont *font_;
154 PkRasterdata *rasterdata_;
155 bool longform_;
156 const Byte *bitmap_;
157 static verbosities verbosity_;
158 static const int two20_ = 1048576; // 2^20
159 static const int two16_ = 65536; // 2^16
160 };
161
162 class PkFont {
163 public:
164 PkFont (double fontmag,
165 unsigned int c,
166 unsigned int s,
167 unsigned int d,
168 string name);
169 ~PkFont();
175 PkGlyph *glyph (unsigned int i) const {
176 if (font_loaded_)
177 {
178 if (i > nglyphs_)
179 throw DviBug ("requested out-of-range glyph");
180 return glyphs_[i];
181 }
182 else
183 return glyphs_[0]; // dummy glyph
184 }
185 static verbosities verbosity (const verbosities level);
186 // setFontPath: specify path to search for fonts. If argument is
187 // null or zero length, simple enable this.
188 static void setFontSearchPath(string fp);
189 static void setFontSearchPath(char *fp);
190 static void setFontSearchPath(bool yesno);
191 // setFontSearchCommand: set the command to use to search for
192 // fonts. If argument is null or zero length, simply enable this,
193 // using the compiled-in default.
194 static void setFontSearchCommand(string cmd);
195 static void setFontSearchCommand(char* cmd);
196 static void setFontSearchCommand(bool yesno);
197 static void setFontSearchKpse(bool yesno);
205 static void setResolution(int res) { resolution_ = res; }
212 static void setMissingFontMode(string mode) { missingFontMode_ = mode; }
213 // Ought I to rationalise setMakeFonts, so that this looks more
214 // like the interface of setFontSearchCommand()? Not really,
215 // since it's possible in principle that there could be more than
216 // just this command-based way of making fonts.
217 static void setFontgen(bool doit);
218 static void setFontgenCommand(string command_template);
219 string fontgenCommand() const;
224 string name() const { return name_; }
229 string fontFilename() const { return path_; }
230 double magnification(bool includeDviMag=true) const;
239 static int dpiBase() { return resolution_; }
245 int dpiScaled() const {
246 return static_cast<int>(resolution_
247 * magnification()
248 + 0.5);
249 }
262 double scale() const {
263 return (double)font_header_.s / (double)font_header_.d;
264 }
271 bool seenInDoc(void) const { return seen_in_doc_; }
272 void setSeenInDoc(void) { seen_in_doc_ = true; }
273
279 double wordSpace() const { return word_space_; }
285 double backSpace() const { return back_space_; }
291 double quad() const { return quad_; }
292
293 // No need to check font_loaded_ in these next three, since these
294 // are never called between the font being created and preamble_
295 // being filled in.
301 double designSize() const { return preamble_.designSize; }
307 double hppp() const { return preamble_.hppp; }
313 double vppp() const { return preamble_.vppp; }
318 unsigned int checksum() const { return preamble_.cs; }
325 bool loaded() const { return font_loaded_; }
326
327 static string& substitute_font_string (const string fmt,
328 const string mode,
329 const string fontname,
330 const int dpi,
331 const int basedpi,
332 const double magnification)
333 throw (PkError);
334
335
336 private:
337 static const unsigned int nglyphs_ = 256;
338 static const unsigned int two20_ = 1048576; // 2^20
339 static const unsigned int two16_ = 65536; // 2^16
340
341 string name_;
342 string path_; /* name of (tbd) file containing font */
343 FileByteStream *pkf_;
344 bool font_loaded_; /* font loaded successfully */
345 struct {
346 unsigned int c; /* font checksum */
347 unsigned int s; /* fixed-point scale factor, in DVI units */
348 unsigned int d; /* `design size', in DVI units */
349 } font_header_; /* this is the information retrieved
350 from the font declaration */
351 double dvimag_; /* Magnification imposed by DVI file (1.0 = no mag) */
352 struct {
353 unsigned int id, cs;
354 double designSize, hppp, vppp;
355 string comment;
356 } preamble_;
357 //double fontscale_;
358 // following are in DVI units
359 double quad_, word_space_, back_space_;
360 PkGlyph *glyphs_[nglyphs_];
361 bool find_font (string&);
362 void read_font(InputByteStream&);
363
364 /* Search the given path for a font. Not static, so that it can
365 see the current font's parameters. */
366 string& search_pkpath (string path,
367 string name, double resolution);
368
369 bool seen_in_doc_; // true once the font_def command has been
370 // seen in the document, as well as the
371 // postamble
372 static verbosities verbosity_;
373 static string fontSearchPath_; // colon-separated list of directories
374 static string fontSearchCommandTemplate_; // command to find fonts
375 static string fontgenCommandTemplate_; // command to generate fonts
376 static void setFontSearchStrategy_(unsigned int, bool);
377 static unsigned int fontSearchStrategies_; // ways to find fonts: flags:
378 static const unsigned int fontSearchStrategyPath_ = 1;
379 static const unsigned int fontSearchStrategyKpse_ = 2;
380 static const unsigned int fontSearchStrategyCommand_ = 4;
381
382 static int resolution_; // base resolution for MF mode
383 static bool makeMissingFonts_; // automatically make fonts
384 static string missingFontMode_;
385 };
386
387 #endif // #ifndef PK_FONT_HEADER_READ
388