// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.tools; import java.awt.Color; import java.util.Locale; /** * Helper to convert from color to HTML string and back. */ public final class ColorHelper { private ColorHelper() { // Hide default constructor for utils classes } /** * Returns the {@code Color} for the given HTML code. * @param html the color code * @return the color */ public static Color html2color(String html) { if (!html.isEmpty() && html.charAt(0) == '#') html = html.substring(1); if (html.length() == 3) { return html2color(new String( new char[]{html.charAt(0), html.charAt(0), html.charAt(1), html.charAt(1), html.charAt(2), html.charAt(2)})); } if (html.length() != 6 && html.length() != 8) return null; try { return new Color( Integer.parseInt(html.substring(0, 2), 16), Integer.parseInt(html.substring(2, 4), 16), Integer.parseInt(html.substring(4, 6), 16), html.length() == 8 ? Integer.parseInt(html.substring(6, 8), 16) : 255); } catch (NumberFormatException e) { return null; } } private static String int2hex(int i) { String s = Integer.toHexString(i / 16) + Integer.toHexString(i % 16); return s.toUpperCase(Locale.ENGLISH); } /** * Returns the HTML color code (6 or 8 digit). * @param col The color to convert * @return the HTML color code (6 or 8 digit) */ public static String color2html(Color col) { return color2html(col, true); } /** * Returns the HTML color code (6 or 8 digit). * @param col The color to convert * @param withAlpha if {@code true} and alpha value < 255, return 8-digit color code, else always 6-digit * @return the HTML color code (6 or 8 digit) * @since 6655 */ public static String color2html(Color col, boolean withAlpha) { if (col == null) return null; String code = '#'+int2hex(col.getRed())+int2hex(col.getGreen())+int2hex(col.getBlue()); if (withAlpha) { int alpha = col.getAlpha(); if (alpha < 255) { code += int2hex(alpha); } } return code; } /** * Determines the correct foreground color (black or white) to use for the given background, * so the text will be readable. * @param bg background color * @return {@code Color#BLACK} or {@code Color#WHITE} * @since 9223 */ public static Color getForegroundColor(Color bg) { // http://stackoverflow.com/a/3943023/2257172 return bg == null ? null : (bg.getRed()*0.299 + bg.getGreen()*0.587 + bg.getBlue()*0.114) > 186 ? Color.BLACK : Color.WHITE; } }