blob: b40735a0530c89b49e3f0c3a19c1411c4ef6bfd0 [file] [log] [blame]
/*
* Copyright 2013 Alex Lewis.
* Copyright 2013 gitblit.com.
*
* 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 com.gitblit.utils;
import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
/**
* Factory for creating color maps.
*
* @author Alex Lewis
*/
public class ColorFactory {
private static final double MAX_TINT_FACTOR = 1;
private static final double MIN_TINT_FACTOR = 0.2;
private static final double FIXED_TINT_FACTOR = 0.875;
/**
* Builds a map of the supplied keys to a random color tinted according to
* the key's position in the set.
*
* Depending on the number of keys in the set a tint is calculated from 1.0
* (I.e. white) to a minimum tint. The keys are sorted such that the
* "lowest" value will have a full tint applied to it (1.0) with an equally
* decreasing tint applied to each key thereafter.
*
* @param keys
* The keys to create a tinted color for.
* @param baseColor
* the base color (optional)
* @return The map of key to tinted color.
*/
public <T> Map<T, String> getGraduatedColorMap(Set<T> keys, Color baseColor) {
Map<T, String> colorMap = new HashMap<T, String>();
if (baseColor == null) {
baseColor = getRandomColor();
}
double tintStep = (MAX_TINT_FACTOR - MIN_TINT_FACTOR) / keys.size();
double currentTint = MAX_TINT_FACTOR;
for (T key : keys) {
Color color = tintColor(baseColor, currentTint);
colorMap.put(key, getColorString(color));
currentTint -= tintStep;
}
return colorMap;
}
/**
* Builds a map of the supplied keys to random colors.
*
* Each color is selected randomly and tinted with a fixed tint.
*
* @param keys The keys to create the mapped colors.
* @return The map of key to random color.
*/
public <T> Map<T, String> getRandomColorMap(Set<T> keys) {
Map<T, String> colorMap = new HashMap<T, String>();
for (T key : keys) {
Color color = tintColor(getRandomColor(), FIXED_TINT_FACTOR);
colorMap.put(key, getColorString(color));
}
return colorMap;
}
private Color getRandomColor() {
Random random = new Random();
Color randomColor = new Color(random.nextInt(256), random.nextInt(256),
random.nextInt(256));
return randomColor;
}
private Color tintColor(Color origColor, double tintFactor) {
int tintedRed = applyTint(origColor.getRed(), tintFactor);
int tintedGreen = applyTint(origColor.getGreen(), tintFactor);
int tintedBlue = applyTint(origColor.getBlue(), tintFactor);
Color tintedColor = new Color(tintedRed, tintedGreen, tintedBlue);
return tintedColor;
}
/**
* Convert the color to an HTML compatible color string in hex format E.g.
* #FF0000
*
* @param color The color to convert
* @return The string version of the color I.e. #RRGGBB
*/
private String getColorString(Color color) {
return "#" + Integer.toHexString(color.getRGB() & 0x00ffffff);
}
/**
* Tint the supplied color with a tint factor (0 to 1 inclusive) to make the
* colour more pale I.e. closer to white.
*
* A Tint of 0 has no effect, a Tint of 1 turns the color white.
*
* @param color The original color
* @param tintFactor The factor - 0 to 1 inclusive
* @return The tinted color.
*/
private int applyTint(int color, double tintFactor) {
return (int) (color + ((255 - color) * tintFactor));
}
}