]> www.fi.muni.cz Git - evince.git/commitdiff
Add pixbuf backend.
authorAnders Carlsson <andersca@gnome.org>
Wed, 22 Dec 2004 17:20:51 +0000 (17:20 +0000)
committerAnders Carlsson <andersca@src.gnome.org>
Wed, 22 Dec 2004 17:20:51 +0000 (17:20 +0000)
2004-12-22  Anders Carlsson  <andersca@gnome.org>

* Makefile.am:
* configure.ac:
* pixbuf/Makefile.am:
* pixbuf/pixbuf-document.c: (G_DEFINE_TYPE_WITH_CODE),
(pixbuf_document_load), (pixbuf_document_get_n_pages),
(pixbuf_document_set_page), (pixbuf_document_get_page),
(pixbuf_document_set_target), (pixbuf_document_set_scale),
(pixbuf_document_set_page_offset), (pixbuf_document_get_page_size),
(pixbuf_document_render), (pixbuf_document_begin_find),
(pixbuf_document_end_find), (pixbuf_document_finalize),
(pixbuf_document_class_init),
(pixbuf_document_document_iface_init), (pixbuf_document_init):
* pixbuf/pixbuf-document.h:
* shell/Makefile.am:
* shell/ev-application.c: (ev_application_open):
* shell/ev-window.c: (mime_type_supported_by_gdk_pixbuf),
(ev_window_open):
Add pixbuf backend.

Makefile.am
configure.ac
pixbuf/Makefile.am [new file with mode: 0644]
pixbuf/pixbuf-document.c [new file with mode: 0644]
pixbuf/pixbuf-document.h [new file with mode: 0644]
shell/Makefile.am
shell/ev-application.c
shell/ev-window.c

index bc064af25205fa2192e5a9bc7a6884526fa28228..631f74b18a78be44029e3977e54cc5e4934b406a 100644 (file)
@@ -1,4 +1,4 @@
-SUBDIRS = cut-n-paste data backend po pdf dvi ps shell
+SUBDIRS = cut-n-paste data backend po pdf dvi ps pixbuf shell
 
 intltool_extra = intltool-extract.in intltool-merge.in intltool-update.in
 
index bce7729f0ddfda5bbb4b962a1f26000036236285..2e016539fb9f72e7d489a3aa3e17fbcd7e7feb69 100644 (file)
@@ -370,6 +370,7 @@ pdf/goo/Makefile
 pdf/fofi/Makefile
 pdf/splash/Makefile
 pdf/xpdf/Makefile
+pixbuf/Makefile
 ps/Makefile
 po/Makefile.in
 backend/Makefile
diff --git a/pixbuf/Makefile.am b/pixbuf/Makefile.am
new file mode 100644 (file)
index 0000000..68d87dc
--- /dev/null
@@ -0,0 +1,11 @@
+INCLUDES =                                                     \
+       -I$(top_srcdir)                                         \
+       -I$(top_srcdir)/backend                                 \
+       $(GTK_CFLAGS)                                           \
+       -DDATADIR=\""$(datadir)"\"
+
+noinst_LTLIBRARIES = libpixbufdocument.la
+
+libpixbufdocument_la_SOURCES = \
+       pixbuf-document.c               \
+       pixbuf-document.h
diff --git a/pixbuf/pixbuf-document.c b/pixbuf/pixbuf-document.c
new file mode 100644 (file)
index 0000000..c8efd2d
--- /dev/null
@@ -0,0 +1,229 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
+/* pixbuf-document.h: Implementation of EvDocument for PIXBUF
+ * Copyright (C) 2004, Anders Carlsson <andersca@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.
+ */
+
+#include "pixbuf-document.h"
+
+struct _PixbufDocumentClass
+{
+       GObjectClass parent_class;
+};
+
+struct _PixbufDocument
+{
+       GObject parent_instance;
+
+       GdkPixbuf *pixbuf;
+       GdkDrawable *target;
+       gdouble scale;
+
+       gint x_offset, y_offset;
+};
+
+typedef struct _PixbufDocumentClass PixbufDocumentClass;
+
+static void pixbuf_document_document_iface_init (EvDocumentIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (PixbufDocument, pixbuf_document, G_TYPE_OBJECT,
+                         { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT,
+                                                 pixbuf_document_document_iface_init) });
+
+static GObjectClass *parent_class;
+
+static gboolean
+pixbuf_document_load (EvDocument  *document,
+                     const char  *uri,
+                     GError     **error)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+       
+       gchar *filename;
+       GdkPixbuf *pixbuf;
+
+       /* FIXME: We could actually load uris  */
+       filename = g_filename_from_uri (uri, NULL, error);
+       if (!filename)
+               return FALSE;
+       
+       pixbuf = gdk_pixbuf_new_from_file (filename, error);
+
+       if (!pixbuf)
+               return FALSE;
+
+       pixbuf_document->pixbuf = pixbuf;
+       
+       return TRUE;
+}
+
+static int
+pixbuf_document_get_n_pages (EvDocument  *document)
+{
+       return 1;
+}
+
+static void
+pixbuf_document_set_page (EvDocument  *document,
+                         int          page)
+{
+       /* Do nothing */
+}
+
+static int
+pixbuf_document_get_page (EvDocument  *document)
+{
+       return 1;
+}
+
+static void
+pixbuf_document_set_target (EvDocument  *document,
+                           GdkDrawable *target)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+
+       pixbuf_document->target = target;
+}
+
+static void
+pixbuf_document_set_scale (EvDocument  *document,
+                          double       scale)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+
+       pixbuf_document->scale = scale;
+}
+
+static void
+pixbuf_document_set_page_offset (EvDocument  *document,
+                             int          x,
+                             int          y)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+
+       pixbuf_document->x_offset = x;
+       pixbuf_document->y_offset = y;
+}
+
+static void
+pixbuf_document_get_page_size (EvDocument   *document,
+                              int          *width,
+                              int          *height)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+
+       *width = gdk_pixbuf_get_width (pixbuf_document->pixbuf);
+       *height = gdk_pixbuf_get_height (pixbuf_document->pixbuf);
+}
+
+static void
+pixbuf_document_render (EvDocument  *document,
+                       int          clip_x,
+                       int          clip_y,
+                       int          clip_width,
+                       int          clip_height)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
+
+       if (pixbuf_document->scale == 1.0) {
+               gdk_draw_pixbuf (pixbuf_document->target, NULL, pixbuf_document->pixbuf,
+                                clip_x, clip_y,
+                                clip_x, clip_y,
+                                clip_width, clip_height, GDK_RGB_DITHER_NORMAL,
+                                0, 0);
+       }
+       else {
+               GdkPixbuf *tmp_pixbuf;
+
+               tmp_pixbuf = gdk_pixbuf_new (gdk_pixbuf_get_colorspace (pixbuf_document->pixbuf),
+                                            gdk_pixbuf_get_has_alpha (pixbuf_document->pixbuf),
+                                            gdk_pixbuf_get_bits_per_sample (pixbuf_document->pixbuf),
+                                            clip_width, clip_height);
+
+               gdk_pixbuf_scale (pixbuf_document->pixbuf, tmp_pixbuf, 0, 0, clip_width, clip_height,
+                                 clip_x * pixbuf_document->scale,
+                                 clip_y * pixbuf_document->scale,
+                                 pixbuf_document->scale, pixbuf_document->scale,
+                                 GDK_INTERP_BILINEAR);
+               
+               gdk_draw_pixbuf (pixbuf_document->target, NULL, tmp_pixbuf,
+                                0, 0,
+                                clip_x + pixbuf_document->x_offset,
+                                clip_y + pixbuf_document->y_offset,
+                                clip_width, clip_height, GDK_RGB_DITHER_NORMAL,
+                                0, 0);
+
+               g_object_unref (tmp_pixbuf);
+       }
+}
+
+static void
+pixbuf_document_begin_find (EvDocument   *document,
+                           const char   *search_string,
+                           gboolean      case_sensitive)
+{
+       
+}
+
+static void
+pixbuf_document_end_find (EvDocument   *document)
+{
+}
+
+static void
+pixbuf_document_finalize (GObject *object)
+{
+       PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (object);
+
+       g_object_unref (pixbuf_document->pixbuf);
+       
+       G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+pixbuf_document_class_init (PixbufDocumentClass *klass)
+{
+       GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+       parent_class = g_type_class_peek_parent (klass);
+       
+       gobject_class->finalize = pixbuf_document_finalize;
+}
+
+static void
+pixbuf_document_document_iface_init (EvDocumentIface *iface)
+{
+       iface->load = pixbuf_document_load;
+       iface->get_n_pages = pixbuf_document_get_n_pages;
+       iface->set_page = pixbuf_document_set_page;
+       iface->get_page = pixbuf_document_get_page;
+       iface->set_scale = pixbuf_document_set_scale;
+       iface->set_target = pixbuf_document_set_target;
+       iface->set_page_offset = pixbuf_document_set_page_offset;
+       iface->get_page_size = pixbuf_document_get_page_size;
+       iface->render = pixbuf_document_render;
+        iface->begin_find = pixbuf_document_begin_find;
+        iface->end_find = pixbuf_document_end_find;
+}
+
+static void
+pixbuf_document_init (PixbufDocument *pixbuf_document)
+{
+       pixbuf_document->scale = 1.0;
+
+       pixbuf_document->x_offset = 10;
+       pixbuf_document->y_offset = 10;
+}
diff --git a/pixbuf/pixbuf-document.h b/pixbuf/pixbuf-document.h
new file mode 100644 (file)
index 0000000..bddf94a
--- /dev/null
@@ -0,0 +1,38 @@
+/* pdfdocument.h: Implementation of EvDocument for pixbufs
+ * Copyright (C) 2004, Anders Carlsson <andersca@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * 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.
+ */
+
+#ifndef __PIXBUF_DOCUMENT_H__
+#define __PIXBUF_DOCUMENT_H__
+
+#include "ev-document.h"
+
+G_BEGIN_DECLS
+
+#define PIXBUF_TYPE_DOCUMENT             (pixbuf_document_get_type ())
+#define PIXBUF_DOCUMENT(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIXBUF_TYPE_DOCUMENT, PixbufDocument))
+#define PIXBUF_IS_DOCUMENT(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIXBUF_TYPE_DOCUMENT))
+
+typedef struct _PixbufDocument PixbufDocument;
+
+PixbufDocument *pixbuf_document_new       (void);
+
+GType        pixbuf_document_get_type  (void) G_GNUC_CONST;
+     
+G_END_DECLS
+
+#endif /* __PIXBUF_DOCUMENT_H__ */
index d51abd14d2a88d5749b5d114db244f7300df7b18..a36511ae51980819b43dd8170e2b06f4e4103431 100644 (file)
@@ -5,6 +5,7 @@ INCLUDES=                                       \
        -I$(top_srcdir)/lib                     \
        -I$(top_srcdir)/backend                 \
        -I$(top_srcdir)/pdf/xpdf                \
+       -I$(top_srcdir)/pixbuf                  \
        -I$(top_srcdir)/ps                      \
        -DGNOMELOCALEDIR=\"$(datadir)/locale\"  \
        -DGNOMEICONDIR=\""$(datadir)/pixmaps"\" \
@@ -41,6 +42,7 @@ evince_LDADD=                                         \
        $(SHELL_LIBS)                                   \
        $(top_builddir)/backend/libevbackend.la         \
        $(top_builddir)/pdf/xpdf/libpdfdocument.la      \
+       $(top_builddir)/pixbuf/libpixbufdocument.la     \
        $(top_builddir)/ps/libgtkgs.la                  \
        $(NULL)
 
index 541b87ec02f3845689a93a72365db7d8b1c438b8..4f006cc5f1732bf86bfc575e0659bd016af9eca6 100644 (file)
@@ -115,8 +115,7 @@ ev_application_open (EvApplication *application, GError *err)
 {
        EvWindow *ev_window;
        GtkWidget *chooser;
-       GtkFileFilter *both_filter, *pdf_filter, *ps_filter, *all_filter;
-
+       GtkFileFilter *both_filter, *pdf_filter, *ps_filter, *pixbuf_filter, *all_filter;
 
        ev_window = ev_application_get_empty_window (application);
 
@@ -145,11 +144,16 @@ ev_application_open (EvApplication *application, GError *err)
        gtk_file_filter_add_mime_type (pdf_filter, "application/pdf");
        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pdf_filter);
 
+       pixbuf_filter = gtk_file_filter_new ();
+       gtk_file_filter_set_name (pixbuf_filter, _("Images"));
+       gtk_file_filter_add_pixbuf_formats (pixbuf_filter);
+       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pixbuf_filter);
+       
        all_filter = gtk_file_filter_new ();
        gtk_file_filter_set_name (all_filter, _("All Files"));
        gtk_file_filter_add_pattern (all_filter, "*");
        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_filter);
-
+       
        gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), both_filter);
 
        if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) {
index b23a1a6e8bb714d3fdd7f35139c76f4e308aa9d1..19a0c52b5d3995054b916e05ff782f5bc547b1cf 100644 (file)
@@ -36,6 +36,7 @@
 #include "eggfindbar.h"
 
 #include "pdf-document.h"
+#include "pixbuf-document.h"
 #include "gtkgs.h"
 
 #include <glib/gi18n.h>
@@ -205,6 +206,44 @@ unable_to_load (EvWindow   *ev_window,
        gtk_widget_destroy (dialog);
 }
 
+/* Would be nice to have this in gdk-pixbuf */
+static gboolean
+mime_type_supported_by_gdk_pixbuf (const gchar *mime_type)
+{
+       GSList *formats, *list;
+       gboolean retval = FALSE;
+       
+       formats = gdk_pixbuf_get_formats ();
+       
+       list = formats;
+       while (list) {
+               GdkPixbufFormat *format = list->data;
+               int i;
+               gchar **mime_types;
+               
+               if (gdk_pixbuf_format_is_disabled (format))
+                       continue;
+
+               mime_types = gdk_pixbuf_format_get_mime_types (format);
+               
+               for (i = 0; mime_types[i] != NULL; i++) {
+                       if (strcmp (mime_types[i], mime_type) == 0) {
+                               retval = TRUE;
+                               break;
+                       }
+               }
+               
+               if (retval)
+                       break;
+               
+               list = list->next;
+       }
+       
+       g_slist_free (formats);
+
+       return retval;
+}
+
 void
 ev_window_open (EvWindow *ev_window, const char *uri)
 {
@@ -217,7 +256,9 @@ ev_window_open (EvWindow *ev_window, const char *uri)
                document = g_object_new (PDF_TYPE_DOCUMENT, NULL);
        else if (!strcmp (mime_type, "application/postscript"))
                document = g_object_new (GTK_GS_TYPE, NULL);
-
+       else if (mime_type_supported_by_gdk_pixbuf (mime_type))
+               document = g_object_new (PIXBUF_TYPE_DOCUMENT, NULL);
+       
        if (document) {
                GError *error = NULL;