]> www.fi.muni.cz Git - evince.git/blobdiff - tiff/tiff-document.c
Text search in djvu. Fix for the bug #303415.
[evince.git] / tiff / tiff-document.c
index f2ed498651d58e51232608a3b474025ead415e0e..9f465a7c5fc2293aa381cec4e530edc5e30fa259 100644 (file)
@@ -1,4 +1,3 @@
-
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
 /*
  * Copyright (C) 2005, Jonathan Blandford <jrb@gnome.org>
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/* FIXME: Shoudl probably buffer calls to libtiff with TIFFSetWarningHandler
+/* FIXME: Should probably buffer calls to libtiff with TIFFSetWarningHandler
  */
+
+#include <stdio.h>
+#include <glib.h>
+
 #include "tiffio.h"
+#include "tiff2ps.h"
 #include "tiff-document.h"
-#include "ev-document-thumbnails.h"
 #include "ev-document-misc.h"
+#include "ev-document-thumbnails.h"
+#include "ev-ps-exporter.h"
 
 struct _TiffDocumentClass
 {
@@ -36,19 +41,24 @@ struct _TiffDocument
 
   TIFF *tiff;
   gint n_pages;
-  EvOrientation orientation;
+  TIFF2PSContext *ps_export_ctx;
+  
+  gchar *uri;
 };
 
 typedef struct _TiffDocumentClass TiffDocumentClass;
 
 static void tiff_document_document_iface_init (EvDocumentIface *iface);
 static void tiff_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
+static void tiff_document_document_ps_exporter_iface_init (EvPSExporterIface *iface);
 
 G_DEFINE_TYPE_WITH_CODE (TiffDocument, tiff_document, G_TYPE_OBJECT,
                          { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT,
                                                  tiff_document_document_iface_init);
                           G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS,
                                                  tiff_document_document_thumbnails_iface_init);
+                          G_IMPLEMENT_INTERFACE (EV_TYPE_PS_EXPORTER,
+                                                 tiff_document_document_ps_exporter_iface_init);
                         });
 
 static TIFFErrorHandler orig_error_handler = NULL;
@@ -78,7 +88,6 @@ tiff_document_load (EvDocument  *document,
   TIFF *tiff;
 
   push_handlers ();
-  /* FIXME: We could actually load uris  */
   filename = g_filename_from_uri (uri, NULL, error);
   if (!filename)
     {
@@ -90,7 +99,7 @@ tiff_document_load (EvDocument  *document,
   if (tiff)
     {
       guint32 w, h;
-      
+      /* FIXME: unused data? why bother here */
       TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &w);
       TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &h);
     }
@@ -100,6 +109,9 @@ tiff_document_load (EvDocument  *document,
       return FALSE;
     }
   tiff_document->tiff = tiff;
+  g_free (tiff_document->uri);
+  g_free (filename);
+  tiff_document->uri = g_strdup (uri);
 
   pop_handlers ();
   return TRUE;
@@ -109,8 +121,10 @@ static gboolean
 tiff_document_save (EvDocument  *document,
                      const char  *uri,
                      GError     **error)
-{
-       return FALSE;
+{              
+       TiffDocument *tiff_document = TIFF_DOCUMENT (document);
+
+       return ev_xfer_uri_simple (tiff_document->uri, uri, error); 
 }
 
 static int
@@ -143,6 +157,7 @@ tiff_document_get_page_size (EvDocument   *document,
                             double       *height)
 {
   guint32 w, h;
+  gfloat x_res, y_res;
   TiffDocument *tiff_document = TIFF_DOCUMENT (document);
 
   g_return_if_fail (TIFF_IS_DOCUMENT (document));
@@ -157,51 +172,14 @@ tiff_document_get_page_size (EvDocument   *document,
 
   TIFFGetField (tiff_document->tiff, TIFFTAG_IMAGEWIDTH, &w);
   TIFFGetField (tiff_document->tiff, TIFFTAG_IMAGELENGTH, &h);
+  TIFFGetField (tiff_document->tiff, TIFFTAG_XRESOLUTION, &x_res);
+  TIFFGetField (tiff_document->tiff, TIFFTAG_YRESOLUTION, &y_res);
+  h = h * (x_res / y_res);
 
-  if (tiff_document->orientation == EV_ORIENTATION_PORTRAIT ||
-      tiff_document->orientation ==  EV_ORIENTATION_UPSIDEDOWN) {
-    *width = w;
-    *height = h;
-  } else {
-    *width = h;
-    *height = w;
-  }
-  pop_handlers ();
-}
+  *width = w;
+  *height = h;
 
-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);
-       }
+  pop_handlers ();
 }
 
 static GdkPixbuf *
@@ -210,6 +188,7 @@ tiff_document_render_pixbuf (EvDocument      *document,
 {
   TiffDocument *tiff_document = TIFF_DOCUMENT (document);
   int width, height;
+  float x_res, y_res;
   gint rowstride, bytes;
   guchar *pixels = NULL;
   GdkPixbuf *pixbuf;
@@ -238,6 +217,18 @@ tiff_document_render_pixbuf (EvDocument      *document,
       return NULL;
     }
 
+  if (!TIFFGetField (tiff_document->tiff, TIFFTAG_XRESOLUTION, &x_res))
+    {
+      pop_handlers ();
+      return NULL;
+    }
+
+  if (! TIFFGetField (tiff_document->tiff, TIFFTAG_YRESOLUTION, &y_res))
+    {
+      pop_handlers ();
+      return NULL;
+    }
+
   pop_handlers ();
 
   /* Sanity check the doc */
@@ -268,11 +259,11 @@ tiff_document_render_pixbuf (EvDocument      *document,
 
   scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf,
                                           width * rc->scale,
-                                          height * rc->scale,
+                                          height * rc->scale * (x_res/y_res),
                                           GDK_INTERP_BILINEAR);
   g_object_unref (pixbuf);
 
-  rotated_pixbuf = rotate_pixbuf (document, scaled_pixbuf);
+  rotated_pixbuf = gdk_pixbuf_rotate_simple (scaled_pixbuf, 360 - rc->rotation);
   g_object_unref (scaled_pixbuf);
 
   return rotated_pixbuf;
@@ -284,6 +275,7 @@ tiff_document_finalize (GObject *object)
        TiffDocument *tiff_document = TIFF_DOCUMENT (object);
 
        TIFFClose (tiff_document->tiff);
+       g_free (tiff_document->uri);
 
        G_OBJECT_CLASS (tiff_document_parent_class)->finalize (object);
 }
@@ -323,13 +315,12 @@ 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 *
 tiff_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
                                        gint                  page,
+                                       gint                  rotation,
                                        gint                  size,
                                        gboolean              border)
 {
@@ -341,14 +332,14 @@ tiff_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
                               page,
                               &w, &h);
 
-  rc = ev_render_context_new (EV_ORIENTATION_PORTRAIT, page, size/w);
+  rc = ev_render_context_new (rotation, page, size/w);
   pixbuf = tiff_document_render_pixbuf (EV_DOCUMENT (document), rc);
   g_object_unref (G_OBJECT (rc));
 
   if (border)
     {
       GdkPixbuf *tmp_pixbuf = pixbuf;
-      pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, tmp_pixbuf);
+      pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, 0, tmp_pixbuf);
       g_object_unref (tmp_pixbuf);
     }
 
@@ -381,10 +372,51 @@ tiff_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface)
   iface->get_dimensions = tiff_document_thumbnails_get_dimensions;
 }
 
+/* postscript exporter implementation */
+
+static void
+tiff_document_ps_export_begin (EvPSExporter *exporter, const char *filename,
+                              int first_page, int last_page,
+                              double width, double height, gboolean duplex)
+{
+       TiffDocument *document = TIFF_DOCUMENT (exporter);
+
+       document->ps_export_ctx = tiff2ps_context_new(filename);
+}
+
+static void
+tiff_document_ps_export_do_page (EvPSExporter *exporter, EvRenderContext *rc)
+{
+       TiffDocument *document = TIFF_DOCUMENT (exporter);
+
+       if (document->ps_export_ctx == NULL)
+               return;
+       if (TIFFSetDirectory (document->tiff, rc->page) != 1)
+               return;
+       tiff2ps_process_page (document->ps_export_ctx, document->tiff,
+                             0, 0, 0, 0, 0);
+}
+
+static void
+tiff_document_ps_export_end (EvPSExporter *exporter)
+{
+       TiffDocument *document = TIFF_DOCUMENT (exporter);
+
+       if (document->ps_export_ctx == NULL)
+               return;
+       tiff2ps_context_finalize(document->ps_export_ctx);
+}
+
+static void
+tiff_document_document_ps_exporter_iface_init (EvPSExporterIface *iface)
+{
+       iface->begin = tiff_document_ps_export_begin;
+       iface->do_page = tiff_document_ps_export_do_page;
+       iface->end = tiff_document_ps_export_end;
+}
 
 static void
 tiff_document_init (TiffDocument *tiff_document)
 {
   tiff_document->n_pages = -1;
-  tiff_document->orientation = EV_ORIENTATION_PORTRAIT;
 }