diff options
Diffstat (limited to 'source/fitz/output.c')
-rw-r--r-- | source/fitz/output.c | 81 |
1 files changed, 41 insertions, 40 deletions
diff --git a/source/fitz/output.c b/source/fitz/output.c index fe63de92..52381377 100644 --- a/source/fitz/output.c +++ b/source/fitz/output.c @@ -1,44 +1,42 @@ #include "mupdf/fitz.h" -void fz_rebind_output(fz_output *out, fz_context *ctx) +struct fz_output_s { - if (out != NULL) - out->ctx = ctx; -} + void *opaque; + int (*printf)(fz_context *, void *opaque, const char *, va_list ap); + int (*write)(fz_context *, void *opaque, const void *, int n); + void (*close)(fz_context *, void *opaque); +}; static int -file_printf(fz_output *out, const char *fmt, va_list ap) +file_printf(fz_context *ctx, void *opaque, const char *fmt, va_list ap) { - FILE *file = (FILE *)out->opaque; - - return fz_vfprintf(out->ctx, file, fmt, ap); + FILE *file = opaque; + return fz_vfprintf(ctx, file, fmt, ap); } static int -file_write(fz_output *out, const void *buffer, int count) +file_write(fz_context *ctx, void *opaque, const void *buffer, int count) { - FILE *file = (FILE *)out->opaque; - + FILE *file = opaque; return fwrite(buffer, 1, count, file); } static void -file_close(fz_output *out) +file_close(fz_context *ctx, void *opaque) { - FILE *file = (FILE *)out->opaque; - + FILE *file = opaque; fclose(file); } fz_output * -fz_new_output_with_file(fz_context *ctx, FILE *file) +fz_new_output_with_file(fz_context *ctx, FILE *file, int close) { fz_output *out = fz_malloc_struct(ctx, fz_output); - out->ctx = ctx; out->opaque = file; out->printf = file_printf; out->write = file_write; - out->close = NULL; + out->close = close ? file_close : NULL; return out; } @@ -56,7 +54,6 @@ fz_new_output_to_filename(fz_context *ctx, const char *filename) fz_try(ctx) { out = fz_malloc_struct(ctx, fz_output); - out->ctx = ctx; out->opaque = file; out->printf = file_printf; out->write = file_write; @@ -71,17 +68,17 @@ fz_new_output_to_filename(fz_context *ctx, const char *filename) } void -fz_close_output(fz_output *out) +fz_drop_output(fz_context *ctx, fz_output *out) { if (!out) return; if (out->close) - out->close(out); - fz_free(out->ctx, out); + out->close(ctx, out->opaque); + fz_free(ctx, out); } int -fz_printf(fz_output *out, const char *fmt, ...) +fz_printf(fz_context *ctx, fz_output *out, const char *fmt, ...) { int ret; va_list ap; @@ -90,60 +87,64 @@ fz_printf(fz_output *out, const char *fmt, ...) return 0; va_start(ap, fmt); - ret = out->printf(out, fmt, ap); + ret = out->printf(ctx, out->opaque, fmt, ap); va_end(ap); return ret; } int -fz_write(fz_output *out, const void *data, int len) +fz_write(fz_context *ctx, fz_output *out, const void *data, int len) { if (!out) return 0; - return out->write(out, data, len); + return out->write(ctx, out->opaque, data, len); } void -fz_putc(fz_output *out, char c) +fz_putc(fz_context *ctx, fz_output *out, char c) { if (out) - (void)out->write(out, &c, 1); + (void)out->write(ctx, out->opaque, &c, 1); } int -fz_puts(fz_output *out, const char *str) +fz_puts(fz_context *ctx, fz_output *out, const char *str) { if (!out) return 0; - return out->write(out, str, strlen(str)); + return out->write(ctx, out->opaque, str, strlen(str)); } static int -buffer_printf(fz_output *out, const char *fmt, va_list list) +buffer_printf(fz_context *ctx, void *opaque, const char *fmt, va_list list) { - fz_buffer *buffer = (fz_buffer *)out->opaque; - - return fz_buffer_vprintf(out->ctx, buffer, fmt, list); + fz_buffer *buffer = opaque; + return fz_buffer_vprintf(ctx, buffer, fmt, list); } static int -buffer_write(fz_output *out, const void *data, int len) +buffer_write(fz_context *ctx, void *opaque, const void *data, int len) { - fz_buffer *buffer = (fz_buffer *)out->opaque; - - fz_write_buffer(out->ctx, buffer, (unsigned char *)data, len); + fz_buffer *buffer = opaque; + fz_write_buffer(ctx, buffer, (unsigned char *)data, len); return len; } +static void +buffer_close(fz_context *ctx, void *opaque) +{ + fz_buffer *buffer = opaque; + fz_drop_buffer(ctx, buffer); +} + fz_output * fz_new_output_with_buffer(fz_context *ctx, fz_buffer *buf) { fz_output *out = fz_malloc_struct(ctx, fz_output); - out->ctx = ctx; - out->opaque = buf; + out->opaque = fz_keep_buffer(ctx, buf); out->printf = buffer_printf; out->write = buffer_write; - out->close = NULL; + out->close = buffer_close; return out; } |