Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option to force component splitting in imagetopnm #531

Merged
merged 1 commit into from
Jul 11, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/bin/jp2/convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -1350,7 +1350,7 @@ opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) {
return image;
}/* pnmtoimage() */

int imagetopnm(opj_image_t * image, const char *outfile)
int imagetopnm(opj_image_t * image, const char *outfile, int force_split)
{
int *red, *green, *blue, *alpha;
int wr, hr, max;
Expand Down Expand Up @@ -1380,16 +1380,17 @@ int imagetopnm(opj_image_t * image, const char *outfile)

if(want_gray) ncomp = 1;

if (ncomp == 2 /* GRAYA */
if ((force_split == 0) &&
(ncomp == 2 /* GRAYA */
|| (ncomp > 2 /* RGB, RGBA */
&& image->comps[0].dx == image->comps[1].dx
&& image->comps[1].dx == image->comps[2].dx
&& image->comps[0].dy == image->comps[1].dy
&& image->comps[1].dy == image->comps[2].dy
&& image->comps[0].prec == image->comps[1].prec
&& image->comps[1].prec == image->comps[2].prec
))
{
)))
{
fdest = fopen(outfile, "wb");

if (!fdest)
Expand Down
2 changes: 1 addition & 1 deletion src/bin/jp2/convert.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters);
int imagetopgx(opj_image_t *image, const char *outfile);

opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters);
int imagetopnm(opj_image_t *image, const char *outfile);
int imagetopnm(opj_image_t *image, const char *outfile, int force_split);

/* RAW conversion */
int imagetoraw(opj_image_t * image, const char *outfile);
Expand Down
9 changes: 7 additions & 2 deletions src/bin/jp2/opj_decompress.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,8 @@ typedef struct opj_decompress_params
int force_rgb;
/* upsample components according to their dx/dy values */
int upsample;
/* split output components to different files */
int split_pnm;
}opj_decompress_parameters;

/* -------------------------------------------------------------------------- */
Expand Down Expand Up @@ -218,6 +220,8 @@ static void decode_help_display(void) {
" Force output image colorspace to RGB\n"
" -upsample\n"
" Downsampled components will be upsampled to image size\n"
" -split-pnm\n"
" Split output components to different files when writing to PNM\n"
"\n");
/* UniPG>> */
#ifdef USE_JPWL
Expand Down Expand Up @@ -506,7 +510,8 @@ int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *para
{"ImgDir", REQ_ARG, NULL ,'y'},
{"OutFor", REQ_ARG, NULL ,'O'},
{"force-rgb", NO_ARG, &(parameters->force_rgb), 1},
{"upsample", NO_ARG, &(parameters->upsample), 1}
{"upsample", NO_ARG, &(parameters->upsample), 1},
{"split-pnm", NO_ARG, &(parameters->split_pnm), 1}
};

const char optlist[] = "i:o:r:l:x:d:t:p:"
Expand Down Expand Up @@ -1433,7 +1438,7 @@ int main(int argc, char **argv)
/* ------------------- */
switch (parameters.cod_format) {
case PXM_DFMT: /* PNM PGM PPM */
if (imagetopnm(image, parameters.outfile)) {
if (imagetopnm(image, parameters.outfile, parameters.split_pnm)) {
fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile);
failed = 1;
}
Expand Down
10 changes: 2 additions & 8 deletions src/lib/openjp2/j2k.c
Original file line number Diff line number Diff line change
Expand Up @@ -2031,14 +2031,8 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
}

/* testcase issue427-illegal-tile-offset.jp2 */
l_tx1 = l_cp->tx0 + l_cp->tdx;
if (l_tx1 < l_cp->tx0) { /* manage overflow */
l_tx1 = 0xFFFFFFFFU;
}
l_ty1 = l_cp->ty0 + l_cp->tdy;
if (l_ty1 < l_cp->ty0) { /* manage overflow */
l_ty1 = 0xFFFFFFFFU;
}
l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */
l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */
if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) || (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0) ) {
opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: illegal tile offset\n");
return OPJ_FALSE;
Expand Down
8 changes: 7 additions & 1 deletion tests/conformance/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -510,11 +510,17 @@ foreach(kdu_file ${kdu_j2k_conf_files})
set( filenameInput "${kdu_file}.j2c" )
set( filenameRef "${kdu_file}.ppm" )

if("${kdu_file}" STREQUAL "a6_mono_colr")
set(kdu_test_args -upsample -split-pnm )
else()
set(kdu_test_args -upsample )
endif()

add_test(NAME ETS-KDU-${filenameInput}-decode
COMMAND opj_decompress
-i ${INPUT_CONF}/${filenameInput}
-o ${TEMP}/${filenameInput}.ppm
-upsample
${kdu_test_args}
)

if("${kdu_file}" STREQUAL "a6_mono_colr")
Expand Down