]> www.fi.muni.cz Git - evince.git/blobdiff - backend/dvi/cairo-device.c
[dvi] Test glyph->data for MDVI_GLYPH_EMPTY
[evince.git] / backend / dvi / cairo-device.c
index 19006d2e36818660d412fecd657d2218ce6d3532..47425cad7e0be21a503a449c8fff618f525c35bb 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
  */
 
-#include <gdk/gdkcolor.h>
+#include <config.h>
+
+#include <stdlib.h>
+#include <gdk/gdk.h>
+#ifdef HAVE_SPECTRE
+#include <libspectre/spectre.h>
+#endif
+
 #include "cairo-device.h"
 
 typedef struct {
 #include "cairo-device.h"
 
 typedef struct {
@@ -48,7 +55,9 @@ dvi_cairo_draw_glyph (DviContext  *dvi,
 
        glyph = &ch->grey;
 
 
        glyph = &ch->grey;
 
-       isbox = (glyph->data == NULL || (dvi->params.flags & MDVI_PARAM_CHARBOXES));
+       isbox = (glyph->data == NULL ||
+                (dvi->params.flags & MDVI_PARAM_CHARBOXES) ||
+                MDVI_GLYPH_ISEMPTY (glyph->data));
 
        x = - glyph->x + x0 + cairo_device->xmargin;
        y = - glyph->y + y0 + cairo_device->ymargin;
 
        x = - glyph->x + x0 + cairo_device->xmargin;
        y = - glyph->y + y0 + cairo_device->ymargin;
@@ -116,6 +125,73 @@ dvi_cairo_draw_rule (DviContext *dvi,
        cairo_restore (cairo_device->cr);
 }
 
        cairo_restore (cairo_device->cr);
 }
 
+#ifdef HAVE_SPECTRE
+static void
+dvi_cairo_draw_ps (DviContext *dvi,
+                  const char *filename,
+                  int         x,
+                  int         y,
+                  Uint        width,
+                  Uint        height)
+{
+       DviCairoDevice       *cairo_device;
+       unsigned char        *data = NULL;
+       int                   row_length;
+       SpectreDocument      *psdoc;
+       SpectreRenderContext *rc;
+       int                   w, h;
+       SpectreStatus         status;
+       cairo_surface_t      *image;
+
+       cairo_device = (DviCairoDevice *) dvi->device.device_data;
+
+       psdoc = spectre_document_new ();
+       spectre_document_load (psdoc, filename);
+       if (spectre_document_status (psdoc)) {
+               spectre_document_free (psdoc);
+               return;
+       }
+
+       spectre_document_get_page_size (psdoc, &w, &h);
+
+       rc = spectre_render_context_new ();
+       spectre_render_context_set_scale (rc,
+                                         (double)width / w,
+                                         (double)height / h);
+       spectre_document_render_full (psdoc, rc, &data, &row_length);   
+       status = spectre_document_status (psdoc);
+
+       spectre_render_context_free (rc);
+       spectre_document_free (psdoc);
+
+       if (status) {
+               g_warning ("Error rendering PS document %s: %s\n",
+                          filename, spectre_status_to_string (status));
+               free (data);
+               
+               return;
+       }
+
+       image = cairo_image_surface_create_for_data ((unsigned char *)data,
+                                                    CAIRO_FORMAT_RGB24,
+                                                    width, height,
+                                                    row_length);
+
+       cairo_save (cairo_device->cr);
+
+       cairo_translate (cairo_device->cr,
+                        x + cairo_device->xmargin,
+                        y + cairo_device->ymargin);
+       cairo_set_source_surface (cairo_device->cr, image, 0, 0); 
+       cairo_paint (cairo_device->cr);
+
+       cairo_restore (cairo_device->cr);
+
+       cairo_surface_destroy (image);
+       free (data);
+}
+#endif /* HAVE_SPECTRE */
+
 static int
 dvi_cairo_alloc_colors (void  *device_data,
                        Ulong *pixels,
 static int
 dvi_cairo_alloc_colors (void  *device_data,
                        Ulong *pixels,
@@ -171,19 +247,16 @@ dvi_cairo_free_image (void *ptr)
 static void
 dvi_cairo_put_pixel (void *image, int x, int y, Ulong color)
 {
 static void
 dvi_cairo_put_pixel (void *image, int x, int y, Ulong color)
 {
-       cairo_t         *cr;
        cairo_surface_t *surface;
        gint             rowstride;
        cairo_surface_t *surface;
        gint             rowstride;
-       guchar          *p;
+       guint32         *p;
 
        surface = (cairo_surface_t *) image;
 
        rowstride = cairo_image_surface_get_stride (surface);
 
        surface = (cairo_surface_t *) image;
 
        rowstride = cairo_image_surface_get_stride (surface);
-       p = cairo_image_surface_get_data (surface) + y * rowstride + x * 4;
+       p = (guint32*) (cairo_image_surface_get_data (surface) + y * rowstride + x * 4);
 
 
-       p[2] = (color >> 16) & 0xff;
-       p[1] = (color >> 8) & 0xff;
-       p[0] = (color >> 0) & 0xff;
+       *p = color;
 }
 
 static void
 }
 
 static void
@@ -208,6 +281,11 @@ mdvi_cairo_device_init (DviDevice *device)
        device->free_image = dvi_cairo_free_image;
        device->put_pixel = dvi_cairo_put_pixel;
        device->set_color = dvi_cairo_set_color;
        device->free_image = dvi_cairo_free_image;
        device->put_pixel = dvi_cairo_put_pixel;
        device->set_color = dvi_cairo_set_color;
+#ifdef HAVE_SPECTRE
+       device->draw_ps = dvi_cairo_draw_ps;
+#else
+       device->draw_ps = NULL;
+#endif
        device->refresh = NULL;
 }
 
        device->refresh = NULL;
 }
 
@@ -241,7 +319,7 @@ mdvi_cairo_device_render (DviContext* dvi)
        gint             page_width;
        gint             page_height;
        cairo_surface_t *surface;
        gint             page_width;
        gint             page_height;
        cairo_surface_t *surface;
-       gchar           *pixels;
+       guchar          *pixels;
        gint             rowstride;
        static const cairo_user_data_key_t key;
 
        gint             rowstride;
        static const cairo_user_data_key_t key;
 
@@ -254,7 +332,7 @@ mdvi_cairo_device_render (DviContext* dvi)
        page_height = dvi->dvi_page_h * dvi->params.vconv + 2 * cairo_device->ymargin;
 
        rowstride = page_width * 4;
        page_height = dvi->dvi_page_h * dvi->params.vconv + 2 * cairo_device->ymargin;
 
        rowstride = page_width * 4;
-       pixels = (gchar *) g_malloc (page_height * rowstride);
+       pixels = (guchar *) g_malloc (page_height * rowstride);
        memset (pixels, 0xff, page_height * rowstride);
 
        surface = cairo_image_surface_create_for_data (pixels,
        memset (pixels, 0xff, page_height * rowstride);
 
        surface = cairo_image_surface_create_for_data (pixels,