X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=libview%2Fev-page-cache.c;h=8fba8c6ad775bc2b4ea7272ef0f0e512e4b4b5e9;hb=6965a51a28f76d0a669d0d1c9fdc089e6cf46c7d;hp=a8639ef62aad36d5d82a0bc030155402ad2c9bd9;hpb=68d0fc3c59185065d9694ba3f8cb2665b984eb9f;p=evince.git diff --git a/libview/ev-page-cache.c b/libview/ev-page-cache.c index a8639ef6..8fba8c6a 100644 --- a/libview/ev-page-cache.c +++ b/libview/ev-page-cache.c @@ -5,55 +5,17 @@ #include #include -#define THUMBNAIL_WIDTH 100 - -typedef struct _EvPageCacheInfo -{ - double width; - double height; -} EvPageCacheInfo; - -typedef struct _EvPageThumbsInfo -{ - gint width; - gint height; -} EvPageThumbsInfo; - struct _EvPageCache { GObject parent; - gint current_page; - int n_pages; - char *title; - char **page_labels; - - gint max_label_chars; - gboolean has_labels; - gboolean uniform; - gboolean dual_even_left; - - double uniform_width; - double uniform_height; + EvDocument *document; - double max_width; - double max_height; + gint current_page; - double* height_to_page; - double* dual_height_to_page; + gboolean dual_even_left; int rotation; - - EvPageCacheInfo *size_cache; - EvDocumentInfo *page_info; - - /* Thumbnail dimensions */ - gboolean thumbs_uniform; - gint thumbs_uniform_width; - gint thumbs_uniform_height; - gint thumbs_max_width; - gint thumbs_max_height; - EvPageThumbsInfo *thumbs_size_cache; }; struct _EvPageCacheClass @@ -83,7 +45,6 @@ static void ev_page_cache_init (EvPageCache *page_cache) { page_cache->current_page = -1; - page_cache->max_label_chars = 0; } static void @@ -120,321 +81,27 @@ ev_page_cache_class_init (EvPageCacheClass *class) static void ev_page_cache_finalize (GObject *object) { - EvPageCache *page_cache; - - page_cache = EV_PAGE_CACHE (object); - - if (page_cache->title) { - g_free (page_cache->title); - page_cache->title = NULL; - } + EvPageCache *page_cache = EV_PAGE_CACHE (object); - if (page_cache->size_cache) { - g_free (page_cache->size_cache); - page_cache->size_cache = NULL; - } - - if (page_cache->thumbs_size_cache) { - g_free (page_cache->thumbs_size_cache); - page_cache->thumbs_size_cache = NULL; - } - - if (page_cache->height_to_page) { - g_free (page_cache->height_to_page); - page_cache->height_to_page = NULL; - } - - if (page_cache->dual_height_to_page) { - g_free (page_cache->dual_height_to_page); - page_cache->dual_height_to_page = NULL; - } - - if (page_cache->page_labels) { - gint i; - - for (i = 0; i < page_cache->n_pages; i++) { - if (page_cache->page_labels[i]) - g_free (page_cache->page_labels[i]); - } - g_free (page_cache->page_labels); - page_cache->page_labels = NULL; - } - - if (page_cache->page_info) { - ev_document_info_free (page_cache->page_info); - page_cache->page_info = NULL; - } + page_cache->document = NULL; G_OBJECT_CLASS (ev_page_cache_parent_class)->finalize (object); } -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 + 1); - page_cache->dual_height_to_page = g_new0(double, page_cache->n_pages + 2); - - 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 * uniform_height; - } else { - if (i < page_cache->n_pages) { - if (!swap) { - page_height = page_cache->size_cache [i].height; - } else { - page_height = page_cache->size_cache [i].width; - } - } else { - page_height = 0; - } - page_cache->height_to_page [i] = saved_height; - saved_height += page_height; - } - } - - if (page_cache->dual_even_left && !page_cache->uniform) { - if (!swap) { - saved_height = page_cache->size_cache [0].height; - } else { - saved_height = page_cache->size_cache [0].width; - } - } else { - saved_height = 0; - } - for (i = page_cache->dual_even_left; i < page_cache->n_pages + 2; 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] = ((i + page_cache->dual_even_left) / 2) * uniform_height; - if (i + 1 < page_cache->n_pages + 2) - page_cache->dual_height_to_page [i + 1] = ((i + page_cache->dual_even_left) / 2) * uniform_height; - } else { - if (i + 1 < page_cache->n_pages) { - if (!swap) { - next_page_height = page_cache->size_cache [i + 1].height; - } else { - next_page_height = page_cache->size_cache [i + 1].width; - } - } else { - next_page_height = 0; - } - if (i < page_cache->n_pages) { - if (!swap) { - page_height = page_cache->size_cache [i].height; - } else { - page_height = page_cache->size_cache [i].width; - } - } else { - page_height = 0; - } - if (i + 1 < page_cache->n_pages + 2) { - page_cache->dual_height_to_page [i] = saved_height; - page_cache->dual_height_to_page [i + 1] = saved_height; - saved_height += MAX(page_height, next_page_height); - } else { - page_cache->dual_height_to_page [i] = saved_height; - } - } - } -} - -EvPageCache * +static EvPageCache * ev_page_cache_new (EvDocument *document) { EvPageCache *page_cache; - EvPageCacheInfo *info; - EvPageThumbsInfo *thumb_info; - EvRenderContext *rc = NULL; - gboolean has_thumbs; - gint i; page_cache = (EvPageCache *) g_object_new (EV_TYPE_PAGE_CACHE, NULL); + page_cache->document = document; - ev_document_doc_mutex_lock (); - - /* We read page information out of the 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->dual_even_left = (page_cache->n_pages > 2); - page_cache->page_labels = g_new0 (char *, page_cache->n_pages); - page_cache->max_width = 0; - page_cache->max_height = 0; - page_cache->page_info = ev_document_get_info (document); - page_cache->thumbs_uniform = TRUE; - - if (page_cache->page_info->fields_mask & EV_DOCUMENT_INFO_TITLE) { - page_cache->title = g_strdup (page_cache->page_info->title); - } else { - page_cache->title = NULL; - } - - has_thumbs = EV_IS_DOCUMENT_THUMBNAILS (document); - - for (i = 0; i < page_cache->n_pages; i++) { - EvPage *page; - double page_width = 0; - double page_height = 0; - gint thumb_width = 0; - gint thumb_height = 0; - - page = ev_document_get_page (document, i); - - ev_document_get_page_size (document, page, &page_width, &page_height); - - page_cache->page_labels[i] = ev_document_get_page_label (document, page); - - if (page_cache->page_labels[i] != NULL) { - - page_cache->max_label_chars = MAX (page_cache->max_label_chars, - g_utf8_strlen (page_cache->page_labels[i], 256)); - if (!page_cache->has_labels) { - 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_cache->max_width = page_width; - } - - if (page_height > page_cache->max_height) { - page_cache->max_height = page_height; - } - - if (i == 0) { - page_cache->uniform_width = page_width; - page_cache->uniform_height = page_height; - } else if (page_cache->uniform && - (page_cache->uniform_width != page_width || - page_cache->uniform_height != page_height)) { - /* It's a different page size. Backfill the array. */ - int j; - - page_cache->size_cache = g_new0 (EvPageCacheInfo, page_cache->n_pages); - - 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]); - - info->width = page_width; - info->height = page_height; - } - - if (!has_thumbs) { - g_object_unref (page); - continue; - } - - if (!rc) { - rc = ev_render_context_new (page, 0, (gdouble)THUMBNAIL_WIDTH / page_width); - } else { - ev_render_context_set_page (rc, page); - ev_render_context_set_scale (rc, (gdouble)THUMBNAIL_WIDTH / page_width); - } - - ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (document), - rc, &thumb_width, &thumb_height); - - if (thumb_width > page_cache->thumbs_max_width) { - page_cache->thumbs_max_width = thumb_width; - } - - if (thumb_height > page_cache->thumbs_max_height) { - page_cache->thumbs_max_height = thumb_height; - } - - if (i == 0) { - page_cache->thumbs_uniform_width = thumb_width; - page_cache->thumbs_uniform_height = thumb_height; - } else if (page_cache->thumbs_uniform && - (page_cache->thumbs_uniform_width != thumb_width || - page_cache->thumbs_uniform_height != thumb_height)) { - /* It's a different thumbnail size. Backfill the array. */ - int j; - - page_cache->thumbs_size_cache = g_new0 (EvPageThumbsInfo, page_cache->n_pages); - - for (j = 0; j < i; j++) { - thumb_info = &(page_cache->thumbs_size_cache [j]); - thumb_info->width = page_cache->thumbs_uniform_width; - thumb_info->height = page_cache->thumbs_uniform_height; - } - page_cache->thumbs_uniform = FALSE; - } - - if (! page_cache->thumbs_uniform) { - thumb_info = &(page_cache->thumbs_size_cache [i]); - - thumb_info->width = thumb_width; - thumb_info->height = thumb_height; - } - - g_object_unref (page); - } - - if (rc) { - g_object_unref (rc); - } - - 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 && page_cache->n_pages > 0) - g_assert (page_cache->uniform_width > 0 && page_cache->uniform_height > 0); - - ev_document_doc_mutex_unlock (); - - if (page_cache->n_pages > 0) + if (ev_document_get_n_pages (page_cache->document) > 0) ev_page_cache_set_current_page (page_cache, 0); return page_cache; } -gint -ev_page_cache_get_n_pages (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0); - - return page_cache->n_pages; -} - gint ev_page_cache_get_current_page (EvPageCache *page_cache) { @@ -448,7 +115,6 @@ 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); if (page == page_cache->current_page) return; @@ -469,232 +135,20 @@ ev_page_cache_set_current_page_history (EvPageCache *page_cache, gboolean ev_page_cache_set_page_label (EvPageCache *page_cache, - const char *page_label) + const gchar *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; - } - } + gint page; - /* Second, look for a match with case insensitively */ - for (i = 0; i < page_cache->n_pages; i++) { - if (page_cache->page_labels[i] != NULL && - ! strcasecmp (page_label, page_cache->page_labels[i])) { - ev_page_cache_set_current_page (page_cache, i); - return TRUE; - } - } + g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); - /* 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) { - ev_page_cache_set_current_page (page_cache, page); - return TRUE; - } + if (ev_document_find_page_by_label (page_cache->document, page_label, &page)) { + ev_page_cache_set_current_page (page_cache, page); + return TRUE; } return FALSE; } -const char * -ev_page_cache_get_title (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), NULL); - - return page_cache->title; -} - -void -ev_page_cache_get_size (EvPageCache *page_cache, - gint page, - gint rotation, - gfloat scale, - gint *width, - gint *height) -{ - double 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) { - w = page_cache->uniform_width; - h = page_cache->uniform_height; - } else { - EvPageCacheInfo *info; - - info = &(page_cache->size_cache [page]); - - w = info->width; - h = info->height; - } - - w = w * scale + 0.5; - h = h * scale + 0.5; - - if (rotation == 0 || rotation == 180) { - if (width) *width = (int)w; - if (height) *height = (int)h; - } else { - if (width) *width = (int)h; - if (height) *height = (int)w; - } -} - -void -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) { - 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, - gint rotation, - gfloat scale, - gint *height) -{ - g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - - 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, - gint rotation, - gfloat scale, - gint *height, - gint *dual_height) -{ - g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - g_return_if_fail (page >= 0); - g_return_if_fail (!height || page <= page_cache->n_pages); - g_return_if_fail (!dual_height || page <= page_cache->n_pages + 1); - - if (page_cache->rotation != rotation) { - page_cache->rotation = rotation; - build_height_to_page (page_cache); - } - - if (height) - *height = page_cache->height_to_page [page] * scale; - - if (dual_height) - *dual_height = page_cache->dual_height_to_page [page] * scale; -} - -void -ev_page_cache_get_thumbnail_size (EvPageCache *page_cache, - gint page, - gint rotation, - gint *width, - gint *height) -{ - gint 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->thumbs_uniform) { - w = page_cache->thumbs_uniform_width; - h = page_cache->thumbs_uniform_height; - } else { - EvPageThumbsInfo *info; - - info = &(page_cache->thumbs_size_cache [page]); - - w = info->width; - h = info->height; - } - - if (rotation == 0 || rotation == 180) { - if (width) *width = w; - if (height) *height = h; - } else { - if (width) *width = h; - if (height) *height = w; - } -} - -gint -ev_page_cache_get_max_label_chars (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0); - - return page_cache->max_label_chars; -} - -gboolean -ev_page_cache_get_dual_even_left (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0); - - return page_cache->dual_even_left; -} - -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_has_nonnumeric_page_labels (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); - return page_cache->has_labels; -} - -const EvDocumentInfo * -ev_page_cache_get_info (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), NULL); - - return page_cache->page_info; -} - #define PAGE_CACHE_STRING "ev-page-cache" EvPageCache *