ddjvu_context_t *d_context;
ddjvu_document_t *d_document;
ddjvu_format_t *d_format;
+
+ EvOrientation orientation;
};
typedef struct _DjvuDocumentClass DjvuDocumentClass;
djvu_document->d_document = doc;
- while (!ddjvu_document_decoding_done (djvu_document->d_document))
- ddjvu_message_wait (djvu_document->d_context);
-
+ while (!ddjvu_document_decoding_done (djvu_document->d_document)) {
+ ddjvu_message_wait (djvu_document->d_context);
+ ddjvu_message_pop (djvu_document->d_context);
+ }
+
return TRUE;
}
return ddjvu_document_get_pagenum (djvu_document->d_document);
}
+static EvOrientation
+djvu_document_get_orientation (EvDocument *document)
+{
+ DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
+
+ return djvu_document->orientation;
+}
+
+static void
+djvu_document_set_orientation (EvDocument *document,
+ EvOrientation orientation)
+{
+ DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
+
+ djvu_document->orientation = orientation;
+}
+
static void
djvu_document_get_page_size (EvDocument *document,
int page,
double *height)
{
DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
-
- ddjvu_page_t *d_page;
+ ddjvu_pageinfo_t info;
g_return_if_fail (djvu_document->d_document);
- d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, page);
+ while (ddjvu_document_get_pageinfo(djvu_document->d_document, page, &info) < DDJVU_JOB_OK) {
+ ddjvu_message_wait (djvu_document->d_context);
+ ddjvu_message_pop (djvu_document->d_context);
+ }
+
+ if (djvu_document->orientation == EV_ORIENTATION_PORTRAIT ||
+ djvu_document->orientation == EV_ORIENTATION_UPSIDEDOWN) {
+ *width = info.width * SCALE_FACTOR;
+ *height = info.height * SCALE_FACTOR;
+ } else {
+ *width = info.height * SCALE_FACTOR;
+ *height = info.width * SCALE_FACTOR;
+ }
+}
- while (!ddjvu_page_decoding_done (d_page))
- ddjvu_message_wait (djvu_document->d_context);
+static GdkPixbuf *
+rotate_pixbuf (EvDocument *document, GdkPixbuf *pixbuf)
+{
+ DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
- if (width)
- *width = ddjvu_page_get_width (d_page) * SCALE_FACTOR;
- if (height)
- *height = ddjvu_page_get_height (d_page) * SCALE_FACTOR;
-
- ddjvu_page_release (d_page);
+ switch (djvu_document->orientation)
+ {
+ case EV_ORIENTATION_LANDSCAPE:
+ return gdk_pixbuf_rotate_simple (pixbuf, 90);
+ case EV_ORIENTATION_UPSIDEDOWN:
+ return gdk_pixbuf_rotate_simple (pixbuf, 180);
+ case EV_ORIENTATION_SEASCAPE:
+ return gdk_pixbuf_rotate_simple (pixbuf, 270);
+ default:
+ return g_object_ref (pixbuf);
+ }
}
static GdkPixbuf *
djvu_document_render_pixbuf (EvDocument *document,
- int page, gdouble scale)
+ EvRenderContext *rc)
{
DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
GdkPixbuf *pixbuf;
+ GdkPixbuf *rotated_pixbuf;
ddjvu_rect_t rrect;
ddjvu_rect_t prect;
double page_width, page_height;
- d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, page);
+ d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, rc->page);
- while (!ddjvu_page_decoding_done (d_page))
- ddjvu_message_wait (djvu_document->d_context);
+ while (!ddjvu_page_decoding_done (d_page)) {
+ ddjvu_message_wait (djvu_document->d_context);
+ ddjvu_message_pop (djvu_document->d_context);
+ }
- page_width = ddjvu_page_get_width (d_page) * scale * SCALE_FACTOR;
- page_height = ddjvu_page_get_height (d_page) * scale * SCALE_FACTOR;
+ page_width = ddjvu_page_get_width (d_page) * rc->scale * SCALE_FACTOR;
+ page_height = ddjvu_page_get_height (d_page) * rc->scale * SCALE_FACTOR;
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, page_width, page_height);
&rrect,
djvu_document->d_format,
gdk_pixbuf_get_rowstride (pixbuf),
- gdk_pixbuf_get_pixels (pixbuf));
+ (gchar *)gdk_pixbuf_get_pixels (pixbuf));
- return pixbuf;
+ rotated_pixbuf = rotate_pixbuf (document, pixbuf);
+ g_object_unref (pixbuf);
+
+ return rotated_pixbuf;
}
static void
G_OBJECT_CLASS (djvu_document_parent_class)->finalize (object);
}
-static void
-djvu_document_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- switch (prop_id)
- {
- case PROP_TITLE:
- /* read only */
- break;
- }
-}
-
-static void
-djvu_document_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- switch (prop_id)
- {
- case PROP_TITLE:
- g_value_set_string (value, NULL);
- break;
- }
-}
-
static void
djvu_document_class_init (DjvuDocumentClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = djvu_document_finalize;
- gobject_class->get_property = djvu_document_get_property;
- gobject_class->set_property = djvu_document_set_property;
-
- g_object_class_override_property (gobject_class, PROP_TITLE, "title");
}
static gboolean
return FALSE;
}
+static EvDocumentInfo *
+djvu_document_get_info (EvDocument *document)
+{
+ EvDocumentInfo *info;
+
+ info = g_new0 (EvDocumentInfo, 1);
+
+ return info;
+}
+
static void
djvu_document_document_iface_init (EvDocumentIface *iface)
{
iface->get_n_pages = djvu_document_get_n_pages;
iface->get_page_size = djvu_document_get_page_size;
iface->render_pixbuf = djvu_document_render_pixbuf;
+ iface->get_info = djvu_document_get_info;
+ iface->set_orientation = djvu_document_set_orientation;
+ iface->get_orientation = djvu_document_get_orientation;
}
static void
GdkPixbuf *pixbuf;
gint thumb_width, thumb_height;
- gchar *pixels;
+ guchar *pixels;
g_return_val_if_fail (djvu_document->d_document, NULL);
pixels = gdk_pixbuf_get_pixels (pixbuf);
}
- while (ddjvu_thumbnail_status (djvu_document->d_document, page, 1) < DDJVU_JOB_OK)
- ddjvu_message_wait (djvu_document->d_context);
+ while (ddjvu_thumbnail_status (djvu_document->d_document, page, 1) < DDJVU_JOB_OK) {
+ ddjvu_message_wait (djvu_document->d_context);
+ ddjvu_message_pop (djvu_document->d_context);
+ }
ddjvu_thumbnail_render (djvu_document->d_document, page,
&thumb_width, &thumb_height,
djvu_document->d_format,
gdk_pixbuf_get_rowstride (pixbuf),
- pixels);
+ (gchar *)pixels);
return pixbuf;
}