tikz-gallery-generator

Custum build of stapix for tikz.pablopie.xyz

NameSizeMode
..
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;
}