]> www.fi.muni.cz Git - evince.git/blobdiff - backend/impress/impress-document.c
[impress] Fix build
[evince.git] / backend / impress / impress-document.c
index 7459dab168c02f246f9f6906a9d8ca61c8c37559..6942951ff0461b677b9ea75d37f7c7fe9df8a998 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
-#include <gtk/gtk.h>
+#include "config.h"
+
 #include <string.h>
+
+#include <glib/gi18n-lib.h>
+#include <gtk/gtk.h>
+
 #include "imposter.h"
 #include "impress-document.h"
-#include "ev-document-thumbnails.h"
+
 #include "ev-document-misc.h"
+#include "ev-document-thumbnails.h"
 
 struct _ImpressDocumentClass
 {
-  GObjectClass parent_class;
+  EvDocumentClass parent_class;
 };
 
 struct _ImpressDocument
 {
-  GObject parent_instance;
+  EvDocument parent_instance;
 
   ImpDoc *imp;
   ImpRenderCtx *ctx;
@@ -53,14 +59,12 @@ struct _ImpressDocument
 
 typedef struct _ImpressDocumentClass ImpressDocumentClass;
 
-static void impress_document_document_iface_init (EvDocumentIface *iface);
-static void impress_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
+static void impress_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (ImpressDocument, impress_document, G_TYPE_OBJECT,
-                         { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT,
-                                                 impress_document_document_iface_init);
-                          G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS,
-                                                 impress_document_document_thumbnails_iface_init);
+EV_BACKEND_REGISTER_WITH_CODE (ImpressDocument, impress_document,
+                        {
+                          EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS,
+                                                          impress_document_document_thumbnails_iface_init);
                         });
 
 /* Renderer */
@@ -285,18 +289,17 @@ impress_document_load (EvDocument  *document,
   /* FIXME: Could we actually load uris ? */
   filename = g_filename_from_uri (uri, NULL, error);
   if (!filename)
-    {
-      //FIXME
-      //g_error_set ();
-      return FALSE;
-    }
+    return FALSE;
 
   imp = imp_open (filename, &err);
+  g_free (filename);
 
   if (!imp)
     {
-      //FIXME translate the err, set error
-      g_free (filename);
+      g_set_error_literal (error,
+                           EV_DOCUMENT_ERROR,
+                           EV_DOCUMENT_ERROR_INVALID,
+                           _("Invalid document"));
       return FALSE;
     }
   impress_document->imp = imp;
@@ -306,9 +309,13 @@ impress_document_load (EvDocument  *document,
 
 static gboolean
 impress_document_save (EvDocument  *document,
-                     const char  *uri,
-                     GError     **error)
+                       const char  *uri,
+                       GError     **error)
 {
+        g_set_error_literal (error,
+                             EV_DOCUMENT_ERROR,
+                             EV_DOCUMENT_ERROR_INVALID,
+                             "Not supported");
        return FALSE;
 }
 
@@ -325,9 +332,9 @@ impress_document_get_n_pages (EvDocument  *document)
 
 static void
 impress_document_get_page_size (EvDocument   *document,
-                            int           page,
-                            double       *width,
-                            double       *height)
+                               EvPage       *page,
+                               double       *width,
+                               double       *height)
 {
   ImpressDocument *impress_document = IMPRESS_DOCUMENT (document);
 
@@ -348,8 +355,10 @@ imp_render_get_from_drawable (ImpressDocument *impress_document)
 
   g_return_val_if_fail (page != NULL, FALSE);
 
+  ev_document_doc_mutex_lock ();
   imp_context_set_page (impress_document->ctx, page);
   imp_render (impress_document->ctx, impress_document);
+  ev_document_doc_mutex_unlock ();
 
   impress_document->pixbuf = gdk_pixbuf_get_from_drawable (NULL,
                                         GDK_DRAWABLE (impress_document->pixmap),
@@ -363,141 +372,151 @@ imp_render_get_from_drawable (ImpressDocument *impress_document)
 }
 
 static GdkPixbuf *
-impress_document_render_pixbuf (EvDocument  *document,
+impress_document_render_pixbuf (EvDocument      *document,
                                EvRenderContext *rc)
 {
   ImpressDocument *impress_document = IMPRESS_DOCUMENT (document);
-  GdkPixbuf *scaled_pixbuf;
-
-  g_return_val_if_fail (IMPRESS_IS_DOCUMENT (document), 0);
-  g_return_val_if_fail (impress_document->imp != NULL, 0);
+  GdkPixbuf       *pixbuf;
 
-  impress_document->pagenum = rc->page;
+  g_return_val_if_fail (IMPRESS_IS_DOCUMENT (document), NULL);
+  g_return_val_if_fail (impress_document->imp != NULL, NULL);
+  
+  impress_document->pagenum = rc->page->index;
 
   g_mutex_lock (impress_document->mutex);
   impress_document->cond = g_cond_new ();
 
   ev_document_fc_mutex_unlock ();
+  ev_document_doc_mutex_unlock ();
   g_idle_add ((GSourceFunc) imp_render_get_from_drawable, impress_document);
   g_cond_wait (impress_document->cond, impress_document->mutex);
   g_cond_free (impress_document->cond);
+  ev_document_doc_mutex_lock ();
   ev_document_fc_mutex_lock ();
-
+  
   g_mutex_unlock (impress_document->mutex);
 
-  scaled_pixbuf = gdk_pixbuf_scale_simple (impress_document->pixbuf,
-                                          PAGE_WIDTH * rc->scale,
-                                          PAGE_HEIGHT * rc->scale,
-                                          GDK_INTERP_BILINEAR);
-  gdk_pixbuf_unref (impress_document->pixbuf);
+  pixbuf = impress_document->pixbuf;
   impress_document->pixbuf = NULL;
 
-  return scaled_pixbuf;
+  return pixbuf;
 }
 
-static void
-impress_document_finalize (GObject *object)
+static cairo_surface_t *
+impress_document_render (EvDocument      *document,
+                        EvRenderContext *rc)
 {
-  ImpressDocument *impress_document = IMPRESS_DOCUMENT (object);
+  GdkPixbuf *pixbuf;
+  cairo_surface_t *surface, *scaled_surface;
 
-  g_mutex_free (impress_document->mutex);
+  pixbuf = impress_document_render_pixbuf (document, rc);
+  
+  /* FIXME: impress backend should be ported to cairo */
+  surface = ev_document_misc_surface_from_pixbuf (pixbuf);
+  g_object_unref (pixbuf);
 
-  imp_close (impress_document->imp);
-  imp_delete_context (impress_document->ctx);
-  g_free (impress_document->pango_ctx);
-  g_object_unref (G_OBJECT (impress_document->pixmap));
-  g_object_unref (impress_document->gc);
+  scaled_surface = ev_document_misc_surface_rotate_and_scale (surface,
+                                                             (PAGE_WIDTH * rc->scale) + 0.5,
+                                                             (PAGE_HEIGHT * rc->scale) + 0.5,
+                                                             rc->rotation);
+  cairo_surface_destroy (surface);
 
-  G_OBJECT_CLASS (impress_document_parent_class)->finalize (object);
+  return scaled_surface;
 }
 
 static void
-impress_document_class_init (ImpressDocumentClass *klass)
+impress_document_finalize (GObject *object)
 {
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  ImpressDocument *impress_document = IMPRESS_DOCUMENT (object);
 
-  gobject_class->finalize = impress_document_finalize;
-}
+  if (impress_document->mutex)
+    g_mutex_free (impress_document->mutex);
 
-static gboolean
-impress_document_can_get_text (EvDocument *document)
-{
-  return FALSE;
-}
+  if (impress_document->imp)
+    imp_close (impress_document->imp);
 
-static EvDocumentInfo *
-impress_document_get_info (EvDocument *document)
-{
-  EvDocumentInfo *info;
+  if (impress_document->ctx)
+    imp_delete_context (impress_document->ctx);
+
+  if (impress_document->pango_ctx)
+    g_object_unref (impress_document->pango_ctx);
+
+  if (impress_document->pixmap)
+    g_object_unref (G_OBJECT (impress_document->pixmap));
 
-  info = g_new0 (EvDocumentInfo, 1);
-  info->fields_mask = 0;
+  if (impress_document->gc)
+    g_object_unref (impress_document->gc);
 
-  return info;
+  G_OBJECT_CLASS (impress_document_parent_class)->finalize (object);
 }
 
 static void
-impress_document_document_iface_init (EvDocumentIface *iface)
+impress_document_class_init (ImpressDocumentClass *klass)
 {
-  iface->load = impress_document_load;
-  iface->save = impress_document_save;
-  iface->can_get_text = impress_document_can_get_text;
-  iface->get_n_pages = impress_document_get_n_pages;
-  iface->get_page_size = impress_document_get_page_size;
-  iface->render_pixbuf = impress_document_render_pixbuf;
-  iface->get_info = impress_document_get_info;
+  GObjectClass    *gobject_class = G_OBJECT_CLASS (klass);
+  EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass);
+
+  gobject_class->finalize = impress_document_finalize;
+
+  ev_document_class->load = impress_document_load;
+  ev_document_class->save = impress_document_save;
+  ev_document_class->get_n_pages = impress_document_get_n_pages;
+  ev_document_class->get_page_size = impress_document_get_page_size;
+  ev_document_class->render = impress_document_render;
 }
 
 static GdkPixbuf *
 impress_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
-                                       gint                  page,
-                                       gint                  rotation,
-                                       gint                  size,
-                                       gboolean              border)
+                                          EvRenderContext      *rc, 
+                                          gboolean              border)
 {
-  GdkPixbuf *pixbuf = NULL;
-  gdouble w, h;
-  EvRenderContext *rc;
-
-  impress_document_get_page_size (EV_DOCUMENT (document),
-                              page,
-                              &w, &h);
+  GdkPixbuf *pixbuf;
+  GdkPixbuf *scaled_pixbuf;
 
-  rc = ev_render_context_new (rotation, page, size/w);
   pixbuf = impress_document_render_pixbuf (EV_DOCUMENT (document), rc);
-  g_object_unref (G_OBJECT (rc));
+  scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf,
+                                          (PAGE_WIDTH * rc->scale),
+                                          (PAGE_HEIGHT * rc->scale),
+                                          GDK_INTERP_BILINEAR);
+  g_object_unref (pixbuf);
 
   if (border)
     {
-      GdkPixbuf *tmp_pixbuf = pixbuf;
-      pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, 0, tmp_pixbuf);
+      GdkPixbuf *tmp_pixbuf = scaled_pixbuf;
+      
+      scaled_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, tmp_pixbuf);
       g_object_unref (tmp_pixbuf);
     }
 
-  return pixbuf;
+  return scaled_pixbuf;
 }
 
 static void
 impress_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
-                                        gint                  page,
-                                        gint                  suggested_width,
-                                        gint                 *width,
-                                        gint                 *height)
+                                           EvRenderContext      *rc,
+                                           gint                 *width,
+                                           gint                 *height)
 {
-  gdouble page_ratio;
-  gdouble w, h;
+  gdouble page_width, page_height;
 
   impress_document_get_page_size (EV_DOCUMENT (document),
-                              page,
-                              &w, &h);
-  g_return_if_fail (w > 0);
-  page_ratio = h/w;
-  *width = suggested_width;
-  *height = (gint) (suggested_width * page_ratio);
+                                 rc->page,
+                                 &page_width, &page_height);
+  
+  if (rc->rotation == 90 || rc->rotation == 270)
+    {
+      *width = (gint) (page_height * rc->scale);
+      *height = (gint) (page_width * rc->scale);
+    }
+  else
+    {
+      *width = (gint) (page_width * rc->scale);
+      *height = (gint) (page_height * rc->scale);
+    }
 }
 
 static void
-impress_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface)
+impress_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
 {
   iface->get_thumbnail = impress_document_thumbnails_get_thumbnail;
   iface->get_dimensions = impress_document_thumbnails_get_dimensions;
@@ -516,7 +535,7 @@ impress_document_init (ImpressDocument *impress_document)
   impress_document->pixmap = gdk_pixmap_new (window,
                                             PAGE_WIDTH, PAGE_HEIGHT, -1);
   impress_document->gc = gdk_gc_new (impress_document->pixmap);
-  impress_document->pango_ctx = gdk_pango_context_get ();
+  impress_document->pango_ctx = gdk_pango_context_get_for_screen (gdk_screen_get_default ());
 }
 
 /*