Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2007-02-16 17:27:12 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2007-02-16 17:27:12 (GMT)
commit1d6150237848b4c1fede94ce23baa4fd8870fd93 (patch)
tree7a607e0263e6b40591b31885b561f2192b7b6695 /shell
parent76f055907e4eab82025f28cd0e813eb39713bf5b (diff)
Use an EvRenderContext for rendering thumbnails instead of a suggested
2007-02-16 Carlos Garcia Campos <carlosgc@gnome.org> * backend/dvi/dvi-document.c: (dvi_document_thumbnails_get_dimensions), (dvi_document_thumbnails_get_thumbnail): * backend/impress/impress-document.c: (impress_document_thumbnails_get_thumbnail), (impress_document_thumbnails_get_dimensions): * backend/ps/ps-document.c: (ps_document_thumbnails_get_thumbnail), (ps_document_thumbnails_get_dimensions): * backend/djvu/djvu-document.c: (djvu_document_thumbnails_get_dimensions), (djvu_document_thumbnails_get_thumbnail): * backend/tiff/tiff-document.c: (tiff_document_thumbnails_get_thumbnail), (tiff_document_thumbnails_get_dimensions): * backend/pdf/ev-poppler.cc: (make_thumbnail_for_page), (pdf_document_thumbnails_get_thumbnail), (pdf_document_thumbnails_get_dimensions): * backend/comics/comics-document.c: (comics_document_thumbnails_get_thumbnail), (comics_document_thumbnails_get_dimensions): * backend/pixbuf/pixbuf-document.c: (pixbuf_document_thumbnails_get_thumbnail), (pixbuf_document_thumbnails_get_dimensions): * libdocument/ev-document-thumbnails.[ch]: (ev_document_thumbnails_get_thumbnail), (ev_document_thumbnails_get_dimensions): * libdocument/ev-document-misc.[ch]: (ev_document_misc_get_thumbnail_frame): * shell/ev-jobs.[ch]: (ev_job_thumbnail_dispose), (ev_job_thumbnail_new), (ev_job_thumbnail_run): * shell/ev-sidebar-thumbnails.c: (get_scale_for_page), (add_range), (ev_sidebar_thumbnails_set_loading_icon), (refresh), (ev_sidebar_thumbnails_refresh): * shell/ev-window.c: (ev_window_setup_document): * thumbnailer/evince-thumbnailer.c: (evince_thumbnail_pngenc_get): Use an EvRenderContext for rendering thumbnails instead of a suggested width, so that different sized pages get sized proportionally. svn path=/trunk/; revision=2332
Diffstat (limited to 'shell')
-rw-r--r--shell/ev-jobs.c20
-rw-r--r--shell/ev-jobs.h12
-rw-r--r--shell/ev-sidebar-thumbnails.c47
-rw-r--r--shell/ev-window.c20
4 files changed, 71 insertions, 28 deletions
diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c
index 9fb242a..6ad4dfc 100644
--- a/shell/ev-jobs.c
+++ b/shell/ev-jobs.c
@@ -167,6 +167,11 @@ ev_job_thumbnail_dispose (GObject *object)
job->thumbnail = NULL;
}
+ if (job->rc) {
+ g_object_unref (job->rc);
+ job->rc = NULL;
+ }
+
(* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
}
@@ -354,19 +359,15 @@ ev_job_render_run (EvJobRender *job)
}
EvJob *
-ev_job_thumbnail_new (EvDocument *document,
- gint page,
- int rotation,
- gint requested_width)
+ev_job_thumbnail_new (EvDocument *document,
+ EvRenderContext *rc)
{
EvJobThumbnail *job;
job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
EV_JOB (job)->document = g_object_ref (document);
- job->page = page;
- job->rotation = rotation;
- job->requested_width = requested_width;
+ job->rc = g_object_ref (rc);
return EV_JOB (job);
}
@@ -380,10 +381,7 @@ ev_job_thumbnail_run (EvJobThumbnail *job)
job->thumbnail =
ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
- job->page,
- job->rotation,
- job->requested_width,
- TRUE);
+ job->rc, TRUE);
EV_JOB (job)->finished = TRUE;
ev_document_doc_mutex_unlock ();
diff --git a/shell/ev-jobs.h b/shell/ev-jobs.h
index 779c373..1f210ec 100644
--- a/shell/ev-jobs.h
+++ b/shell/ev-jobs.h
@@ -148,9 +148,7 @@ struct _EvJobThumbnail
{
EvJob parent;
- gint page;
- gint rotation;
- gint requested_width;
+ EvRenderContext *rc;
GdkPixbuf *thumbnail;
};
@@ -233,11 +231,9 @@ void ev_job_render_run (EvJobRender *thumbnail);
/* EvJobThumbnail */
GType ev_job_thumbnail_get_type (void) G_GNUC_CONST;
-EvJob *ev_job_thumbnail_new (EvDocument *document,
- gint page,
- int rotation,
- gint requested_width);
-void ev_job_thumbnail_run (EvJobThumbnail *thumbnail);
+EvJob *ev_job_thumbnail_new (EvDocument *document,
+ EvRenderContext *rc);
+void ev_job_thumbnail_run (EvJobThumbnail *thumbnail);
/* EvJobFonts */
GType ev_job_fonts_get_type (void) G_GNUC_CONST;
diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c
index aa83dee..325c163 100644
--- a/shell/ev-sidebar-thumbnails.c
+++ b/shell/ev-sidebar-thumbnails.c
@@ -220,6 +220,20 @@ clear_range (EvSidebarThumbnails *sidebar_thumbnails,
gtk_tree_path_free (path);
}
+static gdouble
+get_scale_for_page (EvSidebarThumbnails *sidebar_thumbnails,
+ gint page)
+{
+ EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
+ gint width, height;
+
+ ev_page_cache_get_size (priv->page_cache,
+ page, priv->rotation,
+ 1.0, &width, &height);
+
+ return (gdouble)THUMBNAIL_WIDTH / (gdouble)width;
+}
+
static void
add_range (EvSidebarThumbnails *sidebar_thumbnails,
gint start_page,
@@ -237,7 +251,7 @@ add_range (EvSidebarThumbnails *sidebar_thumbnails,
for (result = gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->list_store), &iter, path);
result && page <= end_page;
result = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->list_store), &iter), page ++) {
- EvJobThumbnail *job;
+ EvJob *job;
gboolean thumbnail_set;
gtk_tree_model_get (GTK_TREE_MODEL (priv->list_store), &iter,
@@ -246,9 +260,14 @@ add_range (EvSidebarThumbnails *sidebar_thumbnails,
-1);
if (job == NULL && !thumbnail_set) {
- /* FIXME: Need rotation */
- job = (EvJobThumbnail *)ev_job_thumbnail_new (priv->document, page, priv->rotation, THUMBNAIL_WIDTH);
+ EvRenderContext *rc;
+
+ rc = ev_render_context_new (priv->rotation, page,
+ get_scale_for_page (sidebar_thumbnails, page));
+ job = ev_job_thumbnail_new (priv->document, rc);
ev_job_queue_add_job (EV_JOB (job), EV_JOB_PRIORITY_HIGH);
+ g_object_unref (rc);
+
g_object_set_data_full (G_OBJECT (job), "tree_iter",
gtk_tree_iter_copy (&iter),
(GDestroyNotify) gtk_tree_iter_free);
@@ -258,6 +277,7 @@ add_range (EvSidebarThumbnails *sidebar_thumbnails,
gtk_list_store_set (priv->list_store, &iter,
COLUMN_JOB, job,
-1);
+
/* The queue and the list own a ref to the job now */
g_object_unref (job);
} else if (job) {
@@ -383,20 +403,35 @@ ev_sidebar_thumbnails_set_loading_icon (EvSidebarThumbnails *sidebar_thumbnails)
g_object_unref (sidebar_thumbnails->priv->loading_icon);
if (sidebar_thumbnails->priv->document) {
+ EvRenderContext *rc;
+
+ rc = ev_render_context_new (sidebar_thumbnails->priv->rotation, 0,
+ get_scale_for_page (sidebar_thumbnails, 0));
+
/* We get the dimensions of the first doc so that we can make a blank
* icon. */
ev_document_doc_mutex_lock ();
ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (sidebar_thumbnails->priv->document),
- 0, THUMBNAIL_WIDTH, &width, &height);
+ rc, &width, &height);
ev_document_doc_mutex_unlock ();
+
+ g_object_unref (rc);
+
sidebar_thumbnails->priv->loading_icon =
- ev_document_misc_get_thumbnail_frame (width, height, sidebar_thumbnails->priv->rotation, NULL);
+ ev_document_misc_get_thumbnail_frame (width, height, NULL);
} else {
sidebar_thumbnails->priv->loading_icon = NULL;
}
}
+static gboolean
+refresh (EvSidebarThumbnails *sidebar_thumbnails)
+{
+ adjustment_changed_cb (sidebar_thumbnails);
+ return FALSE;
+}
+
void
ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails,
int rotation)
@@ -413,7 +448,7 @@ ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails,
/* Trigger a redraw */
sidebar_thumbnails->priv->start_page = 0;
sidebar_thumbnails->priv->end_page = 0;
- adjustment_changed_cb (sidebar_thumbnails);
+ g_idle_add ((GSourceFunc)refresh, sidebar_thumbnails);
}
static void
diff --git a/shell/ev-window.c b/shell/ev-window.c
index b9d6dfe..ab14e27 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1053,8 +1053,10 @@ ev_window_setup_document (EvWindow *ev_window)
document = ev_window->priv->document;
ev_window->priv->page_cache = ev_page_cache_get (ev_window->priv->document);
- g_signal_connect (ev_window->priv->page_cache, "page-changed", G_CALLBACK (page_changed_cb), ev_window);
- g_signal_connect (ev_window->priv->page_cache, "history-changed", G_CALLBACK (history_changed_cb), ev_window);
+ g_signal_connect (ev_window->priv->page_cache, "page-changed",
+ G_CALLBACK (page_changed_cb), ev_window);
+ g_signal_connect (ev_window->priv->page_cache, "history-changed",
+ G_CALLBACK (history_changed_cb), ev_window);
if (EV_IS_DOCUMENT_FIND (document)) {
g_signal_connect_object (G_OBJECT (document),
@@ -1064,12 +1066,24 @@ ev_window_setup_document (EvWindow *ev_window)
}
if (EV_IS_DOCUMENT_THUMBNAILS (document)) {
+ EvRenderContext *rc;
+ gint page_width, page_height;
+ gdouble scale;
+
ev_window_clear_thumbnail_job (ev_window);
- ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, 0, 0, 100);
+
+ ev_page_cache_get_size (ev_window->priv->page_cache,
+ 1, 0, 1.0,
+ &page_width, &page_height);
+ scale = (gdouble)128 / (gdouble)page_width;
+
+ rc = ev_render_context_new (0, 0, scale);
+ ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, rc);
g_signal_connect (ev_window->priv->thumbnail_job, "finished",
G_CALLBACK (ev_window_set_icon_from_thumbnail),
ev_window);
ev_job_queue_add_job (EV_JOB (ev_window->priv->thumbnail_job), EV_JOB_PRIORITY_LOW);
+ g_object_unref (rc);
}
ev_sidebar_set_document (sidebar, document);