]> www.fi.muni.cz Git - evince.git/blob - dvi/painter.hh
cbb968bf49d821ad046ee98ed1c04f61f3599e08
[evince.git] / dvi / painter.hh
1 #ifndef PAINTER_HH
2 #define PAINTER_HH
3
4 #include "dl-dvi-program.hh"
5 #include "dl-dvi-file.hh"
6 #include <gdk-pixbuf/gdk-pixbuf.h>
7 #include "font.hh"
8 #include <gdk/gdk.h>
9 #include <cmath>
10 #include <list>
11
12 class AbstractDviPainter : public DviLib::DviRuntime
13 {
14 public:
15     virtual void paint_bitmap (const unsigned char *data, 
16                                uint width, 
17                                uint height,
18                                int hoffset,
19                                int voffseth) = 0;
20     virtual ~AbstractDviPainter () {}
21 };
22
23 class DviFrame : public DviLib::RefCounted
24 {
25 public:
26     int h, v, w, x, y, z;               // in dvi units
27     DviFrame *next;
28     DviFrame *copy ();
29 };
30
31 class DviPainter : public AbstractDviPainter
32 {
33 public:
34     virtual void set_char (int ch);             // typeset ch, move w
35     virtual void put_char (int ch);             // typeset ch, don't move
36     virtual void set_rule (int height, 
37                            int width);          // rule, move (height, width)
38     virtual void put_rule (int height, 
39                            int width);          // rule, don't move
40     virtual void push (void);                   // push current context
41     virtual void pop (void);                    // pop ccontext
42     virtual void right (int len);               // move right len
43     virtual void w (int len);                   // move right len, set w = len
44     virtual void w_rep ();                      // move right w
45     virtual void x (int len);                   // move right len, set x = len
46     virtual void x_rep ();                      // move right x
47     virtual void down (int len);                // move down len
48     virtual void y (int len);                   // move down len, set y = len
49     virtual void y_rep ();                      // move down y
50     virtual void z (int len);                   // move down len, set z = len
51     virtual void z_rep ();                      // move down z
52     virtual void push_fontmap (std::map<int, DviLib::DviFontdefinition *> fontmap);
53     virtual void font_num (int font_num);       // current_font = fd
54     virtual void special (string spc);          // do something special
55     virtual void paint_bitmap (const unsigned char *data, 
56                                uint width, 
57                                uint height,
58                                int voffset,
59                                int hoffset);
60 private:
61     GdkPixmap           *pixmap;
62     GdkGC               *gc;
63     DviLib::DviFile     *dvi_file;
64     uint                 base_dpi;
65     AbstractFontFactory *font_factory;
66
67     // runtime
68     DviLib::AbstractFont *current_font;
69     DviFrame *current_frame;            // stack of DVI frames
70
71     double scale;               // convert dvi units to pixels
72     int dvi_to_pixels (int du) 
73     { 
74         // We add base_dpi horizontally and vertically. This
75         // has the effect of adding an inch horizontally and
76         // vertically. This is just how .dvi files work ...
77         return (int)floor (0.5 + scale * du) + base_dpi; 
78     }
79     int dvi_to_pixels_no_offset (int du) 
80     { 
81         return (int)floor (0.5 + scale * du); 
82     }
83     int tfm_to_dvi (uint tfm, int at_size);
84     
85 public:
86     DviPainter (GdkPixmap               *pixmap_arg,
87                 GdkGC                   *gc_arg,
88                 DviLib::DviFile         *dvi_file_arg,
89                 uint                     base_dpi_arg,
90                 AbstractFontFactory     *font_factory_arg);
91     virtual ~DviPainter ();
92 };
93
94 #endif