double max_width;
double max_height;
+
double* height_to_page;
double* dual_height_to_page;
+ int rotation;
+
EvPageCacheInfo *size_cache;
EvDocumentInfo *page_info;
};
ev_document_info_free (page_cache->page_info);
}
+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];
+ }
+ }
+ }
+}
+
EvPageCache *
ev_page_cache_new (EvDocument *document)
{
EvPageCache *page_cache;
EvPageCacheInfo *info;
gint i;
- double saved_height;
page_cache = (EvPageCache *) g_object_new (EV_TYPE_PAGE_CACHE, NULL);
}
}
- 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) {
- page_cache->height_to_page [i] = (i + 1) * page_cache->uniform_height;
- } else {
- page_cache->height_to_page [i] = saved_height + page_cache->size_cache [i].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) {
- page_cache->dual_height_to_page [i / 2] = (i / 2 + 1) * page_cache->uniform_height;
- } else {
- if (i == page_cache->n_pages - 1) {
- page_cache->dual_height_to_page [i / 2] =
- saved_height + page_cache->size_cache [i].height;
- }
- else {
- page_cache->dual_height_to_page [i / 2] = saved_height +
- MAX(page_cache->size_cache [i].height,
- page_cache->size_cache [i + 1].height);
- saved_height = page_cache->dual_height_to_page [i / 2];
- }
- }
- }
+ build_height_to_page (page_cache);
/* make some sanity check assertions */
if (! page_cache->uniform)
g_assert (page_cache->size_cache != NULL);
- if (page_cache->uniform)
+ if (page_cache->uniform && page_cache->n_pages > 0)
g_assert (page_cache->uniform_width > 0 && page_cache->uniform_height > 0);
ev_document_doc_mutex_unlock ();
return FALSE;
}
-void
-ev_page_cache_set_link (EvPageCache *page_cache,
- EvLink *link)
-{
- g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
- g_return_if_fail (EV_IS_LINK (link));
-
- ev_page_cache_set_current_page (page_cache, ev_link_get_page (link));
-}
-
const char *
ev_page_cache_get_title (EvPageCache *page_cache)
{
void
ev_page_cache_get_size (EvPageCache *page_cache,
gint page,
- EvOrientation orientation,
+ gint rotation,
gfloat scale,
gint *width,
gint *height)
{
+ double w, h;
+
g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
g_return_if_fail (page >= 0 && page < page_cache->n_pages);
if (page_cache->uniform) {
- if (width)
- *width = page_cache->uniform_width;
- if (height)
- *height = page_cache->uniform_height;
+ w = page_cache->uniform_width;
+ h = page_cache->uniform_height;
} else {
EvPageCacheInfo *info;
info = &(page_cache->size_cache [page]);
- if (width)
- *width = info->width;
- if (height)
- *height = info->height;
+ w = info->width;
+ h = info->height;
}
- if (width)
- *width = (int) ((*width) * scale + 0.5);
- if (width)
- *height = (int) ((*height) * scale + 0.5);
+ w = w * scale + 0.5;
+ h = h * scale + 0.5;
+ if (rotation == 0 || rotation == 180) {
+ if (width) *width = (int)w;
+ if (height) *height = (int)h;
+ } else {
+ if (width) *width = (int)h;
+ if (height) *height = (int)w;
+ }
}
-
void
-ev_page_cache_get_max_width (EvPageCache *page_cache,
- gfloat scale,
- gint *width)
+ev_page_cache_get_max_width (EvPageCache *page_cache,
+ gint rotation,
+ gfloat scale,
+ gint *width)
{
g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
- if (width)
- *width = page_cache->max_width * scale;
+ if (width) {
+ if (rotation == 0 || rotation == 180) {
+ *width = page_cache->max_width * scale;
+ } else {
+ *width = page_cache->max_height * scale;
+ }
+ }
}
void
-ev_page_cache_get_max_height (EvPageCache *page_cache,
- gfloat scale,
- gint *height)
+ev_page_cache_get_max_height (EvPageCache *page_cache,
+ gint rotation,
+ gfloat scale,
+ gint *height)
{
g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
- if (height)
- *height = page_cache->max_height * scale;
+ if (height) {
+ if (rotation == 0 || rotation == 180) {
+ *height = page_cache->max_height * scale;
+ } else {
+ *height = page_cache->max_width * scale;
+ }
+ }
}
void
-ev_page_cache_get_height_to_page (EvPageCache *page_cache,
- gint page,
- gfloat scale,
- gint *height,
- gint *dual_height)
+ev_page_cache_get_height_to_page (EvPageCache *page_cache,
+ gint page,
+ gint rotation,
+ gfloat scale,
+ gint *height,
+ gint *dual_height)
{
double result = 0.0;
double dual_result = 0.0;
g_return_if_fail (EV_IS_PAGE_CACHE (page_cache));
+ if (page_cache->rotation != rotation) {
+ page_cache->rotation = rotation;
+ build_height_to_page (page_cache);
+ }
+
if (page > 0)
result = page_cache->height_to_page [page - 1];
return page_cache->page_info;
}
-
-gboolean
-ev_page_cache_next_page (EvPageCache *page_cache)
-{
- g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE);
-
- if (page_cache->current_page >= page_cache->n_pages - 1)
- return FALSE;
-
- ev_page_cache_set_current_page (page_cache, page_cache->current_page + 1);
- return TRUE;
-
-}
-
-gboolean
-ev_page_cache_prev_page (EvPageCache *page_cache)
-{
- g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE);
-
- if (page_cache->current_page <= 0)
- return FALSE;
-
- ev_page_cache_set_current_page (page_cache, page_cache->current_page - 1);
- return TRUE;
-}
-
#define PAGE_CACHE_STRING "ev-page-cache"
EvPageCache *