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