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
@@ -112,8 +113,7 @@
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?
@@ -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?
@@ -286,5 +285,21 @@
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;
}
} }
} }