Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ev-jobs.c46
-rw-r--r--shell/ev-jobs.h9
-rw-r--r--shell/ev-page-cache.c30
-rw-r--r--shell/ev-pixbuf-cache.c26
-rw-r--r--shell/ev-sidebar-thumbnails.c7
-rw-r--r--shell/ev-view.c32
-rw-r--r--shell/ev-window.c7
7 files changed, 93 insertions, 64 deletions
diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c
index f6328af..7a642a2 100644
--- a/shell/ev-jobs.c
+++ b/shell/ev-jobs.c
@@ -184,11 +184,6 @@ 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);
}
@@ -362,7 +357,7 @@ ev_job_render_run (EvJobRender *job)
if (EV_JOB (job)->async) {
EvAsyncRenderer *renderer = EV_ASYNC_RENDERER (EV_JOB (job)->document);
- ev_async_renderer_render_pixbuf (renderer, job->rc->page, job->rc->scale,
+ ev_async_renderer_render_pixbuf (renderer, job->rc->page->index, job->rc->scale,
job->rc->rotation);
g_signal_connect (EV_JOB (job)->document, "render_finished",
G_CALLBACK (render_finished_cb), job);
@@ -396,15 +391,15 @@ ev_job_render_run (EvJobRender *job)
if (job->include_links && EV_IS_DOCUMENT_LINKS (EV_JOB (job)->document))
job->link_mapping =
ev_document_links_get_links (EV_DOCUMENT_LINKS (EV_JOB (job)->document),
- job->rc->page);
+ job->rc->page->index);
if (job->include_forms && EV_IS_DOCUMENT_FORMS (EV_JOB (job)->document))
job->form_field_mapping =
- ev_document_forms_get_form_fields (EV_DOCUMENT_FORMS (EV_JOB(job)->document),
+ ev_document_forms_get_form_fields (EV_DOCUMENT_FORMS (EV_JOB (job)->document),
job->rc->page);
if (job->include_images && EV_IS_DOCUMENT_IMAGES (EV_JOB (job)->document))
job->image_mapping =
ev_document_images_get_image_mapping (EV_DOCUMENT_IMAGES (EV_JOB (job)->document),
- job->rc->page);
+ job->rc->page->index);
EV_JOB (job)->finished = TRUE;
}
@@ -412,15 +407,19 @@ ev_job_render_run (EvJobRender *job)
}
EvJob *
-ev_job_thumbnail_new (EvDocument *document,
- EvRenderContext *rc)
+ev_job_thumbnail_new (EvDocument *document,
+ gint page,
+ gint rotation,
+ gdouble scale)
{
EvJobThumbnail *job;
job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
EV_JOB (job)->document = g_object_ref (document);
- job->rc = g_object_ref (rc);
+ job->page = page;
+ job->rotation = rotation;
+ job->scale = scale;
return EV_JOB (job);
}
@@ -428,16 +427,24 @@ ev_job_thumbnail_new (EvDocument *document,
void
ev_job_thumbnail_run (EvJobThumbnail *job)
{
+ EvRenderContext *rc;
+ EvPage *page;
+
g_return_if_fail (EV_IS_JOB_THUMBNAIL (job));
ev_document_doc_mutex_lock ();
+ page = ev_document_get_page (EV_JOB (job)->document, job->page);
+ rc = ev_render_context_new (page, job->rotation, job->scale);
+ g_object_unref (page);
+
job->thumbnail =
ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
- job->rc, TRUE);
- EV_JOB (job)->finished = TRUE;
-
+ rc, TRUE);
+ g_object_unref (rc);
ev_document_doc_mutex_unlock ();
+
+ EV_JOB (job)->finished = TRUE;
}
static void ev_job_fonts_init (EvJobFonts *job) { /* Do Nothing */ }
@@ -917,7 +924,7 @@ ev_job_print_run (EvJobPrint *job)
fc.duplex = FALSE;
fc.pages_per_sheet = MAX (1, job->pages_per_sheet);
- rc = ev_render_context_new (0, 0, 1.0);
+ rc = ev_render_context_new (NULL, 0, 1.0);
ev_document_doc_mutex_lock ();
ev_file_exporter_begin (EV_FILE_EXPORTER (document), &fc);
@@ -937,12 +944,17 @@ ev_job_print_run (EvJobPrint *job)
ev_file_exporter_begin_page (EV_FILE_EXPORTER (document));
for (j = 0; j < job->pages_per_sheet; j++) {
+ EvPage *ev_page;
+
gint p = page + j;
if (p < 0 || p >= n_pages)
break;
+
+ ev_page = ev_document_get_page (document, page_list[p]);
+ ev_render_context_set_page (rc, ev_page);
+ g_object_unref (ev_page);
- ev_render_context_set_page (rc, page_list[p]);
ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc);
}
diff --git a/shell/ev-jobs.h b/shell/ev-jobs.h
index c6d73a1..1647154 100644
--- a/shell/ev-jobs.h
+++ b/shell/ev-jobs.h
@@ -163,7 +163,10 @@ struct _EvJobThumbnail
{
EvJob parent;
- EvRenderContext *rc;
+ gint page;
+ gint rotation;
+ gdouble scale;
+
GdkPixbuf *thumbnail;
};
@@ -265,7 +268,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,
- EvRenderContext *rc);
+ gint page,
+ gint rotation,
+ gdouble scale);
void ev_job_thumbnail_run (EvJobThumbnail *thumbnail);
/* EvJobFonts */
diff --git a/shell/ev-page-cache.c b/shell/ev-page-cache.c
index a1b4d60..8b8bedc 100644
--- a/shell/ev-page-cache.c
+++ b/shell/ev-page-cache.c
@@ -2,6 +2,7 @@
#include "ev-page-cache.h"
#include "ev-job-queue.h"
#include "ev-document-thumbnails.h"
+#include "ev-page.h"
#include <stdlib.h>
#include <string.h>
@@ -289,19 +290,22 @@ ev_page_cache_new (EvDocument *document)
has_thumbs = EV_IS_DOCUMENT_THUMBNAILS (document);
for (i = 0; i < page_cache->n_pages; i++) {
- double page_width = 0;
- double page_height = 0;
- gint thumb_width = 0;
- gint thumb_height = 0;
+ EvPage *page;
+ double page_width = 0;
+ double page_height = 0;
+ gint thumb_width = 0;
+ gint thumb_height = 0;
- ev_document_get_page_size (document, i, &page_width, &page_height);
+ page = ev_document_get_page (document, i);
+
+ ev_document_get_page_size (document, page, &page_width, &page_height);
- page_cache->page_labels[i] = ev_document_get_page_label (document, i);
+ page_cache->page_labels[i] = ev_document_get_page_label (document, page);
if (page_cache->page_labels[i] != NULL) {
- page_cache->max_label_chars = MAX(page_cache->max_label_chars,
- g_utf8_strlen (page_cache->page_labels[i], 256));
+ page_cache->max_label_chars = MAX (page_cache->max_label_chars,
+ g_utf8_strlen (page_cache->page_labels[i], 256));
if (!page_cache->has_labels) {
gchar *expected_label;
@@ -347,13 +351,15 @@ ev_page_cache_new (EvDocument *document)
info->height = page_height;
}
- if (!has_thumbs)
+ if (!has_thumbs) {
+ g_object_unref (page);
continue;
+ }
if (!rc) {
- rc = ev_render_context_new (0, i, (gdouble)THUMBNAIL_WIDTH / page_width);
+ rc = ev_render_context_new (page, 0, (gdouble)THUMBNAIL_WIDTH / page_width);
} else {
- ev_render_context_set_page (rc, i);
+ ev_render_context_set_page (rc, page);
ev_render_context_set_scale (rc, (gdouble)THUMBNAIL_WIDTH / page_width);
}
@@ -393,6 +399,8 @@ ev_page_cache_new (EvDocument *document)
thumb_info->width = thumb_width;
thumb_info->height = thumb_height;
}
+
+ g_object_unref (page);
}
if (rc) {
diff --git a/shell/ev-pixbuf-cache.c b/shell/ev-pixbuf-cache.c
index 3403873..4710dfe 100644
--- a/shell/ev-pixbuf-cache.c
+++ b/shell/ev-pixbuf-cache.c
@@ -250,13 +250,13 @@ job_page_ready_cb (EvJob *job,
EvJobRender *job_render = EV_JOB_RENDER (job);
/* If the job is outside of our interest, we silently discard it */
- if ((job_render->rc->page < (pixbuf_cache->start_page - pixbuf_cache->preload_cache_size)) ||
- (job_render->rc->page > (pixbuf_cache->end_page + pixbuf_cache->preload_cache_size))) {
+ if ((job_render->rc->page->index < (pixbuf_cache->start_page - pixbuf_cache->preload_cache_size)) ||
+ (job_render->rc->page->index > (pixbuf_cache->end_page + pixbuf_cache->preload_cache_size))) {
g_object_unref (job);
return;
}
- job_info = find_job_cache (pixbuf_cache, job_render->rc->page);
+ job_info = find_job_cache (pixbuf_cache, job_render->rc->page->index);
copy_job_page_and_selection_to_job_info (job_render, job_info, pixbuf_cache);
g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0, job_info->region);
@@ -270,13 +270,13 @@ job_finished_cb (EvJob *job,
EvJobRender *job_render = EV_JOB_RENDER (job);
/* If the job is outside of our interest, we silently discard it */
- if ((job_render->rc->page < (pixbuf_cache->start_page - pixbuf_cache->preload_cache_size)) ||
- (job_render->rc->page > (pixbuf_cache->end_page + pixbuf_cache->preload_cache_size))) {
+ if ((job_render->rc->page->index < (pixbuf_cache->start_page - pixbuf_cache->preload_cache_size)) ||
+ (job_render->rc->page->index > (pixbuf_cache->end_page + pixbuf_cache->preload_cache_size))) {
g_object_unref (job);
return;
}
- job_info = find_job_cache (pixbuf_cache, job_render->rc->page);
+ job_info = find_job_cache (pixbuf_cache, job_render->rc->page->index);
copy_job_to_job_info (job_render, job_info, pixbuf_cache);
}
@@ -298,7 +298,7 @@ check_job_size_and_unref (EvPixbufCache *pixbuf_cache,
return;
ev_page_cache_get_size (page_cache,
- EV_JOB_RENDER (job_info->job)->rc->page,
+ EV_JOB_RENDER (job_info->job)->rc->page->index,
EV_JOB_RENDER (job_info->job)->rc->rotation,
scale,
&width, &height);
@@ -608,6 +608,7 @@ add_job (EvPixbufCache *pixbuf_cache,
gfloat scale,
EvJobPriority priority)
{
+ EvPage *ev_page;
gboolean include_links = FALSE;
gboolean include_text = FALSE;
gboolean include_selection = FALSE;
@@ -617,14 +618,21 @@ add_job (EvPixbufCache *pixbuf_cache,
job_info->page_ready = FALSE;
+ /* FIXME: we shouldn't lock here */
+ ev_document_doc_mutex_lock ();
+ ev_page = ev_document_get_page (pixbuf_cache->document, page);
+ ev_document_doc_mutex_unlock ();
+
if (job_info->rc == NULL) {
- job_info->rc = ev_render_context_new (rotation, page, scale);
+ job_info->rc = ev_render_context_new (ev_page, rotation, scale);
} else {
+ ev_render_context_set_page (job_info->rc, ev_page);
ev_render_context_set_rotation (job_info->rc, rotation);
- ev_render_context_set_page (job_info->rc, page);
ev_render_context_set_scale (job_info->rc, scale);
}
+ g_object_unref (ev_page);
+
if (job_info->region)
gdk_region_destroy (job_info->region);
job_info->region = region ? gdk_region_copy (region) : NULL;
diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c
index 0d4ed31..25b1b83 100644
--- a/shell/ev-sidebar-thumbnails.c
+++ b/shell/ev-sidebar-thumbnails.c
@@ -260,13 +260,10 @@ add_range (EvSidebarThumbnails *sidebar_thumbnails,
-1);
if (job == NULL && !thumbnail_set) {
- EvRenderContext *rc;
-
- rc = ev_render_context_new (priv->rotation, page,
+ job = ev_job_thumbnail_new (priv->document,
+ page, priv->rotation,
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),
diff --git a/shell/ev-view.c b/shell/ev-view.c
index 1a76442..f984396 100644
--- a/shell/ev-view.c
+++ b/shell/ev-view.c
@@ -1658,9 +1658,9 @@ ev_view_form_field_get_region (EvView *view,
GList *forms_mapping;
forms_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache,
- field->page);
+ field->page->index);
ev_form_field_mapping_get_area (forms_mapping, field, &field_area);
- doc_rect_to_view_rect (view, field->page, &field_area, &view_area);
+ doc_rect_to_view_rect (view, field->page->index, &field_area, &view_area);
view_area.x -= view->scroll_x;
view_area.y -= view->scroll_y;
@@ -1711,7 +1711,7 @@ ev_view_form_field_button_create_widget (EvView *view,
* we need to update also the region for the current selected item
*/
forms_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache,
- field->page);
+ field->page->index);
for (l = forms_mapping; l; l = g_list_next (l)) {
EvFormField *button = ((EvFormFieldMapping *)(l->data))->field;
GdkRegion *button_region;
@@ -1739,7 +1739,7 @@ ev_view_form_field_button_create_widget (EvView *view,
ev_pixbuf_cache_reload_page (view->pixbuf_cache,
field_region,
- field->page,
+ field->page->index,
view->rotation,
view->scale);
gdk_region_destroy (field_region);
@@ -1769,7 +1769,7 @@ ev_view_form_field_text_save (EvView *view,
field->changed = FALSE;
ev_pixbuf_cache_reload_page (view->pixbuf_cache,
field_region,
- field->page,
+ field->page->index,
view->rotation,
view->scale);
gdk_region_destroy (field_region);
@@ -1890,7 +1890,7 @@ ev_view_form_field_choice_save (EvView *view,
field->changed = FALSE;
ev_pixbuf_cache_reload_page (view->pixbuf_cache,
field_region,
- field->page,
+ field->page->index,
view->rotation,
view->scale);
gdk_region_destroy (field_region);
@@ -2107,10 +2107,10 @@ ev_view_handle_form_field (EvView *view,
g_object_ref (field),
(GDestroyNotify)g_object_unref);
- form_field_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache, field->page);
+ form_field_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache, field->page->index);
ev_form_field_mapping_get_area (form_field_mapping, field, &field_area);
- doc_rect_to_view_rect (view, field->page, &field_area, &view_area);
+ doc_rect_to_view_rect (view, field->page->index, &field_area, &view_area);
view_area.x -= view->scroll_x;
view_area.y -= view->scroll_y;
@@ -2310,10 +2310,10 @@ ev_view_size_allocate (GtkWidget *widget,
continue;
form_field_mapping = ev_pixbuf_cache_get_form_field_mapping (view->pixbuf_cache,
- field->page);
+ field->page->index);
ev_form_field_mapping_get_area (form_field_mapping, field, &field_area);
- doc_rect_to_view_rect (view, field->page, &field_area, &view_area);
+ doc_rect_to_view_rect (view, field->page->index, &field_area, &view_area);
view_area.x -= view->scroll_x;
view_area.y -= view->scroll_y;
@@ -5716,15 +5716,19 @@ get_selected_text (EvView *view)
EvRenderContext *rc;
text = g_string_new (NULL);
- rc = ev_render_context_new (view->rotation, 1, view->scale);
+ rc = ev_render_context_new (NULL, view->rotation, view->scale);
ev_document_doc_mutex_lock ();
for (l = view->selection_info.selections; l != NULL; l = l->next) {
EvViewSelection *selection = (EvViewSelection *)l->data;
+ EvPage *page;
gchar *tmp;
- ev_render_context_set_page (rc, selection->page);
+ page = ev_document_get_page (view->document, selection->page);
+ ev_render_context_set_page (rc, page);
+ g_object_unref (page);
+
tmp = ev_selection_get_selected_text (EV_SELECTION (view->document),
rc, selection->style,
&(selection->rect));
@@ -5733,10 +5737,10 @@ get_selected_text (EvView *view)
g_free (tmp);
}
- ev_document_doc_mutex_unlock ();
-
g_object_unref (rc);
+ ev_document_doc_mutex_unlock ();
+
normalized_text = g_utf8_normalize (text->str, text->len, G_NORMALIZE_NFKC);
g_string_free (text, TRUE);
return normalized_text;
diff --git a/shell/ev-window.c b/shell/ev-window.c
index ffac5d7..81c5b9e 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1072,8 +1072,6 @@ ev_window_set_icon_from_thumbnail (EvJobThumbnail *job,
static void
ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation)
{
-
- EvRenderContext *rc;
gint page_width, page_height;
gdouble scale;
EvDocument *document = ev_window->priv->document;
@@ -1089,14 +1087,11 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation)
&page_width, &page_height);
scale = (gdouble)128 / (gdouble)page_width;
- rc = ev_render_context_new (rotation, 0, scale);
-
- ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, rc);
+ ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, 0, rotation, scale);
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);
}
static gboolean