* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 {
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 void
dvi_cairo_put_pixel (void *image, int x, int y, Ulong color)
{
- cairo_t *cr;
cairo_surface_t *surface;
gint rowstride;
- guchar *p;
+ guint32 *p;
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
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;
}
gint page_width;
gint page_height;
cairo_surface_t *surface;
- gchar *pixels;
+ guchar *pixels;
gint rowstride;
static const cairo_user_data_key_t key;
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,