glib/poppler-document.cc | 85 ++++++++++++++++++++++++++++++++++++ glib/poppler-document.h | 3 + glib/reference/poppler-sections.txt | 1 3 files changed, 89 insertions(+)
New commits: commit db1626d5210493a9e77cc6575383b566ae5e07f6 Author: Masamichi Hosoda <[email protected]> Date: Mon Oct 8 19:02:10 2018 +0900 Add poppler_document_create_dests_tree() to glib frontend Creates named destinations balanced binary tree in document. diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc index 49c9ed3a..291c453c 100644 --- a/glib/poppler-document.cc +++ b/glib/poppler-document.cc @@ -3,6 +3,7 @@ * * Copyright (C) 2016 Jakub Alba <[email protected]> * Copyright (C) 2018 Marek Kasik <[email protected]> + * Copyright (C) 2019 Masamichi Hosoda <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -839,6 +840,90 @@ poppler_document_find_dest (PopplerDocument *document, return dest; } +static gint +_poppler_dest_compare_keys (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + return g_strcmp0 (static_cast<const gchar*>(a), + static_cast<const gchar*>(b)); +} + +static void +_poppler_dest_destroy_value (gpointer value) +{ + poppler_dest_free (static_cast<PopplerDest*>(value)); +} + +/** + * poppler_document_create_dests_tree: + * @document: A #PopplerDocument + * + * Creates named destinations balanced binary tree in @document + * + * The tree key is strings in the form returned by + * poppler_named_dest_bytestring() which constains a destination name. + * The tree value is the #PopplerDest* which contains a named destination. + * The return value must be freed with #g_tree_destroy. + * + * Returns: (transfer full) (nullable): the #GTree, or %NULL + * Since: 0.78 + **/ +GTree * +poppler_document_create_dests_tree (PopplerDocument *document) +{ + GTree *tree; + Catalog *catalog; + LinkDest *link_dest; + PopplerDest *dest; + int i; + gchar *key; + + g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), nullptr); + + catalog = document->doc->getCatalog (); + if (catalog == nullptr) + return nullptr; + + tree = g_tree_new_full (_poppler_dest_compare_keys, nullptr, + g_free, + _poppler_dest_destroy_value); + + // Iterate from name-dict + const int nDests = catalog->numDests (); + for (i = 0; i < nDests; ++i) { + // The names of name-dict cannot contain \0, + // so we can use strlen(). + auto name = catalog->getDestsName (i); + key = poppler_named_dest_from_bytestring + (reinterpret_cast<const guint8*> (name), + strlen (name)); + link_dest = catalog->getDestsDest (i); + if (link_dest) { + dest = _poppler_dest_new_goto (document, link_dest); + delete link_dest; + g_tree_insert (tree, key, dest); + } + } + + // Iterate form name-tree + const int nDestsNameTree = catalog->numDestNameTree (); + for (i = 0; i < nDestsNameTree; ++i) { + auto name = catalog->getDestNameTreeName (i); + key = poppler_named_dest_from_bytestring + (reinterpret_cast<const guint8*> (name->c_str ()), + name->getLength ()); + link_dest = catalog->getDestNameTreeDest (i); + if (link_dest) { + dest = _poppler_dest_new_goto (document, link_dest); + delete link_dest; + g_tree_insert (tree, key, dest); + } + } + + return tree; +} + char *_poppler_goo_string_to_utf8(const GooString *s) { if (s == nullptr) { diff --git a/glib/poppler-document.h b/glib/poppler-document.h index e9eeebfd..32614c55 100644 --- a/glib/poppler-document.h +++ b/glib/poppler-document.h @@ -3,6 +3,7 @@ * * Copyright (C) 2016 Jakub Alba <[email protected]> * Copyright (C) 2018 Marek Kasik <[email protected]> + * Copyright (C) 2019 Masamichi Hosoda <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -386,6 +387,8 @@ GList *poppler_document_get_attachments (PopplerDocument *do POPPLER_PUBLIC PopplerDest *poppler_document_find_dest (PopplerDocument *document, const gchar *link_name); +POPPLER_PUBLIC +GTree *poppler_document_create_dests_tree (PopplerDocument *document); /* Form */ POPPLER_PUBLIC diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt index c71c2776..2da8aea5 100644 --- a/glib/reference/poppler-sections.txt +++ b/glib/reference/poppler-sections.txt @@ -151,6 +151,7 @@ PopplerPageLayout PopplerPageMode PopplerPermissions PopplerViewerPreferences +poppler_document_create_dests_tree poppler_document_find_dest poppler_document_get_attachments poppler_document_get_author _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
