X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=backend%2Fdjvu%2Fdjvu-links.c;h=392e9b3904dc367bb063db1a8a2b4943761f5c90;hb=b1afb3adfd0cbad343abe98986e7aef74b280b89;hp=87057d49d4f7dcbadbe36b9e21a2c3baab1242cf;hpb=73dca3f3fdd7cca8a32974b989c5243bd23f7791;p=evince.git diff --git a/backend/djvu/djvu-links.c b/backend/djvu/djvu-links.c index 87057d49..392e9b39 100644 --- a/backend/djvu/djvu-links.c +++ b/backend/djvu/djvu-links.c @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include #include @@ -25,7 +26,7 @@ #include "djvu-links.h" #include "djvu-document-private.h" #include "ev-document-links.h" - +#include "ev-mapping.h" static gboolean number_from_miniexp(miniexp_t sexp, int *number) { @@ -63,7 +64,6 @@ static EvLinkDest * get_djvu_link_dest (const DjvuDocument *djvu_document, const gchar *link_name, int base_page) { guint64 page_num = 0; - gchar *end_ptr; /* #pagenum, #+pageoffset, #-pageoffset */ if (g_str_has_prefix (link_name, "#")) { @@ -169,16 +169,16 @@ build_tree (const DjvuDocument *djvu_document, /* The (bookmarks) cons */ iter = miniexp_cdr (iter); } else if ( miniexp_length (iter) >= 2 ) { + gchar *utf8_title = NULL; + /* An entry */ if (!string_from_miniexp (miniexp_car (iter), &title)) goto unknown_entry; if (!string_from_miniexp (miniexp_cadr (iter), &link_dest)) goto unknown_entry; + if (!g_utf8_validate (title, -1, NULL)) { - gchar *utf8_title; - utf8_title = str_to_utf8 (title); title_markup = g_markup_escape_text (utf8_title, -1); - g_free (utf8_title); } else { title_markup = g_markup_escape_text (title, -1); } @@ -188,7 +188,7 @@ build_tree (const DjvuDocument *djvu_document, if (g_str_has_suffix (link_dest, ".djvu")) { /* FIXME: component file identifiers */ } else if (ev_action) { - ev_link = ev_link_new (title, ev_action); + ev_link = ev_link_new (utf8_title ? utf8_title : title, ev_action); gtk_tree_store_append (GTK_TREE_STORE (model), &tree_iter, parent); gtk_tree_store_set (GTK_TREE_STORE (model), &tree_iter, EV_DOCUMENT_LINKS_COLUMN_MARKUP, title_markup, @@ -205,7 +205,7 @@ build_tree (const DjvuDocument *djvu_document, } g_free (title_markup); - + g_free (utf8_title); iter = miniexp_cddr (iter); parent = &tree_iter; } else { @@ -223,12 +223,11 @@ build_tree (const DjvuDocument *djvu_document, } static gboolean -get_djvu_hyperlink_area (ddjvu_pageinfo_t *page_info, - miniexp_t sexp, - EvLinkMapping *ev_link_mapping) +get_djvu_hyperlink_area (ddjvu_pageinfo_t *page_info, + miniexp_t sexp, + EvMapping *ev_link_mapping) { miniexp_t iter; - ddjvu_pageinfo_t info; iter = sexp; @@ -246,10 +245,10 @@ get_djvu_hyperlink_area (ddjvu_pageinfo_t *page_info, iter = miniexp_cdr (iter); if (!number_from_miniexp (miniexp_car (iter), &height)) goto unknown_link; - ev_link_mapping->x1 = minx; - ev_link_mapping->x2 = (minx + width); - ev_link_mapping->y1 = (page_info->height - (miny + height)); - ev_link_mapping->y2 = (page_info->height - miny); + ev_link_mapping->area.x1 = minx; + ev_link_mapping->area.x2 = (minx + width); + ev_link_mapping->area.y1 = (page_info->height - (miny + height)); + ev_link_mapping->area.y2 = (page_info->height - miny); } else if (miniexp_car (iter) == miniexp_symbol ("poly") && miniexp_length (iter) >= 5 && miniexp_length (iter) % 2 == 1) { @@ -272,10 +271,10 @@ get_djvu_hyperlink_area (ddjvu_pageinfo_t *page_info, maxy = MAX (maxy, y); } - ev_link_mapping->x1 = minx; - ev_link_mapping->x2 = maxx; - ev_link_mapping->y1 = (page_info->height - maxy); - ev_link_mapping->y2 = (page_info->height - miny); + ev_link_mapping->area.x1 = minx; + ev_link_mapping->area.x2 = maxx; + ev_link_mapping->area.y1 = (page_info->height - maxy); + ev_link_mapping->area.y2 = (page_info->height - miny); } else { /* unknown */ goto unknown_link; @@ -288,18 +287,18 @@ get_djvu_hyperlink_area (ddjvu_pageinfo_t *page_info, return FALSE; } -static EvLinkMapping * +static EvMapping * get_djvu_hyperlink_mapping (DjvuDocument *djvu_document, int page, ddjvu_pageinfo_t *page_info, miniexp_t sexp) { - EvLinkMapping *ev_link_mapping = NULL; + EvMapping *ev_link_mapping = NULL; EvLinkAction *ev_action = NULL; miniexp_t iter; const char *url, *url_target, *comment; - ev_link_mapping = g_new (EvLinkMapping, 1); + ev_link_mapping = g_new (EvMapping, 1); iter = sexp; @@ -327,7 +326,7 @@ get_djvu_hyperlink_mapping (DjvuDocument *djvu_document, ev_action = get_djvu_link_action (djvu_document, url, page); if (!ev_action) goto unknown_mapping; - ev_link_mapping->link = ev_link_new (comment, ev_action); + ev_link_mapping->data = ev_link_new (comment, ev_action); return ev_link_mapping; @@ -345,7 +344,7 @@ djvu_links_has_document_links (EvDocumentLinks *document_links) miniexp_t outline; while ((outline = ddjvu_document_get_outline (djvu_document->d_document)) == miniexp_dummy) - djvu_handle_events (djvu_document, TRUE); + djvu_handle_events (djvu_document, TRUE, NULL); if (outline) { ddjvu_miniexp_release (djvu_document->d_document, outline); @@ -364,14 +363,14 @@ djvu_links_get_links (EvDocumentLinks *document_links, GList *retval = NULL; miniexp_t page_annotations = miniexp_nil; miniexp_t *hyperlinks = NULL, *iter = NULL; - EvLinkMapping *ev_link_mapping; + EvMapping *ev_link_mapping; ddjvu_pageinfo_t page_info; while ((page_annotations = ddjvu_document_get_pageanno (djvu_document->d_document, page)) == miniexp_dummy) - djvu_handle_events (djvu_document, TRUE); + djvu_handle_events (djvu_document, TRUE, NULL); while (ddjvu_document_get_pageinfo (djvu_document->d_document, page, &page_info) < DDJVU_JOB_OK) - djvu_handle_events(djvu_document, TRUE); + djvu_handle_events(djvu_document, TRUE, NULL); if (page_annotations) { hyperlinks = ddjvu_anno_get_hyperlinks (page_annotations); @@ -379,10 +378,10 @@ djvu_links_get_links (EvDocumentLinks *document_links, for (iter = hyperlinks; *iter; ++iter) { ev_link_mapping = get_djvu_hyperlink_mapping (djvu_document, page, &page_info, *iter); if (ev_link_mapping) { - ev_link_mapping->x1 *= scale_factor; - ev_link_mapping->x2 *= scale_factor; - ev_link_mapping->y1 *= scale_factor; - ev_link_mapping->y2 *= scale_factor; + ev_link_mapping->area.x1 *= scale_factor; + ev_link_mapping->area.x2 *= scale_factor; + ev_link_mapping->area.y1 *= scale_factor; + ev_link_mapping->area.y2 *= scale_factor; retval = g_list_prepend (retval, ev_link_mapping); } } @@ -401,7 +400,7 @@ djvu_links_find_link_dest (EvDocumentLinks *document_links, DjvuDocument *djvu_document = DJVU_DOCUMENT (document_links); EvLinkDest *ev_dest = NULL; - ev_dest = get_djvu_link_dest (DJVU_DOCUMENT (document_links), link_name, -1); + ev_dest = get_djvu_link_dest (djvu_document, link_name, -1); if (!ev_dest) { g_warning ("DjvuLibre error: unknown link destination %s", link_name); @@ -418,7 +417,7 @@ djvu_links_get_links_model (EvDocumentLinks *document_links) miniexp_t outline = miniexp_nil; while ((outline = ddjvu_document_get_outline (djvu_document->d_document)) == miniexp_dummy) - djvu_handle_events (djvu_document, TRUE); + djvu_handle_events (djvu_document, TRUE, NULL); if (outline) { model = (GtkTreeModel *) gtk_tree_store_new (EV_DOCUMENT_LINKS_COLUMN_NUM_COLUMNS,