package kg.apc.charting.colors;
import kg.apc.charting.ColorsDispatcher;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
import java.awt.*;
import java.util.*;
public class CycleColors implements ColorsDispatcher {
private static final Logger log = LoggingManager.getLoggerForClass();
private java.util.List<Color> assignedColors = new ArrayList<Color>();
private final static int LEVEL_MAX = 256;
private int level;
private int bits;
private int increment;
public CycleColors() {
reset();
}
public void reset() {
assignedColors.clear();
increment = LEVEL_MAX;
bits = 0;
level = LEVEL_MAX - 1;
assignedColors.add(new Color(255, 255, 0));
assignedColors.add(new Color(127, 127, 0));
}
/**
*
* @return
*/
public Color getNextColor() {
Color color = null;
doCycles();
int r = 0, g = 0, b = 0;
if ((bits & 1) == 1) {
r = level;
}
if ((bits & 2) == 2) {
b = level;
}
if ((bits & 4) == 4) {
g = level;
}
Color c = new Color(r, g, b);
if (assignedColors.contains(c)) {
if (log.isDebugEnabled()) {
log.debug("Existing " + r + " " + g + " " + b);
}
color = getNextColor();
} else if ((r + g + b) / 3 < 32) {
if (log.isDebugEnabled()) {
log.debug("Too dark " + r + " " + g + " " + b);
}
color = getNextColor();
} else if ((r + g + b) / 3 > 256 - 64) {
if (log.isDebugEnabled()) {
log.debug("Too light " + r + " " + g + " " + b);
}
color = getNextColor();
} else {
if (log.isDebugEnabled()) {
log.debug("New " + r + " " + g + " " + b);
}
color = new Color(r, g, b);
}
assignedColors.add(color);
return color;
}
private void doCycles() {
bits++;
if (bits >= 8) {
level -= increment;
if (level < 0) {
increment /= 2;
if (increment <= 0) {
log.warn("Colors exceeded. Rewind colors.");
reset();
}
level = LEVEL_MAX - 1;
}
bits = 0;
}
}
}