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
|
#ifndef PAINTER_HH
#define PAINTER_HH
#include "dl-dvi-program.hh"
#include "dl-dvi-file.hh"
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "font.hh"
#include <gdk/gdk.h>
#include <cmath>
#include <list>
class AbstractDviPainter : public DviLib::DviRuntime
{
public:
virtual void paint_bitmap (const unsigned char *data,
uint width,
uint height,
int hoffset,
int voffseth) = 0;
virtual ~AbstractDviPainter () {}
};
class DviFrame : public DviLib::RefCounted
{
public:
DviLib::DviFontMap *fontmap;
int h, v, w, x, y, z; // in dvi units
DviFrame *next;
DviFrame *copy ();
DviLib::AbstractFont *font;
~DviFrame();
};
class DviPainter : public AbstractDviPainter
{
public:
virtual void set_char (int ch); // typeset ch, move w
virtual void put_char (int ch); // typeset ch, don't move
virtual void set_rule (int height,
int width); // rule, move (height, width)
virtual void put_rule (int height,
int width); // rule, don't move
virtual void push (void); // push current context
virtual void pop (void); // pop ccontext
virtual void right (int len); // move right len
virtual void w (int len); // move right len, set w = len
virtual void w_rep (); // move right w
virtual void x (int len); // move right len, set x = len
virtual void x_rep (); // move right x
virtual void down (int len); // move down len
virtual void y (int len); // move down len, set y = len
virtual void y_rep (); // move down y
virtual void z (int len); // move down len, set z = len
virtual void z_rep (); // move down z
virtual void fontmap (DviLib::DviFontMap *fontmap); // set fontmap
virtual void font_num (int font_num); // current_font = fd
virtual void special (string spc); // do something special
virtual void paint_bitmap (const unsigned char *data,
uint width,
uint height,
int voffset,
int hoffset);
private:
GdkPixmap *pixmap;
GdkGC *gc;
DviLib::DviFile *dvi_file;
uint base_dpi;
AbstractFontFactory *font_factory;
// runtime
DviFrame *current_frame; // stack of DVI frames
double scale; // convert dvi units to pixels
int dvi_to_pixels (int du)
{
// We add base_dpi horizontally and vertically. This
// has the effect of adding an inch horizontally and
// vertically. This is just how .dvi files work ...
return (int)floor (0.5 + scale * du) + base_dpi;
}
int dvi_to_pixels_no_offset (int du)
{
return (int)floor (0.5 + scale * du);
}
int tfm_to_dvi (uint tfm, int at_size);
public:
DviPainter (GdkPixmap *pixmap_arg,
GdkGC *gc_arg,
DviLib::DviFile *dvi_file_arg,
uint base_dpi_arg,
AbstractFontFactory *font_factory_arg);
virtual ~DviPainter ();
};
#endif
|