/* * Copyright (C) 2014-2015 たんらる */ package fourthline.mabiicco.ui.color; import java.awt.Color; import java.util.ArrayList; import java.util.Arrays; import java.util.List; final class ColorPalette { private static enum ColorPattern { ACTIVE(250, 200, 0), MELODY(0, 200, 0), CHORD1(0, 200, 40), CHORD2(0, 200, 80), SONGEX(0, 200, 120), UNUSED(0, 80, 0) { @Override public Color getFillColor(Color baseColor) { return Color.GRAY; } }; protected Color filter(Color color) { return new Color( limit(color.getRed()+beta), limit(color.getGreen()+beta), limit(color.getBlue()+beta), color.getAlpha()); } private static int limit(int a) { if (a > 255) return 255; if (a < 0) return 0; return a; } private final int rectAlpha; private final int fillAlpha; private final int beta; private ColorPattern(int rectAlpha, int fillAlpha, int beta) { this.rectAlpha = rectAlpha; this.fillAlpha = fillAlpha; this.beta = beta; } public Color getRectColor(Color baseColor) { return filter(new Color( baseColor.getRed(), baseColor.getGreen(), baseColor.getBlue(), rectAlpha)); } public Color getFillColor(Color baseColor) { return filter(new Color( baseColor.getRed(), baseColor.getGreen(), baseColor.getBlue(), fillAlpha)); } } private static final Color trackBaseColor[] = { new Color(200, 0, 0), new Color(0, 200, 0), new Color(0, 0, 200), Color.decode("#FF4400"), Color.decode("#00AAFF"), Color.decode("#FF00D0"), Color.decode("#009933"), Color.decode("#FF5564"), Color.decode("#8100FF"), Color.decode("#891D1D"), Color.decode("#A78100"), Color.decode("#00600B"), }; private static ArrayList<ColorPalette> instanceList = null; public static void createInstance() { instanceList = new ArrayList<>(); for (Color baseColor : trackBaseColor) { instanceList.add( new ColorPalette(baseColor) ); } } public static int getInstanceSize() { return trackBaseColor.length; } public static ColorPalette getInstance(int trackIndex) { if (instanceList == null) { createInstance(); } int index = trackIndex % instanceList.size(); return instanceList.get(index); } private Color baseColor; private final ArrayList<Color> rectColorTable = new ArrayList<>(); private final ArrayList<Color> fillColorTable = new ArrayList<>(); public ColorPalette(Color baseColor) { setColor(baseColor); } public void setColor(Color baseColor) { rectColorTable.clear(); fillColorTable.clear(); this.baseColor = baseColor; for (ColorPattern pattern : ColorPattern.values()) { rectColorTable.add( pattern.getRectColor(baseColor) ); fillColorTable.add( pattern.getFillColor(baseColor) ); } } public Color getBaseColor() { return this.baseColor; } private Color getColor(List<Color> colorList, ColorPattern pattern) { int index = Arrays.binarySearch(ColorPattern.values(), pattern); return colorList.get(index % colorList.size()); } public Color getActiveRectColor() { return getColor( rectColorTable, ColorPattern.ACTIVE ); } public Color getActiveFillColor() { return getColor( fillColorTable, ColorPattern.ACTIVE ); } public Color getPartRectColor(int part) { return getColor( rectColorTable, getColorType(part) ); } public Color getPartFillColor(int part) { return getColor( fillColorTable, getColorType(part) ); } public Color getUnusedFillColor() { return getColor( fillColorTable, ColorPattern.UNUSED ); } public ColorPattern getColorType(int part) { switch (part) { case 0: return ColorPattern.MELODY; case 1: return ColorPattern.CHORD1; case 2: return ColorPattern.CHORD2; case 3: return ColorPattern.SONGEX; } return ColorPattern.UNUSED; } public static String toText(Color c) { return String.format("%08x", c.getRGB()); } public static Color toColor(String s) { return new Color(Integer.parseUnsignedInt(s, 16), true); } public static void main(String[] args) { ColorManager colorManager = ColorManager.defaultColor(); int track = 12; int part = 4; for (int i = 0; i < track; i++) { System.out.println( "rectA="+ColorPalette.toText( colorManager.getActiveRectColor(i) )); System.out.println( "fillA="+ColorPalette.toText( colorManager.getActiveFillColor(i) )); for (int j = 0; j < part; j++) { System.out.println( "rect"+j+"="+ColorPalette.toText( colorManager.getPartRectColor(i, j) )); System.out.println( "fill"+j+"="+ColorPalette.toText( colorManager.getPartFillColor(i, j) )); } } System.out.println( "unused="+ColorPalette.toText( colorManager.getUnusedFillColor() )); } }