changed the Identify string to report information about the type of the TIFF image
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3105 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
9360e22d50
commit
58100bab8b
@ -379,8 +379,11 @@ identify_bits_header(BPositionIO *inSource, translator_info *outInfo,
|
||||
// return B_NO_TRANSLATOR, otherwise,
|
||||
// return B_OK
|
||||
status_t
|
||||
check_tiff_fields(TiffIfd &ifd, TiffDetails *pdetails)
|
||||
check_tiff_fields(TiffIfd &ifd, TiffDetails *pdetails, bool bAllocArrays)
|
||||
{
|
||||
if (!pdetails)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
try {
|
||||
// Extra Samples are not yet supported
|
||||
if (ifd.HasField(TAG_EXTRA_SAMPLES))
|
||||
@ -532,16 +535,16 @@ check_tiff_fields(TiffIfd &ifd, TiffDetails *pdetails)
|
||||
width, height, compression, interpretation, bitsPerPixel);
|
||||
|
||||
// return read in details if output pointer is supplied
|
||||
if (pdetails) {
|
||||
pdetails->width = width;
|
||||
pdetails->height = height;
|
||||
pdetails->compression = compression;
|
||||
pdetails->rowsPerStrip = rowsPerStrip;
|
||||
pdetails->stripsPerImage = stripsPerImage;
|
||||
pdetails->interpretation = interpretation;
|
||||
pdetails->bitsPerPixel = bitsPerPixel;
|
||||
pdetails->imageType = imageType;
|
||||
pdetails->width = width;
|
||||
pdetails->height = height;
|
||||
pdetails->compression = compression;
|
||||
pdetails->rowsPerStrip = rowsPerStrip;
|
||||
pdetails->stripsPerImage = stripsPerImage;
|
||||
pdetails->interpretation = interpretation;
|
||||
pdetails->bitsPerPixel = bitsPerPixel;
|
||||
pdetails->imageType = imageType;
|
||||
|
||||
if (bAllocArrays) {
|
||||
ifd.GetUint32Array(TAG_STRIP_OFFSETS,
|
||||
&pdetails->pstripOffsets);
|
||||
ifd.GetUint32Array(TAG_STRIP_BYTE_COUNTS,
|
||||
@ -561,6 +564,74 @@ check_tiff_fields(TiffIfd &ifd, TiffDetails *pdetails)
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
// copy descriptive information about the TIFF image
|
||||
// into strname
|
||||
void
|
||||
copy_tiff_name(char *strname, TiffDetails *pdetails, swap_action swp)
|
||||
{
|
||||
if (!strname || !pdetails)
|
||||
return;
|
||||
|
||||
strcpy(strname, "TIFF Image (");
|
||||
|
||||
// byte order
|
||||
if (swp == B_SWAP_BENDIAN_TO_HOST)
|
||||
strcat(strname, "Big, ");
|
||||
else
|
||||
strcat(strname, "Little, ");
|
||||
|
||||
// image type
|
||||
const char *strtype = NULL;
|
||||
switch (pdetails->imageType) {
|
||||
case TIFF_BILEVEL:
|
||||
if (pdetails->bitsPerPixel == 1)
|
||||
strtype = "Mono, ";
|
||||
else
|
||||
strtype = "Gray, ";
|
||||
break;
|
||||
case TIFF_PALETTE:
|
||||
strtype = "Palette, ";
|
||||
break;
|
||||
case TIFF_RGB:
|
||||
strtype = "RGB, ";
|
||||
break;
|
||||
case TIFF_CMYK:
|
||||
strtype = "CMYK, ";
|
||||
break;
|
||||
default:
|
||||
strtype = "??, ";
|
||||
break;
|
||||
}
|
||||
strcat(strname, strtype);
|
||||
|
||||
// compression
|
||||
const char *strcomp = NULL;
|
||||
switch (pdetails->compression) {
|
||||
case COMPRESSION_NONE:
|
||||
strcomp = "None)";
|
||||
break;
|
||||
case COMPRESSION_HUFFMAN:
|
||||
strcomp = "Huffman)";
|
||||
break;
|
||||
case COMPRESSION_T4:
|
||||
strcomp = "Group 3)";
|
||||
break;
|
||||
case COMPRESSION_T6:
|
||||
strcomp = "Group 4)";
|
||||
break;
|
||||
case COMPRESSION_LZW:
|
||||
strcomp = "LZW)";
|
||||
break;
|
||||
case COMPRESSION_PACKBITS:
|
||||
strcomp = "PackBits)";
|
||||
break;
|
||||
default:
|
||||
strcomp = "??)";
|
||||
break;
|
||||
}
|
||||
strcat(strname, strcomp);
|
||||
}
|
||||
|
||||
status_t
|
||||
identify_tiff_header(BPositionIO *inSource, translator_info *outInfo,
|
||||
ssize_t amtread, uint8 *read, swap_action swp,
|
||||
@ -593,16 +664,27 @@ identify_tiff_header(BPositionIO *inSource, translator_info *outInfo,
|
||||
|
||||
// Check the required fields
|
||||
if (initcheck == B_OK) {
|
||||
if (outInfo) {
|
||||
|
||||
bool bAllocArrays = true;
|
||||
TiffDetails localdetails;
|
||||
if (!pdetails) {
|
||||
bAllocArrays = false;
|
||||
pdetails = &localdetails;
|
||||
}
|
||||
status_t result;
|
||||
result = check_tiff_fields(ifd, pdetails, bAllocArrays);
|
||||
|
||||
if (result == B_OK && outInfo) {
|
||||
outInfo->type = B_TIFF_FORMAT;
|
||||
outInfo->group = B_TRANSLATOR_BITMAP;
|
||||
outInfo->quality = TIFF_IN_QUALITY;
|
||||
outInfo->capability = TIFF_IN_CAPABILITY;
|
||||
strcpy(outInfo->MIME, "image/tiff");
|
||||
strcpy(outInfo->name, "TIFF Image");
|
||||
|
||||
copy_tiff_name(outInfo->name, pdetails, swp);
|
||||
}
|
||||
|
||||
return check_tiff_fields(ifd, pdetails);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (initcheck != B_ERROR && initcheck != B_NO_MEMORY)
|
||||
|
Loading…
Reference in New Issue
Block a user