+static void
+build_height_to_page (EvPageCache *page_cache)
+{
+ gboolean swap;
+ int i;
+ double uniform_height, page_height, next_page_height;
+ double saved_height;
+
+ swap = (page_cache->rotation == 90 ||
+ page_cache->rotation == 270);
+
+ g_free (page_cache->height_to_page);
+ g_free (page_cache->dual_height_to_page);
+
+ page_cache->height_to_page = g_new0(double, page_cache->n_pages);
+ page_cache->dual_height_to_page = g_new0(double, page_cache->n_pages / 2 + 1);
+
+ saved_height = 0;
+ for (i = 0; i < page_cache->n_pages; i++) {
+ if (page_cache->uniform) {
+ if (!swap) {
+ uniform_height = page_cache->uniform_height;
+ } else {
+ uniform_height = page_cache->uniform_width;
+ }
+ page_cache->height_to_page [i] = (i + 1) * uniform_height;
+ } else {
+ if (!swap) {
+ page_height = page_cache->size_cache [i].height;
+ } else {
+ page_height = page_cache->size_cache [i].width;
+ }
+ page_cache->height_to_page [i] = saved_height + page_height;
+ saved_height = page_cache->height_to_page [i];
+ }
+ }
+
+ saved_height = 0;
+ for (i = 0; i < page_cache->n_pages; i += 2) {
+ if (page_cache->uniform) {
+ if (!swap) {
+ uniform_height = page_cache->uniform_height;
+ } else {
+ uniform_height = page_cache->uniform_width;
+ }
+ page_cache->dual_height_to_page [i / 2] = (i / 2 + 1) * uniform_height;
+ } else {
+ if (!swap) {
+ page_height = page_cache->size_cache [i].height;
+ next_page_height = page_cache->size_cache [i + 1].height;
+ } else {
+ page_height = page_cache->size_cache [i].width;
+ next_page_height = page_cache->size_cache [i + 1].width;
+ }
+ if (i == page_cache->n_pages - 1) {
+ page_cache->dual_height_to_page [i / 2] =
+ saved_height + page_height;
+ }
+ else {
+ page_cache->dual_height_to_page [i / 2] = saved_height +
+ MAX(page_height, next_page_height);
+ saved_height = page_cache->dual_height_to_page [i / 2];
+ }
+ }
+ }
+}
+