diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ev-jobs.c | 46 | ||||
-rw-r--r-- | shell/ev-jobs.h | 9 | ||||
-rw-r--r-- | shell/ev-page-cache.c | 30 | ||||
-rw-r--r-- | shell/ev-pixbuf-cache.c | 26 | ||||
-rw-r--r-- | shell/ev-sidebar-thumbnails.c | 7 | ||||
-rw-r--r-- | shell/ev-view.c | 32 | ||||
-rw-r--r-- | shell/ev-window.c | 7 |
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 |