[evince] ev-jobs: Add support for rendering thumbnails to a cairo surface with EvJobThumbnail



commit b840a17b7ae6cf32ce8bf98329b1e27ff2acc379
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sat Mar 22 12:47:09 2014 +0100

    ev-jobs: Add support for rendering thumbnails to a cairo surface with EvJobThumbnail

 help/reference/libview/libevview-sections.txt |    2 +
 libview/ev-jobs.c                             |   27 ++++++++++++++++++++++--
 libview/ev-jobs.h                             |   10 +++++++++
 3 files changed, 36 insertions(+), 3 deletions(-)
---
diff --git a/help/reference/libview/libevview-sections.txt b/help/reference/libview/libevview-sections.txt
index f20a0e0..c9f7ac2 100644
--- a/help/reference/libview/libevview-sections.txt
+++ b/help/reference/libview/libevview-sections.txt
@@ -195,6 +195,7 @@ EvJobAnnots
 EvJobAnnotsClass
 EvJobRunMode
 EvJobPageDataFlags
+EvJobThumbnailFormat
 ev_job_run
 ev_job_cancel
 ev_job_failed
@@ -214,6 +215,7 @@ ev_job_render_set_selection_info
 ev_job_page_data_new
 ev_job_thumbnail_new
 ev_job_thumbnail_set_has_frame
+ev_job_thumbnail_set_output_format
 ev_job_fonts_new
 ev_job_load_new
 ev_job_load_set_uri
diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c
index 7e97d63..83c50d8 100644
--- a/libview/ev-jobs.c
+++ b/libview/ev-jobs.c
@@ -838,7 +838,7 @@ ev_job_thumbnail_run (EvJob *job)
 {
        EvJobThumbnail  *job_thumb = EV_JOB_THUMBNAIL (job);
        EvRenderContext *rc;
-       GdkPixbuf       *pixbuf;
+       GdkPixbuf       *pixbuf = NULL;
        EvPage          *page;
 
        ev_debug_message (DEBUG_JOBS, "%d (%p)", job_thumb->page, job);
@@ -850,11 +850,15 @@ ev_job_thumbnail_run (EvJob *job)
        rc = ev_render_context_new (page, job_thumb->rotation, job_thumb->scale);
        g_object_unref (page);
 
-       pixbuf = ev_document_get_thumbnail (job->document, rc);
+        if (job_thumb->format == EV_JOB_THUMBNAIL_PIXBUF)
+                pixbuf = ev_document_get_thumbnail (job->document, rc);
+        else
+                job_thumb->thumbnail_surface = ev_document_get_thumbnail_surface (job->document, rc);
        g_object_unref (rc);
        ev_document_doc_mutex_unlock ();
 
-        if (pixbuf) {
+        /* EV_JOB_THUMBNAIL_SURFACE is not compatible with has_frame = TRUE */
+        if (job_thumb->format == EV_JOB_THUMBNAIL_PIXBUF && pixbuf) {
                 job_thumb->thumbnail = job_thumb->has_frame ?
                         ev_document_misc_get_thumbnail_frame (-1, -1, pixbuf) : g_object_ref (pixbuf);
                 g_object_unref (pixbuf);
@@ -892,6 +896,7 @@ ev_job_thumbnail_new (EvDocument *document,
        job->rotation = rotation;
        job->scale = scale;
         job->has_frame = TRUE;
+        job->format = EV_JOB_THUMBNAIL_PIXBUF;
 
        return EV_JOB (job);
 }
@@ -910,6 +915,22 @@ ev_job_thumbnail_set_has_frame (EvJobThumbnail  *job,
         job->has_frame = has_frame;
 }
 
+/**
+ * ev_job_thumbnail_set_output_format:
+ * @job: a #EvJobThumbnail
+ * @format: a #EvJobThumbnailFormat
+ *
+ * Set the desired output format for the generated thumbnail
+ *
+ * Since: 3.14
+ */
+void
+ev_job_thumbnail_set_output_format (EvJobThumbnail      *job,
+                                    EvJobThumbnailFormat format)
+{
+        job->format = format;
+}
+
 /* EvJobFonts */
 static void
 ev_job_fonts_init (EvJobFonts *job)
diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h
index ac851bf..634b41b 100644
--- a/libview/ev-jobs.h
+++ b/libview/ev-jobs.h
@@ -331,6 +331,11 @@ struct _EvJobPageDataClass
        EvJobClass parent_class;
 };
 
+typedef enum {
+        EV_JOB_THUMBNAIL_PIXBUF,
+        EV_JOB_THUMBNAIL_SURFACE
+} EvJobThumbnailFormat;
+
 struct _EvJobThumbnail
 {
        EvJob parent;
@@ -341,6 +346,9 @@ struct _EvJobThumbnail
 
        GdkPixbuf *thumbnail;
         gboolean has_frame;
+
+        EvJobThumbnailFormat format;
+        cairo_surface_t *thumbnail_surface;
 };
 
 struct _EvJobThumbnailClass
@@ -536,6 +544,8 @@ EvJob          *ev_job_thumbnail_new           (EvDocument      *document,
                                                 gdouble          scale);
 void            ev_job_thumbnail_set_has_frame (EvJobThumbnail  *job,
                                                 gboolean         has_frame);
+void            ev_job_thumbnail_set_output_format (EvJobThumbnail      *job,
+                                                    EvJobThumbnailFormat format);
 /* EvJobFonts */
 GType          ev_job_fonts_get_type     (void) G_GNUC_CONST;
 EvJob         *ev_job_fonts_new          (EvDocument      *document);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]