Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/backend/dvi/cairo-device.c
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2007-12-20 10:12:52 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2007-12-20 10:12:52 (GMT)
commitd24b16f917ca749e9ffebbec8eca0ee791e1b67a (patch)
tree73e060f65da7cdc5fb5dd7491d3b8e526e384792 /backend/dvi/cairo-device.c
parent945efc9392d4c4b5d6a211ed4ccac376bf8c3066 (diff)
Add ps specials support in dvi backend when libspectre is present. Fixes
2007-12-20 Carlos Garcia Campos <carlosgc@gnome.org> * backend/dvi/Makefile.am: * backend/dvi/cairo-device.c: (dvi_cairo_draw_ps), (mdvi_cairo_device_init): * backend/dvi/mdvi-lib/common.h: * backend/dvi/mdvi-lib/mdvi.h: * backend/dvi/mdvi-lib/sp-epsf.c: (epsf_special): * backend/dvi/mdvi-lib/util.c: (mdvi_strrstr), (mdvi_build_path_from_cwd): Add ps specials support in dvi backend when libspectre is present. Fixes bug #386005. svn path=/trunk/; revision=2775
Diffstat (limited to 'backend/dvi/cairo-device.c')
-rw-r--r--backend/dvi/cairo-device.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/backend/dvi/cairo-device.c b/backend/dvi/cairo-device.c
index 19006d2..95f3e63 100644
--- a/backend/dvi/cairo-device.c
+++ b/backend/dvi/cairo-device.c
@@ -16,7 +16,13 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#include <config.h>
+
#include <gdk/gdkcolor.h>
+#ifdef HAVE_SPECTRE
+#include <libspectre/spectre.h>
+#endif
+
#include "cairo-device.h"
typedef struct {
@@ -116,6 +122,73 @@ dvi_cairo_draw_rule (DviContext *dvi,
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;
+ SpectrePage *page;
+ SpectreRenderContext *rc;
+ 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;
+ }
+
+ page = spectre_document_get_page (psdoc, 0);
+ if (!page) {
+ spectre_document_free (psdoc);
+ return;
+ }
+
+ rc = spectre_render_context_new ();
+ spectre_render_context_set_page_size (rc, width, height);
+ spectre_page_render (page, rc, &data, &row_length);
+ status = spectre_page_status (page);
+ spectre_render_context_free (rc);
+
+ spectre_page_free (page);
+ spectre_document_free (psdoc);
+
+ if (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,
@@ -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;
+#ifdef HAVE_SPECTRE
+ device->draw_ps = dvi_cairo_draw_ps;
+#else
+ device->draw_ps = NULL;
+#endif
device->refresh = NULL;
}