X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=backend%2Fev-page-cache.c;h=935347e19430c9ee4e899ea68c94041a73b37a60;hb=429224b821ebc694edd283e8a0d23c6b86d8d078;hp=e2771b66c32d7b0d25d1c81d92c4d0d6eeb72be8;hpb=1c0d19bd22598eca159c3febdcdaf4168891cb8f;p=evince.git diff --git a/backend/ev-page-cache.c b/backend/ev-page-cache.c index e2771b66..935347e1 100644 --- a/backend/ev-page-cache.c +++ b/backend/ev-page-cache.c @@ -1,10 +1,12 @@ #include "ev-page-cache.h" #include "ev-job-queue.h" +#include +#include typedef struct _EvPageCacheInfo { - gint width; - gint height; + double width; + double height; } EvPageCacheInfo; @@ -16,10 +18,11 @@ struct _EvPageCache gint current_page; int n_pages; char *title; + char **page_labels; gboolean uniform; - gint uniform_width; - gint uniform_height; + double uniform_width; + double uniform_height; EvPageCacheInfo *size_cache; }; @@ -48,7 +51,7 @@ G_DEFINE_TYPE (EvPageCache, ev_page_cache, G_TYPE_OBJECT) static void ev_page_cache_init (EvPageCache *page_cache) { - page_cache->current_page = 1; + page_cache->current_page = -1; } static void @@ -86,6 +89,7 @@ ev_page_cache_finalize (GObject *object) EvPageCache * _ev_page_cache_new (EvDocument *document) { + EvDocumentInfo *doc_info; EvPageCache *page_cache; EvPageCacheInfo *info; gint i; @@ -99,16 +103,24 @@ _ev_page_cache_new (EvDocument *document) /* Assume all pages are the same size until proven otherwise */ page_cache->uniform = TRUE; page_cache->n_pages = ev_document_get_n_pages (document); - page_cache->title = ev_document_get_title (document); + page_cache->page_labels = g_new0 (char *, page_cache->n_pages); - ev_document_set_scale (document, 1.0); - for (i = 1; i <= page_cache->n_pages; i++) { - gint page_width = 0; - gint page_height = 0; + doc_info = ev_document_get_info (document); + if (doc_info->fields_mask & EV_DOCUMENT_INFO_TITLE) { + page_cache->title = g_strdup (doc_info->title); + } else { + page_cache->title = NULL; + } + g_free (doc_info); + + for (i = 0; i < page_cache->n_pages; i++) { + double page_width = 0; + double page_height = 0; ev_document_get_page_size (document, i, &page_width, &page_height); + page_cache->page_labels[i] = ev_document_get_page_label (document, i); - if (i == 1) { + if (i == 0) { page_cache->uniform_width = page_width; page_cache->uniform_height = page_height; } else if (page_cache->uniform && @@ -119,17 +131,17 @@ _ev_page_cache_new (EvDocument *document) page_cache->size_cache = g_new0 (EvPageCacheInfo, page_cache->n_pages); - for (j = 1; j < i; j++) { - info = &(page_cache->size_cache [j - 1]); - info->width = page_width; - info->height = page_height; + for (j = 0; j < i; j++) { + info = &(page_cache->size_cache [j]); + info->width = page_cache->uniform_width; + info->height = page_cache->uniform_height; } page_cache->uniform = FALSE; } if (! page_cache->uniform) { - info = &(page_cache->size_cache [i - 1]); + info = &(page_cache->size_cache [i]); info->width = page_width; info->height = page_height; @@ -137,14 +149,14 @@ _ev_page_cache_new (EvDocument *document) } /* make some sanity check assertions */ - g_assert (page_cache->n_pages > 0); if (! page_cache->uniform) g_assert (page_cache->size_cache != NULL); - if (page_cache->uniform) - g_assert (page_cache->uniform_width > 0 && page_cache->uniform_height > 0); g_mutex_unlock (EV_DOC_MUTEX); + if (page_cache->n_pages > 0) + ev_page_cache_set_current_page (page_cache, 0); + return page_cache; } @@ -169,7 +181,7 @@ ev_page_cache_set_current_page (EvPageCache *page_cache, int page) { g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - g_return_if_fail (page > 0 || page <= page_cache->n_pages); + g_return_if_fail (page >= 0 || page < page_cache->n_pages); if (page == page_cache->current_page) return; @@ -178,6 +190,45 @@ ev_page_cache_set_current_page (EvPageCache *page_cache, g_signal_emit (page_cache, signals[PAGE_CHANGED], 0, page); } +gboolean +ev_page_cache_set_page_label (EvPageCache *page_cache, + const char *page_label) +{ + gint i, page; + long value; + char *endptr = NULL; + + g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); + g_return_val_if_fail (page_label != NULL, FALSE); + + /* First, look for a literal label match */ + for (i = 0; i < page_cache->n_pages; i ++) { + if (page_cache->page_labels[i] != NULL && + ! strcmp (page_label, page_cache->page_labels[i])) { + ev_page_cache_set_current_page (page_cache, i); + return TRUE; + } + } + + /* Next, parse the label, and see if the number fits */ + value = strtol (page_label, &endptr, 10); + if (endptr[0] == '\0') { + /* Page number is an integer */ + page = MIN (G_MAXINT, value); + + /* convert from a page label to a page offset */ + page --; + if (page >= 0 && + page < page_cache->n_pages && + page_cache->page_labels[page] == NULL) { + ev_page_cache_set_current_page (page_cache, page); + return TRUE; + } + } + + return FALSE; +} + void ev_page_cache_set_link (EvPageCache *page_cache, EvLink *link) @@ -204,7 +255,7 @@ ev_page_cache_get_size (EvPageCache *page_cache, gint *height) { g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - g_return_if_fail (page > 0 && page <= page_cache->n_pages); + g_return_if_fail (page >= 0 && page < page_cache->n_pages); if (page_cache->uniform) { if (width) @@ -214,7 +265,7 @@ ev_page_cache_get_size (EvPageCache *page_cache, } else { EvPageCacheInfo *info; - info = &(page_cache->size_cache [page - 1]); + info = &(page_cache->size_cache [page]); if (width) *width = info->width; @@ -228,13 +279,26 @@ ev_page_cache_get_size (EvPageCache *page_cache, *height = (*height) * scale; } +gchar * +ev_page_cache_get_page_label (EvPageCache *page_cache, + gint page) +{ + g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), NULL); + g_return_val_if_fail (page >= 0 && page < page_cache->n_pages, NULL); + + if (page_cache->page_labels[page] == NULL) + return g_strdup_printf ("%d", page + 1); + + return g_strdup (page_cache->page_labels[page]); +} + gboolean ev_page_cache_next_page (EvPageCache *page_cache) { g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); - if (page_cache->current_page >= page_cache->n_pages) + if (page_cache->current_page >= page_cache->n_pages - 1) return FALSE; ev_page_cache_set_current_page (page_cache, page_cache->current_page + 1); @@ -247,7 +311,7 @@ ev_page_cache_prev_page (EvPageCache *page_cache) { g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); - if (page_cache->current_page <= 1) + if (page_cache->current_page <= 0) return FALSE; ev_page_cache_set_current_page (page_cache, page_cache->current_page - 1);