X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=backend%2Fdjvu%2Fdjvu-document.c;h=89925e4efe720ee931f13e1bc569b4a6e0865584;hb=223cc03e0275c77c4482ed0495b3bd15993a3ab8;hp=3eafbfe67d64fb379acb7e47e00d7c9573985663;hpb=09d18721e3015b9e4cc448f1f3620da54784ebba;p=evince.git diff --git a/backend/djvu/djvu-document.c b/backend/djvu/djvu-document.c index 3eafbfe6..89925e4e 100644 --- a/backend/djvu/djvu-document.c +++ b/backend/djvu/djvu-document.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" @@ -24,7 +24,6 @@ #include "djvu-text-page.h" #include "djvu-links.h" #include "djvu-document-private.h" -#include "ev-document-thumbnails.h" #include "ev-file-exporter.h" #include "ev-document-misc.h" #include "ev-document-find.h" @@ -34,7 +33,7 @@ #include #include -#include +#include #include #define SCALE_FACTOR 0.2 @@ -46,21 +45,18 @@ enum { struct _DjvuDocumentClass { - GObjectClass parent_class; + EvDocumentClass parent_class; }; typedef struct _DjvuDocumentClass DjvuDocumentClass; -static void djvu_document_document_iface_init (EvDocumentIface *iface); -static void djvu_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface); -static void djvu_document_file_exporter_iface_init (EvFileExporterIface *iface); -static void djvu_document_find_iface_init (EvDocumentFindIface *iface); -static void djvu_document_document_links_iface_init (EvDocumentLinksIface *iface); -static void djvu_selection_iface_init (EvSelectionIface *iface); +static void djvu_document_file_exporter_iface_init (EvFileExporterInterface *iface); +static void djvu_document_find_iface_init (EvDocumentFindInterface *iface); +static void djvu_document_document_links_iface_init (EvDocumentLinksInterface *iface); +static void djvu_selection_iface_init (EvSelectionInterface *iface); EV_BACKEND_REGISTER_WITH_CODE (DjvuDocument, djvu_document, { - EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, djvu_document_document_thumbnails_iface_init); EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, djvu_document_file_exporter_iface_init); EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, djvu_document_find_iface_init); EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_LINKS, djvu_document_document_links_iface_init); @@ -75,7 +71,7 @@ ev_djvu_error_quark (void) { static GQuark q = 0; if (q == 0) - q = g_quark_from_static_string ("ev-djvu-quark"); + q = g_quark_from_string ("ev-djvu-quark"); return q; } @@ -168,6 +164,10 @@ djvu_document_load (EvDocument *document, if (!doc) { g_free (filename); + g_set_error_literal (error, + EV_DOCUMENT_ERROR, + EV_DOCUMENT_ERROR_INVALID, + _("DjVu document has incorrect format")); return FALSE; } @@ -241,11 +241,11 @@ djvu_document_load (EvDocument *document, g_free (filename); if (missing_files) { - g_set_error (error, - G_FILE_ERROR, - G_FILE_ERROR_EXIST, - _("The document is composed by several files. " - "One or more of such files cannot be accessed.")); + g_set_error_literal (error, + G_FILE_ERROR, + G_FILE_ERROR_EXIST, + _("The document is composed of several files. " + "One or more of these files cannot be accessed.")); return FALSE; } @@ -320,7 +320,6 @@ djvu_document_render (EvDocument *document, ddjvu_page_t *d_page; ddjvu_page_rotation_t rotation; double page_width, page_height, tmp; - static const cairo_user_data_key_t key; d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, rc->page->index); @@ -352,19 +351,12 @@ djvu_document_render (EvDocument *document, default: rotation = DDJVU_ROTATE_0; } -#ifdef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH - rowstride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, page_width); -#else - rowstride = page_width * 4; -#endif - pixels = (gchar *) g_malloc (page_height * rowstride); - surface = cairo_image_surface_create_for_data ((guchar *)pixels, - CAIRO_FORMAT_RGB24, - page_width, - page_height, - rowstride); - cairo_surface_set_user_data (surface, &key, - pixels, (cairo_destroy_func_t)g_free); + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + page_width, page_height); + rowstride = cairo_image_surface_get_stride (surface); + pixels = (gchar *)cairo_image_surface_get_data (surface); + prect.x = 0; prect.y = 0; prect.w = page_width; @@ -380,9 +372,49 @@ djvu_document_render (EvDocument *document, rowstride, pixels); + cairo_surface_mark_dirty (surface); + return surface; } +static GdkPixbuf * +djvu_document_get_thumbnail (EvDocument *document, + EvRenderContext *rc) +{ + DjvuDocument *djvu_document = DJVU_DOCUMENT (document); + GdkPixbuf *pixbuf, *rotated_pixbuf; + gdouble page_width, page_height; + gint thumb_width, thumb_height; + guchar *pixels; + + g_return_val_if_fail (djvu_document->d_document, NULL); + + djvu_document_get_page_size (EV_DOCUMENT(djvu_document), rc->page, + &page_width, &page_height); + + thumb_width = (gint) (page_width * rc->scale); + thumb_height = (gint) (page_height * rc->scale); + + pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, + thumb_width, thumb_height); + gdk_pixbuf_fill (pixbuf, 0xffffffff); + pixels = gdk_pixbuf_get_pixels (pixbuf); + + while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page->index, 1) < DDJVU_JOB_OK) + djvu_handle_events(djvu_document, TRUE, NULL); + + ddjvu_thumbnail_render (djvu_document->d_document, rc->page->index, + &thumb_width, &thumb_height, + djvu_document->thumbs_format, + gdk_pixbuf_get_rowstride (pixbuf), + (gchar *)pixels); + + rotated_pixbuf = gdk_pixbuf_rotate_simple (pixbuf, 360 - rc->rotation); + g_object_unref (pixbuf); + + return rotated_pixbuf; +} + static void djvu_document_finalize (GObject *object) { @@ -408,30 +440,17 @@ djvu_document_finalize (GObject *object) static void djvu_document_class_init (DjvuDocumentClass *klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass); gobject_class->finalize = djvu_document_finalize; -} - -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->load = djvu_document_load; - iface->save = djvu_document_save; - iface->get_n_pages = djvu_document_get_n_pages; - iface->get_page_size = djvu_document_get_page_size; - iface->render = djvu_document_render; - iface->get_info = djvu_document_get_info; + ev_document_class->load = djvu_document_load; + ev_document_class->save = djvu_document_save; + ev_document_class->get_n_pages = djvu_document_get_n_pages; + ev_document_class->get_page_size = djvu_document_get_page_size; + ev_document_class->render = djvu_document_render; + ev_document_class->get_thumbnail = djvu_document_get_thumbnail; } static gchar * @@ -460,7 +479,7 @@ djvu_text_copy (DjvuDocument *djvu_document, static gchar * djvu_selection_get_selected_text (EvSelection *selection, - EvRenderContext *rc, + EvPage *page, EvSelectionStyle style, EvRectangle *points) { @@ -470,13 +489,13 @@ djvu_selection_get_selected_text (EvSelection *selection, gchar *text; djvu_document_get_page_size (EV_DOCUMENT (djvu_document), - rc->page, &width, &height); + page, &width, &height); rectangle.x1 = points->x1 / SCALE_FACTOR; rectangle.y1 = (height - points->y2) / SCALE_FACTOR; rectangle.x2 = points->x2 / SCALE_FACTOR; rectangle.y2 = (height - points->y1) / SCALE_FACTOR; - text = djvu_text_copy (djvu_document, rc->page->index, &rectangle); + text = djvu_text_copy (djvu_document, page->index, &rectangle); if (text == NULL) text = g_strdup (""); @@ -485,85 +504,11 @@ djvu_selection_get_selected_text (EvSelection *selection, } static void -djvu_selection_iface_init (EvSelectionIface *iface) +djvu_selection_iface_init (EvSelectionInterface *iface) { 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, - gboolean border) -{ - DjvuDocument *djvu_document = DJVU_DOCUMENT (document); - GdkPixbuf *pixbuf, *rotated_pixbuf; - gdouble page_width, page_height; - gint thumb_width, thumb_height; - guchar *pixels; - - g_return_val_if_fail (djvu_document->d_document, NULL); - - djvu_document_get_page_size (EV_DOCUMENT(djvu_document), rc->page, - &page_width, &page_height); - - thumb_width = (gint) (page_width * rc->scale); - thumb_height = (gint) (page_height * rc->scale); - - pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, - thumb_width, thumb_height); - gdk_pixbuf_fill (pixbuf, 0xffffffff); - pixels = gdk_pixbuf_get_pixels (pixbuf); - - while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page->index, 1) < DDJVU_JOB_OK) - djvu_handle_events(djvu_document, TRUE, NULL); - - ddjvu_thumbnail_render (djvu_document->d_document, rc->page->index, - &thumb_width, &thumb_height, - djvu_document->thumbs_format, - gdk_pixbuf_get_rowstride (pixbuf), - (gchar *)pixels); - - rotated_pixbuf = gdk_pixbuf_rotate_simple (pixbuf, 360 - rc->rotation); - g_object_unref (pixbuf); - - if (border) { - GdkPixbuf *tmp_pixbuf = rotated_pixbuf; - - rotated_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, tmp_pixbuf); - g_object_unref (tmp_pixbuf); - } - - return rotated_pixbuf; -} - -static void -djvu_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface) -{ - iface->get_thumbnail = djvu_document_thumbnails_get_thumbnail; - iface->get_dimensions = djvu_document_thumbnails_get_dimensions; -} - /* EvFileExporterIface */ static void djvu_document_file_exporter_begin (EvFileExporter *exporter, @@ -622,7 +567,7 @@ djvu_document_file_exporter_get_capabilities (EvFileExporter *exporter) } static void -djvu_document_file_exporter_iface_init (EvFileExporterIface *iface) +djvu_document_file_exporter_iface_init (EvFileExporterInterface *iface) { iface->begin = djvu_document_file_exporter_begin; iface->do_page = djvu_document_file_exporter_do_page; @@ -701,23 +646,24 @@ djvu_document_find_find_text (EvDocumentFind *document, } static void -djvu_document_find_iface_init (EvDocumentFindIface *iface) +djvu_document_find_iface_init (EvDocumentFindInterface *iface) { iface->find_text = djvu_document_find_find_text; } -static GList * +static EvMappingList * djvu_document_links_get_links (EvDocumentLinks *document_links, - gint page) + EvPage *page) { - return djvu_links_get_links (document_links, page, SCALE_FACTOR); + return djvu_links_get_links (document_links, page->index, SCALE_FACTOR); } static void -djvu_document_document_links_iface_init (EvDocumentLinksIface *iface) +djvu_document_document_links_iface_init (EvDocumentLinksInterface *iface) { iface->has_document_links = djvu_links_has_document_links; iface->get_links_model = djvu_links_get_links_model; iface->get_links = djvu_document_links_get_links; iface->find_link_dest = djvu_links_find_link_dest; + iface->find_link_page = djvu_links_find_link_page; }