X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-pixbuf-cache.c;h=a23b4cf830904f5162c1d72eb4fd20ca0e1e5105;hb=c087ebf90ee6c32656ae925d0c1682b427a21e7e;hp=fff12499a307c1ce6ac1c350c8e69c85b8c15599;hpb=eb3d8c8e3df570e32e2591eeb650de55dba2f613;p=evince.git diff --git a/shell/ev-pixbuf-cache.c b/shell/ev-pixbuf-cache.c index fff12499..a23b4cf8 100644 --- a/shell/ev-pixbuf-cache.c +++ b/shell/ev-pixbuf-cache.c @@ -2,6 +2,8 @@ #include "ev-job-queue.h" #include "ev-page-cache.h" #include "ev-selection.h" +#include "ev-document-images.h" +#include "ev-image.h" typedef struct _CacheJobInfo { @@ -11,6 +13,7 @@ typedef struct _CacheJobInfo /* Data we get from rendering */ GdkPixbuf *pixbuf; GList *link_mapping; + GList *image_mapping; GdkRegion *text_mapping; /* Selection data. @@ -152,6 +155,10 @@ dispose_cache_job_info (CacheJobInfo *job_info, ev_link_mapping_free (job_info->link_mapping); job_info->link_mapping = NULL; } + if (job_info->image_mapping) { + ev_image_mapping_free (job_info->image_mapping); + job_info->image_mapping = NULL; + } if (job_info->text_mapping) { gdk_region_destroy (job_info->text_mapping); job_info->text_mapping = NULL; @@ -222,7 +229,6 @@ job_finished_cb (EvJob *job, job_info = find_job_cache (pixbuf_cache, job_render->rc->page); copy_job_to_job_info (job_render, job_info, pixbuf_cache); - g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0); } @@ -312,6 +318,7 @@ move_one_job (CacheJobInfo *job_info, job_info->job = NULL; job_info->pixbuf = NULL; job_info->link_mapping = NULL; + job_info->image_mapping = NULL; if (new_priority != priority && target_page->job) { ev_job_queue_update_job (target_page->job, new_priority); @@ -396,30 +403,62 @@ copy_job_to_job_info (EvJobRender *job_render, CacheJobInfo *job_info, EvPixbufCache *pixbuf_cache) { - GdkPixbuf *pixbuf; - EvRenderContext *rc; - pixbuf = g_object_ref (job_render->pixbuf); - rc = g_object_ref (job_render->rc); + job_info->points_set = FALSE; + + if (job_info->pixbuf) { + g_object_unref (G_OBJECT (job_info->pixbuf)); + } + job_info->pixbuf = g_object_ref (job_render->pixbuf); - dispose_cache_job_info (job_info, pixbuf_cache); + if (job_info->rc) { + g_object_unref (G_OBJECT (job_info->rc)); + } + job_info->rc = g_object_ref (job_render->rc); - job_info->pixbuf = pixbuf; - job_info->rc = rc; - - if (job_render->link_mapping) + if (job_render->include_links) { + if (job_info->link_mapping) + ev_link_mapping_free (job_info->link_mapping); job_info->link_mapping = job_render->link_mapping; - if (job_render->text_mapping) - job_info->text_mapping = job_render->text_mapping; + } + + if (job_render->include_images) { + if (job_info->image_mapping) + ev_image_mapping_free (job_info->image_mapping); + job_info->image_mapping = job_render->image_mapping; + } + + if (job_render->include_text) { + if (job_info->text_mapping) + gdk_region_destroy (job_info->text_mapping); + job_info->text_mapping = job_render->text_mapping; + } if (job_render->include_selection) { - pixbuf = g_object_ref (job_render->selection); + if (job_info->selection) { + g_object_unref (G_OBJECT (job_info->selection)); + job_info->selection = NULL; + } + if (job_info->selection_region) { + gdk_region_destroy (job_info->selection_region); + job_info->selection_region = NULL; + } + job_info->selection_points = job_render->selection_points; job_info->selection_region = gdk_region_copy (job_render->selection_region); - job_info->selection = pixbuf; + job_info->selection = g_object_ref (job_render->selection); g_assert (job_info->selection_points.x1 >= 0); + job_info->points_set = TRUE; } + if (job_info->job) { + g_signal_handlers_disconnect_by_func (job_info->job, + G_CALLBACK (job_finished_cb), + pixbuf_cache); + ev_job_queue_remove_job (job_info->job); + g_object_unref (G_OBJECT (job_info->job)); + job_info->job = NULL; + } } static CacheJobInfo * @@ -500,6 +539,7 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, gboolean include_links = FALSE; gboolean include_text = FALSE; gboolean include_selection = FALSE; + gboolean include_images = FALSE; int width, height; GdkColor *text, *base; @@ -526,6 +566,8 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, /* Figure out what else we need for this job */ if (job_info->link_mapping == NULL) include_links = TRUE; + if (job_info->image_mapping == NULL) + include_images = TRUE; if (job_info->text_mapping == NULL) include_text = TRUE; if (new_selection_pixbuf_needed (pixbuf_cache, job_info, page, scale)) { @@ -542,6 +584,7 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, &(job_info->target_points), text, base, include_links, + include_images, include_text, include_selection); ev_job_queue_add_job (job_info->job, priority); @@ -638,6 +681,7 @@ ev_pixbuf_cache_get_pixbuf (EvPixbufCache *pixbuf_cache, if (job_info->job && EV_JOB (job_info->job)->finished) { copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache); + g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0); } return job_info->pixbuf; @@ -657,11 +701,35 @@ ev_pixbuf_cache_get_link_mapping (EvPixbufCache *pixbuf_cache, if (job_info->job && EV_JOB (job_info->job)->finished) { copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache); + g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0); } - + return job_info->link_mapping; } +GList * +ev_pixbuf_cache_get_image_mapping (EvPixbufCache *pixbuf_cache, + gint page) +{ + CacheJobInfo *job_info; + + if (!EV_IS_DOCUMENT_IMAGES (pixbuf_cache->document)) + return NULL; + + job_info = find_job_cache (pixbuf_cache, page); + if (job_info == NULL) + return NULL; + + /* We don't need to wait for the idle to handle the callback */ + if (job_info->job && + EV_JOB (job_info->job)->finished) { + copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache); + g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0); + } + + return job_info->image_mapping; +} + static gboolean new_selection_pixbuf_needed (EvPixbufCache *pixbuf_cache, CacheJobInfo *job_info, @@ -701,8 +769,8 @@ clear_selection_if_needed (EvPixbufCache *pixbuf_cache, } GdkRegion * -ev_pixbuf_cache_get_text_mapping (EvPixbufCache *pixbuf_cache, - gint page) +ev_pixbuf_cache_get_text_mapping (EvPixbufCache *pixbuf_cache, + gint page) { CacheJobInfo *job_info; @@ -714,6 +782,7 @@ ev_pixbuf_cache_get_text_mapping (EvPixbufCache *pixbuf_cache, if (job_info->job && EV_JOB (job_info->job)->finished) { copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache); + g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0); } return job_info->text_mapping; @@ -859,6 +928,7 @@ static void clear_job_selection (CacheJobInfo *job_info) { job_info->points_set = FALSE; + job_info->selection_points.x1 = -1; if (job_info->selection) { g_object_unref (job_info->selection);