/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.pdfbox.pdmodel.graphics.color; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSNumber; import java.io.IOException; import java.util.Arrays; /** * A color value, consisting of one or more color components, or for pattern color spaces, * a name and optional color components. * Color values are not associated with any given color space. * * Instances of PDColor are immutable. * * @author John Hewson */ public final class PDColor { private final float[] components; private final COSName patternName; private final PDColorSpace colorSpace; /** * Creates a PDColor containing the given color value. * @param array a COS array containing the color value * @param colorSpace color space in which the color value is defined */ public PDColor(COSArray array, PDColorSpace colorSpace) { if (array.size() > 0 && array.get(array.size() - 1) instanceof COSName) { // color components (optional), for the color of an uncoloured tiling pattern components = new float[array.size() - 1]; for (int i = 0; i < array.size() - 1; i++) { components[i] = ((COSNumber)array.get(i)).floatValue(); } // pattern name (required) patternName = (COSName)array.get(array.size() - 1); } else { // color components only components = new float[array.size()]; for (int i = 0; i < array.size(); i++) { components[i] = ((COSNumber)array.get(i)).floatValue(); } patternName = null; } this.colorSpace = colorSpace; } /** * Creates a PDColor containing the given color component values. * @param components array of color component values * @param colorSpace color space in which the components are defined */ public PDColor(float[] components, PDColorSpace colorSpace) { this.components = components.clone(); this.patternName = null; this.colorSpace = colorSpace; } /** * Creates a PDColor containing the given pattern name. * @param patternName the name of a pattern in a pattern dictionary * @param colorSpace color space in which the pattern is defined */ public PDColor(COSName patternName, PDColorSpace colorSpace) { this.components = new float[0]; this.patternName = patternName; this.colorSpace = colorSpace; } /** * Creates a PDColor containing the given color component values and pattern name. * @param components array of color component values * @param patternName the name of a pattern in a pattern dictionary * @param colorSpace color space in which the pattern/components are defined */ public PDColor(float[] components, COSName patternName, PDColorSpace colorSpace) { this.components = components.clone(); this.patternName = patternName; this.colorSpace = colorSpace; } /** * Returns the components of this color value. * @return the components of this color value */ public float[] getComponents() { return components.clone(); } /** * Returns the pattern name from this color value. * @return the pattern name from this color value */ public COSName getPatternName() { return patternName; } /** * Returns true if this color value is a pattern. * @return true if this color value is a pattern */ public boolean isPattern() { return patternName != null; } /** * Returns the packed RGB value for this color, if any. * @return RGB * @throws IOException if the color conversion fails * @throws IllegalStateException if this color value is a pattern. */ public int toRGB() throws IOException { float[] floats = colorSpace.toRGB(components); int r = Math.round(floats[0] * 255); int g = Math.round(floats[1] * 255); int b = Math.round(floats[2] * 255); int rgb = r; rgb = (rgb << 8) + g; rgb = (rgb << 8) + b; return rgb; } /** * Returns the color component values as a COS array * @return the color component values as a COS array */ public COSArray toCOSArray() { COSArray array = new COSArray(); array.setFloatArray(components); if (patternName != null) { array.add(patternName); } return array; } /** * Returns the color space in which this color value is defined. */ public PDColorSpace getColorSpace() { return colorSpace; } @Override public String toString() { return "PDColor{components=" + Arrays.toString(components) + ", patternName=" + patternName + "}"; } }