diff options
| author | Gabriel Schneider <[email protected]> | 2026-08-03 09:16:50 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-08-10 09:17:07 -0300 |
| commit | a69cd4a7ef5c4527e3a7cd325d49b6bf445bd810 (patch) | |
| tree | 6a689cdea0f46ed520e5347fbf18ca7303943ae9 /src/pdf_bridge.h | |
| parent | a774cad033fdc371af9f89b9a787a30ea017481c (diff) | |
| download | pardes-a69cd4a7ef5c4527e3a7cd325d49b6bf445bd810.tar.gz pardes-a69cd4a7ef5c4527e3a7cd325d49b6bf445bd810.zip | |
expose MuPDF PDF outline metadata
Diffstat (limited to 'src/pdf_bridge.h')
| -rw-r--r-- | src/pdf_bridge.h | 60 |
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 |
