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=e4d2791ce4ebb0083f8fbeabdc49b22af923ffee;hb=223cc03e0275c77c4482ed0495b3bd15993a3ab8;hp=d54c410bb79586090f930a63ba4d4f0abce542fe;hpb=b319a23ddba7c54078aefaae57a036d25a1e5c4b;p=evince.git diff --git a/backend/djvu/djvu-links.c b/backend/djvu/djvu-links.c index d54c410b..e4d2791c 100644 --- a/backend/djvu/djvu-links.c +++ b/backend/djvu/djvu-links.c @@ -15,7 +15,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 @@ -26,7 +26,7 @@ #include "djvu-links.h" #include "djvu-document-private.h" #include "ev-document-links.h" - +#include "ev-mapping-list.h" static gboolean number_from_miniexp(miniexp_t sexp, int *number) { @@ -60,8 +60,8 @@ static gboolean number_from_string_10(const gchar *str, guint64 *number) } } -static EvLinkDest * -get_djvu_link_dest (const DjvuDocument *djvu_document, const gchar *link_name, int base_page) +static guint64 +get_djvu_link_page (const DjvuDocument *djvu_document, const gchar *link_name, int base_page) { guint64 page_num = 0; @@ -69,22 +69,28 @@ get_djvu_link_dest (const DjvuDocument *djvu_document, const gchar *link_name, i if (g_str_has_prefix (link_name, "#")) { if (base_page > 0 && g_str_has_prefix (link_name+1, "+")) { if (number_from_string_10 (link_name + 2, &page_num)) { - return ev_link_dest_new_page (base_page + page_num); + return base_page + page_num; } } else if (base_page > 0 && g_str_has_prefix (link_name+1, "-")) { if (number_from_string_10 (link_name + 2, &page_num)) { - return ev_link_dest_new_page (base_page - page_num); + return base_page - page_num; } } else { if (number_from_string_10 (link_name + 1, &page_num)) { - return ev_link_dest_new_page (page_num - 1); + return page_num - 1; } } } else { /* FIXME: component file identifiers */ } - return NULL; + return page_num; +} + +static EvLinkDest * +get_djvu_link_dest (const DjvuDocument *djvu_document, const gchar *link_name, int base_page) +{ + return ev_link_dest_new_page (get_djvu_link_page (djvu_document, link_name, base_page)); } static EvLinkAction * @@ -223,9 +229,9 @@ 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; @@ -245,10 +251,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) { @@ -271,10 +277,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; @@ -287,18 +293,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; @@ -326,7 +332,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; @@ -354,7 +360,7 @@ djvu_links_has_document_links (EvDocumentLinks *document_links) return FALSE; } -GList * +EvMappingList * djvu_links_get_links (EvDocumentLinks *document_links, gint page, double scale_factor) @@ -363,7 +369,7 @@ 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) @@ -378,10 +384,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); } } @@ -390,7 +396,7 @@ djvu_links_get_links (EvDocumentLinks *document_links, ddjvu_miniexp_release (djvu_document->d_document, page_annotations); } - return retval; + return ev_mapping_list_new (page, retval, (GDestroyNotify)g_object_unref); } EvLinkDest * @@ -409,6 +415,22 @@ djvu_links_find_link_dest (EvDocumentLinks *document_links, return ev_dest; } +gint +djvu_links_find_link_page (EvDocumentLinks *document_links, + const gchar *link_name) +{ + DjvuDocument *djvu_document = DJVU_DOCUMENT (document_links); + gint page; + + page = get_djvu_link_page (djvu_document, link_name, -1); + + if (page == -1) { + g_warning ("DjvuLibre error: unknown link destination %s", link_name); + } + + return page; +} + GtkTreeModel * djvu_links_get_links_model (EvDocumentLinks *document_links) {