operator []= method
Implementation
void operator []=(Object? tag, Object? value) {
if (tag is String) {
tag = exifTagNameToID[tag];
}
if (tag is! int) {
return;
}
if (value == null) {
data.remove(tag);
} else {
if (value is IfdValue) {
data[tag] = value;
} else {
final tagInfo = exifImageTags[tag];
if (tagInfo != null) {
final tagType = tagInfo.type;
//final tagCount = tagInfo.count;
switch (tagType) {
case IfdValueType.byte:
if (value is List<int>) {
data[tag] = IfdByteValue.list(Uint8List.fromList(value));
} else if (value is int) {
data[tag] = IfdByteValue(value);
}
break;
case IfdValueType.ascii:
if (value is String) {
data[tag] = IfdValueAscii(value);
}
break;
case IfdValueType.short:
if (value is List<int>) {
data[tag] = IfdValueShort.list(Uint16List.fromList(value));
} else if (value is int) {
data[tag] = IfdValueShort(value);
}
break;
case IfdValueType.long:
if (value is List<int>) {
data[tag] = IfdValueLong.list(Uint32List.fromList(value));
} else if (value is int) {
data[tag] = IfdValueLong(value);
}
break;
case IfdValueType.rational:
if (value is List<Rational>) {
data[tag] = IfdValueRational.list(value);
} else if (value is List<int> && value.length == 2) {
data[tag] = IfdValueRational(value[0], value[1]);
} else if (value is Rational) {
data[tag] = IfdValueRational.from(value);
} else if (value is List<List<int>>) {
data[tag] = IfdValueRational.list(List<Rational>.generate(
value.length,
(index) => Rational(value[index][0], value[index][1])));
}
break;
case IfdValueType.sByte:
if (value is List<int>) {
data[tag] = IfdValueSByte.list(Int8List.fromList(value));
} else if (value is int) {
data[tag] = IfdValueSByte(value);
}
break;
case IfdValueType.undefined:
if (value is List<int>) {
data[tag] = IfdValueUndefined.list(Uint8List.fromList(value));
}
break;
case IfdValueType.sShort:
if (value is List<int>) {
data[tag] = IfdValueSShort.list(Int16List.fromList(value));
} else if (value is int) {
data[tag] = IfdValueSShort(value);
}
break;
case IfdValueType.sLong:
if (value is List<int>) {
data[tag] = IfdValueSLong.list(Int32List.fromList(value));
} else if (value is int) {
data[tag] = IfdValueSLong(value);
}
break;
case IfdValueType.sRational:
if (value is List<Rational>) {
data[tag] = IfdValueSRational.list(value);
} else if (value is List<int> && value.length == 2) {
data[tag] = IfdValueSRational(value[0], value[1]);
} else if (value is Rational) {
data[tag] = IfdValueSRational.from(value);
} else if (value is List<List<int>>) {
data[tag] = IfdValueSRational.list(List<Rational>.generate(
value.length,
(index) => Rational(value[index][0], value[index][1])));
}
break;
case IfdValueType.single:
if (value is List<double>) {
data[tag] = IfdValueSingle.list(Float32List.fromList(value));
} else if (value is double) {
data[tag] = IfdValueSingle(value);
} else if (value is int) {
data[tag] = IfdValueSingle(value.toDouble());
}
break;
case IfdValueType.double:
if (value is List<double>) {
data[tag] = IfdValueDouble.list(Float64List.fromList(value));
} else if (value is double) {
data[tag] = IfdValueDouble(value);
} else if (value is int) {
data[tag] = IfdValueDouble(value.toDouble());
}
break;
case IfdValueType.none:
break;
}
}
}
}
}