From a69cd4a7ef5c4527e3a7cd325d49b6bf445bd810 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Mon, 3 Aug 2026 09:16:50 -0300 Subject: expose MuPDF PDF outline metadata --- src/pdf_bridge.h | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) (limited to 'src/pdf_bridge.h') 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 -- cgit v1.3