Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/dvi/painter.hh
blob: cbb968bf49d821ad046ee98ed1c04f61f3599e08 (plain)
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
#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:
    int h, v, w, x, y, z;		// in dvi units
    DviFrame *next;
    DviFrame *copy ();
};

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 push_fontmap (std::map<int, DviLib::DviFontdefinition *> 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
    DviLib::AbstractFont *current_font;
    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