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=6302c42e03b973fcc8b79bdd8cdaf62d3b6d1346;hb=174a8bc98d92b1123ec70fef51e0f64181cc8ab6;hp=a6d78228b5d82d455cad9de47a1e7cd2470ad822;hpb=bf325e9279324f02bcadc0145cd553ed94c23d2d;p=evince.git diff --git a/backend/ev-page-cache.c b/backend/ev-page-cache.c index a6d78228..6302c42e 100644 --- a/backend/ev-page-cache.c +++ b/backend/ev-page-cache.c @@ -19,11 +19,18 @@ struct _EvPageCache int n_pages; char *title; char **page_labels; - + + gboolean has_labels; gboolean uniform; + double uniform_width; double uniform_height; + double max_width_page_width; + double max_width_page_height; + double max_height_page_width; + double max_height_page_height; + EvPageCacheInfo *size_cache; }; @@ -102,8 +109,13 @@ _ev_page_cache_new (EvDocument *document) /* Assume all pages are the same size until proven otherwise */ page_cache->uniform = TRUE; + page_cache->has_labels = FALSE; page_cache->n_pages = ev_document_get_n_pages (document); page_cache->page_labels = g_new0 (char *, page_cache->n_pages); + page_cache->max_width_page_width = 0; + page_cache->max_width_page_height = 0; + page_cache->max_height_page_width = 0; + page_cache->max_height_page_height = 0; doc_info = ev_document_get_info (document); if (doc_info->fields_mask & EV_DOCUMENT_INFO_TITLE) { @@ -116,9 +128,29 @@ _ev_page_cache_new (EvDocument *document) 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); + + page_cache->page_labels[i] = ev_document_get_page_label (document, i); + + if (!page_cache->has_labels && page_cache->page_labels[i] != NULL) { + gchar *expected_label; + + expected_label = g_strdup_printf ("%d", i + 1); + if (strcmp (expected_label, page_cache->page_labels[i])) + page_cache->has_labels = TRUE; + g_free (expected_label); + } + + if (page_width > page_cache->max_width_page_width) { + page_cache->max_width_page_width = page_width; + page_cache->max_width_page_height = page_height; + } + + if (page_height > page_cache->max_height_page_height) { + page_cache->max_height_page_width = page_width; + page_cache->max_height_page_height = page_height; + } if (i == 0) { page_cache->uniform_width = page_width; @@ -151,6 +183,8 @@ _ev_page_cache_new (EvDocument *document) /* make some sanity check assertions */ 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); ev_document_doc_mutex_unlock (); @@ -274,11 +308,44 @@ ev_page_cache_get_size (EvPageCache *page_cache, } if (width) - *width = (*width) * scale; + *width = (int) ((*width) * scale + 0.5); + if (width) + *height = (int) ((*height) * scale + 0.5); + +} + + +/* Note that these aren't necessarily from the same page. + */ +void +ev_page_cache_get_max_width_size (EvPageCache *page_cache, + gfloat scale, + gint *width, + gint *height) +{ + g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); + if (width) - *height = (*height) * scale; + *width = page_cache->max_width_page_width * scale; + if (height) + *height = page_cache->max_width_page_height * scale; +} +void +ev_page_cache_get_max_height_size (EvPageCache *page_cache, + gfloat scale, + gint *width, + gint *height) +{ + g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); + + if (width) + *width = page_cache->max_height_page_width * scale; + if (height) + *height = page_cache->max_height_page_height * scale; } + + gchar * ev_page_cache_get_page_label (EvPageCache *page_cache, gint page) @@ -292,6 +359,12 @@ ev_page_cache_get_page_label (EvPageCache *page_cache, return g_strdup (page_cache->page_labels[page]); } +gboolean +ev_page_cache_has_nonnumeric_page_labels (EvPageCache *page_cache) +{ + g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); + return page_cache->has_labels; +} gboolean ev_page_cache_next_page (EvPageCache *page_cache)