]> www.fi.muni.cz Git - evince.git/commitdiff
Redo size handling.
authorOwen Taylor <otaylor@redhat.com>
Wed, 22 Dec 2004 04:14:06 +0000 (04:14 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Wed, 22 Dec 2004 04:14:06 +0000 (04:14 +0000)
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.

ChangeLog
backend/ev-document.c
backend/ev-document.h
pdf/xpdf/pdf-document.cc
shell/ev-view.c

index 11c2b4592b55c4bb0ac827170c9f711c510c5254..8b5ecb3439efb0424f4a00d1fc99966f8e588db9 100644 (file)
--- 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
index 5886e3f622100642e8d96633985befd63b79c8c1..3ed1181d70d3f1b8ca6d14abf23f15e69aea4f20 100644 (file)
@@ -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
index aa10f9bce3c3dce0546643dd8bce6f4e807fed38..e572fed60cfad2937db751bdd1ce89a6ea93ad91 100644 (file)
@@ -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
 
index 8558c822f1faa6a9dee786c955cf746bd8876f7f..9a9d022e5f2974a3f1782ec1a4528180611293cf 100644 (file)
@@ -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;
 }
 
index 9fbc81afb8c588c2ae794b5bdd6dce6fe9dc3dfe..f52b372778c11d56b31ac5991454292b3405a9fe 100644 (file)
@@ -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);
 }