X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=tiff%2Ftiff-document.c;h=f2ed498651d58e51232608a3b474025ead415e0e;hb=1b167536f9277df8953cc30a531c1c17eab10382;hp=9605c16eacaf281ed04507ad87c7972a060e3192;hpb=8e94fdff19bd0fec3d8932ec750b7386fc1c151b;p=evince.git diff --git a/tiff/tiff-document.c b/tiff/tiff-document.c index 9605c16e..f2ed4986 100644 --- a/tiff/tiff-document.c +++ b/tiff/tiff-document.c @@ -36,6 +36,7 @@ struct _TiffDocument TIFF *tiff; gint n_pages; + EvOrientation orientation; }; typedef struct _TiffDocumentClass TiffDocumentClass; @@ -157,13 +158,55 @@ 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 * -tiff_document_render_pixbuf (EvDocument *document, int page, double scale) +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, + EvRenderContext *rc) { TiffDocument *tiff_document = TIFF_DOCUMENT (document); int width, height; @@ -171,12 +214,13 @@ 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); push_handlers (); - if (TIFFSetDirectory (tiff_document->tiff, page) != 1) + if (TIFFSetDirectory (tiff_document->tiff, rc->page) != 1) { pop_handlers (); return NULL; @@ -223,12 +267,15 @@ tiff_document_render_pixbuf (EvDocument *document, int page, double scale) pop_handlers (); scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, - width * scale, - height * scale, + width * rc->scale, + height * rc->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 +323,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 * @@ -284,6 +333,7 @@ tiff_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, gint size, gboolean border) { + EvRenderContext *rc; GdkPixbuf *pixbuf; gdouble w, h; @@ -291,9 +341,9 @@ tiff_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, page, &w, &h); - pixbuf = tiff_document_render_pixbuf (EV_DOCUMENT (document), - page, - size/w); + rc = ev_render_context_new (EV_ORIENTATION_PORTRAIT, page, size/w); + pixbuf = tiff_document_render_pixbuf (EV_DOCUMENT (document), rc); + g_object_unref (G_OBJECT (rc)); if (border) { @@ -336,4 +386,5 @@ static void tiff_document_init (TiffDocument *tiff_document) { tiff_document->n_pages = -1; + tiff_document->orientation = EV_ORIENTATION_PORTRAIT; }