Skip to main content

cadmus_core/document/
mupdf_sys.rs

1#![allow(unused)]
2
3use std::ffi::c_void;
4use std::mem;
5
6/// Checks whether the loaded MuPDF library exports `fz_load_webp`.
7///
8/// # Safety
9///
10/// `RTLD_DEFAULT` is valid because the process loader resolves
11/// global symbols — MuPDF's linked library (or a dependency) exports
12/// `fz_load_webp`. The byte string `b"fz_load_webp\0".as_ptr()` is
13/// null-terminated and lives in static memory for the call's duration.
14/// The cast to `*const _` is sound: `dlsym` expects a C string pointer,
15/// and we only check `is_null()` without dereferencing the symbol.
16fn has_webp_support() -> bool {
17    unsafe { !libc::dlsym(libc::RTLD_DEFAULT, b"fz_load_webp\0".as_ptr() as *const _).is_null() }
18}
19
20pub fn log_mupdf_features() {
21    tracing::info!(webp = has_webp_support(), "MuPDF features");
22}
23
24pub const FZ_MAX_COLORS: usize = 32;
25pub const FZ_VERSION: &str = "1.27.2";
26
27pub const FZ_META_INFO_AUTHOR: &str = "info:Author";
28pub const FZ_META_INFO_TITLE: &str = "info:Title";
29
30pub const FZ_TEXT_PRESERVE_LIGATURES: libc::c_int = 1;
31pub const FZ_TEXT_PRESERVE_WHITESPACE: libc::c_int = 2;
32pub const FZ_TEXT_PRESERVE_IMAGES: libc::c_int = 4;
33pub const FZ_TEXT_INHIBIT_SPACES: libc::c_int = 8;
34pub const FZ_TEXT_DEHYPHENATE: libc::c_int = 16;
35pub const FZ_TEXT_PRESERVE_SPANS: libc::c_int = 32;
36pub const FZ_TEXT_CLIP: libc::c_int = 64;
37pub const FZ_TEXT_CLIP_RECT: libc::c_int = 1 << 17;
38pub const FZ_TEXT_COLLECT_STRUCTURE: libc::c_int = 256;
39pub const FZ_TEXT_COLLECT_VECTORS: libc::c_int = 1024;
40pub const FZ_TEXT_ACCURATE_BBOXES: libc::c_int = 512;
41pub const FZ_TEXT_ACCURATE_ASCENDERS: libc::c_int = 1 << 18;
42pub const FZ_TEXT_ACCURATE_SIDE_BEARINGS: libc::c_int = 1 << 19;
43pub const FZ_TEXT_IGNORE_ACTUALTEXT: libc::c_int = 2048;
44pub const FZ_TEXT_SEGMENT: libc::c_int = 4096;
45pub const FZ_TEXT_PARAGRAPH_BREAK: libc::c_int = 8192;
46pub const FZ_TEXT_TABLE_HUNT: libc::c_int = 16384;
47pub const FZ_TEXT_USE_CID_FOR_UNKNOWN_UNICODE: libc::c_int = 128;
48pub const FZ_TEXT_USE_GID_FOR_UNKNOWN_UNICODE: libc::c_int = 65536;
49
50pub const FZ_PAGE_BLOCK_TEXT: libc::c_int = 0;
51pub const FZ_PAGE_BLOCK_IMAGE: libc::c_int = 1;
52pub const FZ_PAGE_BLOCK_STRUCT: libc::c_int = 2;
53pub const FZ_PAGE_BLOCK_VECTOR: libc::c_int = 3;
54pub const FZ_PAGE_BLOCK_GRID: libc::c_int = 4;
55
56pub const CACHE_SIZE: libc::size_t = 32 * 1024 * 1024;
57
58pub enum FzContext {}
59pub enum FzDocument {}
60pub enum FzStream {}
61pub enum FzPool {}
62pub enum FzPage {}
63pub enum FzDevice {}
64pub enum FzFont {}
65pub enum FzColorspace {}
66pub enum FzAllocContext {}
67pub enum FzLocksContext {}
68pub enum FzCookie {}
69pub enum FzStoreDropFn {}
70pub enum FzStoreDroppableFn {}
71pub enum FzLinkSetRectFn {}
72pub enum FzLinkSetUriFn {}
73pub enum FzLinkDropLinkFn {}
74pub enum FzSeparations {}
75pub enum FzTextStruct {}
76pub enum FzGridPositions {}
77pub enum FzGridInfo {}
78pub enum FzPoolArray {}
79pub enum FzImage {}
80
81#[link(name = "mupdf")]
82#[link(name = "mupdf_wrapper", kind = "static")]
83
84unsafe extern "C" {
85    pub fn fz_new_context_imp(
86        alloc_ctx: *const FzAllocContext,
87        locks_ctx: *const FzLocksContext,
88        cache_size: libc::size_t,
89        version: *const libc::c_char,
90    ) -> *mut FzContext;
91    pub fn fz_drop_context(ctx: *mut FzContext);
92    pub fn fz_register_document_handlers(ctx: *mut FzContext);
93    pub fn fz_set_user_css(ctx: *mut FzContext, user_css: *const libc::c_char);
94    pub fn fz_set_use_document_css(ctx: *mut FzContext, should_use: libc::c_int);
95    pub fn mp_open_document(ctx: *mut FzContext, path: *const libc::c_char) -> *mut FzDocument;
96    pub fn mp_open_document_with_error(
97        ctx: *mut FzContext,
98        path: *const libc::c_char,
99        err_buf: *mut libc::c_char,
100        err_buf_len: libc::c_int,
101    ) -> *mut FzDocument;
102    pub fn mp_open_document_with_stream(
103        ctx: *mut FzContext,
104        kind: *const libc::c_char,
105        stream: *mut FzStream,
106    ) -> *mut FzDocument;
107    pub fn fz_drop_document(ctx: *mut FzContext, doc: *mut FzDocument);
108    pub fn fz_open_memory(
109        ctx: *mut FzContext,
110        data: *const libc::c_uchar,
111        len: libc::size_t,
112    ) -> *mut FzStream;
113    pub fn fz_drop_stream(ctx: *mut FzContext, stream: *mut FzStream);
114    pub fn mp_count_pages(ctx: *mut FzContext, doc: *mut FzDocument) -> libc::c_int;
115    pub fn mp_page_number_from_location(
116        ctx: *mut FzContext,
117        doc: *mut FzDocument,
118        loc: FzLocation,
119    ) -> libc::c_int;
120    pub fn fz_lookup_metadata(
121        ctx: *mut FzContext,
122        doc: *mut FzDocument,
123        key: *const libc::c_char,
124        buf: *mut libc::c_char,
125        size: libc::c_int,
126    ) -> libc::c_int;
127    pub fn fz_needs_password(ctx: *mut FzContext, doc: *mut FzDocument) -> libc::c_int;
128    pub fn fz_is_document_reflowable(ctx: *mut FzContext, doc: *mut FzDocument) -> libc::c_int;
129    pub fn fz_layout_document(
130        ctx: *mut FzContext,
131        doc: *mut FzDocument,
132        w: libc::c_float,
133        h: libc::c_float,
134        em: libc::c_float,
135    );
136    pub fn mp_load_outline(ctx: *mut FzContext, doc: *mut FzDocument) -> *mut FzOutline;
137    pub fn fz_drop_outline(ctx: *mut FzContext, outline: *mut FzOutline);
138    pub fn fz_device_rgb(ctx: *mut FzContext) -> *mut FzColorspace;
139    pub fn fz_device_gray(ctx: *mut FzContext) -> *mut FzColorspace;
140    pub fn fz_scale(sx: libc::c_float, sy: libc::c_float) -> FzMatrix;
141    pub fn mp_new_pixmap_from_page(
142        ctx: *mut FzContext,
143        page: *mut FzPage,
144        mat: FzMatrix,
145        cs: *mut FzColorspace,
146        alpha: libc::c_int,
147    ) -> *mut FzPixmap;
148    pub fn fz_set_pixmap_resolution(
149        ctx: *mut FzContext,
150        pix: *mut FzPixmap,
151        xres: libc::c_int,
152        yres: libc::c_int,
153    );
154    pub fn fz_drop_pixmap(ctx: *mut FzContext, pixmap: *mut FzPixmap);
155    pub fn mp_load_page(
156        ctx: *mut FzContext,
157        doc: *mut FzDocument,
158        page_idx: libc::c_int,
159    ) -> *mut FzPage;
160    pub fn fz_drop_page(ctx: *mut FzContext, page: *mut FzPage);
161    pub fn fz_bound_page(ctx: *mut FzContext, page: *mut FzPage) -> FzRect;
162    pub fn fz_run_page(
163        ctx: *mut FzContext,
164        page: *mut FzPage,
165        dev: *mut FzDevice,
166        mat: FzMatrix,
167        cookie: *mut FzCookie,
168    );
169    pub fn mp_load_links(ctx: *mut FzContext, page: *mut FzPage) -> *mut FzLink;
170    pub fn fz_drop_link(ctx: *mut FzContext, link: *mut FzLink);
171    pub fn fz_resolve_link_dest(
172        ctx: *mut FzContext,
173        doc: *mut FzDocument,
174        uri: *const libc::c_char,
175    ) -> FzLinkDest;
176    pub fn mp_new_stext_page_from_page(
177        ctx: *mut FzContext,
178        page: *mut FzPage,
179        options: *const FzTextOptions,
180    ) -> *mut FzTextPage;
181    pub fn fz_drop_stext_page(ctx: *mut FzContext, tp: *mut FzTextPage);
182    pub fn fz_new_bbox_device(ctx: *mut FzContext, rect: *mut FzRect) -> *mut FzDevice;
183    pub fn fz_close_device(ctx: *mut FzContext, dev: *mut FzDevice);
184    pub fn fz_drop_device(ctx: *mut FzContext, dev: *mut FzDevice);
185    pub fn fz_union_rect(a: FzRect, b: FzRect) -> FzRect;
186    pub fn fz_rect_from_quad(q: FzQuad) -> FzRect;
187    pub fn fz_runetochar(buf: *mut u8, rune: libc::c_int) -> libc::c_int;
188    pub static fz_identity: FzMatrix;
189}
190
191#[repr(C)]
192#[derive(Debug, Copy, Clone)]
193pub struct FzRect {
194    pub x0: libc::c_float,
195    pub y0: libc::c_float,
196    pub x1: libc::c_float,
197    pub y1: libc::c_float,
198}
199
200impl Default for FzRect {
201    fn default() -> FzRect {
202        // Returns an empty rectangle.
203        FzRect {
204            x0: 1.0,
205            y0: 1.0,
206            x1: -1.0,
207            y1: -1.0,
208        }
209    }
210}
211
212#[repr(C)]
213#[derive(Debug, Copy, Clone)]
214pub struct FzPoint {
215    x: libc::c_float,
216    y: libc::c_float,
217}
218
219#[repr(C)]
220#[derive(Debug, Copy, Clone)]
221pub struct FzQuad {
222    ul: FzPoint,
223    ur: FzPoint,
224    ll: FzPoint,
225    lr: FzPoint,
226}
227
228#[derive(Copy, Clone)]
229#[repr(C)]
230pub struct FzMatrix {
231    a: libc::c_float,
232    b: libc::c_float,
233    c: libc::c_float,
234    d: libc::c_float,
235    e: libc::c_float,
236    f: libc::c_float,
237}
238
239#[repr(C)]
240pub struct FzStorable {
241    refs: libc::c_int,
242    drop: *mut FzStoreDropFn,
243    droppable: *mut FzStoreDroppableFn,
244}
245
246#[repr(C)]
247pub struct FzTextOptions {
248    pub flags: libc::c_int,
249    pub scale: libc::c_float,
250    pub clip: FzRect,
251}
252
253#[repr(C)]
254pub struct FzLinkDest {
255    pub loc: FzLocation,
256    kind: libc::c_int,
257    x: libc::c_float,
258    y: libc::c_float,
259    w: libc::c_float,
260    h: libc::c_float,
261    zoom: libc::c_float,
262}
263
264#[repr(C)]
265pub struct FzPixmap {
266    storable: FzStorable,
267    x: libc::c_int,
268    y: libc::c_int,
269    pub w: libc::c_int,
270    pub h: libc::c_int,
271    n: libc::c_uchar,
272    s: libc::c_uchar,
273    alpha: libc::c_uchar,
274    flags: libc::c_uchar,
275    stride: libc::ptrdiff_t,
276    seps: *mut FzSeparations,
277    xres: libc::c_int,
278    yres: libc::c_int,
279    colorspace: *mut FzColorspace,
280    pub samples: *mut libc::c_uchar,
281    underlying: *mut FzPixmap,
282}
283
284impl Default for FzMatrix {
285    fn default() -> FzMatrix {
286        unsafe { mem::zeroed() }
287    }
288}
289
290#[repr(C)]
291pub struct FzLink {
292    refs: libc::c_int,
293    pub next: *mut FzLink,
294    pub rect: FzRect,
295    pub uri: *mut libc::c_char,
296    set_rect_fn: *mut FzLinkSetRectFn,
297    set_uri_fn: *mut FzLinkSetUriFn,
298    drop: *mut FzLinkDropLinkFn,
299}
300
301#[repr(C)]
302pub struct FzTextPage {
303    refs: libc::c_int,
304    pool: *mut FzPool,
305    mediabox: FzRect,
306    pub first_block: *mut FzTextBlock,
307    last_block: *mut FzTextBlock,
308    last_struct: *mut FzTextStruct,
309    id_list: *mut FzPoolArray,
310}
311
312#[repr(C)]
313pub struct FzTextBlock {
314    pub kind: libc::c_int,
315    id: libc::c_int,
316    pub bbox: FzRect,
317    pub u: FzTextBlockTextImage,
318    prev: *mut FzTextBlock,
319    pub next: *mut FzTextBlock,
320}
321
322#[derive(Copy, Clone)]
323#[repr(C)]
324pub struct FzTextBlockText {
325    pub first_line: *mut FzTextLine,
326    last_line: *mut FzTextLine,
327    flags: libc::c_int,
328}
329
330#[derive(Copy, Clone)]
331#[repr(C)]
332pub struct FzTextBlockImage {
333    transform: FzMatrix,
334    image: *mut FzImage,
335}
336
337#[derive(Copy, Clone)]
338#[repr(C)]
339pub struct FzTextBlockStruct {
340    down: *mut FzTextStruct,
341    index: libc::c_int,
342}
343
344#[derive(Copy, Clone)]
345#[repr(C)]
346pub struct FzTextBlockVector {
347    flags: u32,
348    argb: u32,
349}
350
351#[derive(Copy, Clone)]
352#[repr(C)]
353pub struct FzTextBlockGrid {
354    xs: *mut FzGridPositions,
355    ys: *mut FzGridPositions,
356    info: *mut FzGridInfo,
357}
358
359#[repr(C)]
360pub union FzTextBlockTextImage {
361    pub text: FzTextBlockText,
362    pub image: FzTextBlockImage,
363    pub stru: FzTextBlockStruct,
364    pub vector: FzTextBlockVector,
365    pub grid: FzTextBlockGrid,
366}
367
368#[repr(C)]
369pub struct FzTextLine {
370    wmode: u8,
371    flags: u8,
372    dir: FzPoint,
373    pub bbox: FzRect,
374    pub first_char: *mut FzTextChar,
375    last_char: *mut FzTextChar,
376    prev: *mut FzTextLine,
377    pub next: *mut FzTextLine,
378}
379
380#[repr(C)]
381pub struct FzTextChar {
382    pub c: libc::c_int,
383    bidi: u16,
384    flags: u16,
385    argb: u32,
386    origin: FzPoint,
387    pub quad: FzQuad,
388    size: libc::c_float,
389    font: *mut FzFont,
390    pub next: *mut FzTextChar,
391}
392
393#[derive(Copy, Clone)]
394#[repr(C)]
395pub struct FzLocation {
396    pub chapter: libc::c_int,
397    pub page: libc::c_int,
398}
399
400#[repr(C)]
401pub struct FzOutline {
402    refs: libc::c_int,
403    pub title: *mut libc::c_char,
404    pub uri: *mut libc::c_char,
405    pub page: FzLocation,
406    x: libc::c_float,
407    y: libc::c_float,
408    pub next: *mut FzOutline,
409    pub down: *mut FzOutline,
410    is_open: libc::c_uint,
411    flags: libc::c_uint,
412    r: libc::c_uint,
413    g: libc::c_uint,
414    b: libc::c_uint,
415}
416
417impl Default for FzOutline {
418    fn default() -> Self {
419        unsafe { mem::zeroed() }
420    }
421}