It was the same implementation in every backend.
return thumbnail;
}
-static void
-comics_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
- EvRenderContext *rc,
- gint *width,
- gint *height)
-{
- gdouble page_width, page_height;
-
- comics_document_get_page_size (EV_DOCUMENT (document), rc->page,
- &page_width, &page_height);
-
- if (rc->rotation == 90 || rc->rotation == 270) {
- *width = (gint) (page_height * rc->scale);
- *height = (gint) (page_width * rc->scale);
- } else {
- *width = (gint) (page_width * rc->scale);
- *height = (gint) (page_height * rc->scale);
- }
-}
-
static void
comics_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
{
iface->get_thumbnail = comics_document_thumbnails_get_thumbnail;
- iface->get_dimensions = comics_document_thumbnails_get_dimensions;
}
static char**
iface->get_selected_text = djvu_selection_get_selected_text;
}
-static void
-djvu_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
- EvRenderContext *rc,
- gint *width,
- gint *height)
-{
- DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
- gdouble page_width, page_height;
-
- djvu_document_get_page_size (EV_DOCUMENT(djvu_document), rc->page,
- &page_width, &page_height);
-
- if (rc->rotation == 90 || rc->rotation == 270) {
- *width = (gint) (page_height * rc->scale);
- *height = (gint) (page_width * rc->scale);
- } else {
- *width = (gint) (page_width * rc->scale);
- *height = (gint) (page_height * rc->scale);
- }
-}
-
static GdkPixbuf *
djvu_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
EvRenderContext *rc,
djvu_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
{
iface->get_thumbnail = djvu_document_thumbnails_get_thumbnail;
- iface->get_dimensions = djvu_document_thumbnails_get_dimensions;
}
/* EvFileExporterIface */
ev_document_class->support_synctex = dvi_document_support_synctex;
}
-static void
-dvi_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
- EvRenderContext *rc,
- gint *width,
- gint *height)
-{
- DviDocument *dvi_document = DVI_DOCUMENT (document);
- gdouble page_width = dvi_document->base_width;
- gdouble page_height = dvi_document->base_height;
-
- if (rc->rotation == 90 || rc->rotation == 270) {
- *width = (gint) (page_height * rc->scale);
- *height = (gint) (page_width * rc->scale);
- } else {
- *width = (gint) (page_width * rc->scale);
- *height = (gint) (page_height * rc->scale);
- }
-}
-
static GdkPixbuf *
dvi_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
EvRenderContext *rc,
dvi_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
{
iface->get_thumbnail = dvi_document_thumbnails_get_thumbnail;
- iface->get_dimensions = dvi_document_thumbnails_get_dimensions;
}
/* EvFileExporterIface */
static void pdf_selection_iface_init (EvSelectionInterface *iface);
static void pdf_document_page_transition_iface_init (EvDocumentTransitionInterface *iface);
static void pdf_document_text_iface_init (EvDocumentTextInterface *iface);
-static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails,
- EvRenderContext *rc,
- gint *width,
- gint *height);
static int pdf_document_get_n_pages (EvDocument *document);
static EvLinkDest *ev_link_dest_from_dest (PdfDocument *pdf_document,
PopplerPage *poppler_page;
GdkPixbuf *pixbuf = NULL;
GdkPixbuf *border_pixbuf;
+ double page_width, page_height;
gint width, height;
poppler_page = POPPLER_PAGE (rc->page->backend_page);
- pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document),
- rc, &width, &height);
-
+ poppler_page_get_size (poppler_page,
+ &page_width, &page_height);
+
+ width = MAX ((gint)(page_width * rc->scale + 0.5), 1);
+ height = MAX ((gint)(page_height * rc->scale + 0.5), 1);
+
+ if (rc->rotation == 90 || rc->rotation == 270) {
+ gint temp;
+
+ temp = width;
+ width = height;
+ height = temp;
+ }
+
#ifdef POPPLER_WITH_GDK
pixbuf = poppler_page_get_thumbnail_pixbuf (poppler_page);
#else
return pixbuf;
}
-static void
-pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails,
- EvRenderContext *rc,
- gint *width,
- gint *height)
-{
- double page_width, page_height;
-
- poppler_page_get_size (POPPLER_PAGE (rc->page->backend_page),
- &page_width, &page_height);
-
- *width = MAX ((gint)(page_width * rc->scale + 0.5), 1);
- *height = MAX ((gint)(page_height * rc->scale + 0.5), 1);
-
- if (rc->rotation == 90 || rc->rotation == 270) {
- gint temp;
-
- temp = *width;
- *width = *height;
- *height = temp;
- }
-}
-
static void
pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
{
iface->get_thumbnail = pdf_document_thumbnails_get_thumbnail;
- iface->get_dimensions = pdf_document_thumbnails_get_dimensions;
}
return rotated_pixbuf;
}
-static void
-pixbuf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
- EvRenderContext *rc,
- gint *width,
- gint *height)
-{
- PixbufDocument *pixbuf_document = PIXBUF_DOCUMENT (document);
- gint p_width = gdk_pixbuf_get_width (pixbuf_document->pixbuf);
- gint p_height = gdk_pixbuf_get_height (pixbuf_document->pixbuf);
-
- if (rc->rotation == 90 || rc->rotation == 270) {
- *width = (gint) (p_height * rc->scale);
- *height = (gint) (p_width * rc->scale);
- } else {
- *width = (gint) (p_width * rc->scale);
- *height = (gint) (p_height * rc->scale);
- }
-}
-
static void
pixbuf_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
{
iface->get_thumbnail = pixbuf_document_thumbnails_get_thumbnail;
- iface->get_dimensions = pixbuf_document_thumbnails_get_dimensions;
}
return pixbuf;
}
-static void
-ps_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails,
- EvRenderContext *rc,
- gint *width,
- gint *height)
-{
- PSDocument *ps = PS_DOCUMENT (document_thumbnails);
- gdouble page_width, page_height;
-
- ps_document_get_page_size (EV_DOCUMENT (ps),
- rc->page,
- &page_width, &page_height);
-
- if (rc->rotation == 90 || rc->rotation == 270) {
- *width = (gint) (page_height * rc->scale);
- *height = (gint) (page_width * rc->scale);
- } else {
- *width = (gint) (page_width * rc->scale);
- *height = (gint) (page_height * rc->scale);
- }
-}
-
static void
ps_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
{
iface->get_thumbnail = ps_document_thumbnails_get_thumbnail;
- iface->get_dimensions = ps_document_thumbnails_get_dimensions;
}
/* EvFileExporterIface */
return pixbuf;
}
-static void
-tiff_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
- EvRenderContext *rc,
- gint *width,
- gint *height)
-{
- gdouble page_width, page_height;
-
- tiff_document_get_page_size (EV_DOCUMENT (document),
- rc->page,
- &page_width, &page_height);
-
- if (rc->rotation == 90 || rc->rotation == 270) {
- *width = (gint) (page_height * rc->scale);
- *height = (gint) (page_width * rc->scale);
- } else {
- *width = (gint) (page_width * rc->scale);
- *height = (gint) (page_height * rc->scale);
- }
-}
-
static void
tiff_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
{
iface->get_thumbnail = tiff_document_thumbnails_get_thumbnail;
- iface->get_dimensions = tiff_document_thumbnails_get_dimensions;
}
/* postscript exporter implementation */
return iface->get_thumbnail (document, rc, border);
}
-void
-ev_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
- EvRenderContext *rc,
- gint *width,
- gint *height)
-{
- EvDocumentThumbnailsInterface *iface;
-
- g_return_if_fail (EV_IS_DOCUMENT_THUMBNAILS (document));
- g_return_if_fail (EV_IS_RENDER_CONTEXT (rc));
- g_return_if_fail (width != NULL);
- g_return_if_fail (height != NULL);
-
- iface = EV_DOCUMENT_THUMBNAILS_GET_IFACE (document);
- iface->get_dimensions (document, rc, width, height);
-}
-
GdkPixbuf * (* get_thumbnail) (EvDocumentThumbnails *document,
EvRenderContext *rc,
gboolean border);
- void (* get_dimensions) (EvDocumentThumbnails *document,
- EvRenderContext *rc,
- gint *width,
- gint *height);
};
GType ev_document_thumbnails_get_type (void) G_GNUC_CONST;
GdkPixbuf *ev_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
EvRenderContext *rc,
gboolean border);
-void ev_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
- EvRenderContext *rc,
- gint *width,
- gint *height);
G_END_DECLS
/* Thumbnails dimensions cache */
#define EV_THUMBNAILS_SIZE_CACHE_KEY "ev-thumbnails-size-cache"
+static void
+get_thumbnail_size_for_page (EvDocument *document,
+ guint page,
+ gint *width,
+ gint *height)
+{
+ gdouble scale;
+ gdouble w, h;
+
+ ev_document_get_page_size (document, page, &w, &h);
+ scale = (gdouble)THUMBNAIL_WIDTH / w;
+
+ *width = MAX ((gint)(w * scale + 0.5), 1);
+ *height = MAX ((gint)(h * scale + 0.5), 1);
+}
+
static EvThumbsSizeCache *
ev_thumbnails_size_cache_new (EvDocument *document)
{
EvThumbsSizeCache *cache;
- EvRenderContext *rc = NULL;
- gint i, n_pages;
- EvThumbsSize *thumb_size;
+ gint i, n_pages;
+ EvThumbsSize *thumb_size;
cache = g_new0 (EvThumbsSizeCache, 1);
- n_pages = ev_document_get_n_pages (document);
+ if (ev_document_is_page_size_uniform (document)) {
+ cache->uniform = TRUE;
+ get_thumbnail_size_for_page (document, 0,
+ &cache->uniform_width,
+ &cache->uniform_height);
+ return cache;
+ }
- /* Assume all pages are the same size until proven otherwise */
- cache->uniform = TRUE;
+ n_pages = ev_document_get_n_pages (document);
+ cache->sizes = g_new0 (EvThumbsSize, n_pages);
for (i = 0; i < n_pages; i++) {
- EvPage *page;
- gdouble page_width, page_height;
- gint thumb_width = 0;
- gint thumb_height = 0;
-
- page = ev_document_get_page (document, i);
-
- ev_document_get_page_size (document, i, &page_width, &page_height);
-
- if (!rc) {
- rc = ev_render_context_new (page, 0, (gdouble)THUMBNAIL_WIDTH / page_width);
- } else {
- ev_render_context_set_page (rc, page);
- ev_render_context_set_scale (rc, (gdouble)THUMBNAIL_WIDTH / page_width);
- }
-
- ev_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (document),
- rc, &thumb_width, &thumb_height);
-
- if (i == 0) {
- cache->uniform_width = thumb_width;
- cache->uniform_height = thumb_height;
- } else if (cache->uniform &&
- (cache->uniform_width != thumb_width ||
- cache->uniform_height != thumb_height)) {
- /* It's a different thumbnail size. Backfill the array. */
- int j;
-
- cache->sizes = g_new0 (EvThumbsSize, n_pages);
-
- for (j = 0; j < i; j++) {
- thumb_size = &(cache->sizes[j]);
- thumb_size->width = cache->uniform_width;
- thumb_size->height = cache->uniform_height;
- }
- cache->uniform = FALSE;
- }
-
- if (! cache->uniform) {
- thumb_size = &(cache->sizes[i]);
-
- thumb_size->width = thumb_width;
- thumb_size->height = thumb_height;
- }
-
- g_object_unref (page);
- }
-
- if (rc) {
- g_object_unref (rc);
+ thumb_size = &(cache->sizes[i]);
+ get_thumbnail_size_for_page (document, i,
+ &thumb_size->width,
+ &thumb_size->height);
}
return cache;