/*******************************************************************************
* Copyright 2012 Geoscience Australia
*
* 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 au.gov.ga.earthsci.worldwind.common.layers.model.gocad;
import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Helper enum that converts GOCAD "*color:" lines to a Java Color. The enum
* constants list contain all the HTML color names, which the GOCAD colors seem
* to match.
*
* @author Michael de Hoog (michael.dehoog@ga.gov.au)
*/
public enum GocadColor
{
AliceBlue(0xF0F8FF),
AntiqueWhite(0xFAEBD7),
Aqua(0x00FFFF),
Aquamarine(0x7FFFD4),
Azure(0xF0FFFF),
Beige(0xF5F5DC),
Bisque(0xFFE4C4),
Black(0x000000),
BlanchedAlmond(0xFFEBCD),
Blue(0x0000FF),
BlueViolet(0x8A2BE2),
Brown(0xA52A2A),
BurlyWood(0xDEB887),
CadetBlue(0x5F9EA0),
Chartreuse(0x7FFF00),
Chocolate(0xD2691E),
Coral(0xFF7F50),
CornflowerBlue(0x6495ED),
Cornsilk(0xFFF8DC),
Crimson(0xDC143C),
Cyan(0x00FFFF),
DarkBlue(0x00008B),
DarkCyan(0x008B8B),
DarkGoldenRod(0xB8860B),
DarkGray(0xA9A9A9),
DarkGrey(0xA9A9A9),
DarkGreen(0x006400),
DarkKhaki(0xBDB76B),
DarkMagenta(0x8B008B),
DarkOliveGreen(0x556B2F),
Darkorange(0xFF8C00),
DarkOrchid(0x9932CC),
DarkRed(0x8B0000),
DarkSalmon(0xE9967A),
DarkSeaGreen(0x8FBC8F),
DarkSlateBlue(0x483D8B),
DarkSlateGray(0x2F4F4F),
DarkSlateGrey(0x2F4F4F),
DarkTurquoise(0x00CED1),
DarkViolet(0x9400D3),
DeepPink(0xFF1493),
DeepSkyBlue(0x00BFFF),
DimGray(0x696969),
DimGrey(0x696969),
DodgerBlue(0x1E90FF),
FireBrick(0xB22222),
FloralWhite(0xFFFAF0),
ForestGreen(0x228B22),
Fuchsia(0xFF00FF),
Gainsboro(0xDCDCDC),
GhostWhite(0xF8F8FF),
Gold(0xFFD700),
GoldenRod(0xDAA520),
Gray(0x808080),
Grey(0x808080),
Green(0x008000),
GreenYellow(0xADFF2F),
HoneyDew(0xF0FFF0),
HotPink(0xFF69B4),
IndianRed(0xCD5C5C),
Indigo(0x4B0082),
Ivory(0xFFFFF0),
Khaki(0xF0E68C),
Lavender(0xE6E6FA),
LavenderBlush(0xFFF0F5),
LawnGreen(0x7CFC00),
LemonChiffon(0xFFFACD),
LightBlue(0xADD8E6),
LightCoral(0xF08080),
LightCyan(0xE0FFFF),
LightGoldenRodYellow(0xFAFAD2),
LightGray(0xD3D3D3),
LightGrey(0xD3D3D3),
LightGreen(0x90EE90),
LightPink(0xFFB6C1),
LightSalmon(0xFFA07A),
LightSeaGreen(0x20B2AA),
LightSkyBlue(0x87CEFA),
LightSlateGray(0x778899),
LightSlateGrey(0x778899),
LightSteelBlue(0xB0C4DE),
LightYellow(0xFFFFE0),
Lime(0x00FF00),
LimeGreen(0x32CD32),
Linen(0xFAF0E6),
Magenta(0xFF00FF),
Maroon(0x800000),
MediumAquaMarine(0x66CDAA),
MediumBlue(0x0000CD),
MediumOrchid(0xBA55D3),
MediumPurple(0x9370D8),
MediumSeaGreen(0x3CB371),
MediumSlateBlue(0x7B68EE),
MediumSpringGreen(0x00FA9A),
MediumTurquoise(0x48D1CC),
MediumVioletRed(0xC71585),
MidnightBlue(0x191970),
MintCream(0xF5FFFA),
MistyRose(0xFFE4E1),
Moccasin(0xFFE4B5),
NavajoWhite(0xFFDEAD),
Navy(0x000080),
OldLace(0xFDF5E6),
Olive(0x808000),
OliveDrab(0x6B8E23),
Orange(0xFFA500),
OrangeRed(0xFF4500),
Orchid(0xDA70D6),
PaleGoldenRod(0xEEE8AA),
PaleGreen(0x98FB98),
PaleTurquoise(0xAFEEEE),
PaleVioletRed(0xD87093),
PapayaWhip(0xFFEFD5),
PeachPuff(0xFFDAB9),
Peru(0xCD853F),
Pink(0xFFC0CB),
Plum(0xDDA0DD),
PowderBlue(0xB0E0E6),
Purple(0x800080),
Red(0xFF0000),
RosyBrown(0xBC8F8F),
RoyalBlue(0x4169E1),
SaddleBrown(0x8B4513),
Salmon(0xFA8072),
SandyBrown(0xF4A460),
SeaGreen(0x2E8B57),
SeaShell(0xFFF5EE),
Sienna(0xA0522D),
Silver(0xC0C0C0),
SkyBlue(0x87CEEB),
SlateBlue(0x6A5ACD),
SlateGray(0x708090),
SlateGrey(0x708090),
Snow(0xFFFAFA),
SpringGreen(0x00FF7F),
SteelBlue(0x4682B4),
Tan(0xD2B48C),
Teal(0x008080),
Thistle(0xD8BFD8),
Tomato(0xFF6347),
Turquoise(0x40E0D0),
Violet(0xEE82EE),
Wheat(0xF5DEB3),
White(0xFFFFFF),
WhiteSmoke(0xF5F5F5),
Yellow(0xFFFF00),
YellowGreen(0x9ACD32);
public final String pretty;
public final Color color;
private final static Pattern color4Pattern = Pattern.compile("[^:]+:\\s*([\\d.\\-]+)\\s+([\\d.\\-]+)\\s+([\\d.\\-]+)\\s+([\\d.\\-]+)\\s*");
private final static Pattern color3Pattern = Pattern.compile("[^:]+:\\s*([\\d.\\-]+)\\s+([\\d.\\-]+)\\s+([\\d.\\-]+)\\s*");
private final static Pattern colorNamePattern = Pattern.compile("[^:]+:(.+)");
private final static Pattern hexCodePattern = Pattern.compile("[^:]+:\\s*\\#(.+)");
private GocadColor(int hex)
{
this.color = new Color(hex);
this.pretty = splitCamelCase(name());
}
private static String splitCamelCase(String s)
{
return s.replaceAll(String.format("%s|%s|%s", "(?<=[A-Z])(?=[A-Z][a-z])", "(?<=[^A-Z])(?=[A-Z])",
"(?<=[A-Za-z])(?=[^A-Za-z])"), " ");
}
private static Map<String, GocadColor> prettyToColor = new HashMap<String, GocadColor>();
private static Map<String, GocadColor> nameToColor = new HashMap<String, GocadColor>();
static
{
for (GocadColor color : values())
{
prettyToColor.put(color.pretty.toLowerCase(), color);
nameToColor.put(color.name().toLowerCase(), color);
}
}
/**
* Convert a GOCAD "*color:" line to a Java {@link Color}. The following
* formats are supported:
* <ul>
* <li>*solid*color:1 0.447059 0.337255 1</li>
* <li>*solid*color:1 0.447059 0.337255</li>
* <li>*solid*color:dark olive green</li>
* <li>*solid*color:darkolivegreen</li>
* <li>*solid*color:#006600</li>
* </ul>
* The "*solid*color" part can be replaced by any text that doesn't contain
* a ':'.
*
* @param gocadLine
* Line of text to convert to a {@link Color}
* @return {@link Color} from line
*/
public static Color gocadLineToColor(String gocadLine)
{
if (gocadLine == null)
{
return null;
}
Matcher matcher = color4Pattern.matcher(gocadLine);
if (matcher.matches())
{
double r = Double.parseDouble(matcher.group(1));
double g = Double.parseDouble(matcher.group(2));
double b = Double.parseDouble(matcher.group(3));
double a = Double.parseDouble(matcher.group(4));
return new Color((float) r, (float) g, (float) b, (float) a);
}
matcher = color3Pattern.matcher(gocadLine);
if (matcher.matches())
{
double r = Double.parseDouble(matcher.group(1));
double g = Double.parseDouble(matcher.group(2));
double b = Double.parseDouble(matcher.group(3));
return new Color((float) r, (float) g, (float) b, 1.0f);
}
matcher = colorNamePattern.matcher(gocadLine);
if (matcher.matches())
{
String name = matcher.group(1).trim().toLowerCase();
GocadColor gc = prettyToColor.get(name);
if (gc == null)
{
gc = nameToColor.get(name);
}
if (gc != null)
{
return gc.color;
}
}
matcher = hexCodePattern.matcher(gocadLine);
if (matcher.matches())
{
try
{
int hex = Integer.parseInt(matcher.group(1), 16);
return new Color(hex);
}
catch (NumberFormatException e)
{
return null;
}
}
return null;
}
}