1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
2 /*
3  *  Copyright (C) 2004 Anders Carlsson <andersca@gnome.org>
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #include <config.h>
22 
23 #include "ev-utils.h"
24 #include "ev-file-helpers.h"
25 
26 #include <string.h>
27 #include <glib/gi18n.h>
28 
29 void
file_chooser_dialog_add_writable_pixbuf_formats(GtkFileChooser * chooser)30 file_chooser_dialog_add_writable_pixbuf_formats (GtkFileChooser *chooser)
31 {
32 	GSList *pixbuf_formats = NULL;
33 	GSList *iter;
34 	GtkFileFilter *filter;
35 	int i;
36 
37 	filter = gtk_file_filter_new();
38 	gtk_file_filter_set_name (filter, _("By extension"));
39 	g_object_set_data (G_OBJECT(filter), "pixbuf-format", NULL);
40 	gtk_file_chooser_add_filter (chooser, filter);
41 
42 	pixbuf_formats = gdk_pixbuf_get_formats ();
43 
44 	for (iter = pixbuf_formats; iter; iter = iter->next) {
45 		GdkPixbufFormat *format = iter->data;
46 
47 	        gchar *description, *name, *extensions;
48 		gchar **extension_list, **mime_types;
49 
50 		if (gdk_pixbuf_format_is_disabled (format) ||
51 	    	    !gdk_pixbuf_format_is_writable (format))
52 		            continue;
53 
54 	        name = gdk_pixbuf_format_get_description (format);
55 	        extension_list = gdk_pixbuf_format_get_extensions (format);
56 	        extensions = g_strjoinv (", ", extension_list);
57 		g_strfreev (extension_list);
58 		description = g_strdup_printf ("%s (%s)", name, extensions);
59 
60 		filter = gtk_file_filter_new ();
61 		gtk_file_filter_set_name (filter, description);
62 		g_object_set_data (G_OBJECT (filter), "pixbuf-format", format);
63 		gtk_file_chooser_add_filter (chooser, filter);
64 
65 		g_free (description);
66 		g_free (extensions);
67 		g_free (name);
68 
69 		mime_types = gdk_pixbuf_format_get_mime_types (format);
70 		for (i = 0; mime_types[i] != 0; i++)
71 			gtk_file_filter_add_mime_type (filter, mime_types[i]);
72 		g_strfreev (mime_types);
73 	}
74 
75 	g_slist_free (pixbuf_formats);
76 }
77 
78 GdkPixbufFormat*
get_gdk_pixbuf_format_by_extension(gchar * uri)79 get_gdk_pixbuf_format_by_extension (gchar *uri)
80 {
81 	GSList *pixbuf_formats = NULL;
82 	GSList *iter;
83 	int i;
84 
85 	pixbuf_formats = gdk_pixbuf_get_formats ();
86 
87 	for (iter = pixbuf_formats; iter; iter = iter->next) {
88 		gchar **extension_list;
89 		GdkPixbufFormat *format = iter->data;
90 
91 		if (gdk_pixbuf_format_is_disabled (format) ||
92 	    	    !gdk_pixbuf_format_is_writable (format))
93 		            continue;
94 
95 	        extension_list = gdk_pixbuf_format_get_extensions (format);
96 
97 		for (i = 0; extension_list[i] != 0; i++) {
98 			if (g_str_has_suffix (uri, extension_list[i])) {
99 			    	g_slist_free (pixbuf_formats);
100 				g_strfreev (extension_list);
101 				return format;
102 			}
103 		}
104 		g_strfreev (extension_list);
105 	}
106 
107 	g_slist_free (pixbuf_formats);
108 	return NULL;
109 }
110