X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=backend%2Fdjvu%2Fdjvu-document.c;h=6e1c5f3c378287d4eb9524acb4d6a9643f0e9c16;hb=f51872613abaaa42c716e2fe6a2e4695c529dc4b;hp=a8f04254d8fd8374f1c5190b260622ea744cde3b;hpb=217797d63b2d3b1c9a7a0511af1bbf3d99f0d482;p=evince.git diff --git a/backend/djvu/djvu-document.c b/backend/djvu/djvu-document.c index a8f04254..6e1c5f3c 100644 --- a/backend/djvu/djvu-document.c +++ b/backend/djvu/djvu-document.c @@ -17,6 +17,9 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "config.h" + +#include #include "djvu-document.h" #include "djvu-text.h" #include "djvu-links.h" @@ -26,6 +29,8 @@ #include "ev-document-misc.h" #include "ev-document-find.h" #include "ev-document-links.h" +#include "ev-selection.h" +#include "ev-file-helpers.h" #include #include @@ -51,15 +56,15 @@ static void djvu_document_document_thumbnails_iface_init (EvDocumentThumbnailsIf 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); -G_DEFINE_TYPE_WITH_CODE - (DjvuDocument, djvu_document, G_TYPE_OBJECT, +EV_BACKEND_REGISTER_WITH_CODE (DjvuDocument, djvu_document, { - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, djvu_document_document_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, djvu_document_document_thumbnails_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, djvu_document_file_exporter_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_FIND, djvu_document_find_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_LINKS, djvu_document_document_links_iface_init); + G_IMPLEMENT_INTERFACE (EV_TYPE_SELECTION, djvu_selection_iface_init); }); @@ -216,13 +221,14 @@ djvu_document_render (EvDocument *document, EvRenderContext *rc) { DjvuDocument *djvu_document = DJVU_DOCUMENT (document); - cairo_surface_t *surface, *rotated_surface; + cairo_surface_t *surface; gchar *pixels; gint rowstride; ddjvu_rect_t rrect; ddjvu_rect_t prect; ddjvu_page_t *d_page; - double page_width, page_height; + 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); @@ -232,11 +238,37 @@ djvu_document_render (EvDocument *document, page_width = ddjvu_page_get_width (d_page) * rc->scale * SCALE_FACTOR + 0.5; page_height = ddjvu_page_get_height (d_page) * rc->scale * SCALE_FACTOR + 0.5; - + + switch (rc->rotation) { + case 90: + rotation = DDJVU_ROTATE_90; + tmp = page_height; + page_height = page_width; + page_width = tmp; + + break; + case 180: + rotation = DDJVU_ROTATE_180; + + break; + case 270: + rotation = DDJVU_ROTATE_270; + tmp = page_height; + page_height = page_width; + page_width = tmp; + + break; + 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 (pixels, - CAIRO_FORMAT_ARGB32, + surface = cairo_image_surface_create_for_data ((guchar *)pixels, + CAIRO_FORMAT_RGB24, page_width, page_height, rowstride); @@ -248,6 +280,8 @@ djvu_document_render (EvDocument *document, prect.h = page_height; rrect = prect; + ddjvu_page_set_rotation (d_page, rotation); + ddjvu_page_render (d_page, DDJVU_RENDER_COLOR, &prect, &rrect, @@ -255,13 +289,7 @@ djvu_document_render (EvDocument *document, rowstride, pixels); - rotated_surface = ev_document_misc_surface_rotate_and_scale (surface, - page_width, - page_height, - rc->rotation); - cairo_surface_destroy (surface); - - return rotated_surface; + return surface; } static void @@ -269,6 +297,9 @@ djvu_document_finalize (GObject *object) { DjvuDocument *djvu_document = DJVU_DOCUMENT (object); + if (djvu_document->search) + djvu_text_free (djvu_document->search); + if (djvu_document->d_document) ddjvu_document_release (djvu_document->d_document); @@ -294,35 +325,6 @@ djvu_document_class_init (DjvuDocumentClass *klass) gobject_class->finalize = djvu_document_finalize; } -static gboolean -djvu_document_can_get_text (EvDocument *document) -{ - return TRUE; -} - - -static char * -djvu_document_get_text (EvDocument *document, int page, EvRectangle *rect) -{ - DjvuDocument *djvu_document = DJVU_DOCUMENT (document); - double width, height; - EvRectangle rectangle; - char* text; - - djvu_document_get_page_size (document, page, &width, &height); - rectangle.x1 = rect->x1 / SCALE_FACTOR; - rectangle.y1 = (height - rect->y2) / SCALE_FACTOR; - rectangle.x2 = rect->x2 / SCALE_FACTOR; - rectangle.y2 = (height - rect->y1) / SCALE_FACTOR; - - text = djvu_text_copy (djvu_document, page, &rectangle); - - if (text == NULL) - text = g_strdup (""); - - return text; -} - static EvDocumentInfo * djvu_document_get_info (EvDocument *document) { @@ -338,14 +340,44 @@ djvu_document_document_iface_init (EvDocumentIface *iface) { iface->load = djvu_document_load; iface->save = djvu_document_save; - iface->can_get_text = djvu_document_can_get_text; - iface->get_text = djvu_document_get_text; 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; } +static gchar * +djvu_selection_get_selected_text (EvSelection *selection, + EvRenderContext *rc, + EvSelectionStyle style, + EvRectangle *points) +{ + DjvuDocument *djvu_document = DJVU_DOCUMENT (selection); + double width, height; + EvRectangle rectangle; + gchar *text; + + djvu_document_get_page_size (EV_DOCUMENT (djvu_document), + rc->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, &rectangle); + + if (text == NULL) + text = g_strdup (""); + + return text; +} + +static void +djvu_selection_iface_init (EvSelectionIface *iface) +{ + iface->get_selected_text = djvu_selection_get_selected_text; +} + static void djvu_document_thumbnails_get_dimensions (EvDocumentThumbnails *document, EvRenderContext *rc, @@ -421,30 +453,17 @@ djvu_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface) } /* EvFileExporterIface */ -static gboolean -djvu_document_file_exporter_format_supported (EvFileExporter *exporter, - EvFileExporterFormat format) -{ - return (format == EV_FILE_FORMAT_PS); // only exporting to PS is implemented. -} - static void -djvu_document_file_exporter_begin (EvFileExporter *exporter, - EvFileExporterFormat format, - const char *filename, /* for storing the temp ps file */ - int first_page, - int last_page, - double width, - double height, - gboolean duplex) +djvu_document_file_exporter_begin (EvFileExporter *exporter, + EvFileExporterContext *fc) { DjvuDocument *djvu_document = DJVU_DOCUMENT (exporter); if (djvu_document->ps_filename) g_free (djvu_document->ps_filename); - djvu_document->ps_filename = g_strdup(filename); + djvu_document->ps_filename = g_strdup (fc->filename); - g_string_assign(djvu_document->opts, "-page="); + g_string_assign (djvu_document->opts, "-page="); } static void @@ -453,7 +472,7 @@ djvu_document_file_exporter_do_page (EvFileExporter *exporter, { DjvuDocument *djvu_document = DJVU_DOCUMENT (exporter); - g_string_append_printf(djvu_document->opts, "%d,", (rc->page) + 1); + g_string_append_printf (djvu_document->opts, "%d,", (rc->page) + 1); } static void @@ -464,29 +483,39 @@ djvu_document_file_exporter_end (EvFileExporter *exporter) DjvuDocument *djvu_document = DJVU_DOCUMENT (exporter); - FILE *fn = fopen(djvu_document->ps_filename, "w"); + FILE *fn = fopen (djvu_document->ps_filename, "w"); if (fn == NULL) { - g_warning(_("Cannot open file “%s”."), djvu_document->ps_filename); + g_warning ("Cannot open file “%s”.", djvu_document->ps_filename); return; } d_optv[0] = djvu_document->opts->str; ddjvu_job_t * job = ddjvu_document_print(djvu_document->d_document, fn, d_optc, d_optv); - while (!ddjvu_job_done(job) ) { + while (!ddjvu_job_done(job)) { djvu_handle_events (djvu_document, TRUE); } fclose(fn); } +static EvFileExporterCapabilities +djvu_document_file_exporter_get_capabilities (EvFileExporter *exporter) +{ + return EV_FILE_EXPORTER_CAN_PAGE_SET | + EV_FILE_EXPORTER_CAN_COPIES | + EV_FILE_EXPORTER_CAN_COLLATE | + EV_FILE_EXPORTER_CAN_REVERSE | + EV_FILE_EXPORTER_CAN_GENERATE_PS; +} + static void djvu_document_file_exporter_iface_init (EvFileExporterIface *iface) { - iface->format_supported = djvu_document_file_exporter_format_supported; iface->begin = djvu_document_file_exporter_begin; iface->do_page = djvu_document_file_exporter_do_page; iface->end = djvu_document_file_exporter_end; + iface->get_capabilities = djvu_document_file_exporter_get_capabilities; } static void