2 #include "dl-dvi-fontdefinition.hh"
4 using DviLib::DviFontdefinition;
5 using DviLib::AbstractCharacter;
9 DviPainter::paint_bitmap (const unsigned char *data,
10 uint width, uint height,
11 int hoffset, int voffset)
14 gdk_pixbuf_new_from_data (data,
20 width * 4, // rowstride
22 NULL); // destroy_fn_data
24 uint x = dvi_to_pixels (current_frame->h);
25 uint y = dvi_to_pixels (current_frame->v);
27 gdk_pixbuf_render_to_drawable (pixbuf,
33 //y+(height - voffset),
42 DviPainter::set_char (int ch)
44 g_assert (current_font);
46 AbstractCharacter *character = current_font->get_char (ch);
47 character->paint (* this);
49 int tfm_width = character->get_tfm_width ();
50 int at_size = current_font->get_at_size ();
51 int dvi_width = tfm_to_dvi (tfm_width, at_size);
53 current_frame->h += dvi_width;
56 // typeset ch, don't move
58 DviPainter::put_char (int ch)
60 AbstractCharacter *character = current_font->get_char (ch);
61 character->paint (* this);
65 // rule, move (height, width)
66 DviPainter::set_rule (int height,
69 int width_p = dvi_to_pixels_no_offset (width);
70 int height_p = dvi_to_pixels_no_offset (height);
71 int x = dvi_to_pixels (current_frame->h);
72 int y = dvi_to_pixels (current_frame->v);
74 cout << "BIRNAN\n" << endl;
76 gdk_draw_rectangle (pixmap, gc, TRUE,
78 width_p + 1, height_p + 1);
80 current_frame->h += width;
85 DviPainter::put_rule (int height,
88 cout << "w h " << width << " " << height << " " << endl;
90 int width_p = dvi_to_pixels_no_offset (width);
91 int height_p = dvi_to_pixels_no_offset (height);
92 int x = dvi_to_pixels (current_frame->h);
93 int y = dvi_to_pixels (current_frame->v);
95 cout << "EMFLE\n" << endl;
97 cout << "x y h w " << x << " " << y << " " << height_p << " "
100 gdk_draw_rectangle (pixmap, gc, TRUE,
102 width_p + 1, height_p + 1);
105 // push current context
107 DviFrame::copy (void)
109 DviFrame *frame = new DviFrame ();
122 DviPainter::push (void)
124 DviFrame *new_frame = current_frame->copy();
125 new_frame->next = current_frame;
126 current_frame = new_frame;
131 DviPainter::pop (void)
133 DviFrame *old_frame = current_frame;
135 current_frame = current_frame->next;
142 DviPainter::right (int len)
144 current_frame->h += len;
147 // move right len, set w = len
149 DviPainter::w (int len)
152 current_frame->w = len;
159 right (current_frame->w);
162 // move right len, set x = len
164 DviPainter::x (int len)
167 current_frame->x = len;
174 right (current_frame->x);
179 DviPainter::down (int len)
181 current_frame->v += len;
184 // move down len, set y = len
186 DviPainter::y (int len)
189 current_frame->y = len;
196 down (current_frame->y);
199 // move down len, set z = len
201 DviPainter::z (int len)
204 current_frame->z = len;
211 down (current_frame->z);
216 DviPainter::font_num (int font_num)
218 cout << "get fno " << font_num << endl;
219 DviFontdefinition *fd = dvi_file->get_fontdefinition (font_num);
225 int dpi = (int)floor( 0.5 + 1.0 * base_dpi *
226 dvi_file->get_magnification() * fd->at_size /
227 ( 1000.0 * fd->design_size));
228 cout << "fno: " << fd->fontnum << endl;
229 cout << fd->name << endl;
231 font_factory->create_font (fd->name, dpi, fd->at_size);
235 // do something special
237 DviPainter::special (string spc)
239 cout << "warning: special " << spc << " " << "not handled" << endl;
243 DviPainter::tfm_to_dvi (uint tfm, int at_size)
245 // this is from gtkdvi:
246 int alpha, z, beta, b0, b1, b2, b3, r;
259 b0 = tfm & (0xFF << 24);
260 b1 = tfm & (0xFF << 16);
261 b2 = tfm & (0xFF << 8);
262 b3 = tfm & (0xFF << 0);
266 b1 = (tfm >> 16) & 255;
267 b2 = (tfm >> 8) & 255;
271 r = (((((b3 * z) / 256) + (b2 * z)) / 256) + (b1 * z))/beta;
278 r = (((b3 / 256 + b2) / 256) + b1) / beta;
282 if ((b0 > 0) != (tfm > 0))
283 cout << "b0: " << b0 << "tfm: " << tfm << endl;
290 DviPainter::DviPainter (GdkPixmap *pixmap_arg,
292 DviLib::DviFile *dvi_file_arg,
294 AbstractFontFactory *font_factory_arg)
296 pixmap = (GdkPixmap *)g_object_ref (pixmap_arg);
297 gc = (GdkGC *)g_object_ref (gc_arg);
298 dvi_file = dvi_file_arg;
299 base_dpi = base_dpi_arg;
300 font_factory = font_factory_arg;
307 current_frame = new DviFrame;
308 current_frame->h = 0;
309 current_frame->v = 0;
310 current_frame->w = 0;
311 current_frame->x = 0;
312 current_frame->y = 0;
313 current_frame->z = 0;
316 scale = dvi_file->get_numerator() / 254000.0;
317 scale *= 1.0 * base_dpi / dvi_file->get_denominator ();
318 scale *= dvi_file->get_magnification () / 1000.0;
321 DviPainter::~DviPainter ()
323 g_object_unref (pixmap);
326 font_factory->unref();
327 while (current_frame)
332 DviPainter::push_fontmap (std::map<int, DviFontdefinition *> fontmap)