load static method

Future<UPdfColorSpace> load(
  1. UPdfDocument document,
  2. Object? value, {
  3. UPdfDict? resources,
  4. int depth = 0,
})

Implementation

static Future<UPdfColorSpace> load(UPdfDocument document, Object? value, {UPdfDict? resources, int depth = 0}) async {
  if (depth > 8) return deviceGray;
  final Object? resolved = await document.resolve(value);
  if (resolved is UPdfName) {
    switch (resolved.value) {
      case "DeviceGray":
      case "G":
      case "CalGray":
        return deviceGray;
      case "DeviceRGB":
      case "RGB":
      case "CalRGB":
        return deviceRgb;
      case "DeviceCMYK":
      case "CMYK":
        return deviceCmyk;
      case "Pattern":
        return pattern;
      default:
        final Object? spaces = await document.resolve(resources?["ColorSpace"]);
        if (spaces is UPdfDict && spaces.has(resolved.value)) return load(document, spaces[resolved.value], resources: resources, depth: depth + 1);
        return deviceGray;
    }
  }
  if (resolved is! List<Object?> || resolved.isEmpty) return deviceGray;
  final Object? head = await document.resolve(resolved.first);
  final String name = head is UPdfName ? head.value : "";
  switch (name) {
    case "ICCBased":
      final Object? stream = resolved.length > 1 ? await document.resolve(resolved[1]) : null;
      final int count = stream is UPdfStream ? (((await document.resolve(stream.dict["N"])) as num?)?.toInt() ?? 3) : 3;
      if (count == 1) return deviceGray;
      if (count == 4) return deviceCmyk;
      return deviceRgb;
    case "Indexed":
    case "I":
      if (resolved.length < 4) return deviceGray;
      final UPdfColorSpace base = await load(document, resolved[1], resources: resources, depth: depth + 1);
      final Object? lookupObject = await document.resolve(resolved[3]);
      Uint8List lookup = Uint8List(0);
      if (lookupObject is UPdfString) lookup = lookupObject.bytes;
      if (lookupObject is UPdfStream) lookup = (await document.decodeStream(lookupObject)).bytes;
      final int hival = ((await document.resolve(resolved[2])) as num?)?.toInt() ?? 0;
      return _UPdfIndexedSpace(base, lookup, hival);
    case "Separation":
    case "DeviceN":
      final int inputs = name == "Separation" ? 1 : await _deviceNCount(document, resolved);
      final UPdfColorSpace alternate = resolved.length > 2 ? await load(document, resolved[2], resources: resources, depth: depth + 1) : deviceGray;
      final UPdfFunction? tint = resolved.length > 3 ? await UPdfFunction.load(document, resolved[3]) : null;
      final Object? firstName = resolved.length > 1 ? await document.resolve(resolved[1]) : null;
      final bool isNone = firstName is UPdfName && firstName.value == "None";
      return _UPdfSeparationSpace(inputs, alternate, tint, isNone);
    case "CalRGB":
      return deviceRgb;
    case "CalGray":
      return deviceGray;
    case "Lab":
      return const _UPdfLabSpace();
    case "Pattern":
      return pattern;
    case "DeviceGray":
      return deviceGray;
    case "DeviceRGB":
      return deviceRgb;
    case "DeviceCMYK":
      return deviceCmyk;
    default:
      return deviceGray;
  }
}