operator []= method

void operator []=(
  1. Object? tag,
  2. Object? value
)

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;
        }
      }
    }
  }
}