summaryrefslogtreecommitdiff
path: root/libopenjpeg/jp2.c
diff options
context:
space:
mode:
Diffstat (limited to 'libopenjpeg/jp2.c')
-rw-r--r--libopenjpeg/jp2.c378
1 files changed, 78 insertions, 300 deletions
diff --git a/libopenjpeg/jp2.c b/libopenjpeg/jp2.c
index 61b22cf1..20cf2e67 100644
--- a/libopenjpeg/jp2.c
+++ b/libopenjpeg/jp2.c
@@ -28,15 +28,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include "opj_config.h"
-#ifdef HAVE_LIBLCMS2
-#include <math.h>
-#include <lcms2.h>
-#endif
-#ifdef HAVE_LIBLCMS1
-#include <math.h>
-#include <lcms.h>
-#endif
#include "opj_includes.h"
/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
@@ -92,53 +83,47 @@ static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio);
Decode the structure of a JP2 file
@param jp2 JP2 handle
@param cio Input buffer stream
-@param ext Collector for profile, cdef and pclr data
+@param color Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
- struct extension *ext);
+ opj_jp2_color_t *color);
/**
Apply collected palette data
-@param ext Collector for profile, cdef and pclr data
+@param color Collector for profile, cdef and pclr data
@param image
*/
-static void jp2_apply_pclr(struct extension *ext, opj_image_t *image);
+static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image);
/**
Collect palette data
@param jp2 JP2 handle
@param cio Input buffer stream
@param box
-@param ext Collector for profile, cdef and pclr data
+@param color Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, struct extension *ext);
+ opj_jp2_box_t *box, opj_jp2_color_t *color);
/**
Collect component mapping data
@param jp2 JP2 handle
@param cio Input buffer stream
@param box
-@param ext Collector for profile, cdef and pclr data
+@param color Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, struct extension *ext);
+ opj_jp2_box_t *box, opj_jp2_color_t *color);
/**
Collect colour specification data
@param jp2 JP2 handle
@param cio Input buffer stream
@param box
-@param ext Collector for profile, cdef and pclr data
+@param color Collector for profile, cdef and pclr data
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, struct extension *ext);
-/**
-Apply ICC profile if Color Management System available
-@param ext Collector for profile, cdef and pclr data
-@param image
-*/
-static void jp2_apply_profile(struct extension *ext, opj_image_t *image);
+ opj_jp2_box_t *box, opj_jp2_color_t *color);
/*@}*/
/*@}*/
@@ -308,32 +293,32 @@ static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
cio_seek(cio, box.init_pos + box.length);
}
-static void jp2_free_pclr(struct extension *ext)
+static void jp2_free_pclr(opj_jp2_color_t *color)
{
- opj_free(ext->jp2_pclr->channel_sign);
- opj_free(ext->jp2_pclr->channel_size);
- opj_free(ext->jp2_pclr->entries);
+ opj_free(color->jp2_pclr->channel_sign);
+ opj_free(color->jp2_pclr->channel_size);
+ opj_free(color->jp2_pclr->entries);
- if(ext->jp2_pclr->cmap) opj_free(ext->jp2_pclr->cmap);
+ if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
- opj_free(ext->jp2_pclr); ext->jp2_pclr = NULL;
+ opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
}
-static void free_ext_data(struct extension *ext)
+static void free_color_data(opj_jp2_color_t *color)
{
- if(ext->jp2_pclr)
+ if(color->jp2_pclr)
{
- jp2_free_pclr(ext);
+ jp2_free_pclr(color);
}
- if(ext->jp2_cdef)
+ if(color->jp2_cdef)
{
- if(ext->jp2_cdef->info) opj_free(ext->jp2_cdef->info);
- opj_free(ext->jp2_cdef);
+ if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
+ opj_free(color->jp2_cdef);
}
- if(ext->jp2_profile_buf) opj_free(ext->jp2_profile_buf);
+ if(color->icc_profile_buf) opj_free(color->icc_profile_buf);
}
-static void jp2_apply_pclr(struct extension *ext, opj_image_t *image)
+static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image)
{
opj_image_comp_t *old_comps, *new_comps;
unsigned char *channel_size, *channel_sign;
@@ -344,11 +329,11 @@ static void jp2_apply_pclr(struct extension *ext, opj_image_t *image)
unsigned short i, nr_channels, cmp, pcol;
int k, top_k;
- channel_size = ext->jp2_pclr->channel_size;
- channel_sign = ext->jp2_pclr->channel_sign;
- entries = ext->jp2_pclr->entries;
- cmap = ext->jp2_pclr->cmap;
- nr_channels = ext->jp2_pclr->nr_channels;
+ channel_size = color->jp2_pclr->channel_size;
+ channel_sign = color->jp2_pclr->channel_sign;
+ entries = color->jp2_pclr->entries;
+ cmap = color->jp2_pclr->cmap;
+ nr_channels = color->jp2_pclr->nr_channels;
old_comps = image->comps;
new_comps = (opj_image_comp_t*)
@@ -370,7 +355,7 @@ static void jp2_apply_pclr(struct extension *ext, opj_image_t *image)
new_comps[pcol].prec = channel_size[i];
new_comps[pcol].sgnd = channel_sign[i];
}
- top_k = ext->jp2_pclr->nr_entries - 1;
+ top_k = color->jp2_pclr->nr_entries - 1;
for(i = 0; i < nr_channels; ++i)
{
@@ -400,12 +385,12 @@ static void jp2_apply_pclr(struct extension *ext, opj_image_t *image)
image->comps = new_comps;
image->numcomps = nr_channels;
- jp2_free_pclr(ext);
+ jp2_free_pclr(color);
}/* apply_pclr() */
static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, struct extension *ext)
+ opj_jp2_box_t *box, opj_jp2_color_t *color)
{
opj_jp2_pclr_t *jp2_pclr;
unsigned char *channel_size, *channel_sign;
@@ -417,7 +402,7 @@ static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
/* Part 1, I.5.3.4: 'There shall be at most one Palette box inside
* a JP2 Header box' :
*/
- if(ext->jp2_pclr) return false;
+ if(color->jp2_pclr) return false;
nr_entries = cio_read(cio, 2); /* NE */
nr_channels = cio_read(cio, 1);/* NPC */
@@ -435,7 +420,7 @@ static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
jp2_pclr->nr_channels = nr_channels;
jp2_pclr->cmap = NULL;
- ext->jp2_pclr = jp2_pclr;
+ color->jp2_pclr = jp2_pclr;
for(i = 0; i < nr_channels; ++i)
{
@@ -457,20 +442,20 @@ static bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
}/* jp2_read_pclr() */
static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, struct extension *ext)
+ opj_jp2_box_t *box, opj_jp2_color_t *color)
{
opj_jp2_cmap_comp_t *cmap;
unsigned short i, nr_channels;
/* Need nr_channels: */
- if(ext->jp2_pclr == NULL) return false;
+ if(color->jp2_pclr == NULL) return false;
/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
* inside a JP2 Header box' :
*/
- if(ext->jp2_pclr->cmap) return false;
+ if(color->jp2_pclr->cmap) return false;
- nr_channels = ext->jp2_pclr->nr_channels;
+ nr_channels = color->jp2_pclr->nr_channels;
cmap = (opj_jp2_cmap_comp_t*)
opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
@@ -481,20 +466,20 @@ static bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
cmap[i].pcol = cio_read(cio, 1);
}
- ext->jp2_pclr->cmap = cmap;
+ color->jp2_pclr->cmap = cmap;
return true;
}/* jp2_read_cmap() */
-static void jp2_apply_cdef(opj_image_t *image, struct extension *ext)
+static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)
{
opj_jp2_cdef_info_t *info;
int color_space;
unsigned short i, n, cn, typ, asoc, acn;
color_space = image->color_space;
- info = ext->jp2_cdef->info;
- n = ext->jp2_cdef->n;
+ info = color->jp2_cdef->info;
+ n = color->jp2_cdef->n;
for(i = 0; i < n; ++i)
{
@@ -515,14 +500,14 @@ static void jp2_apply_cdef(opj_image_t *image, struct extension *ext)
info[acn].asoc = info[acn].cn + 1;
}
}
- if(ext->jp2_cdef->info) opj_free(ext->jp2_cdef->info);
+ if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
- opj_free(ext->jp2_cdef); ext->jp2_cdef = NULL;
+ opj_free(color->jp2_cdef); color->jp2_cdef = NULL;
}/* jp2_apply_cdef() */
static bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, struct extension *ext)
+ opj_jp2_box_t *box, opj_jp2_color_t *color)
{
opj_jp2_cdef_info_t *info;
unsigned short i, n;
@@ -530,16 +515,16 @@ static bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio,
/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
* inside a JP2 Header box.'
*/
- if(ext->jp2_cdef) return false;
+ if(color->jp2_cdef) return false;
if((n = cio_read(cio, 2)) == 0) return false; /* szukw000: FIXME */
info = (opj_jp2_cdef_info_t*)
opj_malloc(n * sizeof(opj_jp2_cdef_info_t));
- ext->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
- ext->jp2_cdef->info = info;
- ext->jp2_cdef->n = n;
+ color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
+ color->jp2_cdef->info = info;
+ color->jp2_cdef->n = n;
for(i = 0; i < n; ++i)
{
@@ -552,7 +537,7 @@ static bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio,
}/* jp2_read_cdef() */
static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, struct extension *ext)
+ opj_jp2_box_t *box, opj_jp2_color_t *color)
{
int skip_len;
opj_common_ptr cinfo;
@@ -560,7 +545,7 @@ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
* Specification boxes after the first.'
*/
- if(ext->jp2_has_colr) return false;
+ if(color->jp2_has_colr) return false;
cinfo = jp2->cinfo;
@@ -586,12 +571,12 @@ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
unsigned char *start;
start = cio_getbp(cio);
- ext->jp2_profile_buf = (unsigned char*)opj_malloc(skip_len);
- ext->jp2_profile_len = skip_len;
+ color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len);
+ color->icc_profile_len = skip_len;
cio_skip(cio, box->init_pos + box->length - cio_tell(cio));
- memcpy(ext->jp2_profile_buf, start, skip_len);
+ memcpy(color->icc_profile_buf, start, skip_len);
}
}
@@ -600,213 +585,12 @@ static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n");
return false;
}
- ext->jp2_has_colr = 1;
+ color->jp2_has_colr = 1;
return true;
}/* jp2_read_colr() */
-#if defined(HAVE_LIBLCMS2) || defined(HAVE_LIBLCMS1)
-#ifdef HAVE_LIBLCMS1
-/* Bob Friesenhahn proposed:*/
-#define cmsSigXYZData icSigXYZData
-#define cmsSigLabData icSigLabData
-#define cmsSigCmykData icSigCmykData
-#define cmsSigYCbCrData icSigYCbCrData
-#define cmsSigLuvData icSigLuvData
-#define cmsSigGrayData icSigGrayData
-#define cmsSigRgbData icSigRgbData
-#define cmsUInt32Number DWORD
-
-#define cmsColorSpaceSignature icColorSpaceSignature
-#define cmsGetHeaderRenderingIntent cmsTakeRenderingIntent
-
-#endif /* HAVE_LIBLCMS1 */
-
-static void jp2_apply_profile(struct extension *ext, opj_image_t *image)
-{
- cmsHPROFILE in_prof, out_prof;
- cmsHTRANSFORM transform;
- cmsColorSpaceSignature in_space, out_space;
- cmsUInt32Number intent, in_type, out_type, nr_samples;
- int *r, *g, *b;
- int prec, i, max, max_w, max_h;
- OPJ_COLOR_SPACE oldspace;
-
- in_prof =
- cmsOpenProfileFromMem(ext->jp2_profile_buf, ext->jp2_profile_len);
- in_space = cmsGetPCS(in_prof);
- out_space = cmsGetColorSpace(in_prof);
- intent = cmsGetHeaderRenderingIntent(in_prof);
-
-
- max_w = image->comps[0].w; max_h = image->comps[0].h;
- prec = image->comps[0].prec;
- oldspace = image->color_space;
-
- if(out_space == cmsSigRgbData) /* enumCS 16 */
- {
- in_type = TYPE_RGB_16;
- out_type = TYPE_RGB_16;
- out_prof = cmsCreate_sRGBProfile();
- image->color_space = CLRSPC_SRGB;
- }
- else
- if(out_space == cmsSigGrayData) /* enumCS 17 */
- {
- in_type = TYPE_GRAY_8;
- out_type = TYPE_RGB_8;
- out_prof = cmsCreate_sRGBProfile();
- image->color_space = CLRSPC_SRGB;
- }
- else
- if(out_space == cmsSigYCbCrData) /* enumCS 18 */
- {
- in_type = TYPE_YCbCr_16;
- out_type = TYPE_RGB_16;
- out_prof = cmsCreate_sRGBProfile();
- image->color_space = CLRSPC_SRGB;
- }
- else
- {
-#ifdef DEBUG_PROFILE
-fprintf(stderr,"%s:%d: jp2_apply_profile\n\tICC Profile has unknown "
-"output colorspace(%#x)(%c%c%c%c)\n\tICC Profile ignored.\n",
-__FILE__,__LINE__,out_space,
-(out_space>>24) & 0xff,(out_space>>16) & 0xff,
-(out_space>>8) & 0xff, out_space & 0xff);
-#endif
- return;
- }
-
-#ifdef DEBUG_PROFILE
-fprintf(stderr,"%s:%d:jp2_apply_profile\n\tchannels(%d) prec(%d) w(%d) h(%d)"
-"\n\tprofile: in(%p) out(%p)\n",__FILE__,__LINE__,image->numcomps,prec,
-max_w,max_h, (void*)in_prof,(void*)out_prof);
-
-fprintf(stderr,"\trender_intent (%u)\n\t"
-"color_space: in(%#x)(%c%c%c%c) out:(%#x)(%c%c%c%c)\n\t"
-" type: in(%u) out:(%u)\n",
-intent,
-in_space,
-(in_space>>24) & 0xff,(in_space>>16) & 0xff,
-(in_space>>8) & 0xff, in_space & 0xff,
-
-out_space,
-(out_space>>24) & 0xff,(out_space>>16) & 0xff,
-(out_space>>8) & 0xff, out_space & 0xff,
-
-in_type,out_type
- );
-#endif /* DEBUG_PROFILE */
-
- transform = cmsCreateTransform(in_prof, in_type,
- out_prof, out_type, intent, 0);
-
-#ifdef HAVE_LIBLCMS2
-/* Possible for: LCMS_VERSION >= 2000 :*/
- cmsCloseProfile(in_prof);
- cmsCloseProfile(out_prof);
-#endif
-
- if(transform == NULL)
- {
-#ifdef DEBUG_PROFILE
-fprintf(stderr,"%s:%d:jp2_apply_profile\n\tcmsCreateTransform failed. "
-"ICC Profile ignored.\n",__FILE__,__LINE__);
-#endif
- image->color_space = oldspace;
-#ifdef HAVE_LIBLCMS1
- cmsCloseProfile(in_prof);
- cmsCloseProfile(out_prof);
-#endif
- return;
- }
-
- if(image->numcomps > 2)/* RGB, RGBA */
- {
- unsigned short *inbuf, *outbuf, *in, *out;
- max = max_w * max_h; nr_samples = max * 3 * sizeof(unsigned short);
- in = inbuf = (unsigned short*)opj_malloc(nr_samples);
- out = outbuf = (unsigned short*)opj_malloc(nr_samples);
-
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
-
- for(i = 0; i < max; ++i)
- {
- *in++ = (unsigned short)*r++;
- *in++ = (unsigned short)*g++;
- *in++ = (unsigned short)*b++;
- }
-
- cmsDoTransform(transform, inbuf, outbuf, max);
-
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
-
- for(i = 0; i < max; ++i)
- {
- *r++ = (int)*out++;
- *g++ = (int)*out++;
- *b++ = (int)*out++;
- }
- opj_free(inbuf); opj_free(outbuf);
- }
- else /* GRAY, GRAYA */
- {
- unsigned char *in, *inbuf, *out, *outbuf;
-
- max = max_w * max_h; nr_samples = max * 3 * sizeof(unsigned char);
- in = inbuf = (unsigned char*)opj_malloc(nr_samples);
- out = outbuf = (unsigned char*)opj_malloc(nr_samples);
-
- image->comps = (opj_image_comp_t*)
- opj_realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t));
-
- if(image->numcomps == 2)
- image->comps[3] = image->comps[1];
-
- image->comps[1] = image->comps[0];
- image->comps[2] = image->comps[0];
-
- image->comps[1].data = (int*)opj_calloc(max, sizeof(int));
- image->comps[2].data = (int*)opj_calloc(max, sizeof(int));
-
- image->numcomps += 2;
-
- r = image->comps[0].data;
-
- for(i = 0; i < max; ++i)
- {
- *in++ = (unsigned char)*r++;
- }
- cmsDoTransform(transform, inbuf, outbuf, max);
-
- r = image->comps[0].data;
- g = image->comps[1].data;
- b = image->comps[2].data;
-
- for(i = 0; i < max; ++i)
- {
- *r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++;
- }
- opj_free(inbuf); opj_free(outbuf);
-
- }/* if(image->numcomps */
-
- cmsDeleteTransform(transform);
-
-#ifdef HAVE_LIBLCMS1
- cmsCloseProfile(in_prof);
- cmsCloseProfile(out_prof);
-#endif
-}/* jp2_apply_profile() */
-
-#endif /* HAVE_LIBLCMS2 || HAVE_LIBLCMS1 */
-
-bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext)
+bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color)
{
opj_jp2_box_t box;
unsigned int jp2h_end;
@@ -846,7 +630,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext)
{
if(box.type == JP2_COLR)
{
- if( !jp2_read_colr(jp2, cio, &box, ext))
+ if( !jp2_read_colr(jp2, cio, &box, color))
{
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
@@ -856,7 +640,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext)
}
if(box.type == JP2_CDEF)
{
- if( !jp2_read_cdef(jp2, cio, &box, ext))
+ if( !jp2_read_cdef(jp2, cio, &box, color))
{
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
@@ -866,7 +650,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext)
}
if(box.type == JP2_PCLR)
{
- if( !jp2_read_pclr(jp2, cio, &box, ext))
+ if( !jp2_read_pclr(jp2, cio, &box, color))
{
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
@@ -876,7 +660,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext)
}
if(box.type == JP2_CMAP)
{
- if( !jp2_read_cmap(jp2, cio, &box, ext))
+ if( !jp2_read_cmap(jp2, cio, &box, color))
{
cio_seek(cio, box.init_pos + 8);
cio_skip(cio, box.length - 8);
@@ -893,7 +677,7 @@ bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, struct extension *ext)
cio_seek(cio, jp2h_end);
/* Part 1, I.5.3.3 : 'must contain at least one' */
- return (ext->jp2_has_colr == 1);
+ return (color->jp2_has_colr == 1);
}/* jp2_read_jp2h() */
@@ -902,19 +686,19 @@ opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio,
{
opj_common_ptr cinfo;
opj_image_t *image = NULL;
- struct extension ext;
+ opj_jp2_color_t color;
if(!jp2 || !cio)
{
return NULL;
}
- memset(&ext, 0, sizeof(struct extension));
+ memset(&color, 0, sizeof(opj_jp2_color_t));
cinfo = jp2->cinfo;
/* JP2 decoding */
- if(!jp2_read_struct(jp2, cio, &ext))
+ if(!jp2_read_struct(jp2, cio, &color))
{
- free_ext_data(&ext);
+ free_color_data(&color);
opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n");
return NULL;
}
@@ -924,7 +708,7 @@ opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio,
if(!image)
{
- free_ext_data(&ext);
+ free_color_data(&color);
opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n");
return NULL;
}
@@ -939,29 +723,23 @@ opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio,
else
image->color_space = CLRSPC_UNKNOWN;
- if(ext.jp2_cdef)
+ if(color.jp2_cdef)
{
- jp2_apply_cdef(image, &ext);
+ jp2_apply_cdef(image, &color);
}
- if(ext.jp2_pclr)
+ if(color.jp2_pclr)
{
/* Part 1, I.5.3.4: Either both or none : */
- if( !ext.jp2_pclr->cmap)
- jp2_free_pclr(&ext);
+ if( !color.jp2_pclr->cmap)
+ jp2_free_pclr(&color);
else
- jp2_apply_pclr(&ext, image);
+ jp2_apply_pclr(&color, image);
}
- if(ext.jp2_profile_buf)
- {
-#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- jp2_apply_profile(&ext, image);
-#endif
- opj_free(ext.jp2_profile_buf);
- }
- else
- if(image->color_space == CLRSPC_SYCC)
+ if(color.icc_profile_buf)
{
- opj_convert_sycc_to_rgb(image);
+ image->icc_profile_buf = color.icc_profile_buf;
+ color.icc_profile_buf = NULL;
+ image->icc_profile_len = color.icc_profile_len;
}
return image;
@@ -1125,12 +903,12 @@ static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) {
static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
- struct extension *ext) {
+ opj_jp2_color_t *color) {
if (!jp2_read_jp(jp2, cio))
return false;
if (!jp2_read_ftyp(jp2, cio))
return false;
- if (!jp2_read_jp2h(jp2, cio, ext))
+ if (!jp2_read_jp2h(jp2, cio, color))
return false;
if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset))
return false;