/** * Finds the first occurance of a given color * * @param red the RGB red component, between 0 and 255 inclusive * @param green the RGB green component, between 0 and 255 inclusive * @param blue the RGB blue component, between 0 and 255 inclusive * @return the color, or null if the color does not exist in this palette */ public HSSFColor findColor(byte red, byte green, byte blue) { byte[] b = _palette.getColor(PaletteRecord.FIRST_COLOR_INDEX); for (short i = PaletteRecord.FIRST_COLOR_INDEX; b != null; b = _palette.getColor(++i)) { if (b[0] == red && b[1] == green && b[2] == blue) { return new CustomColor(i, b); } } return null; }
/** * Adds a new color into an empty color slot. * * @param red The red component * @param green The green component * @param blue The blue component * @return The new custom color. * @throws RuntimeException if there are more more free color indexes. */ public HSSFColor addColor(byte red, byte green, byte blue) { byte[] b = _palette.getColor(PaletteRecord.FIRST_COLOR_INDEX); short i; for (i = PaletteRecord.FIRST_COLOR_INDEX; i < PaletteRecord.STANDARD_PALETTE_SIZE + PaletteRecord.FIRST_COLOR_INDEX; b = _palette.getColor(++i)) { if (b == null) { setColorAtIndex(i, red, green, blue); return getColor(i); } } throw new RuntimeException("Could not find free color index"); }
/** * Finds the closest matching color in the custom palette. The method for finding the distance * between the colors is fairly primative. * * @param red The red component of the color to match. * @param green The green component of the color to match. * @param blue The blue component of the color to match. * @return The closest color or null if there are no custom colors currently defined. */ public HSSFColor findSimilarColor(int red, int green, int blue) { HSSFColor result = null; int minColorDistance = Integer.MAX_VALUE; byte[] b = _palette.getColor(PaletteRecord.FIRST_COLOR_INDEX); for (short i = PaletteRecord.FIRST_COLOR_INDEX; b != null; b = _palette.getColor(++i)) { int colorDistance = Math.abs(red - unsignedInt(b[0])) + Math.abs(green - unsignedInt(b[1])) + Math.abs(blue - unsignedInt(b[2])); if (colorDistance < minColorDistance) { minColorDistance = colorDistance; result = getColor(i); } } return result; }
/** * Retrieves the color at a given index * * @param index the palette index, between 0x8 to 0x40 inclusive * @return the color, or null if the index is not populated */ public HSSFColor getColor(short index) { // Handle the special AUTOMATIC case if (index == HSSFColor.AUTOMATIC.index) { return HSSFColor.AUTOMATIC.getInstance(); } byte[] b = _palette.getColor(index); if (b != null) { return new CustomColor(index, b); } return null; }
/** * Sets the color at the given offset * * @param index the palette index, between 0x8 to 0x40 inclusive * @param red the RGB red component, between 0 and 255 inclusive * @param green the RGB green component, between 0 and 255 inclusive * @param blue the RGB blue component, between 0 and 255 inclusive */ public void setColorAtIndex(short index, byte red, byte green, byte blue) { _palette.setColor(index, red, green, blue); }