/usr/include/mupdf/fitz/context.h is in libmupdf-dev 1.5-1+deb8u4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 | #ifndef MUPDF_FITZ_CONTEXT_H
#define MUPDF_FITZ_CONTEXT_H
#include "mupdf/fitz/version.h"
#include "mupdf/fitz/system.h"
/*
Contexts
*/
typedef struct fz_alloc_context_s fz_alloc_context;
typedef struct fz_error_context_s fz_error_context;
typedef struct fz_id_context_s fz_id_context;
typedef struct fz_warn_context_s fz_warn_context;
typedef struct fz_font_context_s fz_font_context;
typedef struct fz_colorspace_context_s fz_colorspace_context;
typedef struct fz_aa_context_s fz_aa_context;
typedef struct fz_locks_context_s fz_locks_context;
typedef struct fz_store_s fz_store;
typedef struct fz_glyph_cache_s fz_glyph_cache;
typedef struct fz_document_handler_context_s fz_document_handler_context;
typedef struct fz_context_s fz_context;
struct fz_alloc_context_s
{
void *user;
void *(*malloc)(void *, unsigned int);
void *(*realloc)(void *, void *, unsigned int);
void (*free)(void *, void *);
};
struct fz_error_context_s
{
int top;
struct {
int code;
fz_jmp_buf buffer;
} stack[256];
int errcode;
char message[256];
};
void fz_var_imp(void *);
#define fz_var(var) fz_var_imp((void *)&(var))
/*
Exception macro definitions. Just treat these as a black box - pay no
attention to the man behind the curtain.
*/
#define fz_try(ctx) \
if (fz_push_try(ctx->error) && \
((ctx->error->stack[ctx->error->top].code = fz_setjmp(ctx->error->stack[ctx->error->top].buffer)) == 0))\
{ do {
#define fz_always(ctx) \
} while (0); \
} \
if (ctx->error->stack[ctx->error->top].code < 3) \
{ \
ctx->error->stack[ctx->error->top].code++; \
do { \
#define fz_catch(ctx) \
} while(0); \
} \
if (ctx->error->stack[ctx->error->top--].code > 1)
int fz_push_try(fz_error_context *ex);
FZ_NORETURN void fz_throw(fz_context *, int errcode, const char *, ...) __printflike(3, 4);
FZ_NORETURN void fz_rethrow(fz_context *);
FZ_NORETURN void fz_rethrow_message(fz_context *, const char *, ...) __printflike(2, 3);
void fz_warn(fz_context *ctx, const char *fmt, ...) __printflike(2, 3);
const char *fz_caught_message(fz_context *ctx);
int fz_caught(fz_context *ctx);
void fz_rethrow_if(fz_context *ctx, int errcode);
enum
{
FZ_ERROR_NONE = 0,
FZ_ERROR_GENERIC = 1,
FZ_ERROR_TRYLATER = 2,
FZ_ERROR_COUNT
};
/*
fz_flush_warnings: Flush any repeated warnings.
Repeated warnings are buffered, counted and eventually printed
along with the number of repetitions. Call fz_flush_warnings
to force printing of the latest buffered warning and the
number of repetitions, for example to make sure that all
warnings are printed before exiting an application.
Does not throw exceptions.
*/
void fz_flush_warnings(fz_context *ctx);
struct fz_context_s
{
fz_alloc_context *alloc;
fz_locks_context *locks;
fz_id_context *id;
fz_error_context *error;
fz_warn_context *warn;
fz_font_context *font;
fz_colorspace_context *colorspace;
fz_aa_context *aa;
fz_store *store;
fz_glyph_cache *glyph_cache;
fz_document_handler_context *handler;
};
/*
Specifies the maximum size in bytes of the resource store in
fz_context. Given as argument to fz_new_context.
FZ_STORE_UNLIMITED: Let resource store grow unbounded.
FZ_STORE_DEFAULT: A reasonable upper bound on the size, for
devices that are not memory constrained.
*/
enum {
FZ_STORE_UNLIMITED = 0,
FZ_STORE_DEFAULT = 256 << 20,
};
/*
fz_new_context: Allocate context containing global state.
The global state contains an exception stack, resource store,
etc. Most functions in MuPDF take a context argument to be
able to reference the global state. See fz_free_context for
freeing an allocated context.
alloc: Supply a custom memory allocator through a set of
function pointers. Set to NULL for the standard library
allocator. The context will keep the allocator pointer, so the
data it points to must not be modified or freed during the
lifetime of the context.
locks: Supply a set of locks and functions to lock/unlock
them, intended for multi-threaded applications. Set to NULL
when using MuPDF in a single-threaded applications. The
context will keep the locks pointer, so the data it points to
must not be modified or freed during the lifetime of the
context.
max_store: Maximum size in bytes of the resource store, before
it will start evicting cached resources such as fonts and
images. FZ_STORE_UNLIMITED can be used if a hard limit is not
desired. Use FZ_STORE_DEFAULT to get a reasonable size.
Does not throw exceptions, but may return NULL.
*/
fz_context *fz_new_context_imp(fz_alloc_context *alloc, fz_locks_context *locks, unsigned int max_store, const char *version);
#define fz_new_context(alloc, locks, max_store) fz_new_context_imp(alloc, locks, max_store, FZ_VERSION)
/*
fz_clone_context: Make a clone of an existing context.
This function is meant to be used in multi-threaded
applications where each thread requires its own context, yet
parts of the global state, for example caching, is shared.
ctx: Context obtained from fz_new_context to make a copy of.
ctx must have had locks and lock/functions setup when created.
The two contexts will share the memory allocator, resource
store, locks and lock/unlock functions. They will each have
their own exception stacks though.
Does not throw exception, but may return NULL.
*/
fz_context *fz_clone_context(fz_context *ctx);
/*
fz_free_context: Free a context and its global state.
The context and all of its global state is freed, and any
buffered warnings are flushed (see fz_flush_warnings). If NULL
is passed in nothing will happen.
Does not throw exceptions.
*/
void fz_free_context(fz_context *ctx);
/*
fz_aa_level: Get the number of bits of antialiasing we are
using. Between 0 and 8.
*/
int fz_aa_level(fz_context *ctx);
/*
fz_set_aa_level: Set the number of bits of antialiasing we should use.
bits: The number of bits of antialiasing to use (values are clamped
to within the 0 to 8 range).
*/
void fz_set_aa_level(fz_context *ctx, int bits);
/*
Locking functions
MuPDF is kept deliberately free of any knowledge of particular
threading systems. As such, in order for safe multi-threaded
operation, we rely on callbacks to client provided functions.
A client is expected to provide FZ_LOCK_MAX number of mutexes,
and a function to lock/unlock each of them. These may be
recursive mutexes, but do not have to be.
If a client does not intend to use multiple threads, then it
may pass NULL instead of a lock structure.
In order to avoid deadlocks, we have one simple rule
internally as to how we use locks: We can never take lock n
when we already hold any lock i, where 0 <= i <= n. In order
to verify this, we have some debugging code, that can be
enabled by defining FITZ_DEBUG_LOCKING.
*/
struct fz_locks_context_s
{
void *user;
void (*lock)(void *user, int lock);
void (*unlock)(void *user, int lock);
};
enum {
FZ_LOCK_ALLOC = 0,
FZ_LOCK_FILE, /* Unused now */
FZ_LOCK_FREETYPE,
FZ_LOCK_GLYPHCACHE,
FZ_LOCK_MAX
};
/*
Memory Allocation and Scavenging:
All calls to MuPDFs allocator functions pass through to the
underlying allocators passed in when the initial context is
created, after locks are taken (using the supplied locking function)
to ensure that only one thread at a time calls through.
If the underlying allocator fails, MuPDF attempts to make room for
the allocation by evicting elements from the store, then retrying.
Any call to allocate may then result in several calls to the underlying
allocator, and result in elements that are only referred to by the
store being freed.
*/
/*
fz_malloc: Allocate a block of memory (with scavenging)
size: The number of bytes to allocate.
Returns a pointer to the allocated block. May return NULL if size is
0. Throws exception on failure to allocate.
*/
void *fz_malloc(fz_context *ctx, unsigned int size);
/*
fz_calloc: Allocate a zeroed block of memory (with scavenging)
count: The number of objects to allocate space for.
size: The size (in bytes) of each object.
Returns a pointer to the allocated block. May return NULL if size
and/or count are 0. Throws exception on failure to allocate.
*/
void *fz_calloc(fz_context *ctx, unsigned int count, unsigned int size);
/*
fz_malloc_struct: Allocate storage for a structure (with scavenging),
clear it, and (in Memento builds) tag the pointer as belonging to a
struct of this type.
CTX: The context.
STRUCT: The structure type.
Returns a pointer to allocated (and cleared) structure. Throws
exception on failure to allocate.
*/
#define fz_malloc_struct(CTX, STRUCT) \
((STRUCT *)Memento_label(fz_calloc(CTX,1,sizeof(STRUCT)), #STRUCT))
/*
fz_malloc_array: Allocate a block of (non zeroed) memory (with
scavenging). Equivalent to fz_calloc without the memory clearing.
count: The number of objects to allocate space for.
size: The size (in bytes) of each object.
Returns a pointer to the allocated block. May return NULL if size
and/or count are 0. Throws exception on failure to allocate.
*/
void *fz_malloc_array(fz_context *ctx, unsigned int count, unsigned int size);
/*
fz_resize_array: Resize a block of memory (with scavenging).
p: The existing block to resize
count: The number of objects to resize to.
size: The size (in bytes) of each object.
Returns a pointer to the resized block. May return NULL if size
and/or count are 0. Throws exception on failure to resize (original
block is left unchanged).
*/
void *fz_resize_array(fz_context *ctx, void *p, unsigned int count, unsigned int size);
/*
fz_strdup: Duplicate a C string (with scavenging)
s: The string to duplicate.
Returns a pointer to a duplicated string. Throws exception on failure
to allocate.
*/
char *fz_strdup(fz_context *ctx, const char *s);
/*
fz_free: Frees an allocation.
Does not throw exceptions.
*/
void fz_free(fz_context *ctx, void *p);
/*
fz_malloc_no_throw: Allocate a block of memory (with scavenging)
size: The number of bytes to allocate.
Returns a pointer to the allocated block. May return NULL if size is
0. Returns NULL on failure to allocate.
*/
void *fz_malloc_no_throw(fz_context *ctx, unsigned int size);
/*
fz_calloc_no_throw: Allocate a zeroed block of memory (with scavenging)
count: The number of objects to allocate space for.
size: The size (in bytes) of each object.
Returns a pointer to the allocated block. May return NULL if size
and/or count are 0. Returns NULL on failure to allocate.
*/
void *fz_calloc_no_throw(fz_context *ctx, unsigned int count, unsigned int size);
/*
fz_malloc_array_no_throw: Allocate a block of (non zeroed) memory
(with scavenging). Equivalent to fz_calloc_no_throw without the
memory clearing.
count: The number of objects to allocate space for.
size: The size (in bytes) of each object.
Returns a pointer to the allocated block. May return NULL if size
and/or count are 0. Returns NULL on failure to allocate.
*/
void *fz_malloc_array_no_throw(fz_context *ctx, unsigned int count, unsigned int size);
/*
fz_resize_array_no_throw: Resize a block of memory (with scavenging).
p: The existing block to resize
count: The number of objects to resize to.
size: The size (in bytes) of each object.
Returns a pointer to the resized block. May return NULL if size
and/or count are 0. Returns NULL on failure to resize (original
block is left unchanged).
*/
void *fz_resize_array_no_throw(fz_context *ctx, void *p, unsigned int count, unsigned int size);
/*
fz_strdup_no_throw: Duplicate a C string (with scavenging)
s: The string to duplicate.
Returns a pointer to a duplicated string. Returns NULL on failure
to allocate.
*/
char *fz_strdup_no_throw(fz_context *ctx, const char *s);
/*
fz_gen_id: Generate an id (guaranteed unique within this family of
contexts).
*/
int fz_gen_id(fz_context *ctx);
struct fz_warn_context_s
{
char message[256];
int count;
};
fz_context *fz_clone_context_internal(fz_context *ctx);
void fz_new_aa_context(fz_context *ctx);
void fz_free_aa_context(fz_context *ctx);
void fz_copy_aa_context(fz_context *dst, fz_context *src);
void fz_new_document_handler_context(fz_context *ctx);
void fz_drop_document_handler_context(fz_context *ctx);
fz_document_handler_context *fz_keep_document_handler_context(fz_context *ctx);
/* Default allocator */
extern fz_alloc_context fz_alloc_default;
/* Default locks */
extern fz_locks_context fz_locks_default;
#if defined(MEMENTO) || defined(DEBUG)
#define FITZ_DEBUG_LOCKING
#endif
#ifdef FITZ_DEBUG_LOCKING
void fz_assert_lock_held(fz_context *ctx, int lock);
void fz_assert_lock_not_held(fz_context *ctx, int lock);
void fz_lock_debug_lock(fz_context *ctx, int lock);
void fz_lock_debug_unlock(fz_context *ctx, int lock);
#else
#define fz_assert_lock_held(A,B) do { } while (0)
#define fz_assert_lock_not_held(A,B) do { } while (0)
#define fz_lock_debug_lock(A,B) do { } while (0)
#define fz_lock_debug_unlock(A,B) do { } while (0)
#endif /* !FITZ_DEBUG_LOCKING */
static inline void
fz_lock(fz_context *ctx, int lock)
{
fz_lock_debug_lock(ctx, lock);
ctx->locks->lock(ctx->locks->user, lock);
}
static inline void
fz_unlock(fz_context *ctx, int lock)
{
fz_lock_debug_unlock(ctx, lock);
ctx->locks->unlock(ctx->locks->user, lock);
}
#endif
|