summaryrefslogtreecommitdiff
path: root/src/pdf_bridge.h
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-08-03 09:16:50 -0300
committerGabriel Schneider <[email protected]>2026-08-10 09:17:07 -0300
commita69cd4a7ef5c4527e3a7cd325d49b6bf445bd810 (patch)
tree6a689cdea0f46ed520e5347fbf18ca7303943ae9 /src/pdf_bridge.h
parenta774cad033fdc371af9f89b9a787a30ea017481c (diff)
downloadpardes-a69cd4a7ef5c4527e3a7cd325d49b6bf445bd810.tar.gz
pardes-a69cd4a7ef5c4527e3a7cd325d49b6bf445bd810.zip
expose MuPDF PDF outline metadata
Diffstat (limited to 'src/pdf_bridge.h')
-rw-r--r--src/pdf_bridge.h60
1 files changed, 59 insertions, 1 deletions
diff --git a/src/pdf_bridge.h b/src/pdf_bridge.h
index 17323a29..c85873e1 100644
--- a/src/pdf_bridge.h
+++ b/src/pdf_bridge.h
@@ -88,6 +88,46 @@ typedef struct pardes_pdf_owned_text {
size_t len;
} pardes_pdf_owned_text;
+typedef enum pardes_pdf_outline_destination_kind {
+ PARDES_PDF_OUTLINE_DESTINATION_NONE = 0,
+ PARDES_PDF_OUTLINE_DESTINATION_INTERNAL = 1,
+ PARDES_PDF_OUTLINE_DESTINATION_EXTERNAL = 2
+} pardes_pdf_outline_destination_kind;
+
+/*
+ * One pre-order depth-first row. Offsets address the result's byte arena;
+ * title_present distinguishes a missing title from a present empty title.
+ * Internal page numbers are zero-based. has_x/has_y preserve MuPDF's NAN
+ * sentinel for viewing coordinates that the outline destination omits.
+ */
+typedef struct pardes_pdf_outline_item {
+ size_t title_offset;
+ size_t title_len;
+ size_t uri_offset;
+ size_t uri_len;
+ unsigned int depth;
+ int page;
+ float x;
+ float y;
+ unsigned char title_present;
+ unsigned char has_x;
+ unsigned char has_y;
+ unsigned char is_open;
+ unsigned char flags;
+ unsigned char r;
+ unsigned char g;
+ unsigned char b;
+ int destination_kind;
+} pardes_pdf_outline_item;
+
+typedef struct pardes_pdf_outline_result {
+ void *handle;
+ const pardes_pdf_outline_item *items;
+ size_t item_count;
+ const unsigned char *bytes;
+ size_t bytes_len;
+} pardes_pdf_outline_result;
+
enum {
PARDES_PDF_OK = 0,
PARDES_PDF_ERROR = -1,
@@ -102,7 +142,12 @@ enum {
* truncated result. Selection uses one extra private probe slot so an
* exact-at-the-limit result remains distinguishable from truncation.
*/
- PARDES_PDF_MAX_RESULT_QUADS = 65536
+ PARDES_PDF_MAX_RESULT_QUADS = 65536,
+
+ /* Outline conversion is atomic: crossing any bound returns no rows. */
+ PARDES_PDF_MAX_OUTLINE_ITEMS = 4096,
+ PARDES_PDF_MAX_OUTLINE_DEPTH = 64,
+ PARDES_PDF_MAX_OUTLINE_BYTES = 4 * 1024 * 1024
};
pardes_pdf_document *pardes_pdf_open(const char *path, int *page_count);
@@ -194,6 +239,19 @@ int pardes_pdf_copy_selection(
);
void pardes_pdf_drop_owned_text(pardes_pdf_document *document, void *text);
+/*
+ * Flatten fz_load_outline's tree in stable document-order DFS. The borrowed
+ * table and byte arena remain valid until drop_outline_result.
+ */
+int pardes_pdf_load_outline(
+ pardes_pdf_document *document,
+ pardes_pdf_outline_result *out
+);
+void pardes_pdf_drop_outline_result(
+ pardes_pdf_document *document,
+ void *outline
+);
+
#ifdef __cplusplus
}
#endif