]> www.fi.muni.cz Git - evince.git/commitdiff
Implement rotation and cleanup the code a bit.
authorMarco Pesenti Gritti <mpg@redhat.com>
Fri, 24 Jun 2005 08:59:56 +0000 (08:59 +0000)
committerMarco Pesenti Gritti <marco@src.gnome.org>
Fri, 24 Jun 2005 08:59:56 +0000 (08:59 +0000)
2005-06-24  Marco Pesenti Gritti  <mpg@redhat.com>

        * pixbuf/pixbuf-document.c: (pixbuf_document_get_orientation),
        (pixbuf_document_set_orientation), (rotate_pixbuf),
        (pixbuf_document_get_page_size), (pixbuf_document_render_pixbuf),
        (pixbuf_document_document_iface_init), (pixbuf_document_init):

        Implement rotation and cleanup the code a bit.

        * tiff/tiff-document.c: (tiff_document_get_page_size),
        (tiff_document_get_orientation), (tiff_document_set_orientation),
        (rotate_pixbuf), (tiff_document_render_pixbuf),
        (tiff_document_document_iface_init), (tiff_document_init):

        Implement rotation. Was the quicker solution for the release
        but we really need to share this code in the shell.

ChangeLog
pixbuf/pixbuf-document.c
tiff/tiff-document.c

index 04bcd52c9ce6cdd4b5911ef5eb56ba621121301d..84aae5df92b099743f0bdb756190488d49b4c36b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2005-06-24  Marco Pesenti Gritti  <mpg@redhat.com>
+
+       * pixbuf/pixbuf-document.c: (pixbuf_document_get_orientation),
+       (pixbuf_document_set_orientation), (rotate_pixbuf),
+       (pixbuf_document_get_page_size), (pixbuf_document_render_pixbuf),
+       (pixbuf_document_document_iface_init), (pixbuf_document_init):
+
+       Implement rotation and cleanup the code a bit.
+
+       * tiff/tiff-document.c: (tiff_document_get_page_size),
+       (tiff_document_get_orientation), (tiff_document_set_orientation),
+       (rotate_pixbuf), (tiff_document_render_pixbuf),
+       (tiff_document_document_iface_init), (tiff_document_init):
+
+       Implement rotation. Was the quicker solution for the release
+       but we really need to share this code in the shell.
+
 2005-06-24  Marco Pesenti Gritti  <mpg@redhat.com>
 
        * pdf/ev-poppler.cc:
index 18d357dfdb857b5d021aedc2faab8275dbff270c..97f5271883ad516759a0bd1fa45d810f0e185c04 100644 (file)
@@ -30,9 +30,7 @@ struct _PixbufDocument
        GObject parent_instance;
 
        GdkPixbuf *pixbuf;
-       GdkDrawable *target;
-
-       gint x_offset, y_offset;
+       EvOrientation orientation;
 };
 
 typedef struct _PixbufDocumentClass PixbufDocumentClass;
@@ -87,6 +85,41 @@ pixbuf_document_get_n_pages (EvDocument  *document)
        return 1;
 }
 
+static EvOrientation
+pixbuf_document_get_orientation (EvDocument *document)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+
+       return pixbuf_document->orientation;
+}
+
+static void
+pixbuf_document_set_orientation (EvDocument *document,
+                                EvOrientation   orientation)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+
+       pixbuf_document->orientation = orientation;
+}
+
+static GdkPixbuf *
+rotate_pixbuf (EvDocument *document, GdkPixbuf *pixbuf)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+
+       switch (pixbuf_document->orientation)
+       {
+               case EV_ORIENTATION_LANDSCAPE:
+                       return gdk_pixbuf_rotate_simple (pixbuf, 90);
+               case EV_ORIENTATION_UPSIDEDOWN:
+                       return gdk_pixbuf_rotate_simple (pixbuf, 180);
+               case EV_ORIENTATION_SEASCAPE:
+                       return gdk_pixbuf_rotate_simple (pixbuf, 270);
+               default:
+                       return g_object_ref (pixbuf);
+       }
+}
+
 static void
 pixbuf_document_get_page_size (EvDocument   *document,
                               int           page,
@@ -95,23 +128,31 @@ pixbuf_document_get_page_size (EvDocument   *document,
 {
        PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
 
-       if (width)
+       if (pixbuf_document->orientation == EV_ORIENTATION_PORTRAIT ||
+           pixbuf_document->orientation ==  EV_ORIENTATION_UPSIDEDOWN) {
                *width = gdk_pixbuf_get_width (pixbuf_document->pixbuf);
-       if (height)
                *height = gdk_pixbuf_get_height (pixbuf_document->pixbuf);
-
-       printf ("get_page_size, page=%d, *width=%f, *height=%f\n",
-               page, *width, *height);
+       } else {
+               *width = gdk_pixbuf_get_height (pixbuf_document->pixbuf);
+               *height = gdk_pixbuf_get_width (pixbuf_document->pixbuf);
+       }
 }
 
 static GdkPixbuf*
 pixbuf_document_render_pixbuf (EvDocument  *document, int page, double scale)
 {
        PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
-       return gdk_pixbuf_scale_simple (pixbuf_document->pixbuf,
-                                       gdk_pixbuf_get_width (pixbuf_document->pixbuf) * scale,
-                                       gdk_pixbuf_get_height (pixbuf_document->pixbuf) * scale,
-                                       GDK_INTERP_BILINEAR);
+       GdkPixbuf *scaled_pixbuf, *rotated_pixbuf;
+
+       scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf_document->pixbuf,
+                                                gdk_pixbuf_get_width (pixbuf_document->pixbuf) * scale,
+                                                gdk_pixbuf_get_height (pixbuf_document->pixbuf) * scale,
+                                                GDK_INTERP_BILINEAR);
+
+       rotated_pixbuf = rotate_pixbuf (document, scaled_pixbuf);
+       g_object_unref (scaled_pixbuf);
+
+       return rotated_pixbuf;
 }
 
 static void
@@ -159,6 +200,8 @@ pixbuf_document_document_iface_init (EvDocumentIface *iface)
        iface->get_page_size = pixbuf_document_get_page_size;
        iface->render_pixbuf = pixbuf_document_render_pixbuf;
        iface->get_info = pixbuf_document_get_info;
+       iface->get_orientation = pixbuf_document_get_orientation;
+       iface->set_orientation = pixbuf_document_set_orientation;
 }
 
 static GdkPixbuf *
@@ -209,6 +252,4 @@ pixbuf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface
 static void
 pixbuf_document_init (PixbufDocument *pixbuf_document)
 {
-       pixbuf_document->x_offset = 0;
-       pixbuf_document->y_offset = 0;
 }
index 9605c16eacaf281ed04507ad87c7972a060e3192..a4c8638ab3042a4512f4e4a2841d216dff7a3077 100644 (file)
@@ -36,6 +36,7 @@ struct _TiffDocument
 
   TIFF *tiff;
   gint n_pages;
+  EvOrientation orientation;
 };
 
 typedef struct _TiffDocumentClass TiffDocumentClass;
@@ -157,11 +158,52 @@ tiff_document_get_page_size (EvDocument   *document,
   TIFFGetField (tiff_document->tiff, TIFFTAG_IMAGEWIDTH, &w);
   TIFFGetField (tiff_document->tiff, TIFFTAG_IMAGELENGTH, &h);
 
-  *width = w;
-  *height = h;
+  if (tiff_document->orientation == EV_ORIENTATION_PORTRAIT ||
+      tiff_document->orientation ==  EV_ORIENTATION_UPSIDEDOWN) {
+    *width = w;
+    *height = h;
+  } else {
+    *width = h;
+    *height = w;
+  }
   pop_handlers ();
 }
 
+static EvOrientation
+tiff_document_get_orientation (EvDocument *document)
+{
+       TiffDocument *tiff_document = TIFF_DOCUMENT (document);
+
+       return tiff_document->orientation;
+}
+
+static void
+tiff_document_set_orientation (EvDocument *document,
+                            EvOrientation   orientation)
+{
+       TiffDocument *tiff_document = TIFF_DOCUMENT (document);
+
+       tiff_document->orientation = orientation;
+}
+
+static GdkPixbuf *
+rotate_pixbuf (EvDocument *document, GdkPixbuf *pixbuf)
+{
+       TiffDocument *tiff_document = TIFF_DOCUMENT (document);
+
+       switch (tiff_document->orientation)
+       {
+               case EV_ORIENTATION_LANDSCAPE:
+                       return gdk_pixbuf_rotate_simple (pixbuf, 90);
+               case EV_ORIENTATION_UPSIDEDOWN:
+                       return gdk_pixbuf_rotate_simple (pixbuf, 180);
+               case EV_ORIENTATION_SEASCAPE:
+                       return gdk_pixbuf_rotate_simple (pixbuf, 270);
+               default:
+                       return g_object_ref (pixbuf);
+       }
+}
+
 static GdkPixbuf *
 tiff_document_render_pixbuf (EvDocument  *document, int page, double scale)
 {
@@ -171,6 +213,7 @@ tiff_document_render_pixbuf (EvDocument  *document, int page, double scale)
   guchar *pixels = NULL;
   GdkPixbuf *pixbuf;
   GdkPixbuf *scaled_pixbuf;
+  GdkPixbuf *rotated_pixbuf;
 
   g_return_val_if_fail (TIFF_IS_DOCUMENT (document), 0);
   g_return_val_if_fail (tiff_document->tiff != NULL, 0);
@@ -228,7 +271,10 @@ tiff_document_render_pixbuf (EvDocument  *document, int page, double scale)
                                           GDK_INTERP_BILINEAR);
   g_object_unref (pixbuf);
 
-  return scaled_pixbuf;
+  rotated_pixbuf = rotate_pixbuf (document, scaled_pixbuf);
+  g_object_unref (scaled_pixbuf);
+
+  return rotated_pixbuf;
 }
 
 static void
@@ -276,6 +322,8 @@ tiff_document_document_iface_init (EvDocumentIface *iface)
        iface->get_page_size = tiff_document_get_page_size;
        iface->render_pixbuf = tiff_document_render_pixbuf;
        iface->get_info = tiff_document_get_info;
+       iface->get_orientation = tiff_document_get_orientation;
+       iface->set_orientation = tiff_document_set_orientation;
 }
 
 static GdkPixbuf *
@@ -336,4 +384,5 @@ static void
 tiff_document_init (TiffDocument *tiff_document)
 {
   tiff_document->n_pages = -1;
+  tiff_document->orientation = EV_ORIENTATION_PORTRAIT;
 }