Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibTIFF4/tif_luv.c view on Meta::CPAN
return (SGILOGDATAFMT_8BIT);
}
#undef PACK
return (SGILOGDATAFMT_UNKNOWN);
}
static tmsize_t
multiply_ms(tmsize_t m1, tmsize_t m2)
{
tmsize_t bytes = m1 * m2;
if (m1 && bytes / m1 != m2)
bytes = 0;
return bytes;
}
static int
LogL16InitState(TIFF* tif)
{
static const char module[] = "LogL16InitState";
TIFFDirectory *td = &tif->tif_dir;
LogLuvState* sp = DecoderState(tif);
assert(sp != NULL);
assert(td->td_photometric == PHOTOMETRIC_LOGL);
/* for some reason, we can't do this in TIFFInitLogL16 */
if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
sp->user_datafmt = LogL16GuessDataFmt(td);
switch (sp->user_datafmt) {
case SGILOGDATAFMT_FLOAT:
sp->pixel_size = sizeof (float);
break;
case SGILOGDATAFMT_16BIT:
sp->pixel_size = sizeof (int16);
break;
case SGILOGDATAFMT_8BIT:
sp->pixel_size = sizeof (uint8);
break;
default:
TIFFErrorExt(tif->tif_clientdata, module,
"No support for converting user data format to LogL");
return (0);
}
if( isTiled(tif) )
sp->tbuflen = multiply_ms(td->td_tilewidth, td->td_tilelength);
else
sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_rowsperstrip);
if (multiply_ms(sp->tbuflen, sizeof (int16)) == 0 ||
(sp->tbuf = (uint8*) _TIFFmalloc(sp->tbuflen * sizeof (int16))) == NULL) {
TIFFErrorExt(tif->tif_clientdata, module, "No space for SGILog translation buffer");
return (0);
}
return (1);
}
static int
LogLuvGuessDataFmt(TIFFDirectory *td)
{
int guess;
/*
* If the user didn't tell us their datafmt,
* take our best guess from the bitspersample.
*/
#define PACK(a,b) (((a)<<3)|(b))
switch (PACK(td->td_bitspersample, td->td_sampleformat)) {
case PACK(32, SAMPLEFORMAT_IEEEFP):
guess = SGILOGDATAFMT_FLOAT;
break;
case PACK(32, SAMPLEFORMAT_VOID):
case PACK(32, SAMPLEFORMAT_UINT):
case PACK(32, SAMPLEFORMAT_INT):
guess = SGILOGDATAFMT_RAW;
break;
case PACK(16, SAMPLEFORMAT_VOID):
case PACK(16, SAMPLEFORMAT_INT):
case PACK(16, SAMPLEFORMAT_UINT):
guess = SGILOGDATAFMT_16BIT;
break;
case PACK( 8, SAMPLEFORMAT_VOID):
case PACK( 8, SAMPLEFORMAT_UINT):
guess = SGILOGDATAFMT_8BIT;
break;
default:
guess = SGILOGDATAFMT_UNKNOWN;
break;
#undef PACK
}
/*
* Double-check samples per pixel.
*/
switch (td->td_samplesperpixel) {
case 1:
if (guess != SGILOGDATAFMT_RAW)
guess = SGILOGDATAFMT_UNKNOWN;
break;
case 3:
if (guess == SGILOGDATAFMT_RAW)
guess = SGILOGDATAFMT_UNKNOWN;
break;
default:
guess = SGILOGDATAFMT_UNKNOWN;
break;
}
return (guess);
}
static int
LogLuvInitState(TIFF* tif)
{
static const char module[] = "LogLuvInitState";
TIFFDirectory* td = &tif->tif_dir;
LogLuvState* sp = DecoderState(tif);
assert(sp != NULL);
assert(td->td_photometric == PHOTOMETRIC_LOGLUV);
/* for some reason, we can't do this in TIFFInitLogLuv */
if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
TIFFErrorExt(tif->tif_clientdata, module,
"SGILog compression cannot handle non-contiguous data");
return (0);
}
if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
sp->user_datafmt = LogLuvGuessDataFmt(td);
switch (sp->user_datafmt) {
case SGILOGDATAFMT_FLOAT:
sp->pixel_size = 3*sizeof (float);
break;
case SGILOGDATAFMT_16BIT:
sp->pixel_size = 3*sizeof (int16);
break;
case SGILOGDATAFMT_RAW:
sp->pixel_size = sizeof (uint32);
break;
case SGILOGDATAFMT_8BIT:
sp->pixel_size = 3*sizeof (uint8);
break;
default:
TIFFErrorExt(tif->tif_clientdata, module,
"No support for converting user data format to LogLuv");
return (0);
}
if( isTiled(tif) )
sp->tbuflen = multiply_ms(td->td_tilewidth, td->td_tilelength);
else
sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_rowsperstrip);
if (multiply_ms(sp->tbuflen, sizeof (uint32)) == 0 ||
(sp->tbuf = (uint8*) _TIFFmalloc(sp->tbuflen * sizeof (uint32))) == NULL) {
TIFFErrorExt(tif->tif_clientdata, module, "No space for SGILog translation buffer");
return (0);
}
return (1);
}
static int
LogLuvFixupTags(TIFF* tif)
{
(void) tif;
return (1);
}
static int
LogLuvSetupDecode(TIFF* tif)
{
( run in 0.813 second using v1.01-cache-2.11-cpan-0c5ce583b80 )