# HG changeset patch # User Pascal Bellard # Date 1399622394 0 # Node ID dfb9c04d63ed49ea1d1c6af993d1a2cb3c40d019 # Parent ee113b0de7d8dca4488ce2ee3e15c907285f7c1b mupdf: add debian patch (again) diff -r ee113b0de7d8 -r dfb9c04d63ed mupdf/stuff/use_openjpeg_1.5.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf/stuff/use_openjpeg_1.5.patch Fri May 09 07:59:54 2014 +0000 @@ -0,0 +1,160 @@ +commit a7341e98ef48d6041028b7294d1acc13665b04ba +Author: Quoc-Viet Nguyen +Date: Fri Apr 18 23:48:29 2014 +1000 + + Use openjpeg 1.5 rather than 2.0 +--- + source/fitz/load-jpx.c | 104 +++++++++---------------------------------------- + 1 file changed, 18 insertions(+), 86 deletions(-) + +diff --git a/source/fitz/load-jpx.c b/source/fitz/load-jpx.c +index dfb89f4..d27b5de 100644 +--- a/source/fitz/load-jpx.c ++++ b/source/fitz/load-jpx.c +@@ -27,119 +27,51 @@ static void fz_opj_info_callback(const char *msg, void *client_data) + /* fz_warn("openjpeg info: %s", msg); */ + } + +-typedef struct stream_block_s +-{ +- unsigned char *data; +- int size; +- int pos; +-} stream_block; +- +-static OPJ_SIZE_T fz_opj_stream_read(void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) +-{ +- stream_block *sb = (stream_block *)p_user_data; +- int len; +- +- len = sb->size - sb->pos; +- if (len < 0) +- len = 0; +- if (len == 0) +- return (OPJ_SIZE_T)-1; /* End of file! */ +- if ((OPJ_SIZE_T)len > p_nb_bytes) +- len = p_nb_bytes; +- memcpy(p_buffer, sb->data + sb->pos, len); +- sb->pos += len; +- return len; +-} +- +-static OPJ_OFF_T fz_opj_stream_skip(OPJ_OFF_T skip, void * p_user_data) +-{ +- stream_block *sb = (stream_block *)p_user_data; +- +- if (skip > sb->size - sb->pos) +- skip = sb->size - sb->pos; +- sb->pos += skip; +- return sb->pos; +-} +- +-static OPJ_BOOL fz_opj_stream_seek(OPJ_OFF_T seek_pos, void * p_user_data) +-{ +- stream_block *sb = (stream_block *)p_user_data; +- +- if (seek_pos > sb->size) +- return OPJ_FALSE; +- sb->pos = seek_pos; +- return OPJ_TRUE; +-} +- + fz_pixmap * + fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *defcs, int indexed) + { + fz_pixmap *img; + fz_colorspace *origcs; ++ opj_event_mgr_t evtmgr; + opj_dparameters_t params; +- opj_codec_t *codec; ++ opj_dinfo_t *codec; + opj_image_t *jpx; +- opj_stream_t *stream; ++ opj_cio_t *stream; + fz_colorspace *colorspace; + unsigned char *p; + OPJ_CODEC_FORMAT format; + int a, n, w, h, depth, sgnd; + int x, y, k, v; +- stream_block sb; + + if (size < 2) + fz_throw(ctx, FZ_ERROR_GENERIC, "not enough data to determine image format"); + + /* Check for SOC marker -- if found we have a bare J2K stream */ + if (data[0] == 0xFF && data[1] == 0x4F) +- format = OPJ_CODEC_J2K; ++ format = CODEC_J2K; + else +- format = OPJ_CODEC_JP2; ++ format = CODEC_JP2; ++ ++ memset(&evtmgr, 0, sizeof(evtmgr)); ++ evtmgr.error_handler = fz_opj_error_callback; ++ evtmgr.warning_handler = fz_opj_warning_callback; ++ evtmgr.info_handler = fz_opj_info_callback; + + opj_set_default_decoder_parameters(¶ms); + if (indexed) + params.flags |= OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; + + codec = opj_create_decompress(format); +- opj_set_info_handler(codec, fz_opj_info_callback, ctx); +- opj_set_warning_handler(codec, fz_opj_warning_callback, ctx); +- opj_set_error_handler(codec, fz_opj_error_callback, ctx); +- if (!opj_setup_decoder(codec, ¶ms)) +- { +- fz_throw(ctx, FZ_ERROR_GENERIC, "j2k decode failed"); +- } +- +- stream = opj_stream_default_create(OPJ_TRUE); +- sb.data = data; +- sb.pos = 0; +- sb.size = size; ++ opj_set_event_mgr((opj_common_ptr)codec, &evtmgr, ctx); ++ opj_setup_decoder(codec, ¶ms); + +- opj_stream_set_read_function(stream, fz_opj_stream_read); +- opj_stream_set_skip_function(stream, fz_opj_stream_skip); +- opj_stream_set_seek_function(stream, fz_opj_stream_seek); +- opj_stream_set_user_data(stream, &sb); +- /* Set the length to avoid an assert */ +- opj_stream_set_user_data_length(stream, size); ++ stream = opj_cio_open((opj_common_ptr)codec, data, size); + +- if (!opj_read_header(stream, codec, &jpx)) +- { +- opj_stream_destroy(stream); +- opj_destroy_codec(codec); +- fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to read JPX header"); +- } +- +- if (!opj_decode(codec, stream, jpx)) +- { +- opj_stream_destroy(stream); +- opj_destroy_codec(codec); +- opj_image_destroy(jpx); +- fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to decode JPX image"); +- } ++ jpx = opj_decode(codec, stream); + +- opj_stream_destroy(stream); +- opj_destroy_codec(codec); ++ opj_cio_close(stream); ++ opj_destroy_decompress(codec); + +- /* jpx should never be NULL here, but check anyway */ + if (!jpx) + fz_throw(ctx, FZ_ERROR_GENERIC, "opj_decode failed"); + +@@ -173,8 +105,8 @@ fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *defcs + depth = jpx->comps[0].prec; + sgnd = jpx->comps[0].sgnd; + +- if (jpx->color_space == OPJ_CLRSPC_SRGB && n == 4) { n = 3; a = 1; } +- else if (jpx->color_space == OPJ_CLRSPC_SYCC && n == 4) { n = 3; a = 1; } ++ if (jpx->color_space == CLRSPC_SRGB && n == 4) { n = 3; a = 1; } ++ else if (jpx->color_space == CLRSPC_SYCC && n == 4) { n = 3; a = 1; } + else if (n == 2) { n = 1; a = 1; } + else if (n > 4) { n = 4; a = 1; } + else { a = 0; }