2 #include "ev-page-cache.h"
3 #include "ev-document-thumbnails.h"
16 gboolean dual_even_left;
18 double* height_to_page;
19 double* dual_height_to_page;
24 struct _EvPageCacheClass
26 GObjectClass parent_class;
28 void (* page_changed) (EvPageCache *page_cache, gint page);
29 void (* history_changed) (EvPageCache *page_cache, gint page);
39 static guint signals[N_SIGNALS] = {0, };
41 static void ev_page_cache_init (EvPageCache *page_cache);
42 static void ev_page_cache_class_init (EvPageCacheClass *page_cache);
43 static void ev_page_cache_finalize (GObject *object);
45 G_DEFINE_TYPE (EvPageCache, ev_page_cache, G_TYPE_OBJECT)
48 ev_page_cache_init (EvPageCache *page_cache)
50 page_cache->current_page = -1;
54 ev_page_cache_class_init (EvPageCacheClass *class)
56 GObjectClass *object_class;
58 object_class = G_OBJECT_CLASS (class);
60 object_class->finalize = ev_page_cache_finalize;
62 signals [PAGE_CHANGED] =
63 g_signal_new ("page-changed",
66 G_STRUCT_OFFSET (EvPageCacheClass, page_changed),
68 g_cclosure_marshal_VOID__INT,
72 signals [HISTORY_CHANGED] =
73 g_signal_new ("history-changed",
76 G_STRUCT_OFFSET (EvPageCacheClass, history_changed),
78 g_cclosure_marshal_VOID__INT,
85 ev_page_cache_finalize (GObject *object)
87 EvPageCache *page_cache = EV_PAGE_CACHE (object);
89 page_cache->document = NULL;
91 if (page_cache->height_to_page) {
92 g_free (page_cache->height_to_page);
93 page_cache->height_to_page = NULL;
96 if (page_cache->dual_height_to_page) {
97 g_free (page_cache->dual_height_to_page);
98 page_cache->dual_height_to_page = NULL;
101 G_OBJECT_CLASS (ev_page_cache_parent_class)->finalize (object);
105 build_height_to_page (EvPageCache *page_cache)
107 gboolean swap, uniform, dual_even_left;
109 double uniform_height, page_height, next_page_height;
111 gdouble u_width, u_height;
114 swap = (page_cache->rotation == 90 ||
115 page_cache->rotation == 270);
117 uniform = ev_document_is_page_size_uniform (page_cache->document);
118 n_pages = ev_document_get_n_pages (page_cache->document);
119 dual_even_left = (n_pages > 2);
121 g_free (page_cache->height_to_page);
122 g_free (page_cache->dual_height_to_page);
124 page_cache->height_to_page = g_new0 (double, n_pages + 1);
125 page_cache->dual_height_to_page = g_new0 (double, n_pages + 2);
128 ev_document_get_page_size (page_cache->document, 0, &u_width, &u_height);
131 for (i = 0; i <= n_pages; i++) {
133 uniform_height = swap ? u_width : u_height;
134 page_cache->height_to_page[i] = i * uniform_height;
139 ev_document_get_page_size (page_cache->document, i, &w, &h);
140 page_height = swap ? w : h;
144 page_cache->height_to_page[i] = saved_height;
145 saved_height += page_height;
149 if (dual_even_left && !uniform) {
152 ev_document_get_page_size (page_cache->document, 0, &w, &h);
153 saved_height = swap ? w : h;
158 for (i = dual_even_left; i < n_pages + 2; i += 2) {
160 uniform_height = swap ? u_width : u_height;
161 page_cache->dual_height_to_page[i] = ((i + dual_even_left) / 2) * uniform_height;
162 if (i + 1 < n_pages + 2)
163 page_cache->dual_height_to_page[i + 1] = ((i + dual_even_left) / 2) * uniform_height;
165 if (i + 1 < n_pages) {
168 ev_document_get_page_size (page_cache->document, i + 1, &w, &h);
169 next_page_height = swap ? w : h;
171 next_page_height = 0;
177 ev_document_get_page_size (page_cache->document, i, &w, &h);
178 page_height = swap ? w : h;
183 if (i + 1 < n_pages + 2) {
184 page_cache->dual_height_to_page[i] = saved_height;
185 page_cache->dual_height_to_page[i + 1] = saved_height;
186 saved_height += MAX(page_height, next_page_height);
188 page_cache->dual_height_to_page[i] = saved_height;
195 ev_page_cache_new (EvDocument *document)
197 EvPageCache *page_cache;
199 page_cache = (EvPageCache *) g_object_new (EV_TYPE_PAGE_CACHE, NULL);
200 page_cache->document = document;
202 build_height_to_page (page_cache);
204 if (ev_document_get_n_pages (page_cache->document) > 0)
205 ev_page_cache_set_current_page (page_cache, 0);
211 ev_page_cache_check_dimensions (EvPageCache *page_cache)
213 gdouble document_width, document_height;
215 ev_document_get_max_page_size (page_cache->document,
216 &document_width, &document_height);
218 return (document_width > 0 && document_height > 0);
222 ev_page_cache_get_current_page (EvPageCache *page_cache)
224 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0);
226 return page_cache->current_page;
230 ev_page_cache_set_current_page (EvPageCache *page_cache,
233 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
235 if (page == page_cache->current_page)
238 page_cache->current_page = page;
239 g_signal_emit (page_cache, signals[PAGE_CHANGED], 0, page);
243 ev_page_cache_set_current_page_history (EvPageCache *page_cache,
246 if (abs (page - page_cache->current_page) > 1)
247 g_signal_emit (page_cache, signals [HISTORY_CHANGED], 0, page);
249 ev_page_cache_set_current_page (page_cache, page);
253 ev_page_cache_set_page_label (EvPageCache *page_cache,
254 const gchar *page_label)
258 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE);
260 if (ev_document_find_page_by_label (page_cache->document, page_label, &page)) {
261 ev_page_cache_set_current_page (page_cache, page);
269 ev_page_cache_get_size (EvPageCache *page_cache,
278 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
280 ev_document_get_page_size (page_cache->document, page, &w, &h);
285 if (rotation == 0 || rotation == 180) {
286 if (width) *width = (int)w;
287 if (height) *height = (int)h;
289 if (width) *width = (int)h;
290 if (height) *height = (int)w;
295 ev_page_cache_get_max_width (EvPageCache *page_cache,
302 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
307 ev_document_get_max_page_size (page_cache->document, &w, &h);
308 *width = (rotation == 0 || rotation == 180) ? w * scale : h * scale;
312 ev_page_cache_get_max_height (EvPageCache *page_cache,
319 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
324 ev_document_get_max_page_size (page_cache->document, &w, &h);
325 *height = (rotation == 0 || rotation == 180) ? h * scale : w * scale;
329 ev_page_cache_get_height_to_page (EvPageCache *page_cache,
336 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
337 g_return_if_fail (page >= 0);
339 if (page_cache->rotation != rotation) {
340 page_cache->rotation = rotation;
341 build_height_to_page (page_cache);
345 *height = page_cache->height_to_page[page] * scale;
348 *dual_height = page_cache->dual_height_to_page[page] * scale;
352 ev_page_cache_get_dual_even_left (EvPageCache *page_cache)
354 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0);
356 return (ev_document_get_n_pages (page_cache->document) > 2);
359 #define PAGE_CACHE_STRING "ev-page-cache"
362 ev_page_cache_get (EvDocument *document)
364 EvPageCache *page_cache;
366 g_return_val_if_fail (EV_IS_DOCUMENT (document), NULL);
368 page_cache = g_object_get_data (G_OBJECT (document), PAGE_CACHE_STRING);
369 if (page_cache == NULL) {
370 page_cache = ev_page_cache_new (document);
371 g_object_set_data_full (G_OBJECT (document), PAGE_CACHE_STRING, page_cache, g_object_unref);