diff options
-rw-r--r-- | src/cmspack.c | 52 | ||||
-rw-r--r-- | utils/tificc/tificc.c | 61 |
2 files changed, 66 insertions, 47 deletions
diff --git a/src/cmspack.c b/src/cmspack.c index 6a72edc..9e18e69 100644 --- a/src/cmspack.c +++ b/src/cmspack.c @@ -112,14 +112,14 @@ cmsUInt8Number* UnrollChunkyBytes(CMSREGISTER _cmsTRANSFORM* info, if (ExtraFirst) { - if (Premul) + if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[0])); accum += Extra; } else { - if (Premul) - alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[nChan - 1])); + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[nChan])); } for (i=0; i < nChan; i++) { @@ -178,7 +178,7 @@ cmsUInt8Number* UnrollPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, if (ExtraFirst) { - if (Premul) + if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[0])); @@ -186,8 +186,8 @@ cmsUInt8Number* UnrollPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, } else { - if (Premul) - alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[(nChan - 1) * Stride])); + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[(nChan) * Stride])); } for (i=0; i < nChan; i++) { @@ -1348,12 +1348,12 @@ cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, Stride /= PixelSize(info->InputFormat); - if (Premul) + if (Premul && Extra) { if (Planar) - alpha_factor = (ExtraFirst ? ptr[0] : ptr[(nChan - 1) * Stride]) / maximum; + alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan * Stride]) / maximum; else - alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan - 1]) / maximum; + alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum; } if (ExtraFirst) @@ -1368,7 +1368,7 @@ cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, else v = ptr[i + start]; - if (Premul) + if (Premul && alpha_factor > 0) v /= alpha_factor; v /= maximum; @@ -1415,12 +1415,12 @@ cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, Stride /= PixelSize(info->InputFormat); - if (Premul) + if (Premul && Extra) { if (Planar) - alpha_factor = (ExtraFirst ? ptr[0] : ptr[(nChan - 1) * Stride]) / maximum; + alpha_factor = (ExtraFirst ? ptr[0] : ptr[(nChan) * Stride]) / maximum; else - alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan - 1]) / maximum; + alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum; } if (ExtraFirst) @@ -1436,7 +1436,7 @@ cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start]; - if (Premul) + if (Premul && alpha_factor > 0) v /= alpha_factor; v /= maximum; @@ -1680,15 +1680,15 @@ cmsUInt8Number* PackChunkyBytes(CMSREGISTER _cmsTRANSFORM* info, if (ExtraFirst) { - if (Premul) + if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[0])); output += Extra; } else { - if (Premul) - alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan - 1])); + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan])); } for (i=0; i < nChan; i++) { @@ -1746,15 +1746,15 @@ cmsUInt8Number* PackChunkyWords(CMSREGISTER _cmsTRANSFORM* info, if (ExtraFirst) { - if (Premul) + if (Premul && Extra) alpha_factor = _cmsToFixedDomain(*(cmsUInt16Number*) output); output += Extra * sizeof(cmsUInt16Number); } else { - if (Premul) - alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[nChan - 1]); + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[nChan]); } for (i=0; i < nChan; i++) { @@ -1816,15 +1816,15 @@ cmsUInt8Number* PackPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, if (ExtraFirst) { - if (Premul) + if (Premul && Extra) alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[0])); output += Extra * Stride; } else { - if (Premul) - alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[(nChan - 1) * Stride])); + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan * Stride])); } @@ -1872,15 +1872,15 @@ cmsUInt8Number* PackPlanarWords(CMSREGISTER _cmsTRANSFORM* info, if (ExtraFirst) { - if (Premul) + if (Premul && Extra) alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[0]); output += Extra * Stride; } else { - if (Premul) - alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*)output)[(nChan - 1) * Stride]); + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*)output)[nChan * Stride]); } for (i=0; i < nChan; i++) { diff --git a/utils/tificc/tificc.c b/utils/tificc/tificc.c index 460ff84..f535950 100644 --- a/utils/tificc/tificc.c +++ b/utils/tificc/tificc.c @@ -119,12 +119,16 @@ void OutOfMem(cmsUInt32Number size) // ----------------------------------------------------------------------------------------------- - +// Lab plug-in // In TIFF, Lab is encoded in a different way, so let's use the plug-in // capabilities of lcms2 to change the meaning of TYPE_Lab_8. +#define LABTIFF_SH(m) ((m) << 30) +#define T_LABTIFF(m) (((m)>>30)&1) + // * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 -static int FromLabV2ToLabV4(int x) +static +int FromLabV2ToLabV4(int x) { int a; @@ -134,7 +138,8 @@ static int FromLabV2ToLabV4(int x) } // * 0xf00 / 0xffff = * 256 / 257 -static int FromLabV4ToLabV2(int x) +static +int FromLabV4ToLabV2(int x) { return ((x << 8) + 0x80) / 257; } @@ -230,7 +235,7 @@ cmsFormatter TiffFormatterFactory(cmsUInt32Number Type, { cmsFormatter Result = { NULL }; int bps = T_BYTES(Type); - int IsTiffSpecial = (Type >> 23) & 1; + int IsTiffSpecial = T_LABTIFF(Type); if (IsTiffSpecial && !(dwFlags & CMS_PACK_FLAGS_FLOAT)) { @@ -247,18 +252,19 @@ cmsFormatter TiffFormatterFactory(cmsUInt32Number Type, static cmsPluginFormatters TiffLabPlugin = { {cmsPluginMagicNumber, 2000, cmsPluginFormattersSig, NULL}, TiffFormatterFactory }; - +// ----------------------------------------------------------------------------------------------- // Build up the pixeltype descriptor static cmsUInt32Number GetInputPixelType(TIFF *Bank) { uint16 Photometric, bps, spp, extra, PlanarConfig, *info; - uint16 Compression, reverse = 0; - int ColorChannels, IsPlanar = 0, pt = 0, IsFlt; + uint16 Compression; + int ColorChannels; + int IsPremul = FALSE, IsPlanar = FALSE, IsFlt = FALSE, IsReverse = FALSE; int labTiffSpecial = FALSE; - - TIFFGetField(Bank, TIFFTAG_PHOTOMETRIC, &Photometric); + int pt = PT_ANY; + TIFFGetFieldDefaulted(Bank, TIFFTAG_BITSPERSAMPLE, &bps); if (bps == 1) @@ -267,7 +273,7 @@ cmsUInt32Number GetInputPixelType(TIFF *Bank) if (bps != 8 && bps != 16 && bps != 32) FatalError("Sorry, 8, 16 or 32 bits per sample only"); - TIFFGetFieldDefaulted(Bank, TIFFTAG_SAMPLESPERPIXEL, &spp); + TIFFGetFieldDefaulted(Bank, TIFFTAG_PLANARCONFIG, &PlanarConfig); switch (PlanarConfig) { @@ -279,8 +285,9 @@ cmsUInt32Number GetInputPixelType(TIFF *Bank) FatalError("Unsupported planar configuration (=%d) ", (int) PlanarConfig); } - // If Samples per pixel == 1, PlanarConfiguration is irrelevant and need - // not to be included. + TIFFGetFieldDefaulted(Bank, TIFFTAG_SAMPLESPERPIXEL, &spp); + + // If Samples per pixel == 1, PlanarConfiguration is irrelevant and need not to be included. if (spp == 1) IsPlanar = 0; @@ -288,7 +295,7 @@ cmsUInt32Number GetInputPixelType(TIFF *Bank) TIFFGetFieldDefaulted(Bank, TIFFTAG_EXTRASAMPLES, &extra, &info); - // Read alpha channels as colorant + // Read alpha channels as colorant? if (StoreAsAlpha) { @@ -298,11 +305,20 @@ cmsUInt32Number GetInputPixelType(TIFF *Bank) else ColorChannels = spp - extra; + // Is alpha premultiplied ? + + IsPremul = ((extra == 1) && (info[0] == EXTRASAMPLE_ASSOCALPHA)); + + + // Get photometric interpretation and proceed accordly + + TIFFGetField(Bank, TIFFTAG_PHOTOMETRIC, &Photometric); + switch (Photometric) { case PHOTOMETRIC_MINISWHITE: - reverse = 1; + IsReverse = 1; // ... fall through ... @@ -316,7 +332,6 @@ cmsUInt32Number GetInputPixelType(TIFF *Bank) FatalError("Sorry, RGB needs at least 3 samples per pixel"); break; - case PHOTOMETRIC_PALETTE: FatalError("Sorry, palette images not supported"); break; @@ -333,11 +348,13 @@ cmsUInt32Number GetInputPixelType(TIFF *Bank) pt = PT_YCbCr; TIFFGetFieldDefaulted(Bank, TIFFTAG_YCBCRSUBSAMPLING, &subx, &suby); if (subx != 1 || suby != 1) - FatalError("Sorry, subsampled images not supported"); + FatalError("Sorry, subsampled images are not supported"); } break; + // Two Lab flavours + case PHOTOMETRIC_ICCLAB: pt = PT_LabV2; break; @@ -347,8 +364,9 @@ cmsUInt32Number GetInputPixelType(TIFF *Bank) labTiffSpecial = TRUE; break; + // CIE Log2(L) (u',v') - case PHOTOMETRIC_LOGLUV: // CIE Log2(L) (u',v') + case PHOTOMETRIC_LOGLUV: TIFFSetField(Bank, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_16BIT); pt = PT_YUV; // *ICCSpace = icSigLuvData; @@ -364,12 +382,13 @@ cmsUInt32Number GetInputPixelType(TIFF *Bank) bps >>= 3; IsFlt = (bps == 0) || (bps == 4); - return (FLOAT_SH(IsFlt)|COLORSPACE_SH(pt)|PLANAR_SH(IsPlanar)|EXTRA_SH(extra)|CHANNELS_SH(ColorChannels)|BYTES_SH(bps)|FLAVOR_SH(reverse) | (labTiffSpecial << 23) ); + return (FLOAT_SH(IsFlt) | COLORSPACE_SH(pt) | PLANAR_SH(IsPlanar) | EXTRA_SH(extra) | PREMUL_SH(IsPremul) | + CHANNELS_SH(ColorChannels) | BYTES_SH(bps) | FLAVOR_SH(IsReverse) | LABTIFF_SH(labTiffSpecial)); } - // Rearrange pixel type to build output descriptor + static cmsUInt32Number ComputeOutputFormatDescriptor(cmsUInt32Number dwInput, int OutColorSpace, int bps) { @@ -381,7 +400,8 @@ cmsUInt32Number ComputeOutputFormatDescriptor(cmsUInt32Number dwInput, int OutCo if (OutColorSpace == PT_Lab) labTiffSpecial = TRUE; - return (FLOAT_SH(IsFlt)|COLORSPACE_SH(OutColorSpace)|PLANAR_SH(IsPlanar)|CHANNELS_SH(Channels)|BYTES_SH(bps) | (labTiffSpecial << 23)); + return (FLOAT_SH(IsFlt)|COLORSPACE_SH(OutColorSpace)|PLANAR_SH(IsPlanar)| + CHANNELS_SH(Channels)|BYTES_SH(bps) | LABTIFF_SH(labTiffSpecial)); } @@ -397,7 +417,6 @@ int TileBasedXform(cmsHTRANSFORM hXForm, TIFF* in, TIFF* out, int nPlanes) uint32 tw, tl; int PixelCount, j; - // Check for bad tiffs if (BufSizeIn > INT_MAX || BufSizeOut > INT_MAX) FatalError("Probably corrupted TIFF, tile too big."); |