Patch for document types, take 3



My patch from a week ago has bit-rotted somewhat.

Attached is an updated version of the patch and the two new files.

I fixed things to track changes in CVS, and renamed things so it uses
ev_document_type_foo/EvDocumentType, rather than
evince_document_type_foo/EvinceDocumentType (as pointed out by marco on
IRC).

OK to commit this?
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
/*
 *  Copyright (C) 2005, Red Hat, Inc. 
 *
 *  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.
 *
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "ev-document-types.h"

/* The various document type backends: */
#include "ev-poppler.h"
#include "pixbuf-document.h"
#include "ps-document.h"
#ifdef ENABLE_DVI
#include "dvi-document.h"
#endif
#ifdef ENABLE_DJVU
#include "djvu-document.h"
#endif

#include <string.h>

struct _EvDocumentType
{
	const char *mime_type;
	GType (*document_type_factory_callback)();
	const char *overlaid_thumbnail_icon;
};

const EvDocumentType document_types[] = {
	/* PDF: */
	{"application/pdf",            pdf_document_get_type,  "pdf-icon.png"},

	/* Postscript: */
	{"application/postscript",     ps_document_get_type,   NULL},
	{"application/x-gzpostscript", ps_document_get_type,   NULL},
	{"image/x-eps",                ps_document_get_type,   NULL},

#ifdef ENABLE_DJVU
	/* djvu: */
	{"image/vnd.djvu",             djvu_document_get_type, NULL),
#endif		

#ifdef ENABLE_DVI
	/* dvi: */
	{"application/x-dvi",          dvi_document_get_type,  NULL},
#endif
};

const EvDocumentType evince_gdk_pixbuf_type = {NULL, pixbuf_document_get_type, NULL};

/* 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;
}

const EvDocumentType* 
ev_document_type_lookup (const char *mime_type)
{
	int i;

	g_return_val_if_fail (mime_type, NULL);

	for (i=0;i<G_N_ELEMENTS (document_types);i++) {
		if (0==strcmp(mime_type, document_types[i].mime_type)) {
			return &document_types[i];
		}
	}

	if (mime_type_supported_by_gdk_pixbuf (mime_type)) {
		return &evince_gdk_pixbuf_type;
	}

	return NULL;
}

EvDocument* 
ev_document_type_manufacture_instance (const EvDocumentType *document_type)
{
	EvDocument *new_document;

	g_return_val_if_fail (document_type, NULL);

	g_assert (document_type->document_type_factory_callback);
	new_document = g_object_new (document_type->document_type_factory_callback(), NULL);

	g_assert (EV_IS_DOCUMENT (new_document));

	return new_document;
}

const char* 
ev_document_type_get_overlaid_thumbnail_icon (const EvDocumentType *document_type)
{
	g_return_val_if_fail (document_type, NULL);

	return document_type->overlaid_thumbnail_icon;
}



/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
/*
 *  Copyright (C) 2005, Red Hat, Inc. 
 *
 *  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 EV_DOCUMENT_TYPES_H
#define EV_DOCUMENT_TYPES_H

#include "ev-document.h"

G_BEGIN_DECLS

typedef struct _EvDocumentType EvDocumentType;

const EvDocumentType* ev_document_type_lookup (const char *mime_type);

EvDocument* ev_document_type_manufacture_instance        (const EvDocumentType *document_type);
const char* ev_document_type_get_overlaid_thumbnail_icon (const EvDocumentType *document_type);

G_END_DECLS

#endif
? fix-warnings.patch
? get-pixbuf-working.patch
? shell/ev-document-types.c
? shell/ev-document-types.h
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evince/ChangeLog,v
retrieving revision 1.304
diff -u -p -r1.304 ChangeLog
--- ChangeLog	18 Apr 2005 15:14:17 -0000	1.304
+++ ChangeLog	18 Apr 2005 17:55:14 -0000
@@ -1,3 +1,21 @@
+2005-04-18  David Malcolm  <dmalcolm redhat com>
+
+	* shell/ev-document-types.h: 
+	* shell/ev-document-types.c: 
+	New files, handling the mapping from mimetypes to backends
+	
+	* shell/ev-window.c: 
+	* thumbnailer/evince-thumbnailer.c:	
+	Use the ev-document-types code
+	
+	* shell/Makefile.am: 
+	Added new convenience library libevbackendfactory_la, containing
+	the new mimetype->backend logic; moved the backends into it.
+
+	* thumbnailer/Makefile.am:
+	Make the thumbnailer link with the libevbackend.la convenience
+	library, rather than having a duplicate of the backend logic here.
+
 2005-04-18  Paolo Borelli  <pborelli katamail com>
 
 	* shell/ev-stock-icons.c: constify some vars.
Index: shell/Makefile.am
===================================================================
RCS file: /cvs/gnome/evince/shell/Makefile.am,v
retrieving revision 1.29
diff -u -p -r1.29 Makefile.am
--- shell/Makefile.am	17 Apr 2005 14:35:12 -0000	1.29
+++ shell/Makefile.am	18 Apr 2005 17:55:14 -0000
@@ -18,6 +18,34 @@ INCLUDES=						\
 	$(NULL)
 
 bin_PROGRAMS=evince
+noinst_LTLIBRARIES = libevbackendfactory.la
+
+libevbackendfactory_la_SOURCES=         		\
+	ev-document-types.c				\
+	ev-document-types.h
+
+libevbackendfactory_la_LIBADD = 			\
+	$(top_builddir)/pdf/libpdfdocument.la	 	\
+	$(top_builddir)/pixbuf/libpixbufdocument.la	\
+	$(top_builddir)/ps/libgtkgs.la			\
+	$(top_builddir)/backend/libevbackend.la		\
+	$(NULL)
+
+if ENABLE_DJVU
+libevbackendfactory_la_LIBADD += 		\
+	$(top_builddir)/djvu/libgtkdjvu.la	\
+	$(NULL)
+endif
+
+if ENABLE_DVI
+libevbackendfactory_la_LIBADD += 		\
+	$(top_builddir)/dvi/libgtkdvi.la	\
+	$(NULL)
+endif
+
+if WITH_TYPE1_FONTS
+libevbackendfactory_la_LIBADD += -lt1lib
+endif
 
 evince_SOURCES=				\
 	dummy.cc			\
@@ -58,23 +86,8 @@ evince_LDADD=							\
 	$(SHELL_LIBS)						\
 	$(top_builddir)/cut-n-paste/recent-files/librecent.la	\
 	$(top_builddir)/lib/libev.la				\
-	$(top_builddir)/pdf/libpdfdocument.la	 		\
-	$(top_builddir)/pixbuf/libpixbufdocument.la		\
-	$(top_builddir)/ps/libgtkgs.la				\
-	$(top_builddir)/backend/libevbackend.la			\
-	$(NULL)
-
-if ENABLE_DJVU
-evince_LDADD += 				\
-	$(top_builddir)/djvu/libgtkdjvu.la	\
+	libevbackendfactory.la					\
 	$(NULL)
-endif
-
-if ENABLE_DVI
-evince_LDADD += 				\
-	$(top_builddir)/dvi/libgtkdvi.la	\
-	$(NULL)
-endif
 
 BUILT_SOURCES = ev-marshal.h ev-marshal.c
 
Index: shell/ev-window.c
===================================================================
RCS file: /cvs/gnome/evince/shell/ev-window.c,v
retrieving revision 1.106
diff -u -p -r1.106 ev-window.c
--- shell/ev-window.c	18 Apr 2005 14:45:18 -0000	1.106
+++ shell/ev-window.c	18 Apr 2005 17:55:14 -0000
@@ -39,6 +39,7 @@
 #include "ev-print-job.h"
 #include "ev-document-thumbnails.h"
 #include "ev-document-links.h"
+#include "ev-document-types.h"
 #include "ev-document-find.h"
 #include "ev-document-security.h"
 #include "ev-job-queue.h"
@@ -47,16 +48,6 @@
 #include "egg-recent-view.h"
 #include "egg-recent-model.h"
 
-#include "ev-poppler.h"
-#include "pixbuf-document.h"
-#include "ps-document.h"
-#ifdef ENABLE_DVI
-#include "dvi-document.h"
-#endif
-#ifdef ENABLE_DJVU
-#include "djvu-document.h"
-#endif
-
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include <gnome.h>
@@ -398,44 +389,6 @@ 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;
-}
-
 static void
 update_window_title (EvDocument *document, GParamSpec *pspec, EvWindow *ev_window)
 {
@@ -709,33 +662,6 @@ start_loading_document (EvWindow   *ev_w
 	return FALSE;
 }
 
-static gboolean
-is_file_supported (const gchar *mime_type)
-{
-	static const char * const supported_types [] = {
-		"application/pdf",
-		"application/postscript",
-		"application/x-dvi",
-		"image/vnd.djvu",
-		"application/x-gzpostscript",
-		"image/x-eps",
-		NULL
-	};
-	gint   i;
-
-	g_return_val_if_fail (mime_type != NULL, FALSE);
-
-	if (mime_type_supported_by_gdk_pixbuf (mime_type))
-		return TRUE;
-	
-	for (i = 0; supported_types[i] != NULL; i++) {
-		if (g_ascii_strcasecmp (mime_type, supported_types[i]) == 0)
-			return TRUE;
-	}
-	
-	return FALSE;
-}
-
 void
 ev_window_open (EvWindow *ev_window, const char *uri)
 {
@@ -749,22 +675,13 @@ ev_window_open (EvWindow *ev_window, con
 
 	if (mime_type == NULL)
 		document = NULL;
-	else if (!strcmp (mime_type, "application/pdf"))
-		document = g_object_new (PDF_TYPE_DOCUMENT, NULL);
-	else if (!strcmp (mime_type, "application/postscript") ||
-		 !strcmp (mime_type, "application/x-gzpostscript") ||
-		 !strcmp (mime_type, "image/x-eps"))
-		document = g_object_new (PS_TYPE_DOCUMENT, NULL);
-#ifdef ENABLE_DJVU
-	else if (!strcmp (mime_type, "image/vnd.djvu"))
-		document = g_object_new (DJVU_TYPE_DOCUMENT, NULL);
-#endif		
-	else if (mime_type_supported_by_gdk_pixbuf (mime_type))
-		document = g_object_new (PIXBUF_TYPE_DOCUMENT, NULL);
-#ifdef ENABLE_DVI
-	else if (!strcmp (mime_type, "application/x-dvi"))
-		document = g_object_new (DVI_TYPE_DOCUMENT, NULL);
-#endif
+	else {
+		const EvDocumentType *document_type = ev_document_type_lookup (mime_type);
+
+		if (document_type) {
+			document = ev_document_type_manufacture_instance (document_type);
+		}
+	}
 
 	if (document) {
 		start_loading_document (ev_window, document, uri);
@@ -797,7 +714,7 @@ ev_window_open_uri_list (EvWindow *ev_wi
 		uri = gnome_vfs_uri_to_string (list->data, GNOME_VFS_URI_HIDE_NONE);
 		mime_type = gnome_vfs_get_mime_type (uri);
 		
-		if (is_file_supported (mime_type)) {
+		if (ev_document_type_lookup (mime_type)!=NULL) {
 			if (ev_window_is_empty (EV_WINDOW (ev_window))) {
 				ev_window_open (ev_window, uri);
 				
Index: thumbnailer/Makefile.am
===================================================================
RCS file: /cvs/gnome/evince/thumbnailer/Makefile.am,v
retrieving revision 1.2
diff -u -p -r1.2 Makefile.am
--- thumbnailer/Makefile.am	3 Apr 2005 00:01:48 -0000	1.2
+++ thumbnailer/Makefile.am	18 Apr 2005 17:55:14 -0000
@@ -7,6 +7,7 @@ INCLUDES=					\
 	-I$(top_srcdir)/lib			\
 	-I$(top_srcdir)/pdf			\
 	-I$(top_srcdir)/backend			\
+	-I$(top_srcdir)/shell			\
 	-DGNOMELOCALEDIR=\"$(datadir)/locale\"	\
 	-DGNOMEICONDIR=\""$(datadir)/pixmaps"\" \
 	$(THUMBNAILER_CFLAGS)			\
@@ -19,11 +20,10 @@ evince_thumbnailer_SOURCES=	\
 	evince-thumbnailer.c
 	$(NULL)
 
-evince_thumbnailer_LDADD=						\
-	$(THUMBNAILER_LIBS)					\
+evince_thumbnailer_LDADD=				\
+	$(THUMBNAILER_LIBS)				\
 	$(top_builddir)/lib/libev.la			\
-	$(top_builddir)/pdf/libpdfdocument.la	 	\
-	$(top_builddir)/backend/libevbackend.la		\
+	$(top_builddir)/shell/libevbackendfactory.la	\
 	$(NULL)
 
 pixmapdir = $(pkgdatadir)
Index: thumbnailer/evince-thumbnailer.c
===================================================================
RCS file: /cvs/gnome/evince/thumbnailer/evince-thumbnailer.c,v
retrieving revision 1.7
diff -u -p -r1.7 evince-thumbnailer.c
--- thumbnailer/evince-thumbnailer.c	16 Apr 2005 15:05:49 -0000	1.7
+++ thumbnailer/evince-thumbnailer.c	18 Apr 2005 17:55:14 -0000
@@ -16,14 +16,13 @@
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-#include <ev-poppler.h>
-
 #include <libgnomevfs/gnome-vfs-mime-utils.h>
 #include <libgnomevfs/gnome-vfs-uri.h>
 #include <libgnomevfs/gnome-vfs-utils.h>
 #include <libgnomevfs/gnome-vfs-init.h>
 
 #include <ev-document.h>
+#include <ev-document-types.h>
 #include <ev-document-thumbnails.h>
 
 #include <string.h>
@@ -37,16 +36,18 @@ evince_thumbnail_pngenc_get (const char 
 	char *mime_type;
 	GError *error = NULL;
 	GdkPixbuf *pixbuf;
+	const EvDocumentType* document_type;
 
 	mime_type = gnome_vfs_get_mime_type (uri);
 	if (mime_type == NULL)
 		return FALSE;
 
-	if (!strcmp (mime_type, "application/pdf"))
-		document = g_object_new (PDF_TYPE_DOCUMENT, NULL);
-	else
+	document_type = ev_document_type_lookup (mime_type);
+	if (document_type==NULL)
 		return FALSE;
 
+	document = ev_document_type_manufacture_instance (document_type);
+
 	if (!ev_document_load (document, uri, &error)) {
 		if (error->domain == EV_DOCUMENT_ERROR &&
             	    error->code == EV_DOCUMENT_ERROR_ENCRYPTED) {
@@ -56,30 +57,41 @@ evince_thumbnail_pngenc_get (const char 
 		return FALSE;
 	}
 
+	if (!EV_IS_DOCUMENT_THUMBNAILS (document)) {
+		return FALSE;
+	}
+
 	pixbuf = ev_document_thumbnails_get_thumbnail
 			(EV_DOCUMENT_THUMBNAILS (document), 1, size, FALSE);
 	
 	if (pixbuf != NULL) {
-		GdkPixbuf *pdflogo;
-
-		pdflogo = gdk_pixbuf_new_from_file (DATADIR"/pdf-icon.png", NULL);
-		if (pdflogo != NULL) {
-			int delta_height, delta_width;
-
-			delta_width = gdk_pixbuf_get_width (pixbuf) -
-			              gdk_pixbuf_get_width (pdflogo);
-			delta_height = gdk_pixbuf_get_height (pixbuf) -
-			               gdk_pixbuf_get_height (pdflogo);
-
-			gdk_pixbuf_composite (pdflogo, pixbuf,
-					      delta_width, delta_height,
-					      gdk_pixbuf_get_width (pdflogo),
-					      gdk_pixbuf_get_height (pdflogo),
-					      delta_width, delta_height,
-					      1, 1,
-					      GDK_INTERP_NEAREST, 100);
+		const char *overlaid_icon_name;
 
-			gdk_pixbuf_unref  (pdflogo);
+		overlaid_icon_name = ev_document_type_get_overlaid_thumbnail_icon (document_type);		
+		if (overlaid_icon_name) {
+			GdkPixbuf *overlaid_pixbuf;
+
+			gchar *overlaid_icon_path = g_strdup_printf ("%s/%s", DATADIR, overlaid_icon_name);
+			overlaid_pixbuf = gdk_pixbuf_new_from_file (overlaid_icon_path, NULL);
+			g_free (overlaid_icon_path);
+			if (overlaid_pixbuf != NULL) {
+				int delta_height, delta_width;
+				
+				delta_width = gdk_pixbuf_get_width (pixbuf) -
+					gdk_pixbuf_get_width (overlaid_pixbuf);
+				delta_height = gdk_pixbuf_get_height (pixbuf) -
+					gdk_pixbuf_get_height (overlaid_pixbuf);
+				
+				gdk_pixbuf_composite (overlaid_pixbuf, pixbuf,
+						      delta_width, delta_height,
+						      gdk_pixbuf_get_width (overlaid_pixbuf),
+						      gdk_pixbuf_get_height (overlaid_pixbuf),
+						      delta_width, delta_height,
+						      1, 1,
+						      GDK_INTERP_NEAREST, 100);
+				
+				gdk_pixbuf_unref  (overlaid_pixbuf);
+			}
 		}
 		if (gdk_pixbuf_save (pixbuf, thumbnail, "png", NULL, NULL)) {
 			gdk_pixbuf_unref  (pixbuf);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]