/********************************************************************* * * Copyright (C) 2002 Andrew Khan * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ***************************************************************************/ package jxl.biff; import jxl.format.Colour; import jxl.format.RGB; import jxl.read.biff.Record; /** * A record representing the RGB colour palette */ public class PaletteRecord extends WritableRecordData { /** * The list of bespoke rgb colours used by this sheet */ private RGB[] rgbColours = new RGB[numColours]; /** * A dirty flag indicating that this palette has been tampered with * in some way */ private boolean dirty; /** * Flag indicating that the palette was read in */ private boolean read; /** * Initialized flag */ private boolean initialized; /** * The number of colours in the palette */ private static final int numColours = 56; /** * Constructor * * @param t the raw bytes */ public PaletteRecord(Record t) { super(t); initialized = false; dirty = false; read = true; } /** * Default constructor - used when there is no palette specified */ public PaletteRecord() { super(Type.PALETTE); initialized = true; dirty = false; read = false; // Initialize the array with all the default colours Colour[] colours = Colour.getAllColours(); for (int i = 0; i < colours.length; i++) { Colour c = colours[i]; setColourRGB(c, c.getDefaultRGB().getRed(), c.getDefaultRGB().getGreen(), c.getDefaultRGB().getBlue()); } } /** * Accessor for the binary data - used when copying * * @return the binary data */ public byte[] getData() { // Palette was read in, but has not been changed if (read && !dirty) { return getRecord().getData(); } byte[] data = new byte[numColours * 4 + 2]; int pos = 0; // Set the number of records IntegerHelper.getTwoBytes(numColours, data, pos); // Set the rgb content for (int i = 0; i < numColours; i++) { pos = i * 4 + 2; data[pos] = (byte) rgbColours[i].getRed(); data[pos + 1] = (byte) rgbColours[i].getGreen(); data[pos + 2] = (byte) rgbColours[i].getBlue(); } return data; } /** * Initialize the record data */ private void initialize() { byte[] data = getRecord().getData(); int numrecords = IntegerHelper.getInt(data[0], data[1]); for (int i = 0; i < numrecords; i++) { int pos = i * 4 + 2; int red = IntegerHelper.getInt(data[pos], (byte) 0); int green = IntegerHelper.getInt(data[pos + 1], (byte) 0); int blue = IntegerHelper.getInt(data[pos + 2], (byte) 0); rgbColours[i] = new RGB(red, green, blue); } initialized = true; } /** * Accessor for the dirty flag, which indicates if this palette has been * modified * * @return TRUE if the palette has been modified, FALSE if it is the default */ public boolean isDirty() { return dirty; } /** * Sets the RGB value for the specified colour for this workbook * * @param c the colour whose RGB value is to be overwritten * @param r the red portion to set (0-255) * @param g the green portion to set (0-255) * @param b the blue portion to set (0-255) */ public void setColourRGB(Colour c, int r, int g, int b) { // Only colours on the standard palette with values 8-64 are acceptable int pos = c.getValue() - 8; if (pos < 0 || pos >= numColours) { return; } if (!initialized) { initialize(); } // Force the colours into the range 0-255 r = setValueRange(r, 0, 0xff); g = setValueRange(g, 0, 0xff); b = setValueRange(b, 0, 0xff); rgbColours[pos] = new RGB(r, g, b); // Indicate that the palette has been modified dirty = true; } /** * Gets the colour RGB from the palette * * @param c the colour * @return an RGB structure */ public RGB getColourRGB(Colour c) { // Only colours on the standard palette with values 8-64 are acceptable int pos = c.getValue() - 8; if (pos < 0 || pos >= numColours) { return c.getDefaultRGB(); } if (!initialized) { initialize(); } return rgbColours[pos]; } /** * Forces the value passed in to be between the range passed in * * @param val the value to constrain * @param min the minimum acceptable value * @param max the maximum acceptable value * @return the constrained value */ private int setValueRange(int val, int min, int max) { val = Math.max(val, min); val = Math.min(val, max); return val; } }