/* * 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.util; import java.awt.*; import java.util.HashMap; /** * ColorUtil is a utra effecient named color parser. The class has a list * of all html named colours and their matching hex values. * * @since 2.7.1 */ public class ColorUtil { private static final int[] defaultColors = { 0xf0f8ff, // aliceblue 0xfaebd7, // antiquewhite 0x00ffff, // aqua 0x7fffd4, // aquamarine 0xf0ffff, // azure 0xf5f5dc, // beige 0xffe4c4, // bisque 0x000000, // black 0xffebcd, // blanchedalmond 0x0000ff, // blue 0x8a2be2, // blueviolet 0xa52a2a, // brown 0xdeb887, // burlywood 0x5f9ea0, // cadetblue 0x7fff00, // chartreuse 0xd2691e, // chocolate 0xff7f50, // coral 0x6495ed, // cornflowerblue 0xfff8dc, // cornsilk 0xdc143c, // crimson 0x00ffff, // cyan 0x00008b, // darkblue 0x008b8b, // darkcyan 0xb8860b, // darkgoldenrod 0xa9a9a9, // darkgray 0x006400, // darkgreen 0xa9a9a9, // darkgrey 0xbdb76b, // darkkhaki 0x8b008b, // darkmagenta 0x556b2f, // darkolivegreen 0xff8c00, // darkorange 0x9932cc, // darkorchid 0x8b0000, // darkred 0xe9967a, // darksalmon 0x8fbc8f, // darkseagreen 0x483d8b, // darkslateblue 0x2f4f4f, // darkslategray 0x2f4f4f, // darkslategrey 0x00ced1, // darkturquoise 0x9400d3, // darkviolet 0xff1493, // deeppink 0x00bfff, // deepskyblue 0x696969, // dimgray 0x696969, // dimgrey 0x1e90ff, // dodgerblue 0xb22222, // firebrick 0xfffaf0, // floralwhite 0x228b22, // forestgreen 0xff00ff, // fuchsia 0xdcdcdc, // gainsboro 0xf8f8ff, // ghostwhite 0xffd700, // gold 0xdaa520, // goldenrod 0x808080, // gray 0x808080, // grey 0x008000, // green 0xadff2f, // greenyellow 0xf0fff0, // honeydew 0xff69b4, // hotpink 0xcd5c5c, // indianred 0x4b0082, // indigo 0xfffff0, // ivory 0xf0e68c, // khaki 0xe6e6fa, // lavender 0xfff0f5, // lavenderblush 0x7cfc00, // lawngreen 0xfffacd, // lemonchiffon 0xadd8e6, // lightblue 0xf08080, // lightcoral 0xe0ffff, // lightcyan 0xfafad2, // lightgoldenrodyellow 0xd3d3d3, // lightgray 0x90ee90, // lightgreen 0xd3d3d3, // lightgrey 0xffb6c1, // lightpink 0xffa07a, // lightsalmon 0x20b2aa, // lightseagreen 0x87cefa, // lightskyblue 0x778899, // lightslategray 0x778899, // lightslategrey 0xb0c4de, // lightsteelblue 0xffffe0, // lightyellow 0x00ff00, // lime 0x32cd32, // limegreen 0xfaf0e6, // linen 0xff00ff, // magenta 0x800000, // maroon 0x66cdaa, // mediumaquamarine 0x0000cd, // mediumblue 0xba55d3, // mediumorchid 0x9370db, // mediumpurple 0x3cb371, // mediumseagreen 0x7b68ee, // mediumslateblue 0x00fa9a, // mediumspringgreen 0x48d1cc, // mediumturquoise 0xc71585, // mediumvioletred 0x191970, // midnightblue 0xf5fffa, // mintcream 0xffe4e1, // mistyrose 0xffe4b5, // moccasin 0xffdead, // navajowhite 0x000080, // navy 0xfdf5e6, // oldlace 0x808000, // olive 0x6b8e23, // olivedrab 0xffa500, // orange 0xff4500, // orangered 0xda70d6, // orchid 0xeee8aa, // palegoldenrod 0x98fb98, // palegreen 0xafeeee, // paleturquoise 0xdb7093, // palevioletred 0xffefd5, // papayawhip 0xffdab9, // peachpuff 0xcd853f, // peru 0xffc0cb, // pink 0xdda0dd, // plum 0xb0e0e6, // powderblue 0x800080, // purple 0xff0000, // red 0xbc8f8f, // rosybrown 0x4169e1, // royalblue 0x8b4513, // saddlebrown 0xfa8072, // salmon 0xf4a460, // sandybrown 0x2e8b57, // seagreen 0xfff5ee, // seashell 0xa0522d, // sienna 0xc0c0c0, // silver 0x87ceeb, // skyblue 0x6a5acd, // slateblue 0x708090, // slategray 0x708090, // slategrey 0xfffafa, // snow 0x00ff7f, // springgreen 0x4682b4, // steelblue 0xd2b48c, // tan 0x008080, // teal 0xd8bfd8, // thistle 0xff6347, // tomato 0x40e0d0, // turquoise 0xee82ee, // violet 0xf5deb3, // wheat 0xffffff, // white 0xf5f5f5, // whitesmoke 0xffff00, // yellow 0x9acd32, // yellowgreen }; private static final HashMap colors = new HashMap(); /** * Converts a named colour to hex rgb notation. For example black is * converted to #000000 and white to #FFFFFF. * * @param name know colour name to be converted * @return name of converted string, the same name is returned if their was * a conversion failure. */ public static final String convertColorNameToRGB(String name) { int c = convertNamedColor(name.toLowerCase()); if (c >= 0) { //int rgb = c.getRGB(); char[] buf = new char[7]; buf[0] = '#'; for (int pos = 1, shift = 20; shift >= 0; ++pos, shift -= 4) { int d = 0xF & (c >> shift); buf[pos] = (char) ((d < 10) ? d + '0' : d + 'A' - 10); } name = new String(buf, 0, 7); } return name; } /** * Converts a colour to hex rgb notation. For example black is * converted to #000000 and white to #FFFFFF. * * @param color know colour to be converted * @return name of converted string, the same name is returned if their was * a conversion failure. */ public static final String convertColorToRGB(Color color) { int c = color.getRGB(); return String.format("#%06X", (0xFFFFFF & c)); } /** * Converts the colour to an integer value. * * @param name colour value in either hex or string format. * @return valid int colour value or -1 if no colour could be resolved */ public static int convertColor(String name) { try { // see if string starts with # if (name.startsWith("#")) { name = name.substring(1); } return Integer.parseInt(name, 16); } catch (NumberFormatException e) { // intentionally left empty } // otherwise try and pare the colour name. return convertNamedColor(name); } /** * Converts the named colour to an integer value. This integer value can * then be used to generate a valid java.awt.Color object. * * @param name name of colour to convert. * @return integer >= 0 if named colour was converted successfully, -1 * otherwise. */ public static final int convertNamedColor(String name) { int index = getDefaultColorIndex(name); if (index >= 0) { return defaultColors[index]; } Integer ii = (Integer) colors.get(name); if (ii != null) { return ii.intValue(); } return -1; //return (index >= 0) ? defaultColors[index] : ((Integer)colors.get(name)).intValue(); } private static final int getDefaultColorIndex(String s) { int id; final int // #string_id_map# // Should be real index plus one due to auto switch generator limitations Id_aliceblue = 1, Id_antiquewhite = 2, Id_aqua = 3, Id_aquamarine = 4, Id_azure = 5, Id_beige = 6, Id_bisque = 7, Id_black = 8, Id_blanchedalmond = 9, Id_blue = 10, Id_blueviolet = 11, Id_brown = 12, Id_burlywood = 13, Id_cadetblue = 14, Id_chartreuse = 15, Id_chocolate = 16, Id_coral = 17, Id_cornflowerblue = 18, Id_cornsilk = 19, Id_crimson = 20, Id_cyan = 21, Id_darkblue = 22, Id_darkcyan = 23, Id_darkgoldenrod = 24, Id_darkgray = 25, Id_darkgreen = 26, Id_darkgrey = 27, Id_darkkhaki = 28, Id_darkmagenta = 29, Id_darkolivegreen = 30, Id_darkorange = 31, Id_darkorchid = 32, Id_darkred = 33, Id_darksalmon = 34, Id_darkseagreen = 35, Id_darkslateblue = 36, Id_darkslategray = 37, Id_darkslategrey = 38, Id_darkturquoise = 39, Id_darkviolet = 40, Id_deeppink = 41, Id_deepskyblue = 42, Id_dimgray = 43, Id_dimgrey = 44, Id_dodgerblue = 45, Id_firebrick = 46, Id_floralwhite = 47, Id_forestgreen = 48, Id_fuchsia = 49, Id_gainsboro = 50, Id_ghostwhite = 51, Id_gold = 52, Id_goldenrod = 53, Id_gray = 54, Id_grey = 55, Id_green = 56, Id_greenyellow = 57, Id_honeydew = 58, Id_hotpink = 59, Id_indianred = 60, Id_indigo = 61, Id_ivory = 62, Id_khaki = 63, Id_lavender = 64, Id_lavenderblush = 65, Id_lawngreen = 66, Id_lemonchiffon = 67, Id_lightblue = 68, Id_lightcoral = 69, Id_lightcyan = 70, Id_lightgoldenrodyellow = 71, Id_lightgray = 72, Id_lightgreen = 73, Id_lightgrey = 74, Id_lightpink = 75, Id_lightsalmon = 76, Id_lightseagreen = 77, Id_lightskyblue = 78, Id_lightslategray = 79, Id_lightslategrey = 80, Id_lightsteelblue = 81, Id_lightyellow = 82, Id_lime = 83, Id_limegreen = 84, Id_linen = 85, Id_magenta = 86, Id_maroon = 87, Id_mediumaquamarine = 88, Id_mediumblue = 89, Id_mediumorchid = 90, Id_mediumpurple = 91, Id_mediumseagreen = 92, Id_mediumslateblue = 93, Id_mediumspringgreen = 94, Id_mediumturquoise = 95, Id_mediumvioletred = 96, Id_midnightblue = 97, Id_mintcream = 98, Id_mistyrose = 99, Id_moccasin = 100, Id_navajowhite = 101, Id_navy = 102, Id_oldlace = 103, Id_olive = 104, Id_olivedrab = 105, Id_orange = 106, Id_orangered = 107, Id_orchid = 108, Id_palegoldenrod = 109, Id_palegreen = 110, Id_paleturquoise = 111, Id_palevioletred = 112, Id_papayawhip = 113, Id_peachpuff = 114, Id_peru = 115, Id_pink = 116, Id_plum = 117, Id_powderblue = 118, Id_purple = 119, Id_red = 120, Id_rosybrown = 121, Id_royalblue = 122, Id_saddlebrown = 123, Id_salmon = 124, Id_sandybrown = 125, Id_seagreen = 126, Id_seashell = 127, Id_sienna = 128, Id_silver = 129, Id_skyblue = 130, Id_slateblue = 131, Id_slategray = 132, Id_slategrey = 133, Id_snow = 134, Id_springgreen = 135, Id_steelblue = 136, Id_tan = 137, Id_teal = 138, Id_thistle = 139, Id_tomato = 140, Id_turquoise = 141, Id_violet = 142, Id_wheat = 143, Id_white = 144, Id_whitesmoke = 145, Id_yellow = 146, Id_yellowgreen = 147; // This is really cool as the look up is based string index commonality // which greatly reduces the parse time. Should really update our // main content parser to work this way. // #generated# Last update: 2001-10-19 16:09:43 CEST L0: { id = 0; String X = null; int c; L: switch (s.length()) { case 3: c = s.charAt(0); if (c == 'r') { if (s.charAt(2) == 'd' && s.charAt(1) == 'e') { id = Id_red; break L0; } } else if (c == 't') { if (s.charAt(2) == 'n' && s.charAt(1) == 'a') { id = Id_tan; break L0; } } break L; case 4: switch (s.charAt(3)) { case 'a': X = "aqua"; id = Id_aqua; break L; case 'd': X = "gold"; id = Id_gold; break L; case 'e': c = s.charAt(0); if (c == 'b') { if (s.charAt(2) == 'u' && s.charAt(1) == 'l') { id = Id_blue; break L0; } } else if (c == 'l') { if (s.charAt(2) == 'm' && s.charAt(1) == 'i') { id = Id_lime; break L0; } } break L; case 'k': X = "pink"; id = Id_pink; break L; case 'l': X = "teal"; id = Id_teal; break L; case 'm': X = "plum"; id = Id_plum; break L; case 'n': X = "cyan"; id = Id_cyan; break L; case 'u': X = "peru"; id = Id_peru; break L; case 'w': X = "snow"; id = Id_snow; break L; case 'y': c = s.charAt(2); if (c == 'a') { if (s.charAt(0) == 'g' && s.charAt(1) == 'r') { id = Id_gray; break L0; } } else if (c == 'e') { if (s.charAt(0) == 'g' && s.charAt(1) == 'r') { id = Id_grey; break L0; } } else if (c == 'v') { if (s.charAt(0) == 'n' && s.charAt(1) == 'a') { id = Id_navy; break L0; } } break L; } break L; case 5: switch (s.charAt(0)) { case 'a': X = "azure"; id = Id_azure; break L; case 'b': c = s.charAt(4); if (c == 'e') { X = "beige"; id = Id_beige; } else if (c == 'k') { X = "black"; id = Id_black; } else if (c == 'n') { X = "brown"; id = Id_brown; } break L; case 'c': X = "coral"; id = Id_coral; break L; case 'g': X = "green"; id = Id_green; break L; case 'i': X = "ivory"; id = Id_ivory; break L; case 'k': X = "khaki"; id = Id_khaki; break L; case 'l': X = "linen"; id = Id_linen; break L; case 'o': X = "olive"; id = Id_olive; break L; case 'w': c = s.charAt(4); if (c == 'e') { X = "white"; id = Id_white; } else if (c == 't') { X = "wheat"; id = Id_wheat; } break L; } break L; case 6: switch (s.charAt(3)) { case 'a': X = "tomato"; id = Id_tomato; break L; case 'h': X = "orchid"; id = Id_orchid; break L; case 'i': X = "indigo"; id = Id_indigo; break L; case 'l': c = s.charAt(0); if (c == 'v') { X = "violet"; id = Id_violet; } else if (c == 'y') { X = "yellow"; id = Id_yellow; } break L; case 'm': X = "salmon"; id = Id_salmon; break L; case 'n': c = s.charAt(0); if (c == 'o') { X = "orange"; id = Id_orange; } else if (c == 's') { X = "sienna"; id = Id_sienna; } break L; case 'o': X = "maroon"; id = Id_maroon; break L; case 'p': X = "purple"; id = Id_purple; break L; case 'q': X = "bisque"; id = Id_bisque; break L; case 'v': X = "silver"; id = Id_silver; break L; } break L; case 7: switch (s.charAt(3)) { case 'b': X = "skyblue"; id = Id_skyblue; break L; case 'e': X = "magenta"; id = Id_magenta; break L; case 'g': c = s.charAt(5); if (c == 'a') { X = "dimgray"; id = Id_dimgray; } else if (c == 'e') { X = "dimgrey"; id = Id_dimgrey; } break L; case 'h': X = "fuchsia"; id = Id_fuchsia; break L; case 'k': X = "darkred"; id = Id_darkred; break L; case 'l': X = "oldlace"; id = Id_oldlace; break L; case 'm': X = "crimson"; id = Id_crimson; break L; case 'p': X = "hotpink"; id = Id_hotpink; break L; case 's': X = "thistle"; id = Id_thistle; break L; } break L; case 8: switch (s.charAt(4)) { case 'a': X = "moccasin"; id = Id_moccasin; break L; case 'b': X = "darkblue"; id = Id_darkblue; break L; case 'c': X = "darkcyan"; id = Id_darkcyan; break L; case 'g': c = s.charAt(6); if (c == 'a') { X = "darkgray"; id = Id_darkgray; } else if (c == 'e') { X = "darkgrey"; id = Id_darkgrey; } break L; case 'h': X = "seashell"; id = Id_seashell; break L; case 'n': X = "lavender"; id = Id_lavender; break L; case 'p': X = "deeppink"; id = Id_deeppink; break L; case 'r': X = "seagreen"; id = Id_seagreen; break L; case 's': X = "cornsilk"; id = Id_cornsilk; break L; case 'y': X = "honeydew"; id = Id_honeydew; break L; } break L; case 9: switch (s.charAt(0)) { case 'a': X = "aliceblue"; id = Id_aliceblue; break L; case 'b': X = "burlywood"; id = Id_burlywood; break L; case 'c': c = s.charAt(1); if (c == 'a') { X = "cadetblue"; id = Id_cadetblue; } else if (c == 'h') { X = "chocolate"; id = Id_chocolate; } break L; case 'd': c = s.charAt(8); if (c == 'i') { X = "darkkhaki"; id = Id_darkkhaki; } else if (c == 'n') { X = "darkgreen"; id = Id_darkgreen; } break L; case 'f': X = "firebrick"; id = Id_firebrick; break L; case 'g': c = s.charAt(8); if (c == 'd') { X = "goldenrod"; id = Id_goldenrod; } else if (c == 'o') { X = "gainsboro"; id = Id_gainsboro; } break L; case 'i': X = "indianred"; id = Id_indianred; break L; case 'l': switch (s.charAt(5)) { case 'b': X = "lightblue"; id = Id_lightblue; break L; case 'c': X = "lightcyan"; id = Id_lightcyan; break L; case 'g': c = s.charAt(7); if (c == 'a') { X = "lightgray"; id = Id_lightgray; } else if (c == 'e') { X = "lightgrey"; id = Id_lightgrey; } break L; case 'p': X = "lightpink"; id = Id_lightpink; break L; case 'r': c = s.charAt(1); if (c == 'a') { X = "lawngreen"; id = Id_lawngreen; } else if (c == 'i') { X = "limegreen"; id = Id_limegreen; } break L; } break L; case 'm': c = s.charAt(8); if (c == 'e') { X = "mistyrose"; id = Id_mistyrose; } else if (c == 'm') { X = "mintcream"; id = Id_mintcream; } break L; case 'o': c = s.charAt(8); if (c == 'b') { X = "olivedrab"; id = Id_olivedrab; } else if (c == 'd') { X = "orangered"; id = Id_orangered; } break L; case 'p': c = s.charAt(8); if (c == 'f') { X = "peachpuff"; id = Id_peachpuff; } else if (c == 'n') { X = "palegreen"; id = Id_palegreen; } break L; case 'r': c = s.charAt(8); if (c == 'e') { X = "royalblue"; id = Id_royalblue; } else if (c == 'n') { X = "rosybrown"; id = Id_rosybrown; } break L; case 's': c = s.charAt(7); if (c == 'a') { X = "slategray"; id = Id_slategray; } else if (c == 'e') { X = "slategrey"; id = Id_slategrey; } else if (c == 'u') { c = s.charAt(1); if (c == 'l') { X = "slateblue"; id = Id_slateblue; } else if (c == 't') { X = "steelblue"; id = Id_steelblue; } } break L; case 't': X = "turquoise"; id = Id_turquoise; break L; } break L; case 10: switch (s.charAt(8)) { case 'a': X = "lightcoral"; id = Id_lightcoral; break L; case 'e': c = s.charAt(0); if (c == 'b') { X = "blueviolet"; id = Id_blueviolet; } else if (c == 'd') { X = "darkviolet"; id = Id_darkviolet; } else if (c == 'l') { X = "lightgreen"; id = Id_lightgreen; } break L; case 'g': X = "darkorange"; id = Id_darkorange; break L; case 'i': c = s.charAt(0); if (c == 'd') { X = "darkorchid"; id = Id_darkorchid; } else if (c == 'p') { X = "papayawhip"; id = Id_papayawhip; } break L; case 'k': X = "whitesmoke"; id = Id_whitesmoke; break L; case 'n': X = "aquamarine"; id = Id_aquamarine; break L; case 'o': X = "darksalmon"; id = Id_darksalmon; break L; case 's': X = "chartreuse"; id = Id_chartreuse; break L; case 't': X = "ghostwhite"; id = Id_ghostwhite; break L; case 'u': c = s.charAt(0); if (c == 'd') { X = "dodgerblue"; id = Id_dodgerblue; } else if (c == 'm') { X = "mediumblue"; id = Id_mediumblue; } else if (c == 'p') { X = "powderblue"; id = Id_powderblue; } break L; case 'w': X = "sandybrown"; id = Id_sandybrown; break L; } break L; case 11: switch (s.charAt(5)) { case 'a': X = "darkmagenta"; id = Id_darkmagenta; break L; case 'e': X = "saddlebrown"; id = Id_saddlebrown; break L; case 'g': X = "springgreen"; id = Id_springgreen; break L; case 'k': X = "deepskyblue"; id = Id_deepskyblue; break L; case 'l': X = "floralwhite"; id = Id_floralwhite; break L; case 'o': X = "navajowhite"; id = Id_navajowhite; break L; case 's': X = "lightsalmon"; id = Id_lightsalmon; break L; case 't': X = "forestgreen"; id = Id_forestgreen; break L; case 'w': X = "yellowgreen"; id = Id_yellowgreen; break L; case 'y': c = s.charAt(0); if (c == 'g') { X = "greenyellow"; id = Id_greenyellow; } else if (c == 'l') { X = "lightyellow"; id = Id_lightyellow; } break L; } break L; case 12: switch (s.charAt(7)) { case 'g': X = "darkseagreen"; id = Id_darkseagreen; break L; case 'i': X = "lemonchiffon"; id = Id_lemonchiffon; break L; case 'r': X = "mediumorchid"; id = Id_mediumorchid; break L; case 't': X = "midnightblue"; id = Id_midnightblue; break L; case 'u': X = "mediumpurple"; id = Id_mediumpurple; break L; case 'w': X = "antiquewhite"; id = Id_antiquewhite; break L; case 'y': X = "lightskyblue"; id = Id_lightskyblue; break L; } break L; case 13: switch (s.charAt(9)) { case 'b': X = "darkslateblue"; id = Id_darkslateblue; break L; case 'g': c = s.charAt(11); if (c == 'a') { X = "darkslategray"; id = Id_darkslategray; } else if (c == 'e') { X = "darkslategrey"; id = Id_darkslategrey; } break L; case 'l': X = "lavenderblush"; id = Id_lavenderblush; break L; case 'n': c = s.charAt(0); if (c == 'd') { X = "darkgoldenrod"; id = Id_darkgoldenrod; } else if (c == 'p') { X = "palegoldenrod"; id = Id_palegoldenrod; } break L; case 'o': c = s.charAt(0); if (c == 'd') { X = "darkturquoise"; id = Id_darkturquoise; } else if (c == 'p') { X = "paleturquoise"; id = Id_paleturquoise; } break L; case 'r': X = "lightseagreen"; id = Id_lightseagreen; break L; case 't': X = "palevioletred"; id = Id_palevioletred; break L; } break L; case 14: switch (s.charAt(6)) { case 'e': X = "blanchedalmond"; id = Id_blanchedalmond; break L; case 'i': X = "darkolivegreen"; id = Id_darkolivegreen; break L; case 'l': c = s.charAt(12); if (c == 'a') { X = "lightslategray"; id = Id_lightslategray; } else if (c == 'e') { X = "lightslategrey"; id = Id_lightslategrey; } break L; case 'o': X = "cornflowerblue"; id = Id_cornflowerblue; break L; case 's': X = "mediumseagreen"; id = Id_mediumseagreen; break L; case 't': X = "lightsteelblue"; id = Id_lightsteelblue; break L; } break L; case 15: c = s.charAt(6); if (c == 's') { X = "mediumslateblue"; id = Id_mediumslateblue; } else if (c == 't') { X = "mediumturquoise"; id = Id_mediumturquoise; } else if (c == 'v') { X = "mediumvioletred"; id = Id_mediumvioletred; } break L; case 16: X = "mediumaquamarine"; id = Id_mediumaquamarine; break L; case 17: X = "mediumspringgreen"; id = Id_mediumspringgreen; break L; case 20: X = "lightgoldenrodyellow"; id = Id_lightgoldenrodyellow; break L; } if (X != null && X != s && !X.equals(s)) id = 0; } // #/generated# // #/string_id_map# return id - 1; } }