X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=inline;f=backend%2Fdvi%2Fcairo-device.c;h=47425cad7e0be21a503a449c8fff618f525c35bb;hb=9f258bd6009e1ae92579cf159d81ad8c28280666;hp=19006d2e36818660d412fecd657d2218ce6d3532;hpb=4ce480dd80453275c10c3b99f988667c2f1bdfff;p=evince.git diff --git a/backend/dvi/cairo-device.c b/backend/dvi/cairo-device.c index 19006d2e..47425cad 100644 --- a/backend/dvi/cairo-device.c +++ b/backend/dvi/cairo-device.c @@ -13,10 +13,17 @@ * * 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 +#include + +#include +#include +#ifdef HAVE_SPECTRE +#include +#endif + #include "cairo-device.h" typedef struct { @@ -48,7 +55,9 @@ dvi_cairo_draw_glyph (DviContext *dvi, 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; @@ -116,6 +125,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; + 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, @@ -171,19 +247,16 @@ dvi_cairo_free_image (void *ptr) 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 @@ -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; } @@ -241,7 +319,7 @@ mdvi_cairo_device_render (DviContext* dvi) gint page_width; gint page_height; cairo_surface_t *surface; - gchar *pixels; + guchar *pixels; 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; - 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,