blob: 4011124576d425f5398cbfff672ef3eeda0c1ea0 [file] [log] [blame]
import '../../image_exception.dart';
import '../../util/input_buffer.dart';
import 'tiff_image.dart';
class TiffEntry {
int tag;
int type;
int numValues;
int valueOffset;
TiffEntry(this.tag, this.type, this.numValues);
String toString() {
if (TiffImage.TAG_NAME.containsKey(tag)) {
return '${TiffImage.TAG_NAME[tag]}: $type $numValues';
}
return '<$tag>: $type $numValues';
}
bool get isValid => type < 13 && type > 0;
int get typeSize => isValid ? SIZE_OF_TYPE[type] : 0;
bool get isString => type == TYPE_ASCII;
int readValue(InputBuffer p) {
p.offset = valueOffset;
return _readValue(p);
}
List<int> readValues(InputBuffer p) {
p.offset = valueOffset;
var values = <int>[];
for (int i = 0; i < numValues; ++i) {
values.add(_readValue(p));
}
return values;
}
String readString(InputBuffer p) {
if (type != TYPE_ASCII) {
throw new ImageException('readString requires ASCII entity');
}
// TODO: ASCII fields can contain multiple strings, separated with a NULL.
return new String.fromCharCodes(readValues(p));
}
int _readValue(InputBuffer p) {
switch (type) {
case TYPE_BYTE:
case TYPE_ASCII:
return p.readByte();
case TYPE_SHORT:
return p.readUint16();
case TYPE_LONG:
return p.readUint32();
case TYPE_RATIONAL:
int num = p.readUint32();
int den = p.readUint32();
if (den == 0) {
return 0;
}
return num ~/ den;
case TYPE_SBYTE:
throw new ImageException('Unhandled value type: SBYTE');
case TYPE_UNDEFINED:
return p.readByte();
case TYPE_SSHORT:
throw new ImageException('Unhandled value type: SSHORT');
case TYPE_SLONG:
throw new ImageException('Unhandled value type: SLONG');
case TYPE_SRATIONAL:
throw new ImageException('Unhandled value type: SRATIONAL');
case TYPE_FLOAT:
throw new ImageException('Unhandled value type: FLOAT');
case TYPE_DOUBLE:
throw new ImageException('Unhandled value type: DOUBLE');
}
return 0;
}
static const int TYPE_BYTE = 1;
static const int TYPE_ASCII = 2;
static const int TYPE_SHORT = 3;
static const int TYPE_LONG = 4;
static const int TYPE_RATIONAL = 5;
static const int TYPE_SBYTE = 6;
static const int TYPE_UNDEFINED = 7;
static const int TYPE_SSHORT = 8;
static const int TYPE_SLONG = 9;
static const int TYPE_SRATIONAL = 10;
static const int TYPE_FLOAT = 11;
static const int TYPE_DOUBLE = 12;
static const List<int> SIZE_OF_TYPE = const [
0, // 0 = n/a
1, // 1 = byte
1, // 2 = ascii
2, // 3 = short
4, // 4 = long
8, // 5 = rational
1, // 6 = sbyte
1, // 7 = undefined
2, // 8 = sshort
4, // 9 = slong
8, // 10 = srational
4, // 11 = float
8, // 12 = double
0
];
}