diff options
author | Robin Watts <robin.watts@artifex.com> | 2012-09-04 14:25:41 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2012-10-05 15:50:37 +0100 |
commit | 9463d7a87f46c4f50cb1074424c9c3ecda7a5da1 (patch) | |
tree | d4de9e755b687811c5818533652d8f68d7b23188 /fitz | |
parent | 68e788fa455c780b83bffa33228ff3f45bebc1d1 (diff) | |
download | mupdf-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.h | 66 | ||||
-rw-r--r-- | fitz/stm_comp_buf.c | 68 |
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); +} |