Last active
August 29, 2015 14:03
-
-
Save whitequark/57aacfd4c7428f979ba9 to your computer and use it in GitHub Desktop.
install mupdf from source
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(¶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; } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment