summaryrefslogtreecommitdiff
path: root/fitz
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-09-04 14:25:41 +0100
committerRobin Watts <robin.watts@artifex.com>2012-10-05 15:50:37 +0100
commit9463d7a87f46c4f50cb1074424c9c3ecda7a5da1 (patch)
treed4de9e755b687811c5818533652d8f68d7b23188 /fitz
parent68e788fa455c780b83bffa33228ff3f45bebc1d1 (diff)
downloadmupdf-9463d7a87f46c4f50cb1074424c9c3ecda7a5da1.tar.xz
Refactor compressed stream loading.
Refactor 'short stopped' image stream loading into fz_compressed_buffer loading. Nicer overall, and reflects the fact that this can be used for non-image streams that we want to hold compressed in memory (for instance for shading streams). This is a preparatory step for pdfwrite, and enables further shading memory use optimisations. Remove unused jbig2 function pointer from the fz_compression_params (previously fz_image_params) structure to avoid confusion.
Diffstat (limited to 'fitz')
-rw-r--r--fitz/fitz-internal.h66
-rw-r--r--fitz/stm_comp_buf.c68
2 files changed, 134 insertions, 0 deletions
diff --git a/fitz/fitz-internal.h b/fitz/fitz-internal.h
index b923429f..5c9270a1 100644
--- a/fitz/fitz-internal.h
+++ b/fitz/fitz-internal.h
@@ -694,6 +694,72 @@ fz_pixmap *fz_scale_pixmap(fz_context *ctx, fz_pixmap *src, float x, float y, fl
fz_bbox fz_pixmap_bbox_no_ctx(fz_pixmap *src);
+typedef struct fz_compression_params_s fz_compression_params;
+
+typedef struct fz_compressed_buffer_s fz_compressed_buffer;
+
+fz_stream *fz_open_image_decomp_stream(fz_context *ctx, fz_compressed_buffer *, int *factor);
+
+enum
+{
+ FZ_IMAGE_UNKNOWN = 0,
+ FZ_IMAGE_JPEG = 1,
+ FZ_IMAGE_JPX = 2, /* Placeholder until supported */
+ FZ_IMAGE_FAX = 3,
+ FZ_IMAGE_JBIG2 = 4, /* Placeholder until supported */
+ FZ_IMAGE_RAW = 5,
+ FZ_IMAGE_RLD = 6,
+ FZ_IMAGE_FLATE = 7,
+ FZ_IMAGE_LZW = 8
+};
+
+struct fz_compression_params_s
+{
+ int type;
+ union {
+ struct {
+ int color_transform;
+ } jpeg;
+ struct {
+ int smask_in_data;
+ } jpx;
+ struct {
+ int columns;
+ int rows;
+ int k;
+ int end_of_line;
+ int encoded_byte_align;
+ int end_of_block;
+ int black_is_1;
+ int damaged_rows_before_error;
+ } fax;
+ struct
+ {
+ int columns;
+ int colors;
+ int predictor;
+ int bpc;
+ }
+ flate;
+ struct
+ {
+ int columns;
+ int colors;
+ int predictor;
+ int bpc;
+ int early_change;
+ } lzw;
+ } u;
+};
+
+struct fz_compressed_buffer_s
+{
+ fz_compression_params params;
+ fz_buffer *buffer;
+};
+
+void fz_free_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf);
+
struct fz_image_s
{
fz_storable storable;
diff --git a/fitz/stm_comp_buf.c b/fitz/stm_comp_buf.c
new file mode 100644
index 00000000..93df0ef0
--- /dev/null
+++ b/fitz/stm_comp_buf.c
@@ -0,0 +1,68 @@
+#include "fitz-internal.h"
+
+/* This code needs to be kept out of stm_buffer.c to avoid it being
+ * pulled into cmapdump.c */
+
+void
+fz_free_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf)
+{
+ if (!buf)
+ return;
+
+ fz_drop_buffer(ctx, buf->buffer);
+ fz_free(ctx, buf);
+}
+
+
+fz_stream *
+fz_open_image_decomp_stream(fz_context *ctx, fz_compressed_buffer *buffer, int *factor)
+{
+ fz_stream *chain = fz_open_buffer(ctx, buffer->buffer);
+ fz_compression_params *params = &buffer->params;
+
+ switch (params->type)
+ {
+ case FZ_IMAGE_FAX:
+ *factor = 1;
+ return fz_open_faxd(chain,
+ params->u.fax.k,
+ params->u.fax.end_of_line,
+ params->u.fax.encoded_byte_align,
+ params->u.fax.columns,
+ params->u.fax.rows,
+ params->u.fax.end_of_block,
+ params->u.fax.black_is_1);
+ case FZ_IMAGE_JPEG:
+ if (*factor > 8)
+ *factor = 8;
+ return fz_open_resized_dctd(chain, params->u.jpeg.color_transform, *factor);
+ case FZ_IMAGE_RLD:
+ *factor = 1;
+ return fz_open_rld(chain);
+ case FZ_IMAGE_FLATE:
+ *factor = 1;
+ chain = fz_open_flated(chain);
+ if (params->u.flate.predictor > 1)
+ chain = fz_open_predict(chain, params->u.flate.predictor, params->u.flate.columns, params->u.flate.colors, params->u.flate.bpc);
+ return chain;
+ case FZ_IMAGE_LZW:
+ *factor = 1;
+ chain = fz_open_lzwd(chain, params->u.lzw.early_change);
+ if (params->u.lzw.predictor > 1)
+ chain = fz_open_predict(chain, params->u.lzw.predictor, params->u.lzw.columns, params->u.lzw.colors, params->u.lzw.bpc);
+ return chain;
+ default:
+ *factor = 1;
+ break;
+ }
+
+ return chain;
+}
+
+fz_stream *
+fz_open_compressed_stream(fz_context *ctx, fz_compressed_buffer *buffer)
+{
+ int factor = 1;
+
+ return fz_open_image_decomp_stream(ctx, buffer, &factor);
+}