+static gsize
+ev_pixbuf_cache_get_page_size (EvPixbufCache *pixbuf_cache,
+ gint page_index,
+ gdouble scale,
+ gint rotation)
+{
+ gint width, height;
+
+ _get_page_size_for_scale_and_rotation (pixbuf_cache->document,
+ page_index, scale, rotation,
+ &width, &height);
+ return height * cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, width);
+}
+
+static gint
+ev_pixbuf_cache_get_preload_size (EvPixbufCache *pixbuf_cache,
+ gint start_page,
+ gint end_page,
+ gdouble scale,
+ gint rotation)
+{
+ gsize range_size = 0;
+ gint new_preload_cache_size = 0;
+ gint i;
+ guint n_pages = ev_document_get_n_pages (pixbuf_cache->document);
+
+ /* Get the size of the current range */
+ for (i = start_page; i <= end_page; i++) {
+ range_size += ev_pixbuf_cache_get_page_size (pixbuf_cache, i, scale, rotation);
+ }
+
+ if (range_size >= pixbuf_cache->max_size)
+ return new_preload_cache_size;
+
+ i = 1;
+ while (((start_page - i > 0) || (end_page + i < n_pages)) &&
+ new_preload_cache_size < MAX_PRELOADED_PAGES) {
+ gsize page_size;
+ gboolean updated = FALSE;
+
+ if (end_page + i < n_pages) {
+ page_size = ev_pixbuf_cache_get_page_size (pixbuf_cache, end_page + i,
+ scale, rotation);
+ if (page_size + range_size <= pixbuf_cache->max_size) {
+ range_size += page_size;
+ new_preload_cache_size++;
+ updated = TRUE;
+ } else {
+ break;
+ }
+ }
+
+ if (start_page - i > 0) {
+ page_size = ev_pixbuf_cache_get_page_size (pixbuf_cache, start_page - i,
+ scale, rotation);
+ if (page_size + range_size <= pixbuf_cache->max_size) {
+ range_size += page_size;
+ if (!updated)
+ new_preload_cache_size++;
+ } else {
+ break;
+ }
+ }
+ i++;
+ }
+
+ return new_preload_cache_size;
+}
+