From c4b192c34c4758bd078d1a212d69c6ae5084d6c8 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Wed, 19 Aug 2009 13:29:40 +0000 Subject: Move part of the EvPageCache to EvDocument The static data about the document is stored now in EvDocument class --- diff --git a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc index 84314ce..9306445 100644 --- a/backend/pdf/ev-poppler.cc +++ b/backend/pdf/ev-poppler.cc @@ -588,13 +588,9 @@ pdf_document_get_info (EvDocument *document) info->n_pages = ev_document_get_n_pages (document); if (info->n_pages > 0) { - page = ev_document_get_page (document, 0); - ev_document_get_page_size (document, page, + ev_document_get_page_size (document, 0, &(info->paper_width), &(info->paper_height)); - g_object_unref (page); - - // Convert to mm. info->paper_width = info->paper_width / 72.0f * 25.4f; info->paper_height = info->paper_height / 72.0f * 25.4f; diff --git a/libdocument/ev-document.c b/libdocument/ev-document.c index 9d2e259..a74a0e3 100644 --- a/libdocument/ev-document.c +++ b/libdocument/ev-document.c @@ -21,8 +21,45 @@ #include "config.h" +#include +#include + #include "ev-document.h" +#define EV_DOCUMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EV_TYPE_DOCUMENT, EvDocumentPrivate)) + +typedef struct _EvPageSize +{ + gdouble width; + gdouble height; +} EvPageSize; + +struct _EvDocumentPrivate +{ + gint n_pages; + + gboolean uniform; + gdouble uniform_width; + gdouble uniform_height; + + gdouble max_width; + gdouble max_height; + gint max_label; + + gchar **page_labels; + EvPageSize *page_sizes; + EvDocumentInfo *info; +}; + +static gint _ev_document_get_n_pages (EvDocument *document); +static void _ev_document_get_page_size (EvDocument *document, + EvPage *page, + double *width, + double *height); +static gchar *_ev_document_get_page_label (EvDocument *document, + EvPage *page); +static EvDocumentInfo *_ev_document_get_info (EvDocument *document); + GMutex *ev_doc_mutex = NULL; GMutex *ev_fc_mutex = NULL; @@ -52,15 +89,53 @@ ev_document_impl_get_info (EvDocument *document) } static void +ev_document_finalize (GObject *object) +{ + EvDocument *document = EV_DOCUMENT (object); + + if (document->priv->page_sizes) { + g_free (document->priv->page_sizes); + document->priv->page_sizes = NULL; + } + + if (document->priv->page_labels) { + gint i; + + for (i = 0; i < document->priv->n_pages; i++) { + g_free (document->priv->page_labels[i]); + } + g_free (document->priv->page_labels); + document->priv->page_labels = NULL; + } + + if (document->priv->info) { + ev_document_info_free (document->priv->info); + document->priv->info = NULL; + } + + G_OBJECT_CLASS (ev_document_parent_class)->finalize (object); +} + +static void ev_document_init (EvDocument *document) { + document->priv = EV_DOCUMENT_GET_PRIVATE (document); + + /* Assume all pages are the same size until proven otherwise */ + document->priv->uniform = TRUE; } static void ev_document_class_init (EvDocumentClass *klass) { + GObjectClass *g_object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (g_object_class, sizeof (EvDocumentPrivate)); + klass->get_page = ev_document_impl_get_page; klass->get_info = ev_document_impl_get_info; + + g_object_class->finalize = ev_document_finalize; } GMutex * @@ -157,6 +232,81 @@ ev_document_load (EvDocument *document, EV_DOCUMENT_ERROR_INVALID, "Internal error in backend"); } + } else { + gint i; + EvDocumentPrivate *priv = document->priv; + + /* Cache some info about the document to avoid + * going to the backends since it requires locks + */ + priv->n_pages = _ev_document_get_n_pages (document); + priv->info = _ev_document_get_info (document); + + for (i = 0; i < priv->n_pages; i++) { + EvPage *page = ev_document_get_page (document, i); + gdouble page_width = 0; + gdouble page_height = 0; + EvPageSize *page_size; + gchar *page_label; + + _ev_document_get_page_size (document, page, &page_width, &page_height); + + if (i == 0) { + priv->uniform_width = page_width; + priv->uniform_height = page_height; + } else if (priv->uniform && + (priv->uniform_width != page_width || + priv->uniform_height != page_height)) { + /* It's a different page size. Backfill the array. */ + int j; + + priv->page_sizes = g_new0 (EvPageSize, priv->n_pages); + + for (j = 0; j < i; j++) { + page_size = &(priv->page_sizes[j]); + page_size->width = priv->uniform_width; + page_size->height = priv->uniform_height; + } + priv->uniform = FALSE; + } + if (!priv->uniform) { + page_size = &(priv->page_sizes[i]); + + page_size->width = page_width; + page_size->height = page_height; + + if (page_width > priv->max_width) + priv->max_width = page_width; + + if (page_height > priv->max_height) + priv->max_height = page_height; + } + + page_label = _ev_document_get_page_label (document, page); + if (page_label) { + if (priv->page_labels) { + priv->page_labels[i] = page_label; + } else { + gchar *numeric_label; + + numeric_label = g_strdup_printf ("%d", i + 1); + if (strcmp (numeric_label, page_label) != 0) { + priv->page_labels = g_new0 (gchar *, priv->n_pages); + priv->page_labels[i] = page_label; + } + g_free (numeric_label); + } + priv->max_label = MAX (priv->max_label, + g_utf8_strlen (page_label, 256)); + } + + g_object_unref (page); + } + + if (priv->uniform) { + priv->max_width = priv->uniform_width; + priv->max_height = priv->uniform_height; + } } return retval; @@ -182,50 +332,87 @@ ev_document_save (EvDocument *document, return klass->save (document, uri, error); } -int -ev_document_get_n_pages (EvDocument *document) +EvPage * +ev_document_get_page (EvDocument *document, + gint index) +{ + EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document); + + return klass->get_page (document, index); +} + +static gint +_ev_document_get_n_pages (EvDocument *document) { EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document); return klass->get_n_pages (document); } -EvPage * -ev_document_get_page (EvDocument *document, - gint index) +gint +ev_document_get_n_pages (EvDocument *document) +{ + return document->priv->n_pages; +} + +static void +_ev_document_get_page_size (EvDocument *document, + EvPage *page, + double *width, + double *height) { EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document); - return klass->get_page (document, index); + klass->get_page_size (document, page, width, height); } void ev_document_get_page_size (EvDocument *document, - EvPage *page, + gint page_index, double *width, double *height) { + if (width) + *width = document->priv->uniform ? + document->priv->uniform_width : + document->priv->page_sizes[page_index].width; + if (height) + *height = document->priv->uniform ? + document->priv->uniform_height : + document->priv->page_sizes[page_index].height; +} + +static gchar * +_ev_document_get_page_label (EvDocument *document, + EvPage *page) +{ EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document); - klass->get_page_size (document, page, width, height); + return klass->get_page_label ? + klass->get_page_label (document, page) : NULL; } gchar * ev_document_get_page_label (EvDocument *document, - EvPage *page) + gint page_index) +{ + return (document->priv->page_labels && document->priv->page_labels[page_index]) ? + g_strdup (document->priv->page_labels[page_index]) : + g_strdup_printf ("%d", page_index + 1); +} + +static EvDocumentInfo * +_ev_document_get_info (EvDocument *document) { EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document); - return klass->get_page_label ? - klass->get_page_label (document, page) : NULL; + return klass->get_info (document); } EvDocumentInfo * ev_document_get_info (EvDocument *document) { - EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS (document); - - return klass->get_info (document); + return document->priv->info; } cairo_surface_t * @@ -237,6 +424,87 @@ ev_document_render (EvDocument *document, return klass->render (document, rc); } +const gchar * +ev_document_get_title (EvDocument *document) +{ + return (document->priv->info->fields_mask & EV_DOCUMENT_INFO_TITLE) ? + document->priv->info->title : NULL; +} + +gboolean +ev_document_is_page_size_uniform (EvDocument *document) +{ + return document->priv->uniform; +} + +void +ev_document_get_max_page_size (EvDocument *document, + gdouble *width, + gdouble *height) +{ + if (width) + *width = document->priv->max_width; + if (height) + *height = document->priv->max_height; +} + +gint +ev_document_get_max_label_len (EvDocument *document) +{ + return document->priv->max_label; +} + +gboolean +ev_document_has_text_page_labels (EvDocument *document) +{ + return document->priv->page_labels != NULL; +} + +gboolean +ev_document_find_page_by_label (EvDocument *document, + const gchar *page_label, + gint *page_index) +{ + gint i, page; + glong value; + gchar *endptr = NULL; + EvDocumentPrivate *priv = document->priv; + + /* First, look for a literal label match */ + for (i = 0; priv->page_labels && i < priv->n_pages; i ++) { + if (priv->page_labels[i] != NULL && + ! strcmp (page_label, priv->page_labels[i])) { + *page_index = i; + return TRUE; + } + } + + /* Second, look for a match with case insensitively */ + for (i = 0; priv->page_labels && i < priv->n_pages; i++) { + if (priv->page_labels[i] != NULL && + ! strcasecmp (page_label, priv->page_labels[i])) { + *page_index = 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 < priv->n_pages) { + *page_index = page; + return TRUE; + } + } + + return FALSE; +} + /* EvDocumentInfo */ EV_DEFINE_BOXED_TYPE (EvDocumentInfo, ev_document_info, ev_document_info_copy, ev_document_info_free) diff --git a/libdocument/ev-document.h b/libdocument/ev-document.h index 74bd3bb..2ce1cf1 100644 --- a/libdocument/ev-document.h +++ b/libdocument/ev-document.h @@ -47,6 +47,8 @@ G_BEGIN_DECLS typedef struct _EvDocument EvDocument; typedef struct _EvDocumentClass EvDocumentClass; +typedef struct _EvDocumentPrivate EvDocumentPrivate; + typedef struct _EvPageCache EvPageCache; typedef struct _EvPageCacheClass EvPageCacheClass; @@ -70,6 +72,8 @@ typedef struct _EvRectangle EvRectangle; struct _EvDocument { GObject base; + + EvDocumentPrivate *priv; }; struct _EvDocumentClass @@ -97,42 +101,52 @@ struct _EvDocumentClass EvDocumentInfo * (* get_info) (EvDocument *document); }; -GType ev_document_get_type (void) G_GNUC_CONST; -GQuark ev_document_error_quark (void); +GType ev_document_get_type (void) G_GNUC_CONST; +GQuark ev_document_error_quark (void); /* Document mutex */ -GMutex *ev_document_get_doc_mutex (void); -void ev_document_doc_mutex_lock (void); -void ev_document_doc_mutex_unlock (void); -gboolean ev_document_doc_mutex_trylock(void); +GMutex *ev_document_get_doc_mutex (void); +void ev_document_doc_mutex_lock (void); +void ev_document_doc_mutex_unlock (void); +gboolean ev_document_doc_mutex_trylock (void); /* FontConfig mutex */ -GMutex *ev_document_get_fc_mutex (void); -void ev_document_fc_mutex_lock (void); -void ev_document_fc_mutex_unlock (void); -gboolean ev_document_fc_mutex_trylock (void); +GMutex *ev_document_get_fc_mutex (void); +void ev_document_fc_mutex_lock (void); +void ev_document_fc_mutex_unlock (void); +gboolean ev_document_fc_mutex_trylock (void); -EvDocumentInfo *ev_document_get_info (EvDocument *document); -gboolean ev_document_load (EvDocument *document, - const char *uri, - GError **error); -gboolean ev_document_save (EvDocument *document, - const char *uri, - GError **error); -gint ev_document_get_n_pages (EvDocument *document); -EvPage *ev_document_get_page (EvDocument *document, - gint index); -void ev_document_get_page_size (EvDocument *document, - EvPage *page, - double *width, - double *height); -gchar *ev_document_get_page_label (EvDocument *document, - EvPage *page); -cairo_surface_t *ev_document_render (EvDocument *document, - EvRenderContext *rc); +EvDocumentInfo *ev_document_get_info (EvDocument *document); +gboolean ev_document_load (EvDocument *document, + const char *uri, + GError **error); +gboolean ev_document_save (EvDocument *document, + const char *uri, + GError **error); +gint ev_document_get_n_pages (EvDocument *document); +EvPage *ev_document_get_page (EvDocument *document, + gint index); +void ev_document_get_page_size (EvDocument *document, + gint page_index, + double *width, + double *height); +gchar *ev_document_get_page_label (EvDocument *document, + gint page_index); +cairo_surface_t *ev_document_render (EvDocument *document, + EvRenderContext *rc); +const gchar *ev_document_get_title (EvDocument *document); +gboolean ev_document_is_page_size_uniform (EvDocument *document); +void ev_document_get_max_page_size (EvDocument *document, + gdouble *width, + gdouble *height); +gint ev_document_get_max_label_len (EvDocument *document); +gboolean ev_document_has_text_page_labels (EvDocument *document); +gboolean ev_document_find_page_by_label (EvDocument *document, + const gchar *page_label, + gint *page_index); -gint ev_rect_cmp (EvRectangle *a, - EvRectangle *b); +gint ev_rect_cmp (EvRectangle *a, + EvRectangle *b); #define EV_TYPE_RECTANGLE (ev_rectangle_get_type ()) struct _EvRectangle diff --git a/libmisc/ev-page-action-widget.c b/libmisc/ev-page-action-widget.c index c24c756..249775c 100644 --- a/libmisc/ev-page-action-widget.c +++ b/libmisc/ev-page-action-widget.c @@ -42,9 +42,11 @@ struct _EvPageActionWidget { GtkToolItem parent; + EvDocument *document; + EvPageCache *page_cache; + GtkWidget *entry; GtkWidget *label; - EvPageCache *page_cache; guint signal_id; GtkTreeModel *filter_model; GtkTreeModel *model; @@ -56,14 +58,13 @@ G_DEFINE_TYPE (EvPageActionWidget, ev_page_action_widget, GTK_TYPE_TOOL_ITEM) static void update_pages_label (EvPageActionWidget *action_widget, - gint page, - EvPageCache *page_cache) + gint page) { char *label_text; gint n_pages; - n_pages = page_cache ? ev_page_cache_get_n_pages (page_cache) : 0; - if (page_cache && ev_page_cache_has_nonnumeric_page_labels (page_cache)) { + n_pages = ev_document_get_n_pages (action_widget->document); + if (ev_document_has_text_page_labels (action_widget->document)) { label_text = g_strdup_printf (_("(%d of %d)"), page + 1, n_pages); } else { label_text = g_strdup_printf (_("of %d"), n_pages); @@ -77,14 +78,14 @@ page_changed_cb (EvPageCache *page_cache, gint page, EvPageActionWidget *action_widget) { - if (page_cache && page >= 0) { + if (page >= 0) { gchar *page_label; gtk_entry_set_width_chars (GTK_ENTRY (action_widget->entry), - CLAMP (ev_page_cache_get_max_label_chars (page_cache), + CLAMP (ev_document_get_max_label_len (action_widget->document), 6, 12)); - page_label = ev_page_cache_get_page_label (page_cache, page); + page_label = ev_document_get_page_label (action_widget->document, page); gtk_entry_set_text (GTK_ENTRY (action_widget->entry), page_label); gtk_editable_set_position (GTK_EDITABLE (action_widget->entry), -1); g_free (page_label); @@ -93,7 +94,7 @@ page_changed_cb (EvPageCache *page_cache, gtk_entry_set_text (GTK_ENTRY (action_widget->entry), ""); } - update_pages_label (action_widget, page, page_cache); + update_pages_label (action_widget, page); } static gboolean @@ -104,7 +105,7 @@ page_scroll_cb (EvPageActionWidget *action_widget, GdkEventScroll *event) pageno = ev_page_cache_get_current_page (page_cache); if ((event->direction == GDK_SCROLL_DOWN) && - (pageno < ev_page_cache_get_n_pages (page_cache) - 1)) + (pageno < ev_document_get_n_pages (action_widget->document) - 1)) pageno++; if ((event->direction == GDK_SCROLL_UP) && (pageno > 0)) pageno--; @@ -139,8 +140,8 @@ activate_cb (EvPageActionWidget *action_widget) /* rest the entry to the current page if we were unable to * change it */ page_cache = action_widget->page_cache; - page_label = ev_page_cache_get_page_label (page_cache, - ev_page_cache_get_current_page (page_cache)); + page_label = ev_document_get_page_label (action_widget->document, + ev_page_cache_get_current_page (page_cache)); gtk_entry_set_text (GTK_ENTRY (action_widget->entry), page_label); gtk_editable_set_position (GTK_EDITABLE (action_widget->entry), -1); g_free (page_label); @@ -159,6 +160,7 @@ ev_page_action_widget_init (EvPageActionWidget *action_widget) gtk_widget_add_events (action_widget->entry, GDK_BUTTON_MOTION_MASK); gtk_entry_set_width_chars (GTK_ENTRY (action_widget->entry), 5); + gtk_entry_set_text (GTK_ENTRY (action_widget->entry), ""); g_signal_connect_swapped (action_widget->entry, "scroll-event", G_CALLBACK (page_scroll_cb), action_widget); @@ -186,9 +188,16 @@ ev_page_action_widget_init (EvPageActionWidget *action_widget) } void -ev_page_action_widget_set_page_cache (EvPageActionWidget *action_widget, - EvPageCache *page_cache) +ev_page_action_widget_set_document (EvPageActionWidget *action_widget, + EvDocument *document) { + EvPageCache *page_cache = ev_page_cache_get (document); + + g_object_ref (document); + if (action_widget->document) + g_object_unref (action_widget->document); + action_widget->document = document; + if (action_widget->page_cache != NULL) { if (action_widget->signal_id > 0) { g_signal_handler_disconnect (action_widget->page_cache, @@ -200,21 +209,16 @@ ev_page_action_widget_set_page_cache (EvPageActionWidget *action_widget, action_widget->page_cache = NULL; } - if (page_cache != NULL) { - action_widget->page_cache = page_cache; - g_object_add_weak_pointer (G_OBJECT (page_cache), - (gpointer)&action_widget->page_cache); - action_widget->signal_id = - g_signal_connect_object (page_cache, "page-changed", - G_CALLBACK (page_changed_cb), - action_widget, 0); - page_changed_cb (page_cache, - ev_page_cache_get_current_page (page_cache), - action_widget); - } else { - action_widget->signal_id = 0; - page_changed_cb (NULL, 0, action_widget); - } + action_widget->page_cache = page_cache; + g_object_add_weak_pointer (G_OBJECT (page_cache), + (gpointer)&action_widget->page_cache); + action_widget->signal_id = + g_signal_connect_object (page_cache, "page-changed", + G_CALLBACK (page_changed_cb), + action_widget, 0); + page_changed_cb (page_cache, + ev_page_cache_get_current_page (page_cache), + action_widget); } static void @@ -233,6 +237,11 @@ ev_page_action_widget_finalize (GObject *object) action_widget->page_cache = NULL; } + if (action_widget->document) { + g_object_unref (action_widget->document); + action_widget->document = NULL; + } + G_OBJECT_CLASS (ev_page_action_widget_parent_class)->finalize (object); } diff --git a/libmisc/ev-page-action-widget.h b/libmisc/ev-page-action-widget.h index 066cf5c..1c9ee35 100644 --- a/libmisc/ev-page-action-widget.h +++ b/libmisc/ev-page-action-widget.h @@ -41,6 +41,6 @@ GType ev_page_action_widget_get_type (void) G_GNUC_CONST; void ev_page_action_widget_update_model (EvPageActionWidget *proxy, GtkTreeModel *model); -void ev_page_action_widget_set_page_cache (EvPageActionWidget *action_widget, - EvPageCache *page_cache); +void ev_page_action_widget_set_document (EvPageActionWidget *action_widget, + EvDocument *document); void ev_page_action_widget_grab_focus (EvPageActionWidget *proxy); diff --git a/libmisc/ev-page-action.c b/libmisc/ev-page-action.c index ced1666..090712e 100644 --- a/libmisc/ev-page-action.c +++ b/libmisc/ev-page-action.c @@ -33,7 +33,7 @@ struct _EvPageActionPrivate { - EvPageCache *page_cache; + EvDocument *document; GtkTreeModel *model; }; @@ -55,7 +55,7 @@ G_DEFINE_TYPE (EvPageAction, ev_page_action, GTK_TYPE_ACTION) enum { PROP_0, - PROP_PAGE_CACHE, + PROP_DOCUMENT, PROP_MODEL, }; @@ -70,9 +70,10 @@ create_tool_item (GtkAction *action) } static void -update_page_cache (EvPageAction *page, GParamSpec *pspec, EvPageActionWidget *proxy) +update_document (EvPageAction *page, GParamSpec *pspec, EvPageActionWidget *proxy) { - ev_page_action_widget_set_page_cache (proxy, page->priv->page_cache); + if (page->priv->document) + ev_page_action_widget_set_document (proxy, page->priv->document); } static void @@ -97,14 +98,12 @@ static void connect_proxy (GtkAction *action, GtkWidget *proxy) { if (GTK_IS_TOOL_ITEM (proxy)) { - g_signal_connect_object (action, "notify::page-cache", - G_CALLBACK (update_page_cache), + g_signal_connect_object (action, "notify::document", + G_CALLBACK (update_document), proxy, 0); g_signal_connect (proxy, "activate_link", G_CALLBACK (activate_link_cb), action); - update_page_cache (EV_PAGE_ACTION (action), NULL, - EV_PAGE_ACTION_WIDGET (proxy)); g_signal_connect_object (action, "notify::model", G_CALLBACK (update_model), proxy, 0); @@ -118,9 +117,9 @@ ev_page_action_dispose (GObject *object) { EvPageAction *page = EV_PAGE_ACTION (object); - if (page->priv->page_cache) { - g_object_unref (page->priv->page_cache); - page->priv->page_cache = NULL; + if (page->priv->document) { + g_object_unref (page->priv->document); + page->priv->document = NULL; } G_OBJECT_CLASS (ev_page_action_parent_class)->dispose (object); @@ -133,18 +132,18 @@ ev_page_action_set_property (GObject *object, GParamSpec *pspec) { EvPageAction *page; - EvPageCache *page_cache; + EvDocument *document; GtkTreeModel *model; - + page = EV_PAGE_ACTION (object); switch (prop_id) { - case PROP_PAGE_CACHE: - page_cache = page->priv->page_cache; - page->priv->page_cache = EV_PAGE_CACHE (g_value_dup_object (value)); - if (page_cache) - g_object_unref (page_cache); + case PROP_DOCUMENT: + document = page->priv->document; + page->priv->document = EV_DOCUMENT (g_value_dup_object (value)); + if (document) + g_object_unref (document); break; case PROP_MODEL: model = page->priv->model; @@ -165,13 +164,13 @@ ev_page_action_get_property (GObject *object, GParamSpec *pspec) { EvPageAction *page; - + page = EV_PAGE_ACTION (object); switch (prop_id) { - case PROP_PAGE_CACHE: - g_value_set_object (value, page->priv->page_cache); + case PROP_DOCUMENT: + g_value_set_object (value, page->priv->document); break; case PROP_MODEL: g_value_set_object (value, page->priv->model); @@ -185,13 +184,8 @@ ev_page_action_get_property (GObject *object, void ev_page_action_set_document (EvPageAction *page, EvDocument *document) { - EvPageCache *page_cache = NULL; - - if (document) - page_cache = ev_page_cache_get (document); - g_object_set (page, - "page-cache", page_cache, + "document", document, "model", NULL, NULL); } @@ -251,11 +245,11 @@ ev_page_action_class_init (EvPageActionClass *class) G_TYPE_OBJECT); g_object_class_install_property (object_class, - PROP_PAGE_CACHE, - g_param_spec_object ("page-cache", - "Page Cache", - "Current page cache", - EV_TYPE_PAGE_CACHE, + PROP_DOCUMENT, + g_param_spec_object ("document", + "Document", + "Current document", + EV_TYPE_DOCUMENT, G_PARAM_READWRITE)); g_object_class_install_property (object_class, diff --git a/libview/ev-page-cache.c b/libview/ev-page-cache.c index c3bb60c..9d271a0 100644 --- a/libview/ev-page-cache.c +++ b/libview/ev-page-cache.c @@ -7,12 +7,6 @@ #define THUMBNAIL_WIDTH 100 -typedef struct _EvPageCacheInfo -{ - double width; - double height; -} EvPageCacheInfo; - typedef struct _EvPageThumbsInfo { gint width; @@ -23,30 +17,17 @@ struct _EvPageCache { GObject parent; + EvDocument *document; + 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; - double max_width; - double max_height; + gboolean dual_even_left; double* height_to_page; double* dual_height_to_page; int rotation; - EvPageCacheInfo *size_cache; - EvDocumentInfo *page_info; - /* Thumbnail dimensions */ gboolean thumbs_uniform; gint thumbs_uniform_width; @@ -83,7 +64,6 @@ static void ev_page_cache_init (EvPageCache *page_cache) { page_cache->current_page = -1; - page_cache->max_label_chars = 0; } static void @@ -120,19 +100,9 @@ ev_page_cache_class_init (EvPageCacheClass *class) static void ev_page_cache_finalize (GObject *object) { - EvPageCache *page_cache; + EvPageCache *page_cache = EV_PAGE_CACHE (object); - page_cache = EV_PAGE_CACHE (object); - - if (page_cache->title) { - g_free (page_cache->title); - page_cache->title = NULL; - } - - if (page_cache->size_cache) { - g_free (page_cache->size_cache); - page_cache->size_cache = NULL; - } + page_cache->document = NULL; if (page_cache->thumbs_size_cache) { g_free (page_cache->thumbs_size_cache); @@ -149,216 +119,132 @@ ev_page_cache_finalize (GObject *object) 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; - } - G_OBJECT_CLASS (ev_page_cache_parent_class)->finalize (object); } static void build_height_to_page (EvPageCache *page_cache) { - gboolean swap; + gboolean swap, uniform, dual_even_left; int i; double uniform_height, page_height, next_page_height; double saved_height; + gdouble u_width, u_height; + gint n_pages; swap = (page_cache->rotation == 90 || page_cache->rotation == 270); + uniform = ev_document_is_page_size_uniform (page_cache->document); + n_pages = ev_document_get_n_pages (page_cache->document); + dual_even_left = (n_pages > 2); + 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); - + page_cache->height_to_page = g_new0 (double, n_pages + 1); + page_cache->dual_height_to_page = g_new0 (double, n_pages + 2); + + if (uniform) + ev_document_get_page_size (page_cache->document, 0, &u_width, &u_height); + 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; + for (i = 0; i <= n_pages; i++) { + if (uniform) { + uniform_height = swap ? u_width : u_height; + 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; - } + if (i < n_pages) { + gdouble w, h; + + ev_document_get_page_size (page_cache->document, i, &w, &h); + page_height = swap ? w : h; } else { page_height = 0; } - page_cache->height_to_page [i] = saved_height; + 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; - } + if (dual_even_left && !uniform) { + gdouble w, h; + + ev_document_get_page_size (page_cache->document, 0, &w, &h); + saved_height = swap ? w : h; } 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; + + for (i = dual_even_left; i < n_pages + 2; i += 2) { + if (uniform) { + uniform_height = swap ? u_width : u_height; + page_cache->dual_height_to_page[i] = ((i + dual_even_left) / 2) * uniform_height; + if (i + 1 < n_pages + 2) + page_cache->dual_height_to_page[i + 1] = ((i + 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; - } + if (i + 1 < n_pages) { + gdouble w, h; + + ev_document_get_page_size (page_cache->document, i + 1, &w, &h); + next_page_height = swap ? w : h; } 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; - } + + if (i < n_pages) { + gdouble w, h; + + ev_document_get_page_size (page_cache->document, i, &w, &h); + page_height = swap ? w : h; } 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; + + if (i + 1 < 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; + 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; + gint i, n_pages; page_cache = (EvPageCache *) g_object_new (EV_TYPE_PAGE_CACHE, NULL); + page_cache->document = document; - ev_document_doc_mutex_lock (); + n_pages = ev_document_get_n_pages (document); - /* We read page information out of the document */ + build_height_to_page (page_cache); + + if (!EV_IS_DOCUMENT_THUMBNAILS (document)) { + if (n_pages > 0) + ev_page_cache_set_current_page (page_cache, 0); + return page_cache; + } /* 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++) { + for (i = 0; i < n_pages; i++) { EvPage *page; - double page_width = 0; - double page_height = 0; + gdouble page_width, page_height; 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; - } + ev_document_get_page_size (document, i, &page_width, &page_height); if (!rc) { rc = ev_render_context_new (page, 0, (gdouble)THUMBNAIL_WIDTH / page_width); @@ -369,7 +255,7 @@ ev_page_cache_new (EvDocument *document) 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; } @@ -377,7 +263,7 @@ ev_page_cache_new (EvDocument *document) 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; @@ -387,10 +273,10 @@ ev_page_cache_new (EvDocument *document) /* It's a different thumbnail size. Backfill the array. */ int j; - page_cache->thumbs_size_cache = g_new0 (EvPageThumbsInfo, page_cache->n_pages); + page_cache->thumbs_size_cache = g_new0 (EvPageThumbsInfo, n_pages); for (j = 0; j < i; j++) { - thumb_info = &(page_cache->thumbs_size_cache [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; } @@ -398,7 +284,7 @@ ev_page_cache_new (EvDocument *document) } if (! page_cache->thumbs_uniform) { - thumb_info = &(page_cache->thumbs_size_cache [i]); + thumb_info = &(page_cache->thumbs_size_cache[i]); thumb_info->width = thumb_width; thumb_info->height = thumb_height; @@ -411,15 +297,7 @@ ev_page_cache_new (EvDocument *document) 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); - - ev_document_doc_mutex_unlock (); - - if (page_cache->n_pages > 0) + if (n_pages > 0) ev_page_cache_set_current_page (page_cache, 0); return page_cache; @@ -428,31 +306,12 @@ ev_page_cache_new (EvDocument *document) gboolean ev_page_cache_check_dimensions (EvPageCache *page_cache) { - gint document_width, document_height; - - if (page_cache->uniform && page_cache->n_pages > 0) - if (page_cache->uniform_width <= 0 || page_cache->uniform_height <= 0) - return TRUE; - - ev_page_cache_get_max_width (page_cache, - 0, 1.0, - &document_width); - ev_page_cache_get_max_height (page_cache, - 0, 1.0, - &document_height); - - if (document_width <= 0 || document_height <= 0) - return TRUE; - - return FALSE; -} + gdouble document_width, document_height; -gint -ev_page_cache_get_n_pages (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0); + ev_document_get_max_page_size (page_cache->document, + &document_width, &document_height); - return page_cache->n_pages; + return (document_width > 0 && document_height > 0); } gint @@ -468,7 +327,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; @@ -489,59 +347,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, @@ -553,19 +372,8 @@ ev_page_cache_get_size (EvPageCache *page_cache, 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; - } + ev_document_get_page_size (page_cache->document, page, &w, &h); w = w * scale + 0.5; h = h * scale + 0.5; @@ -585,15 +393,15 @@ ev_page_cache_get_max_width (EvPageCache *page_cache, gfloat scale, gint *width) { + double w, h; + 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; - } - } + if (!width) + return; + + ev_document_get_max_page_size (page_cache->document, &w, &h); + *width = (rotation == 0 || rotation == 180) ? w * scale : h * scale; } void @@ -602,18 +410,18 @@ ev_page_cache_get_max_height (EvPageCache *page_cache, gfloat scale, gint *height) { + double w, h; + 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; - } - } + if (!height) + return; + + ev_document_get_max_page_size (page_cache->document, &w, &h); + *height = (rotation == 0 || rotation == 180) ? h * scale : w * scale; } -void +void ev_page_cache_get_height_to_page (EvPageCache *page_cache, gint page, gint rotation, @@ -623,19 +431,17 @@ ev_page_cache_get_height_to_page (EvPageCache *page_cache, { 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; + *height = page_cache->height_to_page[page] * scale; if (dual_height) - *dual_height = page_cache->dual_height_to_page [page] * scale; + *dual_height = page_cache->dual_height_to_page[page] * scale; } void @@ -648,7 +454,6 @@ ev_page_cache_get_thumbnail_size (EvPageCache *page_cache, 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; @@ -671,48 +476,12 @@ ev_page_cache_get_thumbnail_size (EvPageCache *page_cache, } } -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; + return (ev_document_get_n_pages (page_cache->document) > 2); } #define PAGE_CACHE_STRING "ev-page-cache" diff --git a/libview/ev-page-cache.h b/libview/ev-page-cache.h index 03e43d7..96e8c43 100644 --- a/libview/ev-page-cache.h +++ b/libview/ev-page-cache.h @@ -35,10 +35,6 @@ G_BEGIN_DECLS GType ev_page_cache_get_type (void) G_GNUC_CONST; -/* Used by ev-document.c only */ -EvPageCache *ev_page_cache_new (EvDocument *document); -gint ev_page_cache_get_n_pages (EvPageCache *page_cache); -const char *ev_page_cache_get_title (EvPageCache *page_cache); void ev_page_cache_get_size (EvPageCache *page_cache, gint page, gint rotation, @@ -64,12 +60,6 @@ void ev_page_cache_get_thumbnail_size (EvPageCache *page_cache, gint rotation, gint *width, gint *height); -gint ev_page_cache_get_max_label_chars (EvPageCache *page_cache); -char *ev_page_cache_get_page_label (EvPageCache *page_cache, - gint page); -gboolean ev_page_cache_has_nonnumeric_page_labels (EvPageCache *page_cache); -const EvDocumentInfo *ev_page_cache_get_info (EvPageCache *page_cache); - gboolean ev_page_cache_get_dual_even_left (EvPageCache *page_cache); /* Navigation */ @@ -79,7 +69,7 @@ void ev_page_cache_set_current_page (EvPageCache *page_cache, void ev_page_cache_set_current_page_history (EvPageCache *page_cache, int page); gboolean ev_page_cache_set_page_label (EvPageCache *page_cache, - const char *page_label); + const gchar *page_label); EvPageCache *ev_page_cache_get (EvDocument *document); diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c index 41ccadc..763ec04 100644 --- a/libview/ev-pixbuf-cache.c +++ b/libview/ev-pixbuf-cache.c @@ -97,8 +97,8 @@ static gboolean new_selection_surface_needed(EvPixbufCache *pixbuf_cac /* These are used for iterating through the prev and next arrays */ #define FIRST_VISIBLE_PREV(pixbuf_cache) \ (MAX (0, pixbuf_cache->preload_cache_size - pixbuf_cache->start_page)) -#define VISIBLE_NEXT_LEN(pixbuf_cache, page_cache) \ - (MIN(pixbuf_cache->preload_cache_size, ev_page_cache_get_n_pages (page_cache) - (1 + pixbuf_cache->end_page))) +#define VISIBLE_NEXT_LEN(pixbuf_cache) \ + (MIN(pixbuf_cache->preload_cache_size, ev_document_get_n_pages (pixbuf_cache->document) - (1 + pixbuf_cache->end_page))) #define PAGE_CACHE_LEN(pixbuf_cache) \ ((pixbuf_cache->end_page - pixbuf_cache->start_page) + 1) @@ -392,15 +392,12 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache, CacheJobInfo *new_job_list; CacheJobInfo *new_prev_job; CacheJobInfo *new_next_job; - EvPageCache *page_cache; int i, page; if (pixbuf_cache->start_page == start_page && pixbuf_cache->end_page == end_page) return; - page_cache = ev_page_cache_get (pixbuf_cache->document); - new_job_list = g_new0 (CacheJobInfo, (end_page - start_page) + 1); new_prev_job = g_new0 (CacheJobInfo, pixbuf_cache->preload_cache_size); new_next_job = g_new0 (CacheJobInfo, pixbuf_cache->preload_cache_size); @@ -432,7 +429,7 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache, } for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { - if (page >= ev_page_cache_get_n_pages (page_cache)) { + if (page >= ev_document_get_n_pages (pixbuf_cache->document)) { dispose_cache_job_info (pixbuf_cache->next_job + i, pixbuf_cache); } else { move_one_job (pixbuf_cache->next_job + i, @@ -620,7 +617,6 @@ get_selection_colors (GtkWidget *widget, GdkColor **text, GdkColor **base) static void add_job (EvPixbufCache *pixbuf_cache, CacheJobInfo *job_info, - EvPageCache *page_cache, GdkRegion *region, gint width, gint height, @@ -696,7 +692,7 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, cairo_image_surface_get_height (job_info->surface) == height) return; - add_job (pixbuf_cache, job_info, page_cache, NULL, + add_job (pixbuf_cache, job_info, NULL, width, height, page, rotation, scale, priority); } @@ -731,7 +727,7 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, EV_JOB_PRIORITY_LOW); } - for (i = 0; i < VISIBLE_NEXT_LEN(pixbuf_cache, page_cache); i++) { + for (i = 0; i < VISIBLE_NEXT_LEN(pixbuf_cache); i++) { job_info = (pixbuf_cache->next_job + i); page = pixbuf_cache->end_page + 1 + i; @@ -750,14 +746,10 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, gfloat scale, GList *selection_list) { - EvPageCache *page_cache; - g_return_if_fail (EV_IS_PIXBUF_CACHE (pixbuf_cache)); - page_cache = ev_page_cache_get (pixbuf_cache->document); - - g_return_if_fail (start_page >= 0 && start_page < ev_page_cache_get_n_pages (page_cache)); - g_return_if_fail (end_page >= 0 && end_page < ev_page_cache_get_n_pages (page_cache)); + g_return_if_fail (start_page >= 0 && start_page < ev_document_get_n_pages (pixbuf_cache->document)); + g_return_if_fail (end_page >= 0 && end_page < ev_document_get_n_pages (pixbuf_cache->document)); g_return_if_fail (end_page >= start_page); /* First, resize the page_range as needed. We cull old pages @@ -1113,7 +1105,6 @@ void ev_pixbuf_cache_set_selection_list (EvPixbufCache *pixbuf_cache, GList *selection_list) { - EvPageCache *page_cache; EvViewSelection *selection; GList *list = selection_list; int page; @@ -1124,8 +1115,6 @@ ev_pixbuf_cache_set_selection_list (EvPixbufCache *pixbuf_cache, if (!EV_IS_SELECTION (pixbuf_cache->document)) return; - page_cache = ev_page_cache_get (pixbuf_cache->document); - /* We check each area to see what needs updating, and what needs freeing; */ page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size; for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { @@ -1171,7 +1160,7 @@ ev_pixbuf_cache_set_selection_list (EvPixbufCache *pixbuf_cache, } for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { - if (page >= ev_page_cache_get_n_pages (page_cache)) + if (page >= ev_document_get_n_pages (pixbuf_cache->document)) break; selection = NULL; @@ -1198,7 +1187,6 @@ ev_pixbuf_cache_set_selection_list (EvPixbufCache *pixbuf_cache, GList * ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) { - EvPageCache *page_cache; EvViewSelection *selection; GList *retval = NULL; int page; @@ -1206,8 +1194,6 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) g_return_val_if_fail (EV_IS_PIXBUF_CACHE (pixbuf_cache), NULL); - page_cache = ev_page_cache_get (pixbuf_cache->document); - /* We check each area to see what needs updating, and what needs freeing; */ page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size; for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { @@ -1243,7 +1229,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) } for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { - if (page >= ev_page_cache_get_n_pages (page_cache)) + if (page >= ev_document_get_n_pages (pixbuf_cache->document)) break; if (pixbuf_cache->next_job[i].selection_points.x1 != -1) { @@ -1261,7 +1247,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) return retval; } -void +void ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, GdkRegion *region, gint page, @@ -1269,18 +1255,17 @@ ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, gdouble scale) { CacheJobInfo *job_info; - EvPageCache *page_cache; gint width, height; job_info = find_job_cache (pixbuf_cache, page); if (job_info == NULL) return; - - page_cache = ev_page_cache_get (pixbuf_cache->document); - ev_page_cache_get_size (page_cache, page, rotation, scale, + + ev_page_cache_get_size (ev_page_cache_get (pixbuf_cache->document), + page, rotation, scale, &width, &height); - add_job (pixbuf_cache, job_info, page_cache, region, + add_job (pixbuf_cache, job_info, region, width, height, page, rotation, scale, EV_JOB_PRIORITY_URGENT); } diff --git a/libview/ev-view.c b/libview/ev-view.c index e1c8403..eb3156f 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -460,7 +460,7 @@ view_update_range_and_current_page (EvView *view) current_area.y = view->vadjustment->value; current_area.height = view->vadjustment->page_size; - for (i = 0; i < ev_page_cache_get_n_pages (view->page_cache); i++) { + for (i = 0; i < ev_document_get_n_pages (view->document); i++) { get_page_extents (view, i, &page_area, &border); @@ -487,7 +487,7 @@ view_update_range_and_current_page (EvView *view) } else if (view->dual_page) { if (view->current_page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) { view->start_page = view->current_page; - if (view->current_page + 1 < ev_page_cache_get_n_pages (view->page_cache)) + if (view->current_page + 1 < ev_document_get_n_pages (view->document)) view->end_page = view->start_page + 1; else view->end_page = view->start_page; @@ -630,7 +630,7 @@ ev_view_scroll (EvView *view, /* Assign boolean for first and last page */ if (view->current_page == 0) first_page = TRUE; - if (view->current_page == ev_page_cache_get_n_pages (view->page_cache) - 1) + if (view->current_page == ev_document_get_n_pages (view->document) - 1) last_page = TRUE; switch (scroll) { @@ -818,7 +818,7 @@ get_page_extents (EvView *view, other_page = (page % 2 == ev_page_cache_get_dual_even_left (view->page_cache)) ? page + 1: page - 1; /* First, we get the bounding box of the two pages */ - if (other_page < ev_page_cache_get_n_pages (view->page_cache) + if (other_page < ev_document_get_n_pages (view->document) && (0 <= other_page)) { ev_page_cache_get_size (view->page_cache, other_page, @@ -1325,7 +1325,7 @@ goto_dest (EvView *view, EvLinkDest *dest) int page, n_pages, current_page; page = ev_link_dest_get_page (dest); - n_pages = ev_page_cache_get_n_pages (view->page_cache); + n_pages = ev_document_get_n_pages (view->document); if (page < 0 || page >= n_pages) return; @@ -1438,8 +1438,8 @@ ev_view_page_label_from_dest (EvView *view, EvLinkDest *dest) dest2 = ev_document_links_find_link_dest (EV_DOCUMENT_LINKS (view->document), named_dest); if (dest2) { - msg = ev_page_cache_get_page_label (view->page_cache, - ev_link_dest_get_page (dest2)); + msg = ev_document_get_page_label (view->document, + ev_link_dest_get_page (dest2)); g_object_unref (dest2); } } @@ -1450,8 +1450,8 @@ ev_view_page_label_from_dest (EvView *view, EvLinkDest *dest) } break; default: - msg = ev_page_cache_get_page_label (view->page_cache, - ev_link_dest_get_page (dest)); + msg = ev_document_get_page_label (view->document, + ev_link_dest_get_page (dest)); } return msg; @@ -2442,7 +2442,7 @@ ev_view_size_request_continuous_dual_page (EvView *view, view->scale, &max_width); compute_border (view, max_width, max_width, &border); - n_pages = ev_page_cache_get_n_pages (view->page_cache) + 1; + n_pages = ev_document_get_n_pages (view->document) + 1; requisition->width = (max_width + border.left + border.right) * 2 + (view->spacing * 3); get_page_y_offset (view, n_pages, view->scale, &requisition->height); @@ -2468,7 +2468,7 @@ ev_view_size_request_continuous (EvView *view, ev_page_cache_get_max_width (view->page_cache, view->rotation, view->scale, &max_width); - n_pages = ev_page_cache_get_n_pages (view->page_cache); + n_pages = ev_document_get_n_pages (view->document); compute_border (view, max_width, max_width, &border); requisition->width = max_width + (view->spacing * 2) + border.left + border.right; @@ -2497,7 +2497,7 @@ ev_view_size_request_dual_page (EvView *view, view->rotation, view->scale, &width, &height); - if (view->current_page + 1 < ev_page_cache_get_n_pages (view->page_cache)) { + if (view->current_page + 1 < ev_document_get_n_pages (view->document)) { gint width_2, height_2; ev_page_cache_get_size (view->page_cache, view->current_page + 1, @@ -3667,8 +3667,7 @@ ev_view_goto_entry_activate (GtkEntry *entry, ev_view_goto_window_hide (view); - if (page >= 0 && - page < ev_page_cache_get_n_pages (view->page_cache)) + if (page >= 0 && page < ev_document_get_n_pages (view->document)) ev_page_cache_set_current_page (view->page_cache, page); } @@ -3827,7 +3826,7 @@ ev_view_key_press_event (GtkWidget *widget, } if (current == view->presentation_state) { - if (ev_page_cache_get_n_pages (view->page_cache) > 1 && + if (ev_document_get_n_pages (view->document) > 1 && key_is_numeric (event->keyval)) { gint x, y; @@ -5405,7 +5404,7 @@ ev_view_zoom_for_size_dual_page (EvView *view, 1.0, &doc_width, &doc_height); - if (other_page < ev_page_cache_get_n_pages (view->page_cache)) { + if (other_page < ev_document_get_n_pages (view->document)) { gint width_2, height_2; ev_page_cache_get_size (view->page_cache, other_page, @@ -5541,7 +5540,7 @@ jump_to_find_page (EvView *view, EvViewFindDirection direction, gint shift) { int n_pages, i; - n_pages = ev_page_cache_get_n_pages (view->page_cache); + n_pages = ev_document_get_n_pages (view->document); for (i = 0; i < n_pages; i++) { int page; @@ -5653,7 +5652,7 @@ compute_new_selection_rect (EvView *view, view_rect.width = MAX (start->x, stop->x) - view_rect.x; view_rect.width = MAX (start->y, stop->y) - view_rect.y; - n_pages = ev_page_cache_get_n_pages (view->page_cache); + n_pages = ev_document_get_n_pages (view->document); for (i = 0; i < n_pages; i++) { GdkRectangle page_area; @@ -5702,7 +5701,7 @@ compute_new_selection_text (EvView *view, g_assert (view->selection_mode == EV_VIEW_SELECTION_TEXT); - n_pages = ev_page_cache_get_n_pages (view->page_cache); + n_pages = ev_document_get_n_pages (view->document); /* First figure out the range of pages the selection * affects. */ @@ -5955,7 +5954,7 @@ ev_view_select_all (EvView *view) clear_selection (view); - n_pages = ev_page_cache_get_n_pages (view->page_cache); + n_pages = ev_document_get_n_pages (view->document); for (i = 0; i < n_pages; i++) { int width, height; EvViewSelection *selection; @@ -6245,7 +6244,7 @@ ev_view_next_page (EvView *view) ev_view_reset_presentation_state (view); page = ev_page_cache_get_current_page (view->page_cache); - n_pages = ev_page_cache_get_n_pages (view->page_cache); + n_pages = ev_document_get_n_pages (view->document); if (view->dual_page && !view->presentation) page = page + 2; diff --git a/shell/ev-print-operation.c b/shell/ev-print-operation.c index a6f8d53..fe5ef54 100644 --- a/shell/ev-print-operation.c +++ b/shell/ev-print-operation.c @@ -1428,7 +1428,7 @@ ev_print_operation_export_constructor (GType type, construct_params); export = EV_PRINT_OPERATION_EXPORT (object); op = EV_PRINT_OPERATION (object); - export->n_pages = ev_page_cache_get_n_pages (ev_page_cache_get (op->document)); + export->n_pages = ev_document_get_n_pages (op->document); return object; } @@ -1589,7 +1589,7 @@ ev_print_operation_print_begin_print (EvPrintOperationPrint *print, EvPrintOperation *op = EV_PRINT_OPERATION (print); gint n_pages; - n_pages = ev_page_cache_get_n_pages (ev_page_cache_get (op->document)); + n_pages = ev_document_get_n_pages (op->document); gtk_print_operation_set_n_pages (print->op, n_pages); ev_print_operation_update_status (op, -1, n_pages, 0); @@ -1650,7 +1650,7 @@ ev_print_operation_print_draw_page (EvPrintOperationPrint *print, EvPrintOperation *op = EV_PRINT_OPERATION (print); cairo_t *cr; gdouble cr_width, cr_height; - gint width, height; + gdouble width, height; gtk_print_operation_set_defer_drawing (print->op); @@ -1669,10 +1669,9 @@ ev_print_operation_print_draw_page (EvPrintOperationPrint *print, cr = gtk_print_context_get_cairo_context (context); cr_width = gtk_print_context_get_width (context); cr_height = gtk_print_context_get_height (context); - ev_page_cache_get_size (ev_page_cache_get (op->document), - page, 0, 1.0, - &width, &height); - cairo_scale (cr, cr_width / (gdouble)width, cr_height / (gdouble)height); + ev_document_get_page_size (op->document, page, + &width, &height); + cairo_scale (cr, cr_width / width, cr_height / height); ev_job_print_set_cairo (EV_JOB_PRINT (print->job_print), cr); ev_job_scheduler_push_job (print->job_print, EV_JOB_PRIORITY_NONE); diff --git a/shell/ev-properties-dialog.c b/shell/ev-properties-dialog.c index f48b967..0ca4661 100644 --- a/shell/ev-properties-dialog.c +++ b/shell/ev-properties-dialog.c @@ -85,7 +85,7 @@ ev_properties_dialog_set_document (EvPropertiesDialog *properties, properties->document = document; - info = ev_page_cache_get_info (ev_page_cache_get (document)); + info = ev_document_get_info (document); if (properties->general_page == NULL) { label = gtk_label_new (_("General")); diff --git a/shell/ev-sidebar-links.c b/shell/ev-sidebar-links.c index 91986f8..8993e5f 100644 --- a/shell/ev-sidebar-links.c +++ b/shell/ev-sidebar-links.c @@ -316,11 +316,11 @@ print_section_cb (GtkWidget *menuitem, EvSidebarLinks *sidebar) g_object_unref (link); } } else { - last_page = ev_page_cache_get_n_pages (sidebar->priv->page_cache); + last_page = ev_document_get_n_pages (sidebar->priv->document); } if (last_page == -1) - last_page = ev_page_cache_get_n_pages (sidebar->priv->page_cache); + last_page = ev_document_get_n_pages (sidebar->priv->document); window = gtk_widget_get_toplevel (GTK_WIDGET (sidebar)); if (EV_IS_WINDOW (window)) { @@ -479,8 +479,8 @@ fill_page_labels (GtkTreeModel *tree_model, if (page < 0) return FALSE; - page_label = ev_page_cache_get_page_label (sidebar_links->priv->page_cache, - page); + page_label = ev_document_get_page_label (sidebar_links->priv->document, + page); gtk_tree_store_set (GTK_TREE_STORE (tree_model), iter, EV_DOCUMENT_LINKS_COLUMN_PAGE_LABEL, page_label, -1); diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c index d86e6a5..e43b008 100644 --- a/shell/ev-sidebar-thumbnails.c +++ b/shell/ev-sidebar-thumbnails.c @@ -263,13 +263,11 @@ get_scale_for_page (EvSidebarThumbnails *sidebar_thumbnails, gint page) { EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv; - gint width, height; + gdouble width; - ev_page_cache_get_size (priv->page_cache, - page, 0, - 1.0, &width, &height); - - return (gdouble)THUMBNAIL_WIDTH / (gdouble)width; + ev_document_get_page_size (priv->document, page, &width, NULL); + + return (gdouble)THUMBNAIL_WIDTH / width; } static void @@ -417,7 +415,7 @@ ev_sidebar_thumbnails_fill_model (EvSidebarThumbnails *sidebar_thumbnails) GdkPixbuf *loading_icon = NULL; gint width, height; - page_label = ev_page_cache_get_page_label (priv->page_cache, i); + page_label = ev_document_get_page_label (priv->document, i); page_string = g_markup_printf_escaped ("%s", page_label); ev_page_cache_get_thumbnail_size (sidebar_thumbnails->priv->page_cache, i, sidebar_thumbnails->priv->rotation, @@ -565,9 +563,8 @@ static gboolean ev_sidebar_thumbnails_use_icon_view (EvSidebarThumbnails *sidebar_thumbnails) { EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv; - if (ev_page_cache_get_n_pages (priv->page_cache) > MAX_ICON_VIEW_PAGE_COUNT) - return FALSE; - return TRUE; + + return (ev_document_get_n_pages (priv->document) <= MAX_ICON_VIEW_PAGE_COUNT); } static void @@ -655,8 +652,8 @@ thumbnail_job_completed_callback (EvJobThumbnail *job, } static void -ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page, - EvDocument *document) +ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page, + EvDocument *document) { EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page); @@ -665,13 +662,13 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page, priv->page_cache = ev_page_cache_get (document); if (!EV_IS_DOCUMENT_THUMBNAILS (document) || - ev_page_cache_get_n_pages (priv->page_cache) <= 0 || - ev_page_cache_check_dimensions (priv->page_cache)) { + ev_document_get_n_pages (document) <= 0 || + !ev_page_cache_check_dimensions (priv->page_cache)) { return; } priv->document = document; - priv->n_pages = ev_page_cache_get_n_pages (priv->page_cache); + priv->n_pages = ev_document_get_n_pages (document); priv->loading_icons = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, diff --git a/shell/ev-window-title.c b/shell/ev-window-title.c index baafa74..2e28c63 100644 --- a/shell/ev-window-title.c +++ b/shell/ev-window-title.c @@ -122,14 +122,11 @@ ev_window_title_update (EvWindowTitle *window_title) { GtkWindow *window = GTK_WINDOW (window_title->window); char *title = NULL, *password_title, *p; - EvPageCache *page_cache; if (window_title->document != NULL) { - char *doc_title; + gchar *doc_title; - page_cache = ev_page_cache_get (window_title->document); - g_return_if_fail (page_cache != NULL); - doc_title = (char *)ev_page_cache_get_title (page_cache); + doc_title = g_strdup (ev_document_get_title (window_title->document)); /* Make sure we get a valid title back */ if (doc_title != NULL) { @@ -139,6 +136,8 @@ ev_window_title_update (EvWindowTitle *window_title) g_utf8_validate (doc_title, -1, NULL)) { title = g_strdup (doc_title); } + + g_free (doc_title); } } diff --git a/shell/ev-window.c b/shell/ev-window.c index 027ddb8..1332122 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -339,11 +339,11 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) if (document) { has_document = TRUE; - info = ev_page_cache_get_info (ev_window->priv->page_cache); + info = ev_document_get_info (document); } if (has_document && ev_window->priv->page_cache) { - has_pages = ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0; + has_pages = ev_document_get_n_pages (document) > 0; } if (!info || info->fields_mask == 0) { @@ -425,7 +425,7 @@ ev_window_update_actions (EvWindow *ev_window) if (ev_window->priv->document && ev_window->priv->page_cache) { page = ev_page_cache_get_current_page (ev_window->priv->page_cache); - n_pages = ev_page_cache_get_n_pages (ev_window->priv->page_cache); + n_pages = ev_document_get_n_pages (ev_window->priv->document); has_pages = n_pages > 0; } @@ -802,7 +802,7 @@ ev_window_add_history (EvWindow *window, gint page, EvLink *link) } else { dest = ev_link_dest_new_page (page); action = ev_link_action_new_dest (dest); - page_label = ev_page_cache_get_page_label (window->priv->page_cache, page); + page_label = ev_document_get_page_label (window->priv->document, page); } if (!page_label) @@ -957,7 +957,7 @@ setup_document_from_metadata (EvWindow *window) gint n_pages; gint new_page; - n_pages = ev_page_cache_get_n_pages (window->priv->page_cache); + n_pages = ev_document_get_n_pages (window->priv->document); new_page = CLAMP (g_value_get_int (&page), 0, n_pages - 1); ev_page_cache_set_current_page (window->priv->page_cache, new_page); @@ -972,21 +972,17 @@ setup_document_from_metadata (EvWindow *window) if (ev_metadata_manager_get (uri, "window_width_ratio", &width_ratio, FALSE) && ev_metadata_manager_get (uri, "window_height_ratio", &height_ratio, FALSE)) { - gint document_width; - gint document_height; + gdouble document_width; + gdouble document_height; GdkScreen *screen; gint request_width; gint request_height; - ev_page_cache_get_max_width (window->priv->page_cache, - 0, 1.0, - &document_width); - ev_page_cache_get_max_height (window->priv->page_cache, - 0, 1.0, - &document_height); - - request_width = g_value_get_double (&width_ratio) * document_width; - request_height = g_value_get_double (&height_ratio) * document_height; + ev_document_get_max_page_size (window->priv->document, + &document_width, &document_height); + + request_width = (gint)(g_value_get_double (&width_ratio) * document_width + 0.5); + request_height = (gint)(g_value_get_double (&height_ratio) * document_height + 0.5); screen = gtk_window_get_screen (GTK_WINDOW (window)); @@ -1156,23 +1152,21 @@ ev_window_set_icon_from_thumbnail (EvJobThumbnail *job, static void ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation) { - gint page_width, page_height; + gdouble page_width; gdouble scale; EvDocument *document = ev_window->priv->document; - + if (!EV_IS_DOCUMENT_THUMBNAILS (document) || - ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0 || - ev_page_cache_check_dimensions (ev_window->priv->page_cache)) { + ev_document_get_n_pages (document) <= 0 || + !ev_page_cache_check_dimensions (ev_window->priv->page_cache)) { return; } - + ev_window_clear_thumbnail_job (ev_window); - - ev_page_cache_get_size (ev_window->priv->page_cache, - 0, 0, 1.0, - &page_width, &page_height); - scale = (gdouble)128 / (gdouble)page_width; - + + ev_document_get_page_size (document, 0, &page_width, NULL); + scale = 128. / page_width; + ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, 0, rotation, scale); g_signal_connect (ev_window->priv->thumbnail_job, "finished", G_CALLBACK (ev_window_set_icon_from_thumbnail), @@ -1214,7 +1208,7 @@ ev_window_setup_document (EvWindow *ev_window) ev_window->priv->document); } - info = ev_page_cache_get_info (ev_window->priv->page_cache); + info = ev_document_get_info (document); update_document_mode (ev_window, info->mode); gtk_widget_grab_focus (ev_window->priv->view); @@ -1245,16 +1239,16 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document) /* Restart the current page */ page = CLAMP (ev_link_dest_get_page (ev_window->priv->dest), 0, - ev_page_cache_get_n_pages (ev_window->priv->page_cache) - 1); + ev_document_get_n_pages (ev_window->priv->document) - 1); ev_page_cache_set_current_page (ev_window->priv->page_cache, page); g_object_unref (ev_window->priv->dest); ev_window->priv->dest = NULL; } - if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) { + if (ev_document_get_n_pages (ev_window->priv->document) <= 0) { ev_window_warning_message (ev_window, "%s", _("The document contains no pages")); - } else if (ev_page_cache_check_dimensions (ev_window->priv->page_cache)) { + } else if (!ev_page_cache_check_dimensions (ev_window->priv->page_cache)) { ev_window_warning_message (ev_window, "%s", _("The document contains only empty pages")); } else { @@ -3022,7 +3016,7 @@ ev_window_print_range (EvWindow *ev_window, page_cache = ev_page_cache_get (ev_window->priv->document); current_page = ev_page_cache_get_current_page (page_cache); - document_last_page = ev_page_cache_get_n_pages (page_cache); + document_last_page = ev_document_get_n_pages (ev_window->priv->document); if (!ev_window->priv->print_settings) { ev_window->priv->print_settings = gtk_print_settings_copy ( @@ -3060,13 +3054,8 @@ ev_window_print_range (EvWindow *ev_window, static void ev_window_print (EvWindow *window) { - EvPageCache *page_cache; - gint last_page; - - page_cache = ev_page_cache_get (window->priv->document); - last_page = ev_page_cache_get_n_pages (page_cache); - - ev_window_print_range (window, 1, last_page); + ev_window_print_range (window, 1, + ev_document_get_n_pages (window->priv->document)); } static void @@ -3854,12 +3843,10 @@ ev_window_cmd_go_first_page (GtkAction *action, EvWindow *ev_window) static void ev_window_cmd_go_last_page (GtkAction *action, EvWindow *ev_window) { - int n_pages; - g_return_if_fail (EV_IS_WINDOW (ev_window)); - n_pages = ev_page_cache_get_n_pages (ev_window->priv->page_cache); - ev_page_cache_set_current_page (ev_window->priv->page_cache, n_pages - 1); + ev_page_cache_set_current_page (ev_window->priv->page_cache, + ev_document_get_n_pages (ev_window->priv->document) - 1); } static void @@ -3869,7 +3856,7 @@ ev_window_cmd_go_forward (GtkAction *action, EvWindow *ev_window) g_return_if_fail (EV_IS_WINDOW (ev_window)); - n_pages = ev_page_cache_get_n_pages (ev_window->priv->page_cache); + n_pages = ev_document_get_n_pages (ev_window->priv->document); current_page = ev_page_cache_get_current_page (ev_window->priv->page_cache); if (current_page + 10 < n_pages) @@ -4530,7 +4517,7 @@ find_bar_search_changed_cb (EggFindBar *find_bar, if (search_string && search_string[0]) { ev_window->priv->find_job = ev_job_find_new (ev_window->priv->document, ev_page_cache_get_current_page (ev_window->priv->page_cache), - ev_page_cache_get_n_pages (ev_window->priv->page_cache), + ev_document_get_n_pages (ev_window->priv->document), search_string, case_sensitive); g_signal_connect (ev_window->priv->find_job, "finished", @@ -5334,30 +5321,23 @@ window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer { char *uri = window->priv->uri; GdkWindowState state; - int x, y, width, height, document_width, document_height; + gdouble document_width, document_height; state = gdk_window_get_state (GTK_WIDGET (window)->window); if (!(state & GDK_WINDOW_STATE_FULLSCREEN)) { - gtk_window_get_position (GTK_WINDOW (window), &x, &y); - gtk_window_get_size (GTK_WINDOW (window), &width, &height); - - if (!ev_window_is_empty (window) && window->priv->page_cache) { - ev_page_cache_get_max_width (window->priv->page_cache, - 0, 1.0, - &document_width); - ev_page_cache_get_max_height (window->priv->page_cache, - 0, 1.0, - &document_height); - ev_metadata_manager_set_double (uri, "window_width_ratio", - (double)width / document_width); - ev_metadata_manager_set_double (uri, "window_height_ratio", - (double)height / document_height); - - ev_metadata_manager_set_int (uri, "window_x", x); - ev_metadata_manager_set_int (uri, "window_y", y); - ev_metadata_manager_set_int (uri, "window_width", width); - ev_metadata_manager_set_int (uri, "window_height", height); + if (!ev_window_is_empty (window) && window->priv->document) { + ev_document_get_max_page_size (window->priv->document, + &document_width, &document_height); + ev_metadata_manager_set_double (uri, "window_width_ratio", + (double)event->width / document_width); + ev_metadata_manager_set_double (uri, "window_height_ratio", + (double)event->height / document_height); + + ev_metadata_manager_set_int (uri, "window_x", event->x); + ev_metadata_manager_set_int (uri, "window_y", event->y); + ev_metadata_manager_set_int (uri, "window_width", event->width); + ev_metadata_manager_set_int (uri, "window_height", event->height); } } diff --git a/thumbnailer/evince-thumbnailer.c b/thumbnailer/evince-thumbnailer.c index 457ceea..31486bf 100644 --- a/thumbnailer/evince-thumbnailer.c +++ b/thumbnailer/evince-thumbnailer.c @@ -84,7 +84,7 @@ evince_thumbnail_pngenc_get (EvDocument *document, const char *thumbnail, int si page = ev_document_get_page (document, 0); - ev_document_get_page_size (document, page, &width, &height); + ev_document_get_page_size (document, 0, &width, &height); rc = ev_render_context_new (page, 0, size / width); pixbuf = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (document), -- cgit v0.9.1