Add support for named color spaces and indirect references when parsing ColorSpaceDetails

This commit is contained in:
Kasper Frank
2021-05-10 21:51:00 +02:00
parent 449f16edd7
commit 92a00782bf

View File

@@ -64,6 +64,7 @@
return false; return false;
} }
} }
internal static class ColorSpaceDetailsParser internal static class ColorSpaceDetailsParser
@@ -110,11 +111,10 @@
if (cannotRecurse) if (cannotRecurse)
{ {
return UnsupportedColorSpaceDetails.Instance; return UnsupportedColorSpaceDetails.Instance;
} }
if ((!imageDictionary.TryGet(NameToken.ColorSpace, scanner, out ArrayToken colorSpaceArray) && if (!TryGetColorSpaceArray(imageDictionary, resourceStore, scanner, out var colorSpaceArray)
!imageDictionary.TryGet(NameToken.Cs, scanner, out colorSpaceArray)) || colorSpaceArray.Length != 4)
|| colorSpaceArray.Length != 4)
{ {
// Error instead? // Error instead?
return UnsupportedColorSpaceDetails.Instance; return UnsupportedColorSpaceDetails.Instance;
@@ -123,7 +123,7 @@
var first = colorSpaceArray[0] as NameToken; var first = colorSpaceArray[0] as NameToken;
if (first == null || !ColorSpaceMapper.TryMap(first, resourceStore, out var innerColorSpace) if (first == null || !ColorSpaceMapper.TryMap(first, resourceStore, out var innerColorSpace)
|| innerColorSpace != ColorSpace.Indexed) || innerColorSpace != ColorSpace.Indexed)
{ {
return UnsupportedColorSpaceDetails.Instance; return UnsupportedColorSpaceDetails.Instance;
} }
@@ -207,8 +207,7 @@
return UnsupportedColorSpaceDetails.Instance; return UnsupportedColorSpaceDetails.Instance;
case ColorSpace.Separation: case ColorSpace.Separation:
{ {
if ((!imageDictionary.TryGet(NameToken.ColorSpace, scanner, out ArrayToken colorSpaceArray) && if (!TryGetColorSpaceArray(imageDictionary, resourceStore, scanner, out var colorSpaceArray)
!imageDictionary.TryGet(NameToken.Cs, scanner, out colorSpaceArray))
|| colorSpaceArray.Length != 4) || colorSpaceArray.Length != 4)
{ {
// Error instead? // Error instead?
@@ -284,7 +283,23 @@
return UnsupportedColorSpaceDetails.Instance; return UnsupportedColorSpaceDetails.Instance;
default: default:
return UnsupportedColorSpaceDetails.Instance; return UnsupportedColorSpaceDetails.Instance;
} }
} }
private static bool TryGetColorSpaceArray(DictionaryToken imageDictionary, IResourceStore resourceStore,
IPdfTokenScanner scanner,
out ArrayToken colorSpaceArray)
{
var colorSpace = imageDictionary.GetObjectOrDefault(NameToken.ColorSpace, NameToken.Cs);
if (!DirectObjectFinder.TryGet(colorSpace, scanner, out colorSpaceArray)
&& DirectObjectFinder.TryGet(colorSpace, scanner, out NameToken colorSpaceName) &&
resourceStore.TryGetNamedColorSpace(colorSpaceName, out var colorSpaceNamedToken))
{
colorSpaceArray = colorSpaceNamedToken.Data as ArrayToken;
}
return colorSpaceArray != null;
}
} }
} }