summaryrefslogtreecommitdiff
path: root/source/fitz/output.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-01-21 16:42:45 +0100
committerTor Andersson <tor.andersson@artifex.com>2015-02-17 18:05:39 +0100
commitf84a189d5f94250e46d2cbd1a75aba00130e2dd6 (patch)
tree8ee614ab90de1baa8941f91ae4946ed5c2e70721 /source/fitz/output.c
parent681039767f2ccc72e236246178893eb0989169c9 (diff)
downloadmupdf-f84a189d5f94250e46d2cbd1a75aba00130e2dd6.tar.xz
Add ctx parameter and remove embedded contexts for API regularity.
Purge several embedded contexts: Remove embedded context in fz_output. Remove embedded context in fz_stream. Remove embedded context in fz_device. Remove fz_rebind_stream (since it is no longer necessary). Remove embedded context in svg_device. Remove embedded context in XML parser. Add ctx argument to fz_document functions. Remove embedded context in fz_document. Remove embedded context in pdf_document. Remove embedded context in pdf_obj. Make fz_page independent of fz_document in the interface. We shouldn't need to pass the document to all functions handling a page. If a page is tied to the source document, it's redundant; otherwise it's just pointless. Fix reference counting oddity in fz_new_image_from_pixmap.
Diffstat (limited to 'source/fitz/output.c')
-rw-r--r--source/fitz/output.c81
1 files changed, 41 insertions, 40 deletions
diff --git a/source/fitz/output.c b/source/fitz/output.c
index 8f5a4a0f..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_drop_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;
}