From b8aebf2e1ba5b4f9ff1e1256b28acb3e23947c51 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Mon, 14 Apr 2008 17:07:39 +0000 Subject: Add EvPage so that we can hold a reference to the backend page. Form 2008-04-14 Carlos Garcia Campos * libdocument/Makefile.am: * libdocument/ev-page.[ch]: * libdocument/ev-render-context.[ch]: (ev_render_context_dispose), (ev_render_context_new), (ev_render_context_set_page): * libdocument/ev-form-field.[ch]: (ev_form_field_init), (ev_form_field_finalize), (ev_form_field_class_init): * libdocument/ev-document-forms.[ch]: (ev_document_forms_get_form_fields): * libdocument/ev-document.[ch]: (ev_document_get_page), (ev_document_get_page_size), (ev_document_get_page_label): * shell/ev-jobs.[ch]: (ev_job_thumbnail_dispose), (ev_job_render_run), (ev_job_thumbnail_new), (ev_job_thumbnail_run), (ev_job_print_run): * shell/ev-page-cache.c: (ev_page_cache_new): * shell/ev-pixbuf-cache.c: (job_page_ready_cb), (job_finished_cb), (check_job_size_and_unref), (add_job): * shell/ev-sidebar-thumbnails.c: (add_range): * shell/ev-view.c: (ev_view_form_field_get_region), (ev_view_form_field_button_create_widget), (ev_view_form_field_text_save), (ev_view_form_field_choice_save), (ev_view_handle_form_field), (ev_view_size_allocate), (get_selected_text): * shell/ev-window.c: (ev_window_refresh_window_thumbnail): * backend/pdf/ev-poppler.cc: (pdf_document_get_page_size), (pdf_document_get_page), (pdf_document_get_page_label), (pdf_document_render), (pdf_document_get_info), (pdf_document_document_iface_init), (pdf_document_thumbnails_get_thumbnail), (pdf_document_thumbnails_get_dimensions), (pdf_document_file_exporter_do_page), (pdf_selection_render_selection), (pdf_selection_get_selected_text), (pdf_selection_get_selection_region), (pdf_selection_get_selection_map), (pdf_document_forms_get_form_fields), (pdf_document_forms_form_field_text_get_text), (pdf_document_forms_form_field_text_set_text), (pdf_document_forms_form_field_button_set_state), (pdf_document_forms_form_field_button_get_state), (pdf_document_forms_form_field_choice_get_item), (pdf_document_forms_form_field_choice_get_n_items), (pdf_document_forms_form_field_choice_is_item_selected), (pdf_document_forms_form_field_choice_select_item), (pdf_document_forms_form_field_choice_toggle_item), (pdf_document_forms_form_field_choice_unselect_all), (pdf_document_forms_form_field_choice_set_text), (pdf_document_forms_form_field_choice_get_text): * backend/ps/ev-spectre.c: (ps_document_get_page), (ps_document_get_page_size), (ps_document_get_page_label), (ps_document_render), (ps_document_document_iface_init), (ps_document_file_exporter_do_page): * backend/tiff/tiff-document.c: (tiff_document_get_page_size), (tiff_document_render), (tiff_document_render_pixbuf), (tiff_document_file_exporter_do_page): * backend/pixbuf/pixbuf-document.c: (pixbuf_document_get_page_size): * backend/comics/comics-document.c: (comics_document_get_page_size), (comics_document_render_pixbuf): * backend/djvu/djvu-document.c: (djvu_document_get_page_size), (djvu_document_render), (djvu_selection_get_selected_text), (djvu_document_thumbnails_get_thumbnail), (djvu_document_file_exporter_do_page), (djvu_document_find_get_result): * backend/dvi/dvi-document.c: (dvi_document_get_page_size), (dvi_document_render), (dvi_document_thumbnails_get_dimensions), (dvi_document_thumbnails_get_thumbnail), (dvi_document_file_exporter_do_page): * backend/impress/impress-document.c: (impress_document_get_page_size), (impress_document_render_pixbuf): * thumbnailer/evince-thumbnailer.c: (evince_thumbnail_pngenc_get): Add EvPage so that we can hold a reference to the backend page. Form fields keep now a reference to the poppler page improving performance since we don't have to create/destroy the poppler field for every form operation. This will be needed for annotations too. svn path=/trunk/; revision=3004 --- (limited to 'libdocument') diff --git a/libdocument/Makefile.am b/libdocument/Makefile.am index a00eeae..577c1c5 100644 --- a/libdocument/Makefile.am +++ b/libdocument/Makefile.am @@ -38,6 +38,7 @@ INST_H_FILES = \ ev-link-action.h \ ev-link-dest.h \ ev-link.h \ + ev-page.h \ ev-render-context.h \ ev-selection.h \ ev-transition-effect.h @@ -68,6 +69,7 @@ libevbackend_la_SOURCES= \ ev-file-exporter.c \ ev-file-helpers.c \ ev-module.c \ + ev-page.c \ ev-render-context.c \ ev-selection.c \ ev-transition-effect.c \ diff --git a/libdocument/ev-document-forms.c b/libdocument/ev-document-forms.c index db90bb8..d5d9c70 100644 --- a/libdocument/ev-document-forms.c +++ b/libdocument/ev-document-forms.c @@ -43,7 +43,7 @@ ev_document_forms_get_type (void) GList * ev_document_forms_get_form_fields (EvDocumentForms *document_forms, - gint page) + EvPage *page) { EvDocumentFormsIface *iface = EV_DOCUMENT_FORMS_GET_IFACE (document_forms); diff --git a/libdocument/ev-document-forms.h b/libdocument/ev-document-forms.h index a1b192d..1337a5e 100644 --- a/libdocument/ev-document-forms.h +++ b/libdocument/ev-document-forms.h @@ -44,7 +44,7 @@ struct _EvDocumentFormsIface /* Methods */ GList *(* get_form_fields) (EvDocumentForms *document_forms, - gint page); + EvPage *page); gchar *(* form_field_text_get_text) (EvDocumentForms *document_forms, EvFormField *field); void (* form_field_text_set_text) (EvDocumentForms *document_forms, @@ -80,7 +80,7 @@ struct _EvDocumentFormsIface GType ev_document_forms_get_type (void) G_GNUC_CONST; GList *ev_document_forms_get_form_fields (EvDocumentForms *document_forms, - gint page); + EvPage *page); gchar *ev_document_forms_form_field_text_get_text (EvDocumentForms *document_forms, EvFormField *field); diff --git a/libdocument/ev-document.c b/libdocument/ev-document.c index 2c6db95..5e582d0 100644 --- a/libdocument/ev-document.c +++ b/libdocument/ev-document.c @@ -150,11 +150,26 @@ ev_document_get_n_pages (EvDocument *document) return retval; } +EvPage * +ev_document_get_page (EvDocument *document, + gint index) +{ + EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document); + EvPage *retval; + + if (iface->get_page) + retval = iface->get_page (document, index); + else + retval = ev_page_new (index); + + return retval; +} + void -ev_document_get_page_size (EvDocument *document, - int page, - double *width, - double *height) +ev_document_get_page_size (EvDocument *document, + EvPage *page, + double *width, + double *height) { EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document); @@ -163,8 +178,8 @@ ev_document_get_page_size (EvDocument *document, } char * -ev_document_get_page_label(EvDocument *document, - int page) +ev_document_get_page_label (EvDocument *document, + EvPage *page) { EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document); @@ -239,7 +254,6 @@ ev_document_info_free (EvDocumentInfo *info) g_free (info->linearized); g_free (info->security); - g_free (info); } diff --git a/libdocument/ev-document.h b/libdocument/ev-document.h index bc040d1..cfcccdb 100644 --- a/libdocument/ev-document.h +++ b/libdocument/ev-document.h @@ -28,6 +28,7 @@ #include #include "ev-document-info.h" +#include "ev-page.h" #include "ev-render-context.h" G_BEGIN_DECLS @@ -78,12 +79,14 @@ struct _EvDocumentIface const char *uri, GError **error); int (* get_n_pages) (EvDocument *document); + EvPage * (* get_page) (EvDocument *document, + gint index); void (* get_page_size) (EvDocument *document, - int page, + EvPage *page, double *width, double *height); char * (* get_page_label) (EvDocument *document, - int page); + EvPage *page); gboolean (* has_attachments) (EvDocument *document); GList * (* get_attachments) (EvDocument *document); cairo_surface_t * (* render) (EvDocument *document, @@ -112,12 +115,14 @@ gboolean ev_document_save (EvDocument *document, const char *uri, GError **error); int ev_document_get_n_pages (EvDocument *document); +EvPage *ev_document_get_page (EvDocument *document, + gint index); void ev_document_get_page_size (EvDocument *document, - int page, + EvPage *page, double *width, double *height); char *ev_document_get_page_label (EvDocument *document, - int page); + EvPage *page); gboolean ev_document_has_attachments (EvDocument *document); GList *ev_document_get_attachments (EvDocument *document); cairo_surface_t *ev_document_render (EvDocument *document, diff --git a/libdocument/ev-form-field.c b/libdocument/ev-form-field.c index cfa25f8..130b6c0 100644 --- a/libdocument/ev-form-field.c +++ b/libdocument/ev-form-field.c @@ -42,14 +42,28 @@ G_DEFINE_TYPE (EvFormFieldSignature, ev_form_field_signature, EV_TYPE_FORM_FIELD static void ev_form_field_init (EvFormField *field) { - field->page = -1; + field->page = NULL; field->changed = FALSE; field->is_read_only = FALSE; } static void +ev_form_field_finalize (GObject *object) +{ + EvFormField *field = EV_FORM_FIELD (object); + + g_object_unref (field->page); + field->page = NULL; + + (* G_OBJECT_CLASS (ev_form_field_parent_class)->finalize) (object); +} + +static void ev_form_field_class_init (EvFormFieldClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = ev_form_field_finalize; } static void diff --git a/libdocument/ev-form-field.h b/libdocument/ev-form-field.h index 0b09af9..027bee6 100644 --- a/libdocument/ev-form-field.h +++ b/libdocument/ev-form-field.h @@ -105,7 +105,7 @@ struct _EvFormField gboolean is_read_only; gdouble font_size; - gint page; + EvPage *page; gboolean changed; }; diff --git a/libdocument/ev-page.c b/libdocument/ev-page.c new file mode 100644 index 0000000..c37e38f --- /dev/null +++ b/libdocument/ev-page.c @@ -0,0 +1,62 @@ +/* this file is part of evince, a gnome document viewer + * + * Copyright (C) 2008 Carlos Garcia Campos + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +#include "ev-page.h" + +G_DEFINE_TYPE (EvPage, ev_page, G_TYPE_OBJECT) + +static void +ev_page_init (EvPage *page) +{ +} + +static void +ev_page_finalize (GObject *object) +{ + EvPage *page = EV_PAGE (object); + + if (page->backend_destroy_func) { + page->backend_destroy_func (page->backend_page); + page->backend_destroy_func = NULL; + } + page->backend_page = NULL; + + (* G_OBJECT_CLASS (ev_page_parent_class)->finalize) (object); +} + +static void +ev_page_class_init (EvPageClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = ev_page_finalize; +} + +EvPage * +ev_page_new (gint index) +{ + EvPage *page; + + page = EV_PAGE (g_object_new (EV_TYPE_PAGE, NULL)); + page->index = index; + + return page; +} diff --git a/libdocument/ev-page.h b/libdocument/ev-page.h new file mode 100644 index 0000000..801b3e1 --- /dev/null +++ b/libdocument/ev-page.h @@ -0,0 +1,59 @@ +/* this file is part of evince, a gnome document viewer + * + * Copyright (C) 2008 Carlos Garcia Campos + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef EV_PAGE_H +#define EV_PAGE_H + +#include + +G_BEGIN_DECLS + +#define EV_TYPE_PAGE (ev_page_get_type()) +#define EV_PAGE(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_PAGE, EvPage)) +#define EV_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_PAGE, EvPageClass)) +#define EV_IS_PAGE(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_PAGE)) +#define EV_IS_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), EV_TYPE_PAGE)) +#define EV_PAGE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), EV_TYPE_PAGE, EvPageClass)) + +typedef struct _EvPage EvPage; +typedef struct _EvPageClass EvPageClass; + +typedef gpointer EvBackendPage; +typedef GDestroyNotify EvBackendPageDestroyFunc; + +struct _EvPage { + GObject base_instance; + + gint index; + + EvBackendPage backend_page; + EvBackendPageDestroyFunc backend_destroy_func; +}; + +struct _EvPageClass { + GObjectClass base_class; +}; + +GType ev_page_get_type (void) G_GNUC_CONST; + +EvPage *ev_page_new (gint index); + +G_END_DECLS + +#endif /* EV_PAGE_H */ diff --git a/libdocument/ev-render-context.c b/libdocument/ev-render-context.c index 5595651..4574066 100644 --- a/libdocument/ev-render-context.c +++ b/libdocument/ev-render-context.c @@ -35,9 +35,9 @@ ev_render_context_dispose (GObject *object) rc = (EvRenderContext *) object; - if (rc->destroy) { - (*rc->destroy) (rc->data); - rc->destroy = NULL; + if (rc->page) { + g_object_unref (rc->page); + rc->page = NULL; } (* G_OBJECT_CLASS (ev_render_context_parent_class)->dispose) (object); @@ -53,18 +53,17 @@ ev_render_context_class_init (EvRenderContextClass *class) oclass->dispose = ev_render_context_dispose; } - EvRenderContext * -ev_render_context_new (int rotation, - gint page, - gdouble scale) +ev_render_context_new (EvPage *page, + gint rotation, + gdouble scale) { EvRenderContext *rc; rc = (EvRenderContext *) g_object_new (EV_TYPE_RENDER_CONTEXT, NULL); + rc->page = page ? g_object_ref (page) : NULL; rc->rotation = rotation; - rc->page = page; rc->scale = scale; return rc; @@ -72,11 +71,14 @@ ev_render_context_new (int rotation, void ev_render_context_set_page (EvRenderContext *rc, - gint page) + EvPage *page) { g_return_if_fail (rc != NULL); + g_return_if_fail (EV_IS_PAGE (page)); - rc->page = page; + if (rc->page) + g_object_unref (rc->page); + rc->page = g_object_ref (page); } void diff --git a/libdocument/ev-render-context.h b/libdocument/ev-render-context.h index 636f02f..eb324e8 100644 --- a/libdocument/ev-render-context.h +++ b/libdocument/ev-render-context.h @@ -22,14 +22,16 @@ #include +#include "ev-page.h" + G_BEGIN_DECLS typedef struct _EvRenderContext EvRenderContext; typedef struct _EvRenderContextClass EvRenderContextClass; #define EV_TYPE_RENDER_CONTEXT (ev_render_context_get_type()) -#define EV_RENDER_CONTEXT(context) ((EvRenderContext *) (context)) -#define EV_RENDER_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_RENDER_CONTEXT, EvRenderContext)) +#define EV_RENDER_CONTEXT(context) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_RENDER_CONTEXT, EvRenderContext) +#define EV_RENDER_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_RENDER_CONTEXT, EvRenderContextClass)) #define EV_IS_RENDER_CONTEXT(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_RENDER_CONTEXT)) struct _EvRenderContextClass @@ -40,23 +42,21 @@ struct _EvRenderContextClass struct _EvRenderContext { GObject parent; - int rotation; - gint page; + + EvPage *page; + gint rotation; gdouble scale; - - gpointer data; - GDestroyNotify destroy; }; GType ev_render_context_get_type (void) G_GNUC_CONST; -EvRenderContext *ev_render_context_new (int rotation, - gint page, +EvRenderContext *ev_render_context_new (EvPage *page, + gint rotation, gdouble scale); void ev_render_context_set_page (EvRenderContext *rc, - gint page); + EvPage *page); void ev_render_context_set_rotation (EvRenderContext *rc, - int rotation); + gint rotation); void ev_render_context_set_scale (EvRenderContext *rc, gdouble scale); -- cgit v0.9.1