2 * Copyright (C) 2000, Matias Atria
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <sys/types.h>
29 #include "dviopcodes.h"
31 typedef struct _DviGlyph DviGlyph;
32 typedef struct _DviDevice DviDevice;
33 typedef struct _DviFontChar DviFontChar;
34 typedef struct _DviFontRef DviFontRef;
35 typedef struct _DviFontInfo DviFontInfo;
36 typedef struct _DviFont DviFont;
37 typedef struct _DviState DviState;
38 typedef struct _DviPageSpec *DviPageSpec;
39 typedef struct _DviParams DviParams;
40 typedef struct _DviBuffer DviBuffer;
41 typedef struct _DviContext DviContext;
42 typedef struct _DviRange DviRange;
43 typedef struct _DviColorPair DviColorPair;
44 typedef struct _DviSection DviSection;
45 typedef struct _TFMChar TFMChar;
46 typedef struct _TFMInfo TFMInfo;
47 typedef struct _DviFontSearch DviFontSearch;
48 /* this is an opaque type */
49 typedef struct _DviFontClass DviFontClass;
51 typedef void (*DviFreeFunc) __PROTO((void *));
52 typedef void (*DviFree2Func) __PROTO((void *, void *));
54 typedef Ulong DviColor;
72 * information about a page:
73 * pagenum[0] = offset to BOP
74 * pagenum[1], ..., pagenum[10] = TeX \counters
76 typedef long PageNum[11];
78 /* this structure contains the platform-specific information
79 * required to interpret a DVI file */
81 typedef void (*DviGlyphDraw) __PROTO((DviContext *context,
85 typedef void (*DviRuleDraw) __PROTO((DviContext *context,
87 Uint width, Uint height, int fill));
89 typedef int (*DviColorScale) __PROTO((void *device_data,
96 typedef void *(*DviCreateImage) __PROTO((void *device_data,
100 typedef void (*DviFreeImage) __PROTO((void *image));
101 typedef void (*DviPutPixel) __PROTO((void *image, int x, int y, Ulong color));
102 typedef void (*DviDevDestroy) __PROTO((void *data));
103 typedef void (*DviRefresh) __PROTO((DviContext *dvi, void *device_data));
104 typedef void (*DviSetColor) __PROTO((void *device_data, Ulong, Ulong));
105 typedef void (*DviPSDraw) __PROTO((DviContext *context,
106 const char *filename,
108 Uint width, Uint height));
111 DviGlyphDraw draw_glyph;
112 DviRuleDraw draw_rule;
113 DviColorScale alloc_colors;
114 DviCreateImage create_image;
115 DviFreeImage free_image;
116 DviPutPixel put_pixel;
117 DviDevDestroy dev_destroy;
119 DviSetColor set_color;
132 Int32 advance; /* advance */
133 Int32 height; /* ascent */
134 Int32 depth; /* descent */
135 Int32 left; /* leftSideBearing */
136 Int32 right; /* rightSideBearing */
140 int type; /* DviFontAFM, DviFontTFM, DviFontOFM */
151 short x, y; /* origin */
152 Uint w, h; /* dimensions */
153 void *data; /* bitmap or XImage */
156 typedef void (*DviFontShrinkFunc)
157 __PROTO((DviContext *, DviFont *, DviFontChar *, DviGlyph *));
158 typedef int (*DviFontLoadFunc) __PROTO((DviParams *, DviFont *));
159 typedef int (*DviFontGetGlyphFunc) __PROTO((DviParams *, DviFont *, int));
160 typedef void (*DviFontFreeFunc) __PROTO((DviFont *));
161 typedef void (*DviFontResetFunc) __PROTO((DviFont *));
162 typedef char *(*DviFontLookupFunc) __PROTO((const char *, Ushort *, Ushort *));
163 typedef int (*DviFontEncodeFunc) __PROTO((DviParams *, DviFont *, DviEncoding *));
165 struct _DviFontInfo {
166 char *name; /* human-readable format identifying string */
167 int scalable; /* does it support scaling natively? */
168 DviFontLoadFunc load;
169 DviFontGetGlyphFunc getglyph;
170 DviFontShrinkFunc shrink0;
171 DviFontShrinkFunc shrink1;
172 DviFontFreeFunc freedata;
173 DviFontResetFunc reset;
174 DviFontLookupFunc lookup;
179 struct _DviFontChar {
181 Int16 code; /* format-dependent, not used by MDVI */
188 #ifdef __STRICT_ANSI__
198 /* data for shrunk bitimaps */
222 struct _DviFontSearch {
228 const char *wanted_name;
229 const char *actual_name;
234 /* this is a kludge, I know */
235 #define ISVIRTUAL(font) ((font)->search.info->getglyph == NULL)
236 #define SEARCH_DONE(s) ((s).id < 0)
237 #define SEARCH_INIT(s, name, h, v) do { \
242 (s).wanted_name = (name); \
243 (s).actual_name = NULL; \
262 DviFontSearch search;
264 DviFontRef *subfonts;
273 MDVI_ORIENT_TBLR = 0, /* top to bottom, left to right */
274 MDVI_ORIENT_TBRL = 1, /* top to bottom, right to left */
275 MDVI_ORIENT_BTLR = 2, /* bottom to top, left to right */
276 MDVI_ORIENT_BTRL = 3, /* bottom to top, right to left */
277 MDVI_ORIENT_RP90 = 4, /* rotated +90 degrees (counter-clockwise) */
278 MDVI_ORIENT_RM90 = 5, /* rotated -90 degrees (clockwise) */
279 MDVI_ORIENT_IRP90 = 6, /* flip horizontally, then rotate by +90 */
280 MDVI_ORIENT_IRM90 = 7 /* rotate by -90, then flip horizontally */
284 MDVI_PAGE_SORT_UP, /* up, using \counter0 */
285 MDVI_PAGE_SORT_DOWN, /* down, using \counter0 */
286 MDVI_PAGE_SORT_RANDOM, /* randomly */
287 MDVI_PAGE_SORT_DVI_UP, /* up, by location in DVI file */
288 MDVI_PAGE_SORT_DVI_DOWN, /* down, by location in DVI file */
289 MDVI_PAGE_SORT_NONE /* don't sort */
293 double mag; /* magnification */
294 double conv; /* horizontal DVI -> pixel */
295 double vconv; /* vertical DVI -> pixel */
296 double tfm_conv; /* TFM -> DVI */
297 double gamma; /* gamma correction factor */
298 Uint dpi; /* horizontal resolution */
299 Uint vdpi; /* vertical resolution */
300 int hshrink; /* horizontal shrinking factor */
301 int vshrink; /* vertical shrinking factor */
302 Uint density; /* pixel density */
303 Uint flags; /* flags (see MDVI_PARAM macros) */
304 int hdrift; /* max. horizontal drift */
305 int vdrift; /* max. vertical drift */
306 int vsmallsp; /* small vertical space */
307 int thinsp; /* small horizontal space */
308 int layer; /* visible layer (for layered DVI files) */
309 Ulong fg; /* foreground color */
310 Ulong bg; /* background color */
311 DviOrientation orientation; /* page orientation */
322 MDVI_SET_XSHRINK = 5,
323 MDVI_SET_YSHRINK = 6,
325 MDVI_SET_DENSITY = 8,
326 MDVI_SET_MAGNIFICATION = 9,
328 MDVI_SET_HDRIFT = 11,
329 MDVI_SET_VDRIFT = 12,
330 MDVI_SET_ORIENTATION = 13,
331 MDVI_SET_FOREGROUND = 14,
332 MDVI_SET_BACKGROUND = 15
337 size_t size; /* allocated size */
338 size_t length; /* amount of data buffered */
339 size_t pos; /* current position in buffer */
340 int frozen; /* can we free this data? */
355 struct _DviColorPair {
361 char *filename; /* name of the DVI file */
362 FILE *in; /* from here we read */
363 char *fileid; /* from preamble */
364 int npages; /* number of pages */
365 int currpage; /* currrent page (0 based) */
366 int depth; /* recursion depth */
367 DviBuffer buffer; /* input buffer */
368 DviParams params; /* parameters */
369 DviPaper paper; /* paper type */
370 Int32 num; /* numerator */
371 Int32 den; /* denominator */
372 DviFontRef *fonts; /* fonts used in this file */
373 DviFontRef **fontmap; /* for faster id lookups */
374 DviFontRef *currfont; /* current font */
375 int nfonts; /* # of fonts used in this job */
376 Int32 dvimag; /* original magnification */
377 double dviconv; /* unshrunk scaling factor */
378 double dvivconv; /* unshrunk scaling factor (vertical) */
379 int dvi_page_w; /* unscaled page width */
380 int dvi_page_h; /* unscaled page height */
381 Ulong modtime; /* file modification time */
382 PageNum *pagemap; /* page table */
383 DviState pos; /* registers */
384 DviPageSpec *pagesel; /* page selection data */
385 int curr_layer; /* current layer */
386 DviState *stack; /* DVI stack */
387 int stacksize; /* stack depth */
388 int stacktop; /* stack pointer */
389 DviDevice device; /* device-specific routines */
390 Ulong curr_fg; /* rendering color */
393 DviColorPair *color_stack;
397 DviFontRef *(*findref) __PROTO((DviContext *, Int32));
398 void *user_data; /* client data attached to this context */
402 MDVI_RANGE_BOUNDED, /* range is finite */
403 MDVI_RANGE_LOWER, /* range has a lower bound */
404 MDVI_RANGE_UPPER, /* range has an upper bound */
405 MDVI_RANGE_UNBOUNDED /* range has no bounds at all */
409 DviRangeType type; /* one of the above */
410 int from; /* lower bound */
411 int to; /* upper bound */
416 typedef void (*DviSpecialHandler)
417 __PROTO((DviContext *dvi, const char *prefix, const char *arg));
419 #define RANGE_HAS_LOWER(x) \
420 ((x) == MDVI_RANGE_BOUNDED || (x) == MDVI_RANGE_LOWER)
421 #define RANGE_HAS_UPPER(x) \
422 ((x) == MDVI_RANGE_BOUNDED || (x) == MDVI_RANGE_UPPER)
425 * Macros and prototypes
428 #define MDVI_PARAM_ANTIALIASED 1
429 #define MDVI_PARAM_MONO 2
430 #define MDVI_PARAM_CHARBOXES 4
431 #define MDVI_PARAM_SHOWUNDEF 8
432 #define MDVI_PARAM_DELAYFONTS 16
435 * The FALLBACK priority class is reserved for font formats that
436 * contain no glyph information and are to be used as a last
437 * resort (e.g. TFM, AFM)
439 #define MDVI_FONTPRIO_FALLBACK -3
440 #define MDVI_FONTPRIO_LOWEST -2
441 #define MDVI_FONTPRIO_LOW -1
442 #define MDVI_FONTPRIO_NORMAL 0
443 #define MDVI_FONTPRIO_HIGH 1
444 #define MDVI_FONTPRIO_HIGHEST 2
446 #define MDVI_FONT_ENCODED (1 << 0)
448 #define MDVI_GLYPH_EMPTY ((void *)1)
449 /* does the glyph have a non-empty bitmap/image? */
450 #define MDVI_GLYPH_NONEMPTY(x) ((x) && (x) != MDVI_GLYPH_EMPTY)
451 /* has the glyph been loaded from disk? */
452 #define MDVI_GLYPH_UNSET(x) ((x) == NULL)
453 /* do we have only a bounding box for this glyph? */
454 #define MDVI_GLYPH_ISEMPTY(x) ((x) == MDVI_GLYPH_EMPTY)
456 #define MDVI_ENABLED(d,x) ((d)->params.flags & (x))
457 #define MDVI_DISABLED(d,x) !MDVI_ENABLED((d), (x))
459 #define MDVI_LASTPAGE(d) ((d)->npages - 1)
460 #define MDVI_NPAGES(d) (d)->npages
461 #define MDVI_VALIDPAGE(d,p) ((p) >= 0 && (p) <= MDVI_LASTPAGE(d))
462 #define MDVI_FLAGS(d) (d)->params.flags
463 #define MDVI_SHRINK_FROM_DPI(d) Max(1, (d) / 75)
464 #define MDVI_CURRFG(d) (d)->curr_fg
465 #define MDVI_CURRBG(d) (d)->curr_bg
467 #define pixel_round(d,v) (int)((d)->params.conv * (v) + 0.5)
468 #define vpixel_round(d,v) (int)((d)->params.vconv * (v) + 0.5)
469 #define rule_round(d,v) (int)((d)->params.conv * (v) + 0.99999) /*9999999)*/
470 #define vrule_round(d,v) (int)((d)->params.vconv * (v) + 0.99999)
472 extern int mdvi_reload __PROTO((DviContext *, DviParams *));
473 extern void mdvi_setpage __PROTO((DviContext *, int));
474 extern int mdvi_dopage __PROTO((DviContext *, int));
475 extern void mdvi_shrink_glyph __PROTO((DviContext *, DviFont *, DviFontChar *, DviGlyph *));
476 extern void mdvi_shrink_box __PROTO((DviContext *, DviFont *, DviFontChar *, DviGlyph *));
477 extern void mdvi_shrink_glyph_grey __PROTO((DviContext *, DviFont *, DviFontChar *, DviGlyph *));
478 extern int mdvi_find_tex_page __PROTO((DviContext *, int));
479 extern int mdvi_configure __PROTO((DviContext *, DviParamCode, ...));
481 extern int get_tfm_chars __PROTO((DviParams *, DviFont *, TFMInfo *, int));
482 extern int tfm_load_file __PROTO((const char *, TFMInfo *));
483 extern int afm_load_file __PROTO((const char *, TFMInfo *));
484 extern TFMInfo *get_font_metrics __PROTO((const char *, int, const char *));
485 extern char *lookup_font_metrics __PROTO((const char *, int *));
486 extern void free_font_metrics __PROTO((TFMInfo *));
487 extern void flush_font_metrics __PROTO((void));
489 #define get_metrics(name) get_font_metrics((name), DviFontAny, NULL)
491 extern void mdvi_sort_pages __PROTO((DviContext *, DviPageSort));
493 extern void mdvi_init_kpathsea __PROTO((const char *, const char *, const char *, int));
495 extern DviContext* mdvi_init_context __PROTO((DviParams *, DviPageSpec *, const char *));
496 extern void mdvi_destroy_context __PROTO((DviContext *));
498 /* helper macros that call mdvi_configure() */
499 #define mdvi_config_one(d,x,y) mdvi_configure((d), (x), (y), MDVI_PARAM_LAST)
500 #define mdvi_set_dpi(d,x) mdvi_config_one((d), MDVI_SET_DPI, (x))
501 #define mdvi_set_xdpi(d,x) mdvi_config_one((d), MDVI_SET_XDPI, (x))
502 #define mdvi_set_ydpi(d,x) mdvi_config_one((d), MDVI_SET_YDPI, (x))
503 #define mdvi_set_hshrink(d,h) mdvi_config_one((d), MDVI_SET_XSHRINK, (h))
504 #define mdvi_set_vshrink(d,h) mdvi_config_one((d), MDVI_SET_YSHRINK, (h))
505 #define mdvi_set_gamma(d,g) mdvi_config_one((d), MDVI_SET_GAMMA, (g))
506 #define mdvi_set_density(d,x) mdvi_config_one((d), MDVI_SET_DENSITY, (x))
507 #define mdvi_set_drift(d,x) mdvi_config_one((d), MDVI_SET_DRIFT, (x))
508 #define mdvi_set_hdrift(d,h) mdvi_config_one((d), MDVI_SET_HDRIFT, (h))
509 #define mdvi_set_vdrift(d,v) mdvi_config_one((d), MDVI_SET_VDRIFT, (v))
510 #define mdvi_set_mag(d,m) \
511 mdvi_config_one((d), MDVI_SET_MAGNIFICATION, (m))
512 #define mdvi_set_foreground(d,x) \
513 mdvi_config_one((d), MDVI_SET_FOREGROUND, (x))
514 #define mdvi_set_background(d,x) \
515 mdvi_config_one((d), MDVI_SET_BACKGROUND, (x))
516 #define mdvi_set_orientation(d,x) \
517 mdvi_config_one((d), MDVI_SET_ORIENTATION, (x))
518 #define mdvi_set_shrink(d,h,v) \
519 mdvi_configure((d), MDVI_SET_XSHRINK, (h), \
520 MDVI_SET_YSHRINK, (v), MDVI_PARAM_LAST)
522 extern DviRange* mdvi_parse_range __PROTO((const char *, DviRange *, int *, char **));
523 extern DviPageSpec* mdvi_parse_page_spec __PROTO((const char *));
524 extern void mdvi_free_page_spec __PROTO((DviPageSpec *));
525 extern int mdvi_in_range __PROTO((DviRange *, int, int));
526 extern int mdvi_range_length __PROTO((DviRange *, int));
527 extern int mdvi_page_selected __PROTO((DviPageSpec *, PageNum, int));
530 extern int mdvi_register_special __PROTO((
534 DviSpecialHandler handler,
536 extern int mdvi_unregister_special __PROTO((const char *prefix));
537 extern int mdvi_do_special __PROTO((DviContext *dvi, char *dvi_special));
538 extern void mdvi_flush_specials __PROTO((void));
542 #define MDVI_FONTSEL_BITMAP (1 << 0)
543 #define MDVI_FONTSEL_GREY (1 << 1)
544 #define MDVI_FONTSEL_GLYPH (1 << 2)
546 #define FONTCHAR(font, code) \
547 (((code) < font->loc || (code) > font->hic || !(font)->chars) ? \
548 NULL : &font->chars[(code) - (font)->loc])
549 #define FONT_GLYPH_COUNT(font) ((font)->hic - (font)->loc + 1)
551 #define glyph_present(x) ((x) && (x)->offset)
553 /* create a reference to a font */
554 extern DviFontRef *font_reference __PROTO((DviParams *params,
556 const char *font_name,
560 Int32 scale_factor));
562 /* drop a reference to a font */
563 extern void font_drop_one __PROTO((DviFontRef *));
565 /* drop a chain of references */
566 extern void font_drop_chain __PROTO((DviFontRef *));
568 /* destroy selected information for a glyph */
569 extern void font_reset_one_glyph __PROTO((DviDevice *, DviFontChar *, int));
571 /* destroy selected information for all glyphs in a font */
572 extern void font_reset_font_glyphs __PROTO((DviDevice *, DviFont *, int));
574 /* same for a chain of font references */
575 extern void font_reset_chain_glyphs __PROTO((DviDevice *, DviFontRef *, int));
577 extern void font_finish_definitions __PROTO((DviContext *));
579 /* lookup an id # in a reference chain */
580 extern DviFontRef* font_find_flat __PROTO((DviContext *, Int32));
581 extern DviFontRef* font_find_mapped __PROTO((DviContext *, Int32));
583 /* called to reopen (or rewind) a font file */
584 extern int font_reopen __PROTO((DviFont *));
586 /* reads a glyph from a font, and makes all necessary transformations */
587 extern DviFontChar* font_get_glyph __PROTO((DviContext *, DviFont *, int));
589 /* transform a glyph according to the given orientation */
590 extern void font_transform_glyph __PROTO((DviOrientation, DviGlyph *));
592 /* destroy all fonts that are not being used, returns number of fonts freed */
593 extern int font_free_unused __PROTO((DviDevice *));
595 #define font_free_glyph(dev, font, code) \
596 font_reset_one_glyph((dev), \
597 FONTCHAR((font), (code)), MDVI_FONTSEL_GLYPH)
599 extern int mdvi_encode_font __PROTO((DviParams *, DviFont *));
602 /* font lookup functions */
603 extern int mdvi_register_font_type __PROTO((DviFontInfo *, int));
604 extern char **mdvi_list_font_class __PROTO((int));
605 extern int mdvi_get_font_classes __PROTO((void));
606 extern int mdvi_unregister_font_type __PROTO((const char *, int));
607 extern char *mdvi_lookup_font __PROTO((DviFontSearch *));
608 extern DviFont *mdvi_add_font __PROTO((const char *, Int32, int, int, Int32));
609 extern int mdvi_font_retry __PROTO((DviParams *, DviFont *));
613 extern int mdvi_set_logfile __PROTO((const char *));
614 extern int mdvi_set_logstream __PROTO((FILE *));
615 extern int mdvi_set_loglevel __PROTO((int));
617 #define mdvi_stop_logging(x) mdvi_set_logstream(NULL)
619 /* this will check the environment and then `texmf.cnf' for
620 * the given name changed to lowercase, and `_' changed to `-' */
621 extern char* mdvi_getenv __PROTO((const char *));
623 #endif /* _MDVI_DVI_H */