159 lines
4.8 KiB
Diff
159 lines
4.8 KiB
Diff
|
diff -aur old/src/xo-file.c new/src/xo-file.c
|
||
|
--- src/xo-file.c 2009-09-29 09:36:05.000000000 +1000
|
||
|
+++ src/xo-file.c 2011-10-06 03:11:17.307822836 +1100
|
||
|
@@ -975,6 +975,140 @@
|
||
|
g_free(req);
|
||
|
}
|
||
|
|
||
|
+/*
|
||
|
+ * Copied from http://cgit.freedesktop.org/poppler/poppler/tree/glib/poppler-page.cc?h=poppler-0.16#n617
|
||
|
+ * as a temporary workaround to poppler removing depreciated functions while we wait for
|
||
|
+ * upstream to rewrite against cairo
|
||
|
+ */
|
||
|
+static void
|
||
|
+copy_cairo_surface_to_pixbuf (cairo_surface_t *surface, GdkPixbuf *pixbuf)
|
||
|
+{
|
||
|
+ int cairo_width, cairo_height, cairo_rowstride;
|
||
|
+ unsigned char *pixbuf_data, *dst, *cairo_data;
|
||
|
+ int pixbuf_rowstride, pixbuf_n_channels;
|
||
|
+ unsigned int *src;
|
||
|
+ int x, y;
|
||
|
+
|
||
|
+ cairo_width = cairo_image_surface_get_width (surface);
|
||
|
+ cairo_height = cairo_image_surface_get_height (surface);
|
||
|
+ cairo_rowstride = cairo_image_surface_get_stride (surface);
|
||
|
+ cairo_data = cairo_image_surface_get_data (surface);
|
||
|
+
|
||
|
+ pixbuf_data = gdk_pixbuf_get_pixels (pixbuf);
|
||
|
+ pixbuf_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
|
||
|
+ pixbuf_n_channels = gdk_pixbuf_get_n_channels (pixbuf);
|
||
|
+
|
||
|
+ if (cairo_width > gdk_pixbuf_get_width (pixbuf))
|
||
|
+ cairo_width = gdk_pixbuf_get_width (pixbuf);
|
||
|
+ if (cairo_height > gdk_pixbuf_get_height (pixbuf))
|
||
|
+ cairo_height = gdk_pixbuf_get_height (pixbuf);
|
||
|
+ for (y = 0; y < cairo_height; y++)
|
||
|
+ {
|
||
|
+ src = (unsigned int *) (cairo_data + y * cairo_rowstride);
|
||
|
+ dst = pixbuf_data + y * pixbuf_rowstride;
|
||
|
+ for (x = 0; x < cairo_width; x++)
|
||
|
+ {
|
||
|
+ dst[0] = (*src >> 16) & 0xff;
|
||
|
+ dst[1] = (*src >> 8) & 0xff;
|
||
|
+ dst[2] = (*src >> 0) & 0xff;
|
||
|
+ if (pixbuf_n_channels == 4)
|
||
|
+ dst[3] = (*src >> 24) & 0xff;
|
||
|
+ dst += pixbuf_n_channels;
|
||
|
+ src++;
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
+static void
|
||
|
+_poppler_page_render_to_pixbuf (PopplerPage *page,
|
||
|
+ int src_x, int src_y,
|
||
|
+ int src_width, int src_height,
|
||
|
+ double scale,
|
||
|
+ int rotation,
|
||
|
+ gboolean printing,
|
||
|
+ GdkPixbuf *pixbuf)
|
||
|
+{
|
||
|
+ cairo_t *cr;
|
||
|
+ cairo_surface_t *surface;
|
||
|
+
|
||
|
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||
|
+ src_width, src_height);
|
||
|
+ cr = cairo_create (surface);
|
||
|
+ cairo_save (cr);
|
||
|
+ switch (rotation) {
|
||
|
+ case 90:
|
||
|
+ cairo_translate (cr, src_x + src_width, -src_y);
|
||
|
+ break;
|
||
|
+ case 180:
|
||
|
+ cairo_translate (cr, src_x + src_width, src_y + src_height);
|
||
|
+ break;
|
||
|
+ case 270:
|
||
|
+ cairo_translate (cr, -src_x, src_y + src_height);
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ cairo_translate (cr, -src_x, -src_y);
|
||
|
+ }
|
||
|
+
|
||
|
+ if (scale != 1.0)
|
||
|
+ cairo_scale (cr, scale, scale);
|
||
|
+
|
||
|
+ if (rotation != 0)
|
||
|
+ cairo_rotate (cr, rotation * G_PI / 180.0);
|
||
|
+
|
||
|
+ if (printing)
|
||
|
+ poppler_page_render_for_printing (page, cr);
|
||
|
+ else
|
||
|
+ poppler_page_render (page, cr);
|
||
|
+ cairo_restore (cr);
|
||
|
+
|
||
|
+ cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER);
|
||
|
+ cairo_set_source_rgb (cr, 1., 1., 1.);
|
||
|
+ cairo_paint (cr);
|
||
|
+
|
||
|
+ cairo_destroy (cr);
|
||
|
+
|
||
|
+ copy_cairo_surface_to_pixbuf (surface, pixbuf);
|
||
|
+ cairo_surface_destroy (surface);
|
||
|
+}
|
||
|
+
|
||
|
+/**
|
||
|
+ * poppler_page_render_to_pixbuf:
|
||
|
+ * @page: the page to render from
|
||
|
+ * @src_x: x coordinate of upper left corner
|
||
|
+ * @src_y: y coordinate of upper left corner
|
||
|
+ * @src_width: width of rectangle to render
|
||
|
+ * @src_height: height of rectangle to render
|
||
|
+ * @scale: scale specified as pixels per point
|
||
|
+ * @rotation: rotate the document by the specified degree
|
||
|
+ * @pixbuf: pixbuf to render into
|
||
|
+ *
|
||
|
+ * First scale the document to match the specified pixels per point,
|
||
|
+ * then render the rectangle given by the upper left corner at
|
||
|
+ * (src_x, src_y) and src_width and src_height.
|
||
|
+ * This function is for rendering a page that will be displayed.
|
||
|
+ * If you want to render a page that will be printed use
|
||
|
+ * poppler_page_render_to_pixbuf_for_printing() instead
|
||
|
+ *
|
||
|
+ * Deprecated: 0.16
|
||
|
+ **/
|
||
|
+void
|
||
|
+poppler_page_render_to_pixbuf (PopplerPage *page,
|
||
|
+ int src_x, int src_y,
|
||
|
+ int src_width, int src_height,
|
||
|
+ double scale,
|
||
|
+ int rotation,
|
||
|
+ GdkPixbuf *pixbuf)
|
||
|
+{
|
||
|
+ g_return_if_fail (POPPLER_IS_PAGE (page));
|
||
|
+ g_return_if_fail (scale > 0.0);
|
||
|
+ g_return_if_fail (pixbuf != NULL);
|
||
|
+
|
||
|
+ _poppler_page_render_to_pixbuf (page, src_x, src_y,
|
||
|
+ src_width, src_height,
|
||
|
+ scale, rotation,
|
||
|
+ FALSE,
|
||
|
+ pixbuf);
|
||
|
+}
|
||
|
/* process a bg PDF request from the queue, and recurse */
|
||
|
|
||
|
gboolean bgpdf_scheduler_callback(gpointer data)
|
||
|
diff -aur old/src/xo-file.h new/src/xo-file.h
|
||
|
--- src/xo-file.h 2009-09-28 08:45:53.000000000 +1000
|
||
|
+++ src/xo-file.h 2011-10-06 03:11:17.311156160 +1100
|
||
|
@@ -36,3 +36,10 @@
|
||
|
void init_config_default(void);
|
||
|
void load_config_from_file(void);
|
||
|
void save_config_to_file(void);
|
||
|
+
|
||
|
+void poppler_page_render_to_pixbuf (PopplerPage *page,
|
||
|
+ int src_x, int src_y,
|
||
|
+ int src_width, int src_height,
|
||
|
+ double scale,
|
||
|
+ int rotation,
|
||
|
+ GdkPixbuf *pixbuf);
|