/**
  * 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);
 }