Skip to content

Instantly share code, notes, and snippets.

@whitequark
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save whitequark/57aacfd4c7428f979ba9 to your computer and use it in GitHub Desktop.
Save whitequark/57aacfd4c7428f979ba9 to your computer and use it in GitHub Desktop.
install mupdf from source
#!/bin/sh -ex
sudo apt-get install libjbig2dec0-dev libjpeg8-dev libfreetype6-dev libopenjpeg-dev zlib1g-dev libmupdf-dev libv8-dev libssl-dev
MUPDFREV=eebc338
curl -L "http://git.ghostscript.com/?p=mupdf.git;a=snapshot;h=${MUPDFREV};sf=tgz" -o mupdf-${MUPDFREV}.tgz
curl -LO "https://gist.github.com/whitequark/57aacfd4c7428f979ba9/raw/f8d6077285d3458a7cabb5e2e0e06c494b30179b/use_openjpeg_1.5.patch"
tar xf mupdf-${MUPDFREV}.tgz
cd mupdf-${MUPDFREV}
patch -p1 <../use_openjpeg_1.5.patch
make prefix=/usr install
commit a7341e98ef48d6041028b7294d1acc13665b04ba
Author: Quoc-Viet Nguyen <afelion@gmail.com>
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(&params);
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, &params))
- {
- 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, &params);
- 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; }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment