[1.5] Apply big-endian patch from winfried: libopenjpeg and WORDS_BIGENDIAN, 2012/02/14
This commit is contained in:
parent
dd999a2840
commit
8c9fd1b351
|
@ -94,7 +94,7 @@ struct tga_header
|
|||
|
||||
static unsigned short get_ushort(unsigned short val) {
|
||||
|
||||
#ifdef ORDER_BIGENDIAN
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
return( ((val & 0xff) << 8) + (val >> 8) );
|
||||
#else
|
||||
return( val );
|
||||
|
@ -179,6 +179,16 @@ static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel,
|
|||
return 1;
|
||||
}
|
||||
|
||||
#if WORDS_BIGENDIAN == 1
|
||||
|
||||
static inline int16_t swap16(int16_t x)
|
||||
{
|
||||
return((((u_int16_t)x & 0x00ffU) << 8) |
|
||||
(((u_int16_t)x & 0xff00U) >> 8));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height,
|
||||
opj_bool flip_image)
|
||||
{
|
||||
|
@ -216,8 +226,15 @@ static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height,
|
|||
image_w = (unsigned short)width;
|
||||
image_h = (unsigned short) height;
|
||||
|
||||
#if WORDS_BIGENDIAN == 0
|
||||
if(fwrite(&image_w, 2, 1, fp) != 1) goto fails;
|
||||
if(fwrite(&image_h, 2, 1, fp) != 1) goto fails;
|
||||
#else
|
||||
image_w = swap16(image_w);
|
||||
image_h = swap16(image_h);
|
||||
if(fwrite(&image_w, 2, 1, fp) != 1) goto fails;
|
||||
if(fwrite(&image_h, 2, 1, fp) != 1) goto fails;
|
||||
#endif
|
||||
|
||||
if(fwrite(&pixel_depth, 1, 1, fp) != 1) goto fails;
|
||||
|
||||
|
@ -493,7 +510,7 @@ int imagetotga(opj_image_t * image, const char *outfile) {
|
|||
typedef unsigned short int WORD;
|
||||
|
||||
/* DWORD defines a four byte word */
|
||||
typedef unsigned long int DWORD;
|
||||
typedef unsigned int DWORD;
|
||||
|
||||
typedef struct {
|
||||
WORD bfType; /* 'BM' for Bitmap (19776) */
|
||||
|
@ -583,7 +600,7 @@ opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
|
||||
if(Info_h.biSize != 40)
|
||||
{
|
||||
fprintf(stderr,"Error, unknown BMP header size %ld\n", Info_h.biSize);
|
||||
fprintf(stderr,"Error, unknown BMP header size %d\n", Info_h.biSize);
|
||||
fclose(IN);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -997,7 +1014,7 @@ int imagetobmp(opj_image_t * image, const char *outfile) {
|
|||
fprintf(stderr, "Unsupported number of components: %d\n", image->comps[0].prec);
|
||||
return 1;
|
||||
}
|
||||
if (image->numcomps == 3 && image->comps[0].dx == image->comps[1].dx
|
||||
if (image->numcomps >= 3 && 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
|
||||
|
@ -1251,6 +1268,7 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) {
|
|||
OPJ_COLOR_SPACE color_space;
|
||||
opj_image_cmptparm_t cmptparm; /* maximum of 1 component */
|
||||
opj_image_t * image = NULL;
|
||||
int adjustS, ushift, dshift, force8;
|
||||
|
||||
char endian1,endian2,sign;
|
||||
char signtmp[32];
|
||||
|
@ -1307,6 +1325,16 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) {
|
|||
} else {
|
||||
cmptparm.sgnd = 0;
|
||||
}
|
||||
if(prec < 8)
|
||||
{
|
||||
force8 = 1;
|
||||
ushift = 8 - prec; dshift = prec - ushift;
|
||||
if(cmptparm.sgnd) adjustS = (1<<(prec - 1)); else adjustS = 0;
|
||||
cmptparm.sgnd = 0;
|
||||
prec = 8;
|
||||
}
|
||||
else ushift = dshift = force8 = adjustS = 0;
|
||||
|
||||
cmptparm.prec = prec;
|
||||
cmptparm.bpp = prec;
|
||||
cmptparm.dx = parameters->subsampling_dx;
|
||||
|
@ -1330,7 +1358,17 @@ opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) {
|
|||
|
||||
for (i = 0; i < w * h; i++) {
|
||||
int v;
|
||||
if (comp->prec <= 8) {
|
||||
if(force8)
|
||||
{
|
||||
v = readuchar(f) + adjustS;
|
||||
v = (v<<ushift) + (v>>dshift);
|
||||
comp->data[i] = (unsigned char)v;
|
||||
|
||||
if(v > max) max = v;
|
||||
|
||||
continue;
|
||||
}
|
||||
if (comp->prec == 8) {
|
||||
if (!comp->sgnd) {
|
||||
v = readuchar(f);
|
||||
} else {
|
||||
|
@ -2043,16 +2081,6 @@ int imagetopnm(opj_image_t * image, const char *outfile)
|
|||
|
||||
<<-- <<-- <<-- <<-- */
|
||||
|
||||
typedef struct tiff_infoheader{
|
||||
DWORD tiWidth; /* Width of Image in pixel*/
|
||||
DWORD tiHeight; /* Height of Image in pixel */
|
||||
DWORD tiPhoto; /* Photometric */
|
||||
WORD tiBps; /* Bits per sample */
|
||||
WORD tiSf; /* Sample Format */
|
||||
WORD tiSpp; /* Sample per pixel 1-bilevel,gray scale , 2- RGB */
|
||||
WORD tiPC; /* Planar config (1-Interleaved, 2-Planarcomp) */
|
||||
}tiff_infoheader_t;
|
||||
|
||||
int imagetotif(opj_image_t * image, const char *outfile)
|
||||
{
|
||||
int width, height, imgsize;
|
||||
|
@ -2424,7 +2452,6 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
int subsampling_dx = parameters->subsampling_dx;
|
||||
int subsampling_dy = parameters->subsampling_dy;
|
||||
TIFF *tif;
|
||||
tiff_infoheader_t Info;
|
||||
tdata_t buf;
|
||||
tstrip_t strip;
|
||||
tsize_t strip_size;
|
||||
|
@ -2434,6 +2461,8 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
opj_image_t *image = NULL;
|
||||
int imgsize = 0;
|
||||
int has_alpha = 0;
|
||||
unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC;
|
||||
unsigned int tiWidth, tiHeight;
|
||||
|
||||
tif = TIFFOpen(filename, "r");
|
||||
|
||||
|
@ -2442,38 +2471,36 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename);
|
||||
return 0;
|
||||
}
|
||||
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &Info.tiWidth);
|
||||
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &Info.tiHeight);
|
||||
TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &Info.tiBps);
|
||||
TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &Info.tiSf);
|
||||
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &Info.tiSpp);
|
||||
Info.tiPhoto = 0;
|
||||
TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &Info.tiPhoto);
|
||||
TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &Info.tiPC);
|
||||
w= Info.tiWidth;
|
||||
h= Info.tiHeight;
|
||||
tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0;
|
||||
tiWidth = tiHeight = 0;
|
||||
|
||||
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth);
|
||||
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight);
|
||||
TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps);
|
||||
TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf);
|
||||
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp);
|
||||
TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto);
|
||||
TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC);
|
||||
w= tiWidth;
|
||||
h= tiHeight;
|
||||
|
||||
if(tiBps != 8 && tiBps != 16 && tiBps != 12) tiBps = 0;
|
||||
if(tiPhoto != 1 && tiPhoto != 2) tiPhoto = 0;
|
||||
|
||||
if( !tiBps || !tiPhoto)
|
||||
{
|
||||
int b, p;
|
||||
|
||||
if((b = Info.tiBps) != 8 && b != 16 && b != 12) b = 0;
|
||||
if((p = Info.tiPhoto) != 1 && p != 2) p = 0;
|
||||
|
||||
if( !b || !p)
|
||||
{
|
||||
if( !b)
|
||||
if( !tiBps)
|
||||
fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits"
|
||||
" implemented\n",Info.tiBps);
|
||||
" implemented\n",tiBps);
|
||||
else
|
||||
if( !p)
|
||||
if( !tiPhoto)
|
||||
fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A)"
|
||||
" and GRAY(A) has been implemented\n",(int) Info.tiPhoto);
|
||||
" and GRAY(A) has been implemented\n",(int) tiPhoto);
|
||||
|
||||
fprintf(stderr,"\tAborting\n");
|
||||
TIFFClose(tif);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
{/* From: tiff-4.0.x/libtiff/tif_getimage.c : */
|
||||
|
@ -2490,7 +2517,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
case EXTRASAMPLE_UNSPECIFIED:
|
||||
/* Workaround for some images without correct info about alpha channel
|
||||
*/
|
||||
if(Info.tiSpp > 3)
|
||||
if(tiSpp > 3)
|
||||
has_alpha = 1;
|
||||
break;
|
||||
|
||||
|
@ -2500,12 +2527,15 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
break;
|
||||
}
|
||||
}
|
||||
else /* extrasamples == 0 */
|
||||
if(tiSpp == 4 || tiSpp == 2) has_alpha = 1;
|
||||
}
|
||||
|
||||
/* initialize image components
|
||||
*/
|
||||
memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t));
|
||||
|
||||
if(Info.tiPhoto == PHOTOMETRIC_RGB) /* RGB(A) */
|
||||
if(tiPhoto == PHOTOMETRIC_RGB) /* RGB(A) */
|
||||
{
|
||||
numcomps = 3 + has_alpha;
|
||||
color_space = CLRSPC_SRGB;
|
||||
|
@ -2519,8 +2549,8 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
}
|
||||
else
|
||||
{
|
||||
cmptparm[j].prec = Info.tiBps;
|
||||
cmptparm[j].bpp = Info.tiBps;
|
||||
cmptparm[j].prec = tiBps;
|
||||
cmptparm[j].bpp = tiBps;
|
||||
}
|
||||
cmptparm[j].dx = subsampling_dx;
|
||||
cmptparm[j].dy = subsampling_dy;
|
||||
|
@ -2559,7 +2589,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size);
|
||||
dat8 = (unsigned char*)buf;
|
||||
|
||||
if(Info.tiBps == 16)
|
||||
if(tiBps == 16)
|
||||
{
|
||||
step = 6 + has_alpha + has_alpha;
|
||||
|
||||
|
@ -2592,9 +2622,9 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
else
|
||||
break;
|
||||
}/*for(i = 0)*/
|
||||
}/*if(Info.tiBps == 16)*/
|
||||
}/*if(tiBps == 16)*/
|
||||
else
|
||||
if(Info.tiBps == 8)
|
||||
if(tiBps == 8)
|
||||
{
|
||||
step = 3 + has_alpha;
|
||||
|
||||
|
@ -2623,9 +2653,9 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
else
|
||||
break;
|
||||
}/*for(i )*/
|
||||
}/*if( Info.tiBps == 8)*/
|
||||
}/*if( tiBps == 8)*/
|
||||
else
|
||||
if(Info.tiBps == 12)/* CINEMA file */
|
||||
if(tiBps == 12)/* CINEMA file */
|
||||
{
|
||||
step = 9;
|
||||
|
||||
|
@ -2656,15 +2686,15 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
return image;
|
||||
}/*RGB(A)*/
|
||||
|
||||
if(Info.tiPhoto == PHOTOMETRIC_MINISBLACK) /* GRAY(A) */
|
||||
if(tiPhoto == PHOTOMETRIC_MINISBLACK) /* GRAY(A) */
|
||||
{
|
||||
numcomps = 1 + has_alpha;
|
||||
color_space = CLRSPC_GRAY;
|
||||
|
||||
for(j = 0; j < numcomps; ++j)
|
||||
{
|
||||
cmptparm[j].prec = Info.tiBps;
|
||||
cmptparm[j].bpp = Info.tiBps;
|
||||
cmptparm[j].prec = tiBps;
|
||||
cmptparm[j].bpp = tiBps;
|
||||
cmptparm[j].dx = subsampling_dx;
|
||||
cmptparm[j].dy = subsampling_dy;
|
||||
cmptparm[j].w = w;
|
||||
|
@ -2702,7 +2732,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size);
|
||||
dat8 = (unsigned char*)buf;
|
||||
|
||||
if(Info.tiBps == 16)
|
||||
if(tiBps == 16)
|
||||
{
|
||||
step = 2 + has_alpha + has_alpha;
|
||||
|
||||
|
@ -2720,7 +2750,7 @@ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
|
|||
}/*for(i )*/
|
||||
}
|
||||
else
|
||||
if(Info.tiBps == 8)
|
||||
if(tiBps == 8)
|
||||
{
|
||||
step = 1 + has_alpha;
|
||||
|
||||
|
|
Loading…
Reference in New Issue