From 694748d4887f8ffd866ae30c1660e86af2ceafed Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Wed, 22 Dec 2004 04:14:06 +0000 Subject: [PATCH] Redo size handling. Tue Dec 21 23:05:51 2004 Owen Taylor * backend/ev-document.{h,cc} pdf/xpdf/pdf-document.cc: Redo size handling. * shell/ev-view.c: Track the size from the document. --- ChangeLog | 7 +++ backend/ev-document.c | 27 +++++++--- backend/ev-document.h | 60 +++++++++++---------- pdf/xpdf/pdf-document.cc | 110 ++++++++++++++++++++++++++++++--------- shell/ev-view.c | 25 +++++++-- 5 files changed, 167 insertions(+), 62 deletions(-) diff --git a/ChangeLog b/ChangeLog index 11c2b459..8b5ecb34 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Dec 21 23:05:51 2004 Owen Taylor + + * backend/ev-document.{h,cc} pdf/xpdf/pdf-document.cc: + Redo size handling. + + * shell/ev-view.c: Track the size from the document. + Tue Dec 21 22:17:04 2004 Owen Taylor * pdf/xpdf/pdf-document.cc (pdf_document_load): PDFDoc diff --git a/backend/ev-document.c b/backend/ev-document.c index 5886e3f6..3ed1181d 100644 --- a/backend/ev-document.c +++ b/backend/ev-document.c @@ -83,14 +83,29 @@ ev_document_set_target (EvDocument *document, } void -ev_document_set_page_rect (EvDocument *document, - int x, - int y, - int width, - int height) +ev_document_set_scale (EvDocument *document, + double scale) { EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document); - iface->set_page_rect (document, x, y, width, height); + iface->set_scale (document, scale); +} + +void +ev_document_set_page_offset (EvDocument *document, + int x, + int y) +{ + EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document); + iface->set_page_offset (document, x, y); +} + +void +ev_document_get_page_size (EvDocument *document, + int *width, + int *height) +{ + EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document); + iface->get_page_size (document, width, height); } void diff --git a/backend/ev-document.h b/backend/ev-document.h index aa10f9bc..e572fed6 100644 --- a/backend/ev-document.h +++ b/backend/ev-document.h @@ -50,38 +50,44 @@ struct _EvDocumentIface int page); void (* set_target) (EvDocument *document, GdkDrawable *target); - void (* set_page_rect) (EvDocument *document, + void (* set_scale) (EvDocument *document, + double scale); + void (* set_page_offset) (EvDocument *document, int x, - int y, - int width, - int height); - void (* render) (EvDocument *document, - int clip_x, - int clip_y, - int clip_width, - int clip_height); + int y); + void (* get_page_size) (EvDocument *document, + int *width, + int *height); + void (* render) (EvDocument *document, + int clip_x, + int clip_y, + int clip_width, + int clip_height); }; GType ev_document_get_type (void); -gboolean ev_document_load (EvDocument *document, - const char *uri, - GError **error); -int ev_document_get_n_pages (EvDocument *document); -void ev_document_set_page (EvDocument *document, - int page); -void ev_document_set_target (EvDocument *document, - GdkDrawable *target); -void ev_document_set_page_rect (EvDocument *document, - int x, - int y, - int width, - int height); -void ev_document_render (EvDocument *document, - int clip_x, - int clip_y, - int clip_width, - int clip_height); +gboolean ev_document_load (EvDocument *document, + const char *uri, + GError **error); +int ev_document_get_n_pages (EvDocument *document); +void ev_document_set_page (EvDocument *document, + int page); +void ev_document_set_target (EvDocument *document, + GdkDrawable *target); +void ev_document_set_scale (EvDocument *document, + double scale); +void ev_document_set_page_offset (EvDocument *document, + int x, + int y); +void ev_document_get_page_size (EvDocument *document, + int *width, + int *height); +void ev_document_render (EvDocument *document, + int clip_x, + int clip_y, + int clip_width, + int clip_height); G_END_DECLS diff --git a/pdf/xpdf/pdf-document.cc b/pdf/xpdf/pdf-document.cc index 8558c822..9a9d022e 100644 --- a/pdf/xpdf/pdf-document.cc +++ b/pdf/xpdf/pdf-document.cc @@ -40,12 +40,15 @@ struct _PdfDocument GObject parent_instance; int page; - GdkRectangle page_rect; + int page_x_offset; + int page_y_offset; + double scale; GdkDrawable *target; GDKSplashOutputDev *out; PDFDoc *doc; - + + gboolean page_valid; }; static void pdf_document_document_iface_init (EvDocumentIface *iface); @@ -54,6 +57,18 @@ G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, pdf_document_document_iface_init) }); +static gboolean +document_validate_page (PdfDocument *pdf_document) +{ + if (!pdf_document->page_valid) { + pdf_document->doc->displayPage (pdf_document->out, pdf_document->page, + 72 * pdf_document->scale, + 72 * pdf_document->scale, + 0, gTrue, gTrue); + + pdf_document->page_valid = TRUE; + } +} static gboolean pdf_document_load (EvDocument *document, @@ -99,10 +114,12 @@ pdf_document_load (EvDocument *document, delete pdf_document->doc; pdf_document->doc = newDoc; - if (pdf_document->out) { + pdf_document->page = 1; + + if (pdf_document->out) pdf_document->out->startDoc(pdf_document->doc->getXRef()); - pdf_document->doc->displayPage (pdf_document->out, 1, 72, 72, 0, gTrue, gTrue); - } + + pdf_document->page_valid = FALSE; return TRUE; } @@ -124,7 +141,11 @@ pdf_document_set_page (EvDocument *document, { PdfDocument *pdf_document = PDF_DOCUMENT (document); - pdf_document->page = page; + if (page != pdf_document->page) { + pdf_document->page = page; + pdf_document->page_valid = FALSE; + } + } static void @@ -148,34 +169,65 @@ pdf_document_set_target (EvDocument *document, if (pdf_document->target) g_object_ref (pdf_document->target); - if (pdf_document->out) + if (pdf_document->out) { delete pdf_document->out; + pdf_document->out = NULL; + } if (pdf_document->target) { pdf_document->out = new GDKSplashOutputDev (gdk_drawable_get_screen (pdf_document->target), redraw_callback, (void*) document); - if (pdf_document->doc) { + if (pdf_document->doc) pdf_document->out->startDoc(pdf_document->doc->getXRef()); - pdf_document->doc->displayPage (pdf_document->out, 1, 72, 72, 0, gTrue, gTrue); - } + } + + pdf_document->page_valid = FALSE; } } static void -pdf_document_set_page_rect (EvDocument *document, - int x, - int y, - int width, - int height) +pdf_document_set_scale (EvDocument *document, + double scale) { PdfDocument *pdf_document = PDF_DOCUMENT (document); - pdf_document->page_rect.x = x; - pdf_document->page_rect.y = y; - pdf_document->page_rect.width = width; - pdf_document->page_rect.height = height; + if (pdf_document->scale != scale) { + pdf_document->scale = scale; + pdf_document->page_valid = FALSE; + } +} + +static void +pdf_document_set_page_offset (EvDocument *document, + int x, + int y) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + + pdf_document->page_x_offset = x; + pdf_document->page_y_offset = y; +} + +static void +pdf_document_get_page_size (EvDocument *document, + int *width, + int *height) +{ + PdfDocument *pdf_document = PDF_DOCUMENT (document); + + if (document_validate_page (pdf_document)) { + if (width) + *width = pdf_document->out->getBitmapWidth(); + if (height) + *height = pdf_document->out->getBitmapHeight(); + } else { + if (width) + *width = 1; + if (height) + *height = 1; + } } static void @@ -189,11 +241,11 @@ pdf_document_render (EvDocument *document, GdkRectangle page; GdkRectangle draw; - if (!pdf_document->target) + if (!document_validate_page (pdf_document) || !pdf_document->target) return; - page.x = 0; - page.y = 0; + page.x = pdf_document->page_x_offset; + page.y = pdf_document->page_y_offset; page.width = pdf_document->out->getBitmapWidth(); page.height = pdf_document->out->getBitmapHeight(); @@ -203,7 +255,7 @@ pdf_document_render (EvDocument *document, draw.height = clip_height; if (gdk_rectangle_intersect (&page, &draw, &draw)) - pdf_document->out->redraw (draw.x, draw.y, + pdf_document->out->redraw (draw.x - page.x, draw.y - page.y, pdf_document->target, draw.x, draw.y, draw.width, draw.height); @@ -238,13 +290,21 @@ pdf_document_document_iface_init (EvDocumentIface *iface) iface->load = pdf_document_load; iface->get_n_pages = pdf_document_get_n_pages; iface->set_page = pdf_document_set_page; + iface->set_scale = pdf_document_set_scale; iface->set_target = pdf_document_set_target; - iface->set_page_rect = pdf_document_set_page_rect; + iface->set_page_offset = pdf_document_set_page_offset; + iface->get_page_size = pdf_document_get_page_size; iface->render = pdf_document_render; } static void -pdf_document_init (PdfDocument *document) +pdf_document_init (PdfDocument *pdf_document) { + pdf_document->page = 1; + pdf_document->page_x_offset = 0; + pdf_document->page_y_offset = 0; + pdf_document->scale = 1.; + + pdf_document->page_valid = FALSE; } diff --git a/shell/ev-view.c b/shell/ev-view.c index 9fbc81af..f52b3727 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -147,10 +147,19 @@ static void ev_view_size_request (GtkWidget *widget, GtkRequisition *requisition) { - /* EvView *view = EV_VIEW (widget); */ + EvView *view = EV_VIEW (widget); + + if (GTK_WIDGET_REALIZED (widget)) { + if (view->document) { + ev_document_get_page_size (view->document, + &requisition->width, + &requisition->height); + } else { + requisition->width = 10; + requisition->height = 10; + } + } - requisition->width = 500; - requisition->height = 500; } static void @@ -223,9 +232,17 @@ ev_view_realize (GtkWidget *widget) gdk_window_set_user_data (view->bin_window, widget); gdk_window_show (view->bin_window); - if (view->document) + if (view->document) { ev_document_set_target (view->document, view->bin_window); + /* We can't get page size without a target, so we have to + * queue a size request at realization. Could be fixed + * with EvDocument changes to allow setting a GdkScreen + * without setting a target. + */ + gtk_widget_queue_resize (widget); + } + update_window_backgrounds (view); } -- 2.43.5