X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-page-cache.c;h=eb88ed9d607880b346382bc6378e848a1d40c5ae;hb=1ba681aa9eb43a60f0a01c1939e70f9f6de755c7;hp=41acecfc30bd0be36c9f8c13c1d55cc17c749477;hpb=96ab01a78dafd62f121b11010a9857cbd9a7922c;p=evince.git diff --git a/shell/ev-page-cache.c b/shell/ev-page-cache.c index 41acecfc..eb88ed9d 100644 --- a/shell/ev-page-cache.c +++ b/shell/ev-page-cache.c @@ -29,9 +29,12 @@ struct _EvPageCache double max_width; double max_height; + double* height_to_page; double* dual_height_to_page; + int rotation; + EvPageCacheInfo *size_cache; EvDocumentInfo *page_info; }; @@ -100,13 +103,79 @@ ev_page_cache_finalize (GObject *object) ev_document_info_free (page_cache->page_info); } +static void +build_height_to_page (EvPageCache *page_cache) +{ + gboolean swap; + int i; + double uniform_height, page_height, next_page_height; + double saved_height; + + swap = (page_cache->rotation == 90 || + page_cache->rotation == 270); + + g_free (page_cache->height_to_page); + g_free (page_cache->dual_height_to_page); + + page_cache->height_to_page = g_new0(double, page_cache->n_pages); + page_cache->dual_height_to_page = g_new0(double, page_cache->n_pages / 2 + 1); + + saved_height = 0; + for (i = 0; i < page_cache->n_pages; i++) { + if (page_cache->uniform) { + if (!swap) { + uniform_height = page_cache->uniform_height; + } else { + uniform_height = page_cache->uniform_width; + } + page_cache->height_to_page [i] = (i + 1) * uniform_height; + } else { + if (!swap) { + page_height = page_cache->size_cache [i].height; + } else { + page_height = page_cache->size_cache [i].width; + } + page_cache->height_to_page [i] = saved_height + page_height; + saved_height = page_cache->height_to_page [i]; + } + } + + saved_height = 0; + for (i = 0; i < page_cache->n_pages; i += 2) { + if (page_cache->uniform) { + if (!swap) { + uniform_height = page_cache->uniform_height; + } else { + uniform_height = page_cache->uniform_width; + } + page_cache->dual_height_to_page [i / 2] = (i / 2 + 1) * uniform_height; + } else { + if (!swap) { + page_height = page_cache->size_cache [i].height; + next_page_height = page_cache->size_cache [i + 1].height; + } else { + page_height = page_cache->size_cache [i].width; + next_page_height = page_cache->size_cache [i + 1].width; + } + if (i == page_cache->n_pages - 1) { + page_cache->dual_height_to_page [i / 2] = + saved_height + page_height; + } + else { + page_cache->dual_height_to_page [i / 2] = saved_height + + MAX(page_height, next_page_height); + saved_height = page_cache->dual_height_to_page [i / 2]; + } + } + } +} + EvPageCache * ev_page_cache_new (EvDocument *document) { EvPageCache *page_cache; EvPageCacheInfo *info; gint i; - double saved_height; page_cache = (EvPageCache *) g_object_new (EV_TYPE_PAGE_CACHE, NULL); @@ -187,43 +256,12 @@ ev_page_cache_new (EvDocument *document) } } - page_cache->height_to_page = g_new0(double, page_cache->n_pages); - page_cache->dual_height_to_page = g_new0(double, page_cache->n_pages / 2 + 1); - - saved_height = 0; - for (i = 0; i < page_cache->n_pages; i++) { - - if (page_cache->uniform) { - page_cache->height_to_page [i] = (i + 1) * page_cache->uniform_height; - } else { - page_cache->height_to_page [i] = saved_height + page_cache->size_cache [i].height; - saved_height = page_cache->height_to_page [i]; - } - } - - saved_height = 0; - for (i = 0; i < page_cache->n_pages; i += 2) { - - if (page_cache->uniform) { - page_cache->dual_height_to_page [i / 2] = (i / 2 + 1) * page_cache->uniform_height; - } else { - if (i == page_cache->n_pages - 1) { - page_cache->dual_height_to_page [i / 2] = - saved_height + page_cache->size_cache [i].height; - } - else { - page_cache->dual_height_to_page [i / 2] = saved_height + - MAX(page_cache->size_cache [i].height, - page_cache->size_cache [i + 1].height); - saved_height = page_cache->dual_height_to_page [i / 2]; - } - } - } + build_height_to_page (page_cache); /* make some sanity check assertions */ if (! page_cache->uniform) g_assert (page_cache->size_cache != NULL); - if (page_cache->uniform) + if (page_cache->uniform && page_cache->n_pages > 0) g_assert (page_cache->uniform_width > 0 && page_cache->uniform_height > 0); ev_document_doc_mutex_unlock (); @@ -324,72 +362,92 @@ ev_page_cache_get_title (EvPageCache *page_cache) void ev_page_cache_get_size (EvPageCache *page_cache, gint page, - EvOrientation orientation, + gint rotation, gfloat scale, gint *width, gint *height) { + int w, h; + g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); g_return_if_fail (page >= 0 && page < page_cache->n_pages); if (page_cache->uniform) { - if (width) - *width = page_cache->uniform_width; - if (height) - *height = page_cache->uniform_height; + w = page_cache->uniform_width; + h = page_cache->uniform_height; } else { EvPageCacheInfo *info; info = &(page_cache->size_cache [page]); - if (width) - *width = info->width; - if (height) - *height = info->height; + w = info->width; + h = info->height; } - if (width) - *width = (int) ((*width) * scale + 0.5); - if (width) - *height = (int) ((*height) * scale + 0.5); + w = (int) (w * scale + 0.5); + h = (int) (h * scale + 0.5); + if (rotation == 0 || rotation == 180) { + if (width) *width = w; + if (height) *height = h; + } else { + if (width) *width = h; + if (height) *height = w; + } } - void -ev_page_cache_get_max_width (EvPageCache *page_cache, - gfloat scale, - gint *width) +ev_page_cache_get_max_width (EvPageCache *page_cache, + gint rotation, + gfloat scale, + gint *width) { g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - if (width) - *width = page_cache->max_width * scale; + if (width) { + if (rotation == 0 || rotation == 180) { + *width = page_cache->max_width * scale; + } else { + *width = page_cache->max_height * scale; + } + } } void -ev_page_cache_get_max_height (EvPageCache *page_cache, - gfloat scale, - gint *height) +ev_page_cache_get_max_height (EvPageCache *page_cache, + gint rotation, + gfloat scale, + gint *height) { g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - if (height) - *height = page_cache->max_height * scale; + if (height) { + if (rotation == 0 || rotation == 180) { + *height = page_cache->max_height * scale; + } else { + *height = page_cache->max_width * scale; + } + } } void -ev_page_cache_get_height_to_page (EvPageCache *page_cache, - gint page, - gfloat scale, - gint *height, - gint *dual_height) +ev_page_cache_get_height_to_page (EvPageCache *page_cache, + gint page, + gint rotation, + gfloat scale, + gint *height, + gint *dual_height) { double result = 0.0; double dual_result = 0.0; g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); + if (page_cache->rotation != rotation) { + page_cache->rotation = rotation; + build_height_to_page (page_cache); + } + if (page > 0) result = page_cache->height_to_page [page - 1];