tikz-gallery-generator
Custum build of stapix for tikz.pablopie.xyz
| Name | Size | Mode |
| .. | ||
| mupdf-sys/src/wrapper.c | 2K | -rw-r--r-- |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
#include <stdlib.h> #include <stdint.h> #include <mupdf/fitz.h> #include <mupdf/pdf.h> typedef struct { const char* err_msg; enum fz_error_type type; } mupdf_result_t; mupdf_result_t mupdf_open_doc_from_bytes( fz_context* ctx, uint8_t* bytes, size_t size, fz_document** doc, uint32_t* page_count) { mupdf_result_t result = {0}; fz_stream* stream = NULL; fz_try(ctx) { fz_buffer buf = {0}; buf.data = bytes; buf.cap = size; buf.len = size; stream = fz_open_buffer(ctx, &buf); *doc = (fz_document*)pdf_open_document_with_stream(ctx, stream); if (*doc == NULL) break; *page_count = fz_count_pages(ctx, *doc); } fz_always(ctx) { fz_drop_stream(ctx, stream); } fz_catch(ctx) { result.err_msg = fz_caught_message(ctx); result.type = fz_caught(ctx); } return result; } mupdf_result_t mupdf_page_to_svg(fz_context* ctx, fz_document* doc, size_t page_number, fz_buffer** buf) { mupdf_result_t result = {0}; fz_page* page = NULL; fz_output* out = NULL; fz_device* dev = NULL; fz_try(ctx) { // TODO: page bound checks when running in debug mode? page = fz_load_page(ctx, doc, page_number); if (page == NULL) break; // skip to fz_always fz_rect bbox = fz_bound_page(ctx, page); float width = bbox.x1 - bbox.x0, height = bbox.y1 - bbox.y0; *buf = fz_new_buffer(ctx, 1024); if (*buf == NULL) break; // skip to fz_always out = fz_new_output_with_buffer(ctx, *buf); if (out == NULL) break; // skip to fz_always dev = fz_new_svg_device(ctx, out, width, height, FZ_SVG_TEXT_AS_PATH, 0); if (dev == NULL) break; // skip to fz_always fz_run_page(ctx, page, dev, fz_identity, NULL); fz_close_device(ctx, dev); fz_close_output(ctx, out); } fz_always(ctx) { fz_drop_device(ctx, dev); fz_drop_output(ctx, out); fz_drop_page(ctx, page); } fz_catch(ctx) { result.err_msg = fz_caught_message(ctx); result.type = fz_caught(ctx); } return result; }