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=7ab5c76cc00f35b40439f7360f6bba3d07c2e361;hb=5a058f12f1606d6d87c9ed592df93b33235d3766;hp=5f59a8ea3ab34c27baffcf97b1de158515235c79;hpb=b319a23ddba7c54078aefaae57a036d25a1e5c4b;p=evince.git diff --git a/backend/djvu/djvu-document.c b/backend/djvu/djvu-document.c index 5f59a8ea..7ab5c76c 100644 --- a/backend/djvu/djvu-document.c +++ b/backend/djvu/djvu-document.c @@ -21,7 +21,7 @@ #include #include "djvu-document.h" -#include "djvu-text.h" +#include "djvu-text-page.h" #include "djvu-links.h" #include "djvu-document-private.h" #include "ev-document-thumbnails.h" @@ -32,9 +32,9 @@ #include "ev-selection.h" #include "ev-file-helpers.h" -#include -#include -#include +#include +#include +#include #include #define SCALE_FACTOR 0.2 @@ -46,12 +46,11 @@ 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); @@ -75,7 +74,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; } @@ -97,9 +96,9 @@ handle_message (const ddjvu_message_t *msg, GError **error) } if (error) { - g_set_error (error, EV_DJVU_ERROR, 0, error_str); + g_set_error_literal (error, EV_DJVU_ERROR, 0, error_str); } else { - g_warning (error_str); + g_warning ("%s", error_str); } g_free (error_str); @@ -168,6 +167,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; } @@ -178,10 +181,10 @@ djvu_document_load (EvDocument *document, djvu_wait_for_message (djvu_document, DDJVU_DOCINFO, &djvu_error); if (djvu_error) { - g_set_error (error, - EV_DOCUMENT_ERROR, - EV_DOCUMENT_ERROR_INVALID, - djvu_error->message); + g_set_error_literal (error, + EV_DOCUMENT_ERROR, + EV_DOCUMENT_ERROR_INVALID, + djvu_error->message); g_error_free (djvu_error); g_free (filename); ddjvu_document_release (djvu_document->d_document); @@ -194,10 +197,10 @@ djvu_document_load (EvDocument *document, djvu_handle_events (djvu_document, TRUE, &djvu_error); if (djvu_error) { - g_set_error (error, - EV_DOCUMENT_ERROR, - EV_DOCUMENT_ERROR_INVALID, - djvu_error->message); + g_set_error_literal (error, + EV_DOCUMENT_ERROR, + EV_DOCUMENT_ERROR_INVALID, + djvu_error->message); g_error_free (djvu_error); g_free (filename); ddjvu_document_release (djvu_document->d_document); @@ -241,11 +244,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 +323,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 +354,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,6 +375,8 @@ djvu_document_render (EvDocument *document, rowstride, pixels); + cairo_surface_mark_dirty (surface); + return surface; } @@ -388,9 +385,6 @@ 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); @@ -411,30 +405,40 @@ 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; + + 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; } -static EvDocumentInfo * -djvu_document_get_info (EvDocument *document) +static gchar * +djvu_text_copy (DjvuDocument *djvu_document, + gint page, + EvRectangle *rectangle) { - EvDocumentInfo *info; + miniexp_t page_text; + gchar *text = NULL; - info = g_new0 (EvDocumentInfo, 1); + while ((page_text = + ddjvu_document_get_pagetext (djvu_document->d_document, + page, "char")) == miniexp_dummy) + djvu_handle_events (djvu_document, TRUE, NULL); - return info; -} + if (page_text != miniexp_nil) { + DjvuTextPage *page = djvu_text_page_new (page_text); + + text = djvu_text_page_copy (page, rectangle); + djvu_text_page_free (page); + ddjvu_miniexp_release (djvu_document->d_document, page_text); + } -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; + return text; } static gchar * @@ -627,114 +631,69 @@ djvu_document_init (DjvuDocument *djvu_document) djvu_document->d_document = NULL; } -static void -djvu_document_find_begin (EvDocumentFind *document, - int page, - const char *search_string, - gboolean case_sensitive) +static GList * +djvu_document_find_find_text (EvDocumentFind *document, + EvPage *page, + const char *text, + gboolean case_sensitive) { DjvuDocument *djvu_document = DJVU_DOCUMENT (document); + miniexp_t page_text; + gdouble width, height; + GList *matches = NULL, *l; - if (djvu_document->search && - strcmp (search_string, djvu_text_get_text (djvu_document->search)) == 0) - return; - - if (djvu_document->search) - djvu_text_free (djvu_document->search); - - djvu_document->search = djvu_text_new (djvu_document, - page, - case_sensitive, - search_string); -} + g_return_val_if_fail (text != NULL, NULL); -static int -djvu_document_find_get_n_results (EvDocumentFind *document_find, int page) -{ - DjvuText *search = DJVU_DOCUMENT (document_find)->search; + while ((page_text = ddjvu_document_get_pagetext (djvu_document->d_document, + page->index, + "char")) == miniexp_dummy) + djvu_handle_events (djvu_document, TRUE, NULL); - if (search) { - return djvu_text_n_results (search, page); - } else { - return 0; + if (page_text != miniexp_nil) { + DjvuTextPage *tpage = djvu_text_page_new (page_text); + + djvu_text_page_prepare_search (tpage, case_sensitive); + if (tpage->links->len > 0) { + djvu_text_page_search (tpage, text); + matches = tpage->results; + } + djvu_text_page_free (tpage); + ddjvu_miniexp_release (djvu_document->d_document, page_text); } -} - -static gboolean -djvu_document_find_get_result (EvDocumentFind *document_find, - int page, - int n_result, - EvRectangle *rectangle) -{ - DjvuDocument *djvu_document = DJVU_DOCUMENT (document_find); - DjvuText *search = djvu_document->search; - EvRectangle *r; - double width, height; - if (search == NULL) - return FALSE; + if (!matches) + return NULL; - r = djvu_text_get_result (search, page, n_result); - if (r == NULL) - return FALSE; + document_get_page_size (djvu_document, page->index, &width, &height); + for (l = matches; l && l->data; l = g_list_next (l)) { + EvRectangle *r = (EvRectangle *)l->data; + gdouble tmp; - document_get_page_size (djvu_document, page, &width, &height); - rectangle->x1 = r->x1 * SCALE_FACTOR; - rectangle->y1 = height - r->y2 * SCALE_FACTOR; - rectangle->x2 = r->x2 * SCALE_FACTOR; - rectangle->y2 = height - r->y1 * SCALE_FACTOR; + tmp = r->y1; - return TRUE; -} - -static int -djvu_document_find_page_has_results (EvDocumentFind *document_find, - int page) -{ - DjvuText *search = DJVU_DOCUMENT (document_find)->search; - - return search && djvu_text_has_results (search, page); -} + r->x1 *= SCALE_FACTOR; + r->x2 *= SCALE_FACTOR; -static double -djvu_document_find_get_progress (EvDocumentFind *document_find) -{ - DjvuText *search = DJVU_DOCUMENT (document_find)->search; - - if (search == NULL) { - return 0; + tmp = r->y1; + r->y1 = height - r->y2 * SCALE_FACTOR; + r->y2 = height - tmp * SCALE_FACTOR; } + - return djvu_text_get_progress (search); -} - -static void -djvu_document_find_cancel (EvDocumentFind *document) -{ - DjvuDocument *djvu_document = DJVU_DOCUMENT (document); - - if (djvu_document->search) { - djvu_text_free (djvu_document->search); - djvu_document->search = NULL; - } + return matches; } static void djvu_document_find_iface_init (EvDocumentFindIface *iface) { - iface->begin = djvu_document_find_begin; - iface->get_n_results = djvu_document_find_get_n_results; - iface->get_result = djvu_document_find_get_result; - iface->page_has_results = djvu_document_find_page_has_results; - iface->get_progress = djvu_document_find_get_progress; - iface->cancel = djvu_document_find_cancel; + iface->find_text = djvu_document_find_find_text; } static GList * 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