X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libview%2Fev-page-cache.c;h=d81414417438e2c6bc5bc4619b4742dec1af821c;hb=356536f6b8b44bfcf13c644a26ecdd583465bc0f;hp=d682080d1a7b75db092ec7e77375af1b227c44db;hpb=19a00ed1cd086dcca4b6bfeb84e0b1488b2e3089;p=evince.git diff --git a/libview/ev-page-cache.c b/libview/ev-page-cache.c index d682080d..d8141441 100644 --- a/libview/ev-page-cache.c +++ b/libview/ev-page-cache.c @@ -19,25 +19,30 @@ #include +#include #include "ev-jobs.h" #include "ev-job-scheduler.h" -#include "ev-mapping.h" +#include "ev-mapping-list.h" #include "ev-selection.h" #include "ev-document-links.h" #include "ev-document-forms.h" #include "ev-document-images.h" #include "ev-document-annotations.h" +#include "ev-document-text.h" #include "ev-page-cache.h" typedef struct _EvPageCacheData { - EvJob *job; - gboolean done : 1; - - GList *link_mapping; - GList *image_mapping; - GList *form_field_mapping; - GList *annot_mapping; - GdkRegion *text_mapping; + EvJob *job; + gboolean done : 1; + + EvMappingList *link_mapping; + EvMappingList *image_mapping; + EvMappingList *form_field_mapping; + EvMappingList *annot_mapping; + cairo_region_t *text_mapping; + EvRectangle *text_layout; + guint text_layout_length; + gchar *text; } EvPageCacheData; struct _EvPageCache { @@ -67,29 +72,40 @@ ev_page_cache_data_free (EvPageCacheData *data) } if (data->link_mapping) { - ev_mapping_list_free (data->link_mapping, g_object_unref); + ev_mapping_list_unref (data->link_mapping); data->link_mapping = NULL; } if (data->image_mapping) { - ev_mapping_list_free (data->image_mapping, g_object_unref); + ev_mapping_list_unref (data->image_mapping); data->image_mapping = NULL; } if (data->form_field_mapping) { - ev_mapping_list_free (data->form_field_mapping, g_object_unref); + ev_mapping_list_unref (data->form_field_mapping); data->form_field_mapping = NULL; } if (data->annot_mapping) { - ev_mapping_list_free (data->annot_mapping, g_object_unref); + ev_mapping_list_unref (data->annot_mapping); data->annot_mapping = NULL; } if (data->text_mapping) { - gdk_region_destroy (data->text_mapping); + cairo_region_destroy (data->text_mapping); data->text_mapping = NULL; } + + if (data->text_layout) { + g_free (data->text_layout); + data->text_layout = NULL; + data->text_layout_length = 0; + } + + if (data->text) { + g_free (data->text); + data->text = NULL; + } } static void @@ -150,8 +166,10 @@ get_flags_for_document (EvDocument *document) flags |= EV_PAGE_DATA_INCLUDE_FORMS; if (EV_IS_DOCUMENT_ANNOTATIONS (document)) flags |= EV_PAGE_DATA_INCLUDE_ANNOTS; - if (EV_IS_SELECTION (document)) - flags |= EV_PAGE_DATA_INCLUDE_TEXT; + if (EV_IS_SELECTION (document) && EV_IS_DOCUMENT_TEXT (document)) + flags |= EV_PAGE_DATA_INCLUDE_TEXT_MAPPING; + if (EV_IS_DOCUMENT_TEXT (document)) + flags |= EV_PAGE_DATA_INCLUDE_TEXT | EV_PAGE_DATA_INCLUDE_TEXT_LAYOUT; return flags; } @@ -188,6 +206,9 @@ job_page_data_finished_cb (EvJob *job, data->form_field_mapping = job_data->form_field_mapping; data->annot_mapping = job_data->annot_mapping; data->text_mapping = job_data->text_mapping; + data->text_layout = job_data->text_layout; + data->text_layout_length = job_data->text_layout_length; + data->text = job_data->text; data->done = TRUE; g_object_unref (data->job); @@ -231,7 +252,7 @@ ev_page_cache_set_flags (EvPageCache *cache, cache->flags = flags; } -GList * +EvMappingList * ev_page_cache_get_link_mapping (EvPageCache *cache, gint page) { @@ -253,7 +274,7 @@ ev_page_cache_get_link_mapping (EvPageCache *cache, return data->link_mapping; } -GList * +EvMappingList * ev_page_cache_get_image_mapping (EvPageCache *cache, gint page) { @@ -275,7 +296,7 @@ ev_page_cache_get_image_mapping (EvPageCache *cache, return data->image_mapping; } -GList * +EvMappingList * ev_page_cache_get_form_field_mapping (EvPageCache *cache, gint page) { @@ -297,7 +318,7 @@ ev_page_cache_get_form_field_mapping (EvPageCache *cache, return data->form_field_mapping; } -GList * +EvMappingList * ev_page_cache_get_annot_mapping (EvPageCache *cache, gint page) { @@ -319,7 +340,7 @@ ev_page_cache_get_annot_mapping (EvPageCache *cache, return data->annot_mapping; } -GdkRegion * +cairo_region_t * ev_page_cache_get_text_mapping (EvPageCache *cache, gint page) { @@ -328,7 +349,7 @@ ev_page_cache_get_text_mapping (EvPageCache *cache, g_return_val_if_fail (EV_IS_PAGE_CACHE (cache), NULL); g_return_val_if_fail (page >= 0 && page < cache->n_pages, NULL); - if (!(cache->flags & EV_PAGE_DATA_INCLUDE_TEXT)) + if (!(cache->flags & EV_PAGE_DATA_INCLUDE_TEXT_MAPPING)) return NULL; data = &cache->page_list[page]; @@ -341,3 +362,56 @@ ev_page_cache_get_text_mapping (EvPageCache *cache, return data->text_mapping; } +const gchar * +ev_page_cache_get_text (EvPageCache *cache, + gint page) +{ + EvPageCacheData *data; + + g_return_val_if_fail (EV_IS_PAGE_CACHE (cache), NULL); + g_return_val_if_fail (page >= 0 && page < cache->n_pages, NULL); + + if (!(cache->flags & EV_PAGE_DATA_INCLUDE_TEXT)) + return NULL; + + data = &cache->page_list[page]; + if (data->done) + return data->text; + + if (data->job) + return EV_JOB_PAGE_DATA (data->job)->text; + + return data->text; +} + +gboolean +ev_page_cache_get_text_layout (EvPageCache *cache, + gint page, + EvRectangle **areas, + guint *n_areas) +{ + EvPageCacheData *data; + + g_return_val_if_fail (EV_IS_PAGE_CACHE (cache), FALSE); + g_return_val_if_fail (page >= 0 && page < cache->n_pages, FALSE); + + if (!(cache->flags & EV_PAGE_DATA_INCLUDE_TEXT_LAYOUT)) + return FALSE; + + data = &cache->page_list[page]; + if (data->done) { + *areas = data->text_layout; + *n_areas = data->text_layout_length; + + return TRUE; + } + + if (data->job) { + *areas = EV_JOB_PAGE_DATA (data->job)->text_layout; + *n_areas = EV_JOB_PAGE_DATA (data->job)->text_layout_length; + + return TRUE; + } + + return FALSE; +}