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_get_current_page (EvPageCache *page_cache)
213 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0);
215 return page_cache->current_page;
219 ev_page_cache_set_current_page (EvPageCache *page_cache,
222 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
224 if (page == page_cache->current_page)
227 page_cache->current_page = page;
228 g_signal_emit (page_cache, signals[PAGE_CHANGED], 0, page);
232 ev_page_cache_set_current_page_history (EvPageCache *page_cache,
235 if (abs (page - page_cache->current_page) > 1)
236 g_signal_emit (page_cache, signals [HISTORY_CHANGED], 0, page);
238 ev_page_cache_set_current_page (page_cache, page);
242 ev_page_cache_set_page_label (EvPageCache *page_cache,
243 const gchar *page_label)
247 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE);
249 if (ev_document_find_page_by_label (page_cache->document, page_label, &page)) {
250 ev_page_cache_set_current_page (page_cache, page);
258 ev_page_cache_get_size (EvPageCache *page_cache,
267 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
269 ev_document_get_page_size (page_cache->document, page, &w, &h);
274 if (rotation == 0 || rotation == 180) {
275 if (width) *width = (int)w;
276 if (height) *height = (int)h;
278 if (width) *width = (int)h;
279 if (height) *height = (int)w;
284 ev_page_cache_get_max_width (EvPageCache *page_cache,
291 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
296 ev_document_get_max_page_size (page_cache->document, &w, &h);
297 *width = (rotation == 0 || rotation == 180) ? w * scale : h * scale;
301 ev_page_cache_get_max_height (EvPageCache *page_cache,
308 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
313 ev_document_get_max_page_size (page_cache->document, &w, &h);
314 *height = (rotation == 0 || rotation == 180) ? h * scale : w * scale;
318 ev_page_cache_get_height_to_page (EvPageCache *page_cache,
325 g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
326 g_return_if_fail (page >= 0);
328 if (page_cache->rotation != rotation) {
329 page_cache->rotation = rotation;
330 build_height_to_page (page_cache);
334 *height = page_cache->height_to_page[page] * scale;
337 *dual_height = page_cache->dual_height_to_page[page] * scale;
341 ev_page_cache_get_dual_even_left (EvPageCache *page_cache)
343 g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0);
345 return (ev_document_get_n_pages (page_cache->document) > 2);
348 #define PAGE_CACHE_STRING "ev-page-cache"
351 ev_page_cache_get (EvDocument *document)
353 EvPageCache *page_cache;
355 g_return_val_if_fail (EV_IS_DOCUMENT (document), NULL);
357 page_cache = g_object_get_data (G_OBJECT (document), PAGE_CACHE_STRING);
358 if (page_cache == NULL) {
359 page_cache = ev_page_cache_new (document);
360 g_object_set_data_full (G_OBJECT (document), PAGE_CACHE_STRING, page_cache, g_object_unref);