]> www.fi.muni.cz Git - evince.git/blob - dvi/painter.hh
Auto*ify dvi and dvi/dvilib
[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     DviLib::DviFontMap *fontmap;
27     int h, v, w, x, y, z;               // in dvi units
28     DviFrame *next;
29     DviFrame *copy ();
30     DviLib::AbstractFont *font;
31     ~DviFrame();
32 };
33
34 class DviPainter : public AbstractDviPainter
35 {
36 public:
37     virtual void set_char (int ch);             // typeset ch, move w
38     virtual void put_char (int ch);             // typeset ch, don't move
39     virtual void set_rule (int height, 
40                            int width);          // rule, move (height, width)
41     virtual void put_rule (int height, 
42                            int width);          // rule, don't move
43     virtual void push (void);                   // push current context
44     virtual void pop (void);                    // pop ccontext
45     virtual void right (int len);               // move right len
46     virtual void w (int len);                   // move right len, set w = len
47     virtual void w_rep ();                      // move right w
48     virtual void x (int len);                   // move right len, set x = len
49     virtual void x_rep ();                      // move right x
50     virtual void down (int len);                // move down len
51     virtual void y (int len);                   // move down len, set y = len
52     virtual void y_rep ();                      // move down y
53     virtual void z (int len);                   // move down len, set z = len
54     virtual void z_rep ();                      // move down z
55     virtual void fontmap (DviLib::DviFontMap *fontmap); // set fontmap
56     virtual void font_num (int font_num);       // current_font = fd
57     virtual void special (string spc);          // do something special
58     virtual void paint_bitmap (const unsigned char *data, 
59                                uint width, 
60                                uint height,
61                                int voffset,
62                                int hoffset);
63 private:
64     GdkPixmap           *pixmap;
65     GdkGC               *gc;
66     DviLib::DviFile     *dvi_file;
67     uint                 base_dpi;
68     AbstractFontFactory *font_factory;
69
70     // runtime
71     DviFrame *current_frame;            // stack of DVI frames
72
73     double scale;               // convert dvi units to pixels
74     int dvi_to_pixels (int du) 
75     { 
76         // We add base_dpi horizontally and vertically. This
77         // has the effect of adding an inch horizontally and
78         // vertically. This is just how .dvi files work ...
79         return (int)floor (0.5 + scale * du) + base_dpi; 
80     }
81     int dvi_to_pixels_no_offset (int du) 
82     { 
83         return (int)floor (0.5 + scale * du); 
84     }
85     int tfm_to_dvi (uint tfm, int at_size);
86     
87 public:
88     DviPainter (GdkPixmap               *pixmap_arg,
89                 GdkGC                   *gc_arg,
90                 DviLib::DviFile         *dvi_file_arg,
91                 uint                     base_dpi_arg,
92                 AbstractFontFactory     *font_factory_arg);
93     virtual ~DviPainter ();
94 };
95
96 #endif