/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * Licensed 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.icepdf.core.pobjects.graphics; import org.icepdf.core.pobjects.Name; import org.icepdf.core.pobjects.Reference; import org.icepdf.core.pobjects.Stream; import org.icepdf.core.pobjects.StringObject; import org.icepdf.core.util.Library; import java.awt.*; import java.util.HashMap; import java.util.List; /** * The class represents an indexed colour space. */ public class Indexed extends PColorSpace { public static final Name INDEXED_KEY = new Name("Indexed"); public static final Name I_KEY = new Name("I"); PColorSpace colorSpace; int hival; byte[] colors = { -1, -1, -1, 0, 0, 0 }; private boolean inited = false; private Color[] cols; /** * Constructs a new instance of the indexed colour space. Pares the indexed * colour pattern: [/Indexed base hival lookup] where base is an array or * name that identifies the base colour space. Hival parameter is an integer * that specifies the maximum valid index value. Lookup is the colour table * which must be of length m x (hival + 1) where m is the number of colour * components in base. * * @param library document library. * @param entries dictionary entries. * @param dictionary indexed colour dictionary. */ Indexed(Library library, HashMap entries, List dictionary) { super(library, entries); // get the base colour space colorSpace = getColorSpace(library, dictionary.get(1)); // get the hival hival = (((Number) (dictionary.get(2))).intValue()); // check for an instance of a lookup table. if (dictionary.get(3) instanceof StringObject) { // peel and decrypt the literal string StringObject tmpText = (StringObject) dictionary.get(3); String tmp = tmpText.getDecryptedLiteralString(library.getSecurityManager()); // build the colour lookup table. byte[] textBytes = new byte[colorSpace.getNumComponents() * (hival + 1)]; // m * (hival + 1) for (int i = 0; i < textBytes.length; i++) { textBytes[i] = (byte) tmp.charAt(i); } colors = textBytes; } else if (dictionary.get(3) instanceof Reference) { colors = new byte[colorSpace.getNumComponents() * (hival + 1)]; // make sure the colors array is the correct length, so we'll copy // over the data from the stream just to be sure. Stream lookup = (Stream) (library.getObject((Reference) (dictionary.get(3)))); if (lookup != null) { byte[] colorStream = lookup.getDecodedStreamBytes(0); int length = colors.length < colorStream.length ? colors.length : colorStream.length; System.arraycopy(colorStream, 0, colors, 0, length); } } } /** * Return the number of components in indexed colour. * * @return always returns 1. */ public int getNumComponents() { return 1; } public String getDescription() { String desc = super.getDescription(); if (colorSpace != null) desc = desc + ":" + colorSpace.getDescription(); return desc; } /** * Initiate the Indexed Colour Object */ public synchronized void init() { if (inited) { return; } int numCSComps = colorSpace.getNumComponents(); int b1[] = new int[numCSComps]; float f1[] = new float[numCSComps]; cols = new Color[hival + 1]; for (int j = 0; j <= hival; j++) { for (int i = 0; i < numCSComps; i++) { b1[numCSComps - 1 - i] = 0xFF & ((int) colors[j * numCSComps + i]); } colorSpace.normaliseComponentsToFloats(b1, f1, 255.0f); cols[j] = colorSpace.getColor(f1, true); } inited = true; } /** * Gets the colour for the array of float values * * @param f * @return */ public Color getColor(float[] f, boolean fillAndStroke) { init(); int index = (int) f[0];//(int) (f[0] * (cols.length - 1)); if (index >= 0 && index <= hival) { return cols[index]; } else if (index > hival) { return cols[hival]; } else { return cols[0]; } } public Color[] accessColorTable() { return cols; } }