package kaka.cakelight;
public class Color {
+ public static final Color BLACK = Color.rgb(0, 0, 0);
+
+ private static int[] gammaCorrection = new int[256];
+
+ public static void calculateGammaCorrection(double gamma) {
+ for (int i = 0, max = 255; i <= max; i++) {
+ gammaCorrection[i] = (int)(Math.pow((double)i / max, gamma) * max);
+ }
+ }
+
private int r, g, b;
public static Color rgb(double r, double g, double b) {
return c;
}
+ /**
+ * @param hue 0.0 - 1.0
+ * @param saturation 0.0 - 1.0
+ * @param value 0.0 - 1.0
+ */
public static Color hsv(double hue, double saturation, double value) {
double normalizedHue = hue - Math.floor(hue);
int h = (int)(normalizedHue * 6);
}
}
+ public double[] toHSV() {
+ return toHSV(r / 255.0, g / 255.0, b / 255.0);
+ }
+
+ /**
+ * @return an array with hsv values ranging from 0.0 to 1.0
+ */
+ public static double[] toHSV(double r, double g, double b) {
+ double h, s, v;
+ double min = Math.min(Math.min(r, g), b);
+ double max = Math.max(Math.max(r, g), b);
+
+ if (max == 0) {
+ return new double[] {0, 0, 0};
+ }
+
+ // Value
+ v = max;
+
+ // Saturation
+ double delta = max - min;
+ s = delta / max;
+
+ // Hue
+ if (r == max) {
+ h = (g - b) / delta; // between yellow & magenta
+ } else if (g == max) {
+ h = 2 + (b - r) / delta; // between cyan & yellow
+ } else {
+ h = 4 + (r - g) / delta; // between magenta & cyan
+ }
+
+ h /= 6.0;
+ if (h < 0)
+ h += 1;
+
+ return new double[] {h, s, v};
+ }
+
public int r() {
- return r;
+ return gammaCorrection[r];
}
public int g() {
- return g;
+ return gammaCorrection[g];
}
public int b() {
- return b;
+ return gammaCorrection[b];
}
public Color interpolate(Color other, double value) {
(int)(b * invertedValue + other.b * value)
);
}
+
+ @Override
+ public String toString() {
+ return "Color{r=" + r + ", g=" + g + ", b=" + b + "}";
+ }
}