]> www.fi.muni.cz Git - evince.git/commitdiff
Add orientation api. Currently poppler api is not optimal, we need to set
authorMarco Pesenti Gritti <mpg@redhat.com>
Tue, 14 Jun 2005 21:04:23 +0000 (21:04 +0000)
committerMarco Pesenti Gritti <marco@src.gnome.org>
Tue, 14 Jun 2005 21:04:23 +0000 (21:04 +0000)
2005-06-14  Marco Pesenti Gritti <mpg@redhat.com>

        * backend/ev-document.c: (ev_document_set_orientation):
        * backend/ev-document.h:
        * pdf/ev-poppler.cc:

        Add orientation api. Currently poppler api is not optimal,
        we need to set orientation every time we _get a page

        * data/evince-ui.xml:
        * shell/ev-window.c: (ev_window_cmd_edit_landscape),
        (ev_window_cmd_edit_portrait), (ev_window_cmd_edit_flip):

        Add orientation menu items

        * shell/ev-page-cache.c: (ev_page_cache_clear):
        * shell/ev-page-cache.h:

        Add api to clear the cache

        * shell/ev-view.c: (setup_caches), (clear_caches),
        (ev_view_set_document), (ev_view_zoom_out),
        (ev_view_set_orientation):
        * shell/ev-view.h:

        Implement orientation changing

ChangeLog
backend/ev-document.c
backend/ev-document.h
data/evince-ui.xml
pdf/ev-poppler.cc
shell/ev-page-cache.c
shell/ev-page-cache.h
shell/ev-view.c
shell/ev-view.h
shell/ev-window.c

index f2a3b7d8878d874b1ca78051af9d8fc65de0b75b..4b20650f2f11b602d28b0266a54ea12726d7b754 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+2005-06-14  Marco Pesenti Gritti <mpg@redhat.com>
+
+       * backend/ev-document.c: (ev_document_set_orientation):
+       * backend/ev-document.h:
+       * pdf/ev-poppler.cc:
+
+       Add orientation api. Currently poppler api is not optimal,
+       we need to set orientation every time we _get a page
+
+       * data/evince-ui.xml:
+       * shell/ev-window.c: (ev_window_cmd_edit_landscape),
+       (ev_window_cmd_edit_portrait), (ev_window_cmd_edit_flip):
+
+       Add orientation menu items
+
+       * shell/ev-page-cache.c: (ev_page_cache_clear):
+       * shell/ev-page-cache.h:
+
+       Add api to clear the cache
+
+       * shell/ev-view.c: (setup_caches), (clear_caches),
+       (ev_view_set_document), (ev_view_zoom_out),
+       (ev_view_set_orientation):
+       * shell/ev-view.h:
+
+       Implement orientation changing
+
 2005-06-13  Marco Pesenti Gritti <mpg@redhat.com>
 
        * backend/ev-document-fonts.c: (ev_document_fonts_get_progress),
index d4130838edcd864836b40229efb2fe28a8487ae5..4513df50e5c09e75510da5333d06b30773dfc335 100644 (file)
@@ -218,6 +218,15 @@ ev_document_render_pixbuf (EvDocument *document,
        return retval;
 }
 
+void
+ev_document_set_orientation (EvDocument     *document,
+                            EvOrientation   orientation)
+{
+       EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
+
+       iface->set_orientation (document, orientation);
+}
+
 void
 ev_document_info_free (EvDocumentInfo *info)
 {
index ffc9c2ec621640a715f45b92cb93e9eee501e375..1fd8fe3221eda755b300d6592c32a4aaa12f8df5 100644 (file)
@@ -55,6 +55,15 @@ typedef enum
        EV_DOCUMENT_ERROR_ENCRYPTED
 } EvDocumentError;
 
+typedef enum
+{
+       EV_ORIENTATION_DOCUMENT,
+       EV_ORIENTATION_PORTRAIT,
+       EV_ORIENTATION_LANDSCAPE,
+       EV_ORIENTATION_UPSIDEDOWN,
+       EV_ORIENTATION_SEASCAPE
+} EvOrientation;
+
 typedef struct {
        double x1;
        double y1;
@@ -67,29 +76,31 @@ struct _EvDocumentIface
        GTypeInterface base_iface;
 
        /* Methods  */
-       gboolean    (* load)            (EvDocument   *document,
-                                        const char   *uri,
-                                        GError      **error);
-       gboolean    (* save)            (EvDocument   *document,
-                                        const char   *uri,
-                                        GError      **error);
-       int         (* get_n_pages)     (EvDocument   *document);
-       void        (* get_page_size)   (EvDocument   *document,
-                                        int           page,
-                                        double       *width,
-                                        double       *height);
-       char      * (* get_page_label)  (EvDocument   *document,
-                                        int           page);
-       gboolean    (* can_get_text)    (EvDocument   *document);
-       char      * (* get_text)        (EvDocument   *document,
-                                        int           page,
-                                        EvRectangle  *rect);
-       GList     * (* get_links)       (EvDocument   *document,
-                                        int           page);
-       GdkPixbuf * (* render_pixbuf)   (EvDocument   *document,
-                                        int           page,
-                                        double        scale);
-       EvDocumentInfo *(* get_info)    (EvDocument   *document);
+       gboolean         (* load)            (EvDocument   *document,
+                                             const char   *uri,
+                                             GError      **error);
+       gboolean         (* save)            (EvDocument   *document,
+                                             const char   *uri,
+                                             GError      **error);
+       int              (* get_n_pages)     (EvDocument   *document);
+       void             (* get_page_size)   (EvDocument   *document,
+                                             int           page,
+                                             double       *width,
+                                             double       *height);
+       char           * (* get_page_label)  (EvDocument   *document,
+                                             int           page);
+       gboolean         (* can_get_text)    (EvDocument   *document);
+       char           * (* get_text)        (EvDocument   *document,
+                                             int           page,
+                                             EvRectangle  *rect);
+       GList          * (* get_links)       (EvDocument   *document,
+                                             int           page);
+       GdkPixbuf      * (* render_pixbuf)   (EvDocument   *document,
+                                             int           page,
+                                             double        scale);
+       void             (* set_orientation) (EvDocument   *document,
+                                             EvOrientation orientation);
+       EvDocumentInfo * (* get_info)        (EvDocument   *document);
 };
 
 GType          ev_document_get_type       (void);
@@ -98,29 +109,31 @@ GMutex            *ev_document_get_doc_mutex  (void);
 void            ev_document_doc_mutex_lock (void);
 void            ev_document_doc_mutex_unlock (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);
-int            ev_document_get_n_pages    (EvDocument     *document);
-void           ev_document_get_page_size  (EvDocument     *document,
-                                           int             page,
-                                           double         *width,
-                                           double         *height);
-char          *ev_document_get_page_label (EvDocument     *document,
-                                           int             page);
-gboolean       ev_document_can_get_text   (EvDocument     *document);
-char          *ev_document_get_text       (EvDocument     *document,
-                                           int             page,
-                                           EvRectangle    *rect);
-GList         *ev_document_get_links      (EvDocument     *document,
-                                           int             page);
-GdkPixbuf      *ev_document_render_pixbuf  (EvDocument     *document,
-                                           int             page,
-                                           double          scale);
+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);
+int            ev_document_get_n_pages     (EvDocument     *document);
+void           ev_document_get_page_size   (EvDocument     *document,
+                                            int             page,
+                                            double         *width,
+                                            double         *height);
+char          *ev_document_get_page_label  (EvDocument     *document,
+                                            int             page);
+gboolean       ev_document_can_get_text    (EvDocument     *document);
+char          *ev_document_get_text        (EvDocument     *document,
+                                            int             page,
+                                            EvRectangle    *rect);
+GList         *ev_document_get_links       (EvDocument     *document,
+                                            int             page);
+GdkPixbuf      *ev_document_render_pixbuf   (EvDocument     *document,
+                                            int             page,
+                                            double          scale);
+void           ev_document_set_orientation (EvDocument     *document,
+                                            EvOrientation   orientation);
 
 G_END_DECLS
 
index e519b85ec96d88ed86852404b5fc6073545b922b..1d251ca0944bf027cb5e2dd2c4623740997628ff 100644 (file)
       <menuitem name="EditFindMenu" action="EditFind"/>
       <menuitem name="EditFindNextMenu" action="EditFindNext"/>
       <separator/>
+      <menuitem name="EditLandscapeMenu" action="EditLandscape"/>
+      <menuitem name="EditPortraitMenu" action="EditPortrait"/>
+      <menuitem name="EditFlipMenu" action="EditFlip"/>
+      <separator/>
       <menuitem name="EditToolbarMenu" action="EditToolbar"/>
     </menu>
 
index 7c60d9cff351c7350f922903436d1d744e6d0e34..9989d827674d6d9e17fb55f7ef34cb8930653d79 100644 (file)
@@ -56,6 +56,8 @@ struct _PdfDocument
        PopplerPSFile *ps_file;
        gchar *password;
 
+       PopplerOrientation orientation;
+
        PopplerFontInfo *font_info;
        PopplerFontsIter *fonts_iter;
        int fonts_scanned_pages;
@@ -204,11 +206,11 @@ pdf_document_get_page_size (EvDocument   *document,
                            double       *width,
                            double       *height)
 {
+       PdfDocument *pdf_document = PDF_DOCUMENT (document);
        PopplerPage *poppler_page;
 
-       poppler_page = poppler_document_get_page (PDF_DOCUMENT (document)->document,
-                                                 page);
-
+       poppler_page = poppler_document_get_page (pdf_document->document, page);
+       poppler_page_set_orientation (poppler_page, pdf_document->orientation);
        poppler_page_get_size (poppler_page, width, height);
 }
 
@@ -282,6 +284,7 @@ pdf_document_render_pixbuf (EvDocument   *document,
        pdf_document = PDF_DOCUMENT (document);
        poppler_page = poppler_document_get_page (pdf_document->document,
                                                  page);
+       poppler_page_set_orientation (poppler_page, pdf_document->orientation);
 
        poppler_page_get_size (poppler_page, &width_points, &height_points);
        width = (int) ((width_points * scale) + 0.5);
@@ -485,6 +488,33 @@ pdf_document_get_text (EvDocument *document, int page, EvRectangle *rect)
        return poppler_page_get_text (poppler_page, &r);
 }
 
+static void
+pdf_document_set_orientation (EvDocument *document, EvOrientation orientation)
+{
+       PdfDocument *pdf_document = PDF_DOCUMENT (document);
+       PopplerOrientation poppler_orientation;
+
+       switch (orientation) {
+               case EV_ORIENTATION_DOCUMENT:
+                       poppler_orientation = POPPLER_ORIENTATION_DOCUMENT;
+                       break;
+               case EV_ORIENTATION_PORTRAIT:
+                       poppler_orientation = POPPLER_ORIENTATION_PORTRAIT;
+                       break;
+               case EV_ORIENTATION_LANDSCAPE:
+                       poppler_orientation = POPPLER_ORIENTATION_LANDSCAPE;
+                       break;
+               case EV_ORIENTATION_UPSIDEDOWN:
+                       poppler_orientation = POPPLER_ORIENTATION_UPSIDEDOWN;
+                       break;
+               case EV_ORIENTATION_SEASCAPE:
+                       poppler_orientation = POPPLER_ORIENTATION_SEASCAPE;
+                       break;
+       }
+
+       pdf_document->orientation = poppler_orientation;
+}
+
 static void
 pdf_document_document_iface_init (EvDocumentIface *iface)
 {
@@ -498,6 +528,7 @@ pdf_document_document_iface_init (EvDocumentIface *iface)
        iface->get_text = pdf_document_get_text;
        iface->can_get_text = pdf_document_can_get_text;
        iface->get_info = pdf_document_get_info;
+       iface->set_orientation = pdf_document_set_orientation;
 };
 
 static void
index 6c44c9fc08f82fc56024f5239c2ef0b45e4d46e3..936328ffc9e90ab4be42ac53062ea4a4e960da6e 100644 (file)
@@ -482,4 +482,10 @@ ev_page_cache_get (EvDocument *document)
        return page_cache;
 }
 
+void
+ev_page_cache_clear (EvDocument *document)
+{
+       g_return_if_fail (EV_IS_DOCUMENT (document));
 
+       g_object_set_data (G_OBJECT (document), PAGE_CACHE_STRING, NULL);
+}
index b0bf6ccd7bec0292f3c4c46e284a3785d335510b..2b270b0487eb7f3d451031be9f6730cf5156dba0 100644 (file)
@@ -67,7 +67,8 @@ void           ev_page_cache_set_link            (EvPageCache *page_cache,
 gboolean       ev_page_cache_next_page           (EvPageCache *page_cache);
 gboolean       ev_page_cache_prev_page           (EvPageCache *page_cache);
 
-EvPageCache*   ev_page_cache_get (EvDocument     *document);         
+EvPageCache   *ev_page_cache_get                (EvDocument *document);
+void          ev_page_cache_clear               (EvDocument *document);  
 
 G_END_DECLS
 
index ff05be2118d98fda27ff3ebeb8ed2b44c275eba4..3e31d293448250094b2317bbcdc781aaea81e15b 100644 (file)
@@ -1899,6 +1899,28 @@ ev_view_new (void)
        return view;
 }
 
+static void
+setup_caches (EvView *view)
+{
+       view->page_cache = ev_page_cache_get (view->document);
+       g_signal_connect (view->page_cache, "page-changed", G_CALLBACK (page_changed_cb), view);
+       view->pixbuf_cache = ev_pixbuf_cache_new (view->document);
+       g_signal_connect (view->pixbuf_cache, "job-finished", G_CALLBACK (job_finished_cb), view);
+}
+
+static void
+clear_caches (EvView *view)
+{
+       if (view->pixbuf_cache) {
+               g_object_unref (view->pixbuf_cache);
+               view->pixbuf_cache = NULL;
+       }
+
+       if (view->document) {
+               ev_page_cache_clear (view->document);
+       }
+}
+
 void
 ev_view_set_document (EvView     *view,
                      EvDocument *document)
@@ -1915,10 +1937,7 @@ ev_view_set_document (EvView     *view,
 
                 }
 
-               if (view->pixbuf_cache) {
-                       g_object_unref (view->pixbuf_cache);
-                       view->pixbuf_cache = NULL;
-               }
+               clear_caches (view);
 
                view->document = document;
                view->find_page = 0;
@@ -1932,10 +1951,8 @@ ev_view_set_document (EvView     *view,
                                                  G_CALLBACK (find_changed_cb),
                                                  view);
                        }
-                       view->page_cache = ev_page_cache_get (view->document);
-                       g_signal_connect (view->page_cache, "page-changed", G_CALLBACK (page_changed_cb), view);
-                       view->pixbuf_cache = ev_pixbuf_cache_new (view->document);
-                       g_signal_connect (view->pixbuf_cache, "job-finished", G_CALLBACK (job_finished_cb), view);
+
+                       setup_caches (view);
                 }
 
                gtk_widget_queue_resize (GTK_WIDGET (view));
@@ -2125,6 +2142,18 @@ ev_view_zoom_out (EvView *view)
        ev_view_set_zoom (view, ZOOM_OUT_FACTOR, TRUE);
 }
 
+void
+ev_view_set_orientation (EvView         *view,
+                        EvOrientation   orientation)
+{
+       ev_document_set_orientation (view->document, orientation);
+
+       clear_caches (view);
+       setup_caches (view);
+
+       gtk_widget_queue_resize (GTK_WIDGET (view));
+}
+
 static double
 zoom_for_size_fit_width (int doc_width,
                         int doc_height,
index 42437616bf15601cdaec30f31e9dfe9744d7c92f..2244ae0fd9278ff1a49aa94cb7c6ae113a89ac4e 100644 (file)
@@ -85,12 +85,14 @@ void                ev_view_set_zoom          (EvView         *view,
                                           double          factor,
                                           gboolean        relative);
 double         ev_view_get_zoom          (EvView         *view);
+void           ev_view_set_zoom_for_size (EvView         *view,
+                                          int             width,
+                                          int             height,
+                                          int             vsb_width,
+                                          int             hsb_height);
+void           ev_view_set_orientation   (EvView         *view,
+                                          EvOrientation   orientation);
 
-void           ev_view_set_zoom_for_size (EvView *view,
-                                          int     width,
-                                          int     height,
-                                          int     vsb_width,
-                                          int     hsb_height);
 /* Find */
 gboolean       ev_view_can_find_next     (EvView         *view);
 void            ev_view_find_next         (EvView         *view);
index 46ae9a201e194f4072f6dc6b6efb81f4a8bc8396..12fa3d86d68888cf522a6dfa33236638b63eeef6 100644 (file)
@@ -1781,6 +1781,27 @@ ev_window_cmd_edit_toolbar_cb (GtkDialog *dialog, gint response, gpointer data)
         gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
+static void
+ev_window_cmd_edit_landscape (GtkAction *action, EvWindow *ev_window)
+{
+       ev_view_set_orientation (EV_VIEW (ev_window->priv->view),
+                                EV_ORIENTATION_LANDSCAPE);
+}
+
+static void
+ev_window_cmd_edit_portrait (GtkAction *action, EvWindow *ev_window)
+{
+       ev_view_set_orientation (EV_VIEW (ev_window->priv->view),
+                                EV_ORIENTATION_PORTRAIT);
+}
+
+static void
+ev_window_cmd_edit_flip (GtkAction *action, EvWindow *ev_window)
+{
+       ev_view_set_orientation (EV_VIEW (ev_window->priv->view),
+                                EV_ORIENTATION_SEASCAPE);
+}
+
 static void
 ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window)
 {
@@ -2474,6 +2495,15 @@ static const GtkActionEntry entries[] = {
         { "EditToolbar", NULL, N_("T_oolbar"), NULL,
           N_("Customize the toolbar"),
           G_CALLBACK (ev_window_cmd_edit_toolbar) },
+       { "EditLandscape", NULL, N_("_Landscape"), NULL,
+         N_("Change the document orientation to landscape"),
+         G_CALLBACK (ev_window_cmd_edit_landscape) },
+       { "EditPortrait", NULL, N_("_Portrait"), NULL,
+         N_("Change the document orientation to portrait"),
+         G_CALLBACK (ev_window_cmd_edit_portrait) },
+       { "EditFlip", NULL, N_("_Flip"), NULL,
+         N_("Flip the document"),
+         G_CALLBACK (ev_window_cmd_edit_flip) },
 
         /* View menu */
         { "ViewZoomIn", GTK_STOCK_ZOOM_IN, NULL, "<control>plus",