]> www.fi.muni.cz Git - evince.git/blobdiff - dvi/pixbuf-device.c
Enable print to a PDF. Fixes bug #332121.
[evince.git] / dvi / pixbuf-device.c
index 9ce93192a2ddfc334c9117875228a083c3fea365..1ef436587812c3728d005dff8445f98235d78642 100644 (file)
@@ -9,6 +9,10 @@ typedef struct _DviPixbufDevice
     
     gint xmargin;
     gint ymargin;
+    
+    Ulong fg;
+    Ulong bg;
+    
 } DviPixbufDevice;
 
 static void dvi_pixbuf_draw_rule(DviContext *dvi, int x, int y, Uint w, Uint h, int fill);
@@ -50,8 +54,13 @@ static void dvi_pixbuf_draw_rule(DviContext *dvi, int x, int y, Uint w, Uint h,
 {
        DviPixbufDevice *c_device = (DviPixbufDevice *) dvi->device.device_data;
        gint rowstride;
-       gchar *p;
+       guchar *p;
        gint i, j;    
+       gint red, green, blue;
+       
+       red = (c_device->fg >> 16) & 0xff;
+       green = (c_device->fg >> 8) & 0xff;
+       blue = c_device->fg & 0xff;
        
        x += c_device->xmargin; y += c_device->ymargin;
        
@@ -61,25 +70,22 @@ static void dvi_pixbuf_draw_rule(DviContext *dvi, int x, int y, Uint w, Uint h,
            return;
        
        rowstride = gdk_pixbuf_get_rowstride (c_device->pixbuf);
-       p = gdk_pixbuf_get_pixels (c_device->pixbuf) + rowstride * y + 4 * x;
+       p = gdk_pixbuf_get_pixels (c_device->pixbuf) + rowstride * y + 3 * x;
 
        for (i = 0; i < h; i++) {
            if (i == 0 || i == h - 1 || fill) {
                  for (j = 0; j < w; j++) {
-                       p[j * 4] = 0x00;
-                       p[j * 4 + 1] = 0x00;
-                       p[j * 4 + 2] = 0x00;
-                       p[j * 4 + 3] = 0xff;
+                       p[j * 3] = red;
+                       p[j * 3 + 1] = green;
+                       p[j * 3 + 2] = blue;
                  }
            } else {
-               p[0] = 0x00;
-               p[1] = 0x00;
-               p[2] = 0x00;
-               p[3] = 0xff;
-               p[(w - 1) * 4] = 0x00;
-               p[(w - 1) * 4 + 1] = 0x00;
-               p[(w - 1) * 4 + 2] = 0x00;
-               p[(w - 1) * 4 + 3] = 0xff;
+               p[0] = red;
+               p[1] = green;
+               p[2] = blue;
+               p[(w - 1) * 3] = red;
+               p[(w - 1) * 3 + 1] = green;
+               p[(w - 1) * 3 + 2] = blue;
            }
            p += rowstride;
       }
@@ -119,7 +125,7 @@ static int dvi_pixbuf_interpolate_colors(void *device_data,
 static void *dvi_pixbuf_create_image(void *device_data, Uint w, Uint h, Uint bpp)
 {
 
-    return gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, w, h);
+    return gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, w, h);
     
     return NULL;
 }
@@ -131,19 +137,21 @@ static void dvi_pixbuf_free_image(void *ptr)
 
 static void dvi_pixbuf_put_pixel(void *image, int x, int y, Ulong color)
 {
-    gchar *p;
+    guchar *p;
     
-    p = gdk_pixbuf_get_pixels (GDK_PIXBUF(image)) + y * gdk_pixbuf_get_rowstride(GDK_PIXBUF(image)) + x * 4;
+    p = gdk_pixbuf_get_pixels (GDK_PIXBUF(image)) + y * gdk_pixbuf_get_rowstride(GDK_PIXBUF(image)) + x * 3;
 
     p[0] = (color >> 16) & 0xff;
     p[1] = (color >> 8) & 0xff;
     p[2] = color & 0xff;
-    p[3] = (color >> 24) & 0xff;
 }
 
 static void dvi_pixbuf_set_color(void *device_data, Ulong fg, Ulong bg)
 {
+    DviPixbufDevice *c_device = (DviPixbufDevice *) device_data;
     
+    c_device->fg = fg;
+        
     return; 
 }
 
@@ -194,8 +202,8 @@ mdvi_pixbuf_device_render (DviContext * dvi)
     
   page_width = dvi->dvi_page_w * dvi->params.conv + 2 * c_device->xmargin;
   page_height = dvi->dvi_page_h * dvi->params.vconv + 2 * c_device->ymargin;
-     
-  c_device->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, page_width, page_height);
+    
+  c_device->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, page_width, page_height);
   gdk_pixbuf_fill (c_device->pixbuf, 0xffffffff);
 
   mdvi_dopage (dvi, dvi->currpage);