]> www.fi.muni.cz Git - evince.git/blob - pixbuf/pixbuf-document.c
Hungarian translation added by "Last-Translator: \n".
[evince.git] / pixbuf / pixbuf-document.c
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19
20 #include "pixbuf-document.h"
21 #include "ev-document-thumbnails.h"
22
23 struct _PixbufDocumentClass
24 {
25         GObjectClass parent_class;
26 };
27
28 struct _PixbufDocument
29 {
30         GObject parent_instance;
31
32         GdkPixbuf *pixbuf;
33         GdkDrawable *target;
34
35         gint x_offset, y_offset;
36 };
37
38 typedef struct _PixbufDocumentClass PixbufDocumentClass;
39
40 static void pixbuf_document_document_iface_init (EvDocumentIface *iface);
41 static void pixbuf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
42
43 G_DEFINE_TYPE_WITH_CODE (PixbufDocument, pixbuf_document, G_TYPE_OBJECT,
44                          { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT,
45                                                   pixbuf_document_document_iface_init);
46                          G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS,
47                                                 pixbuf_document_document_thumbnails_iface_init)                            
48                                    });
49
50 static gboolean
51 pixbuf_document_load (EvDocument  *document,
52                       const char  *uri,
53                       GError     **error)
54 {
55         PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
56         
57         gchar *filename;
58         GdkPixbuf *pixbuf;
59
60         /* FIXME: We could actually load uris  */
61         filename = g_filename_from_uri (uri, NULL, error);
62         if (!filename)
63                 return FALSE;
64         
65         pixbuf = gdk_pixbuf_new_from_file (filename, error);
66
67         if (!pixbuf)
68                 return FALSE;
69
70         pixbuf_document->pixbuf = pixbuf;
71         
72         return TRUE;
73 }
74
75 static gboolean
76 pixbuf_document_save (EvDocument  *document,
77                       const char  *uri,
78                       GError     **error)
79 {
80         g_warning ("pixbuf_document_save not implemented"); /* FIXME */
81         return TRUE;
82 }
83
84 static int
85 pixbuf_document_get_n_pages (EvDocument  *document)
86 {
87         return 1;
88 }
89
90 static void
91 pixbuf_document_get_page_size (EvDocument   *document,
92                                int           page,
93                                double       *width,
94                                double       *height)
95 {
96         PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
97
98         if (width)
99                 *width = gdk_pixbuf_get_width (pixbuf_document->pixbuf);
100         if (height)
101                 *height = gdk_pixbuf_get_height (pixbuf_document->pixbuf);
102
103         printf ("get_page_size, page=%d, *width=%f, *height=%f\n",
104                 page, *width, *height);
105 }
106
107 static GdkPixbuf*
108 pixbuf_document_render_pixbuf (EvDocument  *document, int page, double scale)
109 {
110         PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
111         return gdk_pixbuf_scale_simple (pixbuf_document->pixbuf,
112                                         gdk_pixbuf_get_width (pixbuf_document->pixbuf) * scale,
113                                         gdk_pixbuf_get_height (pixbuf_document->pixbuf) * scale,
114                                         GDK_INTERP_BILINEAR);
115 }
116
117 static void
118 pixbuf_document_finalize (GObject *object)
119 {
120         PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (object);
121
122         g_object_unref (pixbuf_document->pixbuf);
123         
124         G_OBJECT_CLASS (pixbuf_document_parent_class)->finalize (object);
125 }
126
127 static void
128 pixbuf_document_class_init (PixbufDocumentClass *klass)
129 {
130         GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
131
132         gobject_class->finalize = pixbuf_document_finalize;
133 }
134
135 static gboolean
136 pixbuf_document_can_get_text (EvDocument *document)
137 {
138         return FALSE;
139 }
140
141 static EvDocumentInfo *
142 pixbuf_document_get_info (EvDocument *document)
143 {
144         EvDocumentInfo *info;
145
146         info = g_new0 (EvDocumentInfo, 1);
147         info->fields_mask = 0;
148
149         return info;
150 }
151
152 static void
153 pixbuf_document_document_iface_init (EvDocumentIface *iface)
154 {
155         iface->load = pixbuf_document_load;
156         iface->save = pixbuf_document_save;
157         iface->can_get_text = pixbuf_document_can_get_text;
158         iface->get_n_pages = pixbuf_document_get_n_pages;
159         iface->get_page_size = pixbuf_document_get_page_size;
160         iface->render_pixbuf = pixbuf_document_render_pixbuf;
161         iface->get_info = pixbuf_document_get_info;
162 }
163
164 static GdkPixbuf *
165 pixbuf_document_thumbnails_get_thumbnail (EvDocumentThumbnails   *document,
166                                           gint                    page,
167                                           gint                    size,
168                                           gboolean                border)
169 {
170         PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
171         GdkPixbuf *pixbuf;
172         gdouble scale_factor;
173         gint height;
174         
175         scale_factor = (gdouble)size / gdk_pixbuf_get_width (pixbuf_document->pixbuf);
176
177         height = gdk_pixbuf_get_height (pixbuf_document->pixbuf) * scale_factor;
178         
179         pixbuf = gdk_pixbuf_scale_simple (pixbuf_document->pixbuf, size, height,
180                                           GDK_INTERP_BILINEAR);
181         
182         return pixbuf;
183 }
184
185 static void
186 pixbuf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
187                                            gint                  page,
188                                            gint                  suggested_width,
189                                            gint                  *width,
190                                            gint                  *height)
191 {
192         PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
193         gdouble page_ratio;
194
195         page_ratio = ((double)gdk_pixbuf_get_height (pixbuf_document->pixbuf)) /
196                      gdk_pixbuf_get_width (pixbuf_document->pixbuf);
197         *width = suggested_width;
198         *height = (gint) (suggested_width * page_ratio);
199 }
200
201 static void
202 pixbuf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface)
203 {
204         iface->get_thumbnail = pixbuf_document_thumbnails_get_thumbnail;
205         iface->get_dimensions = pixbuf_document_thumbnails_get_dimensions;
206 }
207
208
209 static void
210 pixbuf_document_init (PixbufDocument *pixbuf_document)
211 {
212         pixbuf_document->x_offset = 0;
213         pixbuf_document->y_offset = 0;
214 }