load static method
Future<UPdfColorSpace>
load(
- UPdfDocument document,
- Object? value, {
- UPdfDict? resources,
- 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;
}
}