{
throw new InvalidFileStructureException("Number of palette entries must be divideable by three without rest; " + count);
}
if (count < 3 || count > 768)
{
throw new UnsupportedTypeException("Unsupported number of palette entries: " + count + ".");
}
if (type != TAG_TYPE_SHORT)
{
throw new UnsupportedTypeException("Unsupported number type for palette entries: " + type);
}
int numEntries = count / 3;
palette = new Palette(numEntries, 255);
int vectorIndex = 0;
for (int paletteIndex = 0; paletteIndex < numEntries; paletteIndex++)
{
palette.putSample(RGBIndex.INDEX_RED, paletteIndex, tag.getElementAsInt(vectorIndex++) >> 8);
}
for (int paletteIndex = 0; paletteIndex < numEntries; paletteIndex++)
{
palette.putSample(RGBIndex.INDEX_GREEN, paletteIndex, tag.getElementAsInt(vectorIndex++) >> 8);
}
for (int paletteIndex = 0; paletteIndex < numEntries; paletteIndex++)
{
palette.putSample(RGBIndex.INDEX_BLUE, paletteIndex, tag.getElementAsInt(vectorIndex++) >> 8);
}
break;
}
case(TAG_COMPRESSION):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
" single byte/short/long value for compression " +
"(count=" + count + ", type=" + type + ").");
}
compression = tag.getOffset();
break;
}
case(TAG_DATE_TIME):
{
dateTime = tag.getString();
if (dateTime != null)
{
dateTime = dateTime.trim();
}
if (dateTime != null)
{
SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
if (timeZone != null)
{
format.setCalendar(new GregorianCalendar(timeZone));
}
try
{
date = format.parse(dateTime);
}
catch (ParseException pe)
{
date = null;
}
}
break;
}
case(TAG_HOST_COMPUTER):
{
hostComputer = tag.getString();
break;
}
case(TAG_IMAGE_DESCRIPTION):
{
imageDescription = tag.getString();
break;
}
case(TAG_IMAGE_WIDTH):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for image width " +
"(count=" + count + ", type=" + type + ").");
}
width = tag.getOffset();
break;
}
case(TAG_IMAGE_LENGTH):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for image height " +
"(count=" + count + ", type=" + type + ").");
}
height = tag.getOffset();
break;
}
case(TAG_MAKE):
{
make = tag.getString();
break;
}
case(TAG_MODEL):
{
model = tag.getString();
break;
}
case(TAG_ORIENTATION):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for image height " +
"(count=" + count + ", type=" + type + ").");
}
orientation = tag.getOffset();
break;
}
case(TAG_PHOTOMETRIC_INTERPRETATION):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for photometric interpretation.");
}
photometricInterpretation = tag.getOffset();
break;
}
case(TAG_RESOLUTION_UNIT):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for planar configuration.");
}
resolutionUnit = tag.getOffset();
break;
}
case(TAG_RESOLUTION_X):
{
if (count != 1 || type != TAG_TYPE_RATIONAL)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for planar configuration.");
}
Object o = tag.getObject(0);
if (o != null && o instanceof TIFFRational)
{
TIFFRational rational = (TIFFRational)o;
resolutionX = rational.getAsDouble();
}
break;
}
case(TAG_RESOLUTION_Y):
{
if (count != 1 || type != TAG_TYPE_RATIONAL)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for planar configuration.");
}
Object o = tag.getObject(0);
if (o != null && o instanceof TIFFRational)
{
TIFFRational rational = (TIFFRational)o;
resolutionY = rational.getAsDouble();
}
break;
}
case(TAG_PLANAR_CONFIGURATION):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for planar configuration.");
}
planarConfiguration = tag.getOffset();
break;
}
case(TAG_ROWS_PER_STRIP):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for image height.");
}
rowsPerStrip = tag.getOffset();
break;
}
case(TAG_SAMPLES_PER_PIXEL):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for samples per pixel.");
}
samplesPerPixel = tag.getOffset();
break;
}
case(TAG_SOFTWARE):
{
software = tag.getString();
break;
}
case(TAG_STRIP_BYTE_COUNTS):
{
if (count < 1)
{
throw new InvalidFileStructureException("Need at least one strip offset.");
}
if (count == 1)
{
if (isNotInt)
{
throw new InvalidFileStructureException("There is " +
"only one strip offset, but its type is not integer.");
}
stripByteCounts = new Vector();
stripByteCounts.addElement(new Long(tag.getOffset()));
}
else
{
stripByteCounts = tag.getVector();
}
break;
}
case(TAG_STRIP_OFFSETS):
{
if (count < 1)
{
throw new InvalidFileStructureException("Need at least one strip offset.");
}
if (count == 1)
{
if (isNotInt)
{
throw new InvalidFileStructureException("There is " +
"only one strip offset, but its type is not integer.");
}
stripOffsets = new Vector();
stripOffsets.addElement(new Long(tag.getOffset()));
}
else
{
stripOffsets = tag.getVector();
}
numStrips = count;
numTiles = count;
horizontalTiles = 1;
verticalTiles = count;
break;
}
case(TAG_T4_OPTIONS):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for T4 Options.");
}
t4Options = tag.getOffset();
break;
}
case(TAG_T6_OPTIONS):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for T6 Options.");
}
t6Options = tag.getOffset();
break;
}
case(TAG_TILE_HEIGHT):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for image height " +
"(count=" + count + ", type=" + type + ").");
}
tileHeight = tag.getOffset();
if (tileHeight < 1)
{
throw new InvalidFileStructureException("Tile height must be one or larger.");
}
verticalTiles = height / tileHeight;
if ((height % tileHeight) != 0)
{
verticalTiles++;
}
break;
}
case(TAG_TILE_OFFSETS):
{
if (count < 1)
{
throw new InvalidFileStructureException("Need at least one tile offset.");
}
if (count == 1)
{
if (isNotInt)
{
throw new InvalidFileStructureException("There is " +
"only one tile offset, but its type is not integer.");
}
tileOffsets = new Vector();
tileOffsets.addElement(new Long(tag.getOffset()));
}
else
{
tileOffsets = tag.getVector();
}
numStrips = count;
numTiles = count;
horizontalTiles = 1;
verticalTiles = count;
break;
}
case(TAG_TILE_WIDTH):
{
if (count != 1 || isNotInt)
{
throw new InvalidFileStructureException("Expected " +
"single byte/short/long value for image height " +
"(count=" + count + ", type=" + type + ").");
}
tileWidth = tag.getOffset();
if (tileWidth < 1)
{
throw new InvalidFileStructureException("Tile width must be one or larger.");
}
horizontalTiles = width / tileWidth;
if ((width % tileWidth) != 0)
{
horizontalTiles++;
}
break;
}
}
}
if (planarConfiguration == -1)
{
planarConfiguration = PLANAR_CONFIGURATION_CHUNKY;
}
if (photometricInterpretation == TIFFConstants.PHOTOMETRIC_PALETTED)
{
if (bitsPerPixel == 4)
{
imageType = TYPE_PALETTED4;
}
else
if (bitsPerPixel == 8)
{
imageType = TYPE_PALETTED8;
}
else
{
throw new UnsupportedTypeException("Only paletted images with 4 or 8 bits per sample are supported.");
}
}
if (resolutionUnit == 2 && resolutionX > 0.0 && resolutionY > 0.0)
{
dpiX = (int)resolutionX;