Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--backend/ev-document.c27
-rw-r--r--backend/ev-document.h60
-rw-r--r--pdf/xpdf/pdf-document.cc110
-rw-r--r--shell/ev-view.c25
5 files changed, 167 insertions, 62 deletions
diff --git a/ChangeLog b/ChangeLog
index 11c2b45..8b5ecb3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Tue Dec 21 23:05:51 2004 Owen Taylor <otaylor@redhat.com>
+
+ * 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 <otaylor@redhat.com>
* pdf/xpdf/pdf-document.cc (pdf_document_load): PDFDoc
diff --git a/backend/ev-document.c b/backend/ev-document.c
index 5886e3f..3ed1181 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 aa10f9b..e572fed 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 8558c82..9a9d022 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 9fbc81a..f52b372 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);
}