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;
}
}
internal static class ColorSpaceDetailsParser
@@ -112,8 +113,7 @@
return UnsupportedColorSpaceDetails.Instance;
}
if ((!imageDictionary.TryGet(NameToken.ColorSpace, scanner, out ArrayToken colorSpaceArray) &&
!imageDictionary.TryGet(NameToken.Cs, scanner, out colorSpaceArray))
if (!TryGetColorSpaceArray(imageDictionary, resourceStore, scanner, out var colorSpaceArray)
|| colorSpaceArray.Length != 4)
{
// Error instead?
@@ -207,8 +207,7 @@
return UnsupportedColorSpaceDetails.Instance;
case ColorSpace.Separation:
{
if ((!imageDictionary.TryGet(NameToken.ColorSpace, scanner, out ArrayToken colorSpaceArray) &&
!imageDictionary.TryGet(NameToken.Cs, scanner, out colorSpaceArray))
if (!TryGetColorSpaceArray(imageDictionary, resourceStore, scanner, out var colorSpaceArray)
|| colorSpaceArray.Length != 4)
{
// Error instead?
@@ -286,5 +285,21 @@
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;
}
}
}