/* * Copyright (C) 2014-2015 たんらる */ package fourthline.mabiicco.fx.color; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javafx.scene.paint.Color; 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.getOpacity()); } private static double limit(double a) { if (a > 1.0) return 1.0; if (a < 0) return 0; return a; } private final double rectAlpha; private final double fillAlpha; private final double beta; private ColorPattern(int rectAlpha, int fillAlpha, int beta) { this.rectAlpha = rectAlpha/250.0; this.fillAlpha = fillAlpha/250.0; this.beta = beta/250.0; } 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[] = { Color.color(0.9, 0, 0), Color.color(0, 0.9, 0), Color.color(0, 0, 0.9), Color.web("#FF4400"), Color.web("#00AAFF"), Color.web("#FF00D0"), Color.web("#009933"), Color.web("#FF5564"), Color.web("#8100FF"), Color.web("#891D1D"), Color.web("#A78100"), Color.web("#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; } }