From 2e0aa06503b8641408842176152bd0019fe6b8cb Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Mon, 7 Jan 2013 16:00:07 +0000 Subject: Update OpenJPEG to v2.0.0. --- Makethird | 11 +- fitz/image_jpx.c | 99 ++++++++++++--- scripts/opj_config.h | 4 + thirdparty/openjpeg | 2 +- win32/libmupdf.vcproj | 6 +- win32/libthirdparty.vcproj | 302 +++++++++++++++++++++++++++++++-------------- 6 files changed, 305 insertions(+), 119 deletions(-) diff --git a/Makethird b/Makethird index 42264faf..06824601 100644 --- a/Makethird +++ b/Makethird @@ -186,7 +186,7 @@ endif # --- OpenJPEG --- ifneq "$(wildcard $(OPENJPEG_DIR)/README)" "" -CFLAGS += -I$(OPENJPEG_DIR)/libopenjpeg +CFLAGS += -I$(OPENJPEG_DIR)/src/lib/openjp2 -DOPJ_STATIC -DOPJ_HAVE_STDINT_H -DHAVE_SSIZE_T -DHAVE_INTTYPES_H LIBS := $(filter-out -lopenjpeg, $(LIBS)) OPENJPEG_LIB := $(OUT)/libopenjpeg.a @@ -196,14 +196,15 @@ OPENJPEG_SRC := \ cio.c \ dwt.c \ event.c \ + function_list.c \ image.c \ + invert.c \ j2k.c \ - j2k_lib.c \ jp2.c \ - jpt.c \ mct.c \ mqc.c \ openjpeg.c \ + opj_clock.c \ phix_manager.c \ pi.c \ ppix_manager.c \ @@ -216,8 +217,8 @@ OPENJPEG_SRC := \ tpix_manager.c \ $(OPENJPEG_LIB): $(addprefix $(OUT)/opj_, $(OPENJPEG_SRC:%.c=%.o)) -$(OUT)/opj_%.o: $(OPENJPEG_DIR)/libopenjpeg/%.c | $(OUT) - $(CC_CMD) -DOPJ_STATIC +$(OUT)/opj_%.o: $(OPENJPEG_DIR)/src/lib/openjp2/%.c | $(OUT) + $(CC_CMD) else SYS_OPENJPEG_CFLAGS := $(SYS_OPENJPEG_CFLAGS) CFLAGS += $(SYS_OPENJPEG_CFLAGS) diff --git a/fitz/image_jpx.c b/fitz/image_jpx.c index ac232220..f680b50c 100644 --- a/fitz/image_jpx.c +++ b/fitz/image_jpx.c @@ -20,50 +20,111 @@ 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; + +OPJ_SIZE_T 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 > p_nb_bytes) + len = p_nb_bytes; + memcpy(p_buffer, sb->data + sb->pos, len); + sb->pos += len; + return len; +} + +OPJ_OFF_T 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; +} + +OPJ_BOOL 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_dinfo_t *info; - opj_cio_t *cio; + opj_codec_t *codec; opj_image_t *jpx; + opj_stream_t *stream; fz_colorspace *colorspace; unsigned char *p; int format; int a, n, w, h, depth, sgnd; int x, y, k, v; + stream_block sb; if (size < 2) fz_throw(ctx, "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 = CODEC_J2K; + format = OPJ_CODEC_J2K; else - 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; + format = OPJ_CODEC_JP2; opj_set_default_decoder_parameters(¶ms); if (indexed) params.flags |= OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; - info = opj_create_decompress(format); - opj_set_event_mgr((opj_common_ptr)info, &evtmgr, ctx); - opj_setup_decoder(info, ¶ms); + 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, "j2k decode failed"); + } + + stream = opj_stream_default_create(OPJ_TRUE); + sb.data = data; + sb.pos = 0; + sb.size = size; - cio = opj_cio_open((opj_common_ptr)info, data, size); + opj_stream_set_read_function(stream, stream_read); + opj_stream_set_skip_function(stream, stream_skip); + opj_stream_set_seek_function(stream, stream_seek); + opj_stream_set_user_data(stream, &sb); - jpx = opj_decode(info, cio); + if (!opj_read_header(stream, codec, &jpx)) + { + opj_stream_destroy(stream); + opj_destroy_codec(codec); + fz_throw(ctx, "Failed to read JPX header"); + } + + if (!opj_decode(codec, stream, jpx)) + { + opj_stream_destroy(stream); + opj_destroy_codec(codec); + fz_throw(ctx, "Failed to decode JPX image"); + } - opj_cio_close(cio); - opj_destroy_decompress(info); + opj_destroy_codec(codec); if (!jpx) fz_throw(ctx, "opj_decode failed"); @@ -93,8 +154,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 == CLRSPC_SRGB && n == 4) { n = 3; a = 1; } - else if (jpx->color_space == CLRSPC_SYCC && n == 4) { n = 3; a = 1; } + 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; } else if (n == 2) { n = 1; a = 1; } else if (n > 4) { n = 4; a = 1; } else { a = 0; } diff --git a/scripts/opj_config.h b/scripts/opj_config.h index db37745d..39b38228 100644 --- a/scripts/opj_config.h +++ b/scripts/opj_config.h @@ -17,6 +17,10 @@ * === DO NOT FORGET TO CHANGE 'config.nix' APPROPRIATELY. ==== */ +#define USE_JPIP +#define USE JPWL +#define OPJ_PACKAGE_VERSION "2.0.0" + /* DO NOT DEFINE BOTH VERSIONS OF LCMS */ /* define to 1 if you have both liblcms and lcms.h installed */ #undef HAVE_LIBLCMS1 diff --git a/thirdparty/openjpeg b/thirdparty/openjpeg index d5693f4e..8f7358dc 160000 --- a/thirdparty/openjpeg +++ b/thirdparty/openjpeg @@ -1 +1 @@ -Subproject commit d5693f4ec8635d81defc92619c02134b6b785b06 +Subproject commit 8f7358dc09a144250bad08a504a26bf7dd3a0551 diff --git a/win32/libmupdf.vcproj b/win32/libmupdf.vcproj index f073bbee..996b48aa 100644 --- a/win32/libmupdf.vcproj +++ b/win32/libmupdf.vcproj @@ -40,7 +40,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +