in pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java [89:242]
public static PDColorSpace create(COSBase colorSpace,
PDResources resources,
boolean wasDefault)
throws IOException
{
if (colorSpace instanceof COSObject)
{
return createFromCOSObject((COSObject) colorSpace, resources);
}
else if (colorSpace instanceof COSName)
{
COSName name = (COSName)colorSpace;
// default color spaces
if (resources != null)
{
COSName defaultName = null;
if (name.equals(COSName.DEVICECMYK) &&
resources.hasColorSpace(COSName.DEFAULT_CMYK))
{
defaultName = COSName.DEFAULT_CMYK;
}
else if (name.equals(COSName.DEVICERGB) &&
resources.hasColorSpace(COSName.DEFAULT_RGB))
{
defaultName = COSName.DEFAULT_RGB;
}
else if (name.equals(COSName.DEVICEGRAY) &&
resources.hasColorSpace(COSName.DEFAULT_GRAY))
{
defaultName = COSName.DEFAULT_GRAY;
}
if (resources.hasColorSpace(defaultName) && !wasDefault)
{
return resources.getColorSpace(defaultName, true);
}
}
// built-in color spaces
if (name == COSName.DEVICECMYK)
{
return PDDeviceCMYK.INSTANCE;
}
else if (name == COSName.DEVICERGB)
{
return PDDeviceRGB.INSTANCE;
}
else if (name == COSName.DEVICEGRAY)
{
return PDDeviceGray.INSTANCE;
}
else if (name == COSName.PATTERN)
{
return new PDPattern(resources);
}
else if (resources != null)
{
if (!resources.hasColorSpace(name))
{
throw new MissingResourceException("Missing color space: " + name.getName());
}
return resources.getColorSpace(name);
}
else
{
throw new MissingResourceException("Unknown color space: " + name.getName());
}
}
else if (colorSpace instanceof COSArray)
{
COSArray array = (COSArray)colorSpace;
if (array.isEmpty())
{
throw new IOException("Colorspace array is empty");
}
COSBase base = array.getObject(0);
if (!(base instanceof COSName))
{
throw new IOException("First element in colorspace array must be a name");
}
COSName name = (COSName) base;
// TODO cache these returned color spaces?
if (name == COSName.CALGRAY)
{
return new PDCalGray(array);
}
else if (name == COSName.CALRGB)
{
return new PDCalRGB(array);
}
else if (name == COSName.DEVICEN)
{
return new PDDeviceN(array, resources);
}
else if (name == COSName.INDEXED)
{
return new PDIndexed(array, resources);
}
else if (name == COSName.SEPARATION)
{
return new PDSeparation(array, resources);
}
else if (name == COSName.ICCBASED)
{
return PDICCBased.create(array, resources);
}
else if (name == COSName.LAB)
{
return new PDLab(array);
}
else if (name == COSName.PATTERN)
{
if (array.size() == 1)
{
return new PDPattern(resources);
}
else
{
return new PDPattern(resources, PDColorSpace.create(array.get(1)));
}
}
else if (name == COSName.DEVICECMYK ||
name == COSName.DEVICERGB ||
name == COSName.DEVICEGRAY)
{
// not allowed in an array, but we sometimes encounter these regardless
return create(name, resources, wasDefault);
}
else
{
throw new IOException("Invalid color space kind: " + name);
}
}
else if (colorSpace instanceof COSDictionary &&
((COSDictionary) colorSpace).containsKey(COSName.COLORSPACE))
{
// PDFBOX-4833: dictionary with /ColorSpace entry
COSBase base = ((COSDictionary) colorSpace).getDictionaryObject(COSName.COLORSPACE);
if (base == colorSpace)
{
// PDFBOX-5315
throw new IOException("Recursion in colorspace: " +
((COSDictionary) colorSpace).getItem(COSName.COLORSPACE) + " points to itself");
}
return create(base, resources, wasDefault);
}
else
{
throw new IOException("Expected a name or array but got: " + colorSpace);
}
}