From fb7aabb780c8f8e555a9866b1770b281ee71b900 Mon Sep 17 00:00:00 2001 From: bwssystems Date: Mon, 7 Dec 2020 18:07:42 -0600 Subject: [PATCH] Fix all color handling and dim with no on request --- pom.xml | 2 +- .../HABridge/dao/DeviceDescriptor.java | 13 +- .../HABridge/hue/ColorConverter.java | 127 ++++----- .../bwssystems/HABridge/hue/ColorDecode.java | 253 +++++++++++++----- .../bwssystems/HABridge/hue/HueMulator.java | 36 ++- src/main/resources/public/scripts/app.js | 56 ++-- .../resources/public/views/editdevice.html | 6 + .../color/test/ConvertCIEColorTestCase.java | 68 ++++- 8 files changed, 386 insertions(+), 175 deletions(-) diff --git a/pom.xml b/pom.xml index 527f745..0fd9cc1 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.bwssystems.HABridge ha-bridge - 5.3.1RC3 + 5.3.1RC4-java11 jar HA Bridge diff --git a/src/main/java/com/bwssystems/HABridge/dao/DeviceDescriptor.java b/src/main/java/com/bwssystems/HABridge/dao/DeviceDescriptor.java index d24d563..b52e99f 100644 --- a/src/main/java/com/bwssystems/HABridge/dao/DeviceDescriptor.java +++ b/src/main/java/com/bwssystems/HABridge/dao/DeviceDescriptor.java @@ -92,7 +92,10 @@ public class DeviceDescriptor{ @SerializedName("startupActions") @Expose private String startupActions; - + @SerializedName("dimNoOn") + @Expose + private boolean dimNoOn; + public String getName() { return name; } @@ -355,4 +358,12 @@ public class DeviceDescriptor{ public void setStartupActions(String startupActions) { this.startupActions = startupActions; } + + public boolean isDimNoOn() { + return dimNoOn; + } + + public void setDimNoOn(boolean dimNoOn) { + this.dimNoOn = dimNoOn; + } } \ No newline at end of file diff --git a/src/main/java/com/bwssystems/HABridge/hue/ColorConverter.java b/src/main/java/com/bwssystems/HABridge/hue/ColorConverter.java index faa089f..769a2b5 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/ColorConverter.java +++ b/src/main/java/com/bwssystems/HABridge/hue/ColorConverter.java @@ -18,6 +18,8 @@ package com.bwssystems.HABridge.hue; * XYZ -> CIE-LAB -> XYZ * @author Diego Catalano */ + + public class ColorConverter { /** @@ -26,6 +28,7 @@ public class ColorConverter { private ColorConverter() {} public static enum YCbCrColorSpace {ITU_BT_601,ITU_BT_709_HDTV}; + private final static double EPSILON = 0.00001; // XYZ (Tristimulus) Reference values of a perfect reflecting diffuser @@ -259,7 +262,7 @@ public class ColorConverter { * @param blue Blue coefficient. * @return Normalized RGChromaticity. Range[0..1]. */ - public static double[] RGChromaticity(int red, int green, int blue){ + public static float[] RGChromaticity(int red, int green, int blue){ double[] color = new double[5]; double sum = red + green + blue; @@ -276,24 +279,7 @@ public class ColorConverter { double rS = color[0] - 0.333; double gS = color[1] - 0.333; - //saturation - color[3] = Math.sqrt(rS * rS + gS * gS); - - //hue - color[4] = Math.atan(rS / gS); - - return color; - } - - /** - * RGB -> HSV. - * Adds (hue + 360) % 360 for represent hue in the range [0..359]. - * @param red Red coefficient. Values in the range [0..255]. - * @param green Green coefficient. Values in the range [0..255]. - * @param blue Blue coefficient. Values in the range [0..255]. - * @return HSV color space. - */ - public static float[] RGBtoHSV(int red, int green, int blue){ + //saturationBRGBtoHSV(int red, int green, int blue){ float[] hsv = new float[3]; float r = red / 255f; float g = green / 255f; @@ -630,69 +616,69 @@ public class ColorConverter { public static int[] HunterLABtoRGB(float l, float a, float b){ float[] xyz = HunterLABtoXYZ(l, a, b); return XYZtoRGB(xyz[0], xyz[1], xyz[2]); - } + } /** - * RGB -> HLS. + * RGB -> HSL. * @param red Red coefficient. Values in the range [0..255]. * @param green Green coefficient. Values in the range [0..255]. * @param blue Blue coefficient. Values in the range [0..255]. - * @return HLS color space. + * @return HSL color space. */ - public static float[] RGBtoHLS(int red, int green, int blue){ + public static float[] RGBtoHSL(int red, int green, int blue){ float[] hsl = new float[3]; - float r = red / 255f; - float g = green / 255f; - float b = blue / 255f; + double r = red; + double g = green; + double b = blue; - float max = Math.max(r,Math.max(r,b)); - float min = Math.min(r,Math.min(r,b)); - float delta = max - min; + double max = Math.max(r,Math.max(g,b)); + double min = Math.min(r,Math.min(g,b)); +// double delta = max - min; //HSK - float h = 0; - float s = 0; - float l = (max + min) / 2; + Double h = 0d; + Double s = 0d; + Double l = 0d; - if ( delta == 0 ){ - // gray color - h = 0; - s = 0.0f; - } - else - { - // get saturation value - s = ( l <= 0.5 ) ? ( delta / ( max + min ) ) : ( delta / ( 2 - max - min ) ); - - // get hue value - float hue; - - if ( r == max ) - { - hue = ( ( g - b ) / 6 ) / delta; + //saturation + double cnt = (max + min) / 2d; + if (cnt <= 127d) { + s = ((max - min) / (max + min)); } - else if ( g == max ) - { - hue = ( 1.0f / 3 ) + ( ( b - r ) / 6 ) / delta; - } - else - { - hue = ( 2.0f / 3 ) + ( ( r - g ) / 6 ) / delta; + else { + s = ((max - min) / (510d - max - min)); } - // correct hue if needed - if ( hue < 0 ) - hue += 1; - if ( hue > 1 ) - hue -= 1; + //lightness + l = ((max + min) / 2d) / 255d; - h = (int) ( hue * 360 ); - } + //hue + if (Math.abs(max - min) <= EPSILON) { + h = 0d; + s = 0d; + } + else { + double diff = max - min; + + if (Math.abs(max - r) <= EPSILON) { + h = 60d * (g - b) / diff; + } + else if (Math.abs(max - g) <= EPSILON) { + h = 60d * (b - r) / diff + 120d; + } + else { + h = 60d * (r - g) / diff + 240d; + } + + if (h < 0d) { + h += 360d; + } + } - hsl[0] = h; - hsl[1] = s; - hsl[2] = l; + hsl[0] = h.floatValue(); + hsl[1] = s.floatValue(); + hsl[2] = l.floatValue(); return hsl; } @@ -931,14 +917,19 @@ public class ColorConverter { */ public static float[] XYtoXYZ(XYColorSpace xy){ float[] xyz = new float[3]; - + /* Old Way xyz[0] = (xy.getBrightnessAdjusted() / xy.getXy()[1]) * xy.getXy()[0]; xyz[1] = xy.getBrightnessAdjusted(); xyz[2] = (xy.getBrightnessAdjusted() / xy.getXy()[1]) * (1.0f - xy.getXy()[0] - xy.getXy()[1]); - + */ + // New Way + xyz[0] = xy.getXy()[0] * (xy.getBrightnessAdjusted() / xy.getXy()[1]) ; + xyz[1] = xy.getBrightnessAdjusted(); + xyz[2] = (float) ((1.0 - xy.getXy()[0] - xy.getXy()[1]) * (xy.getBrightnessAdjusted() / xy.getXy()[1])); + return xyz; } - + public static int[] normalizeRGB(int[] rgb) { int[] newRGB = new int[3]; diff --git a/src/main/java/com/bwssystems/HABridge/hue/ColorDecode.java b/src/main/java/com/bwssystems/HABridge/hue/ColorDecode.java index 1284b8e..9855036 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/ColorDecode.java +++ b/src/main/java/com/bwssystems/HABridge/hue/ColorDecode.java @@ -4,12 +4,12 @@ import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.awt.Color; +// import java.awt.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.bwssystems.HABridge.hue.ColorData; +// import com.bwssystems.HABridge.hue.ColorData; public class ColorDecode { private static final Logger log = LoggerFactory.getLogger(ColorDecode.class); @@ -27,75 +27,83 @@ public class ColorDecode { private static final String COLOR_BRI = "${colorbri}"; private static final Pattern COLOR_MILIGHT = Pattern.compile("\\$\\{color.milight\\:([01234])\\}"); - public static List convertHSBtoRGB(HueSatBri hsb) { + + /* This is supersceded by the next iteration function below this original one + public static List convertHSBtoRGBOrig(HueSatBri hsb) { List rgb; Float hue = (Float)(hsb.getHue()*1.0f); Float saturation = (Float)(hsb.getSat()*1.0f); Float brightness = (Float)(hsb.getBri()*1.0f); log.info("Hue = " + hue + ", Sat = " + saturation + ", Bri = " + brightness); //Convert Hue into degrees for HSB - hue = hue / 182.04f; + // hue = hue / 182.04f; + hue = (hue / 65535.0f) * 360.0f; //Bri and Sat must be values from 0-1 (~percentage) - brightness = brightness / 255.0f; - saturation = saturation / 255.0f; - + // ightness = brightness / 255.0f; + // saturation = saturation / 255.0f; + + brightness = brightness / 254.0f; + saturation = saturation / 254.0f; + Float r = 0f; Float g = 0f; Float b = 0f; - - if (saturation == 0) - { - r = g = b = brightness; + + if(brightness > 0.0f) { + if (saturation == 0) + { + r = g = b = brightness; + } + else + { + // the color wheel consists of 6 sectors. + Float sectorPos = hue / 60.0f; + int sectorNumber = (int)(Math.floor(sectorPos)); + // get the fractional part of the sector + Float fractionalSector = sectorPos - sectorNumber; + + // calculate values for the three axes of the color. + Float p = brightness * (1.0f - saturation); + Float q = brightness * (1.0f - (saturation * fractionalSector)); + Float t = brightness * (1.0f - (saturation * (1f - fractionalSector))); + + // assign the fractional colors to r, g, and b based on the sector the angle is in. + switch (sectorNumber) + { + case 0: + r = brightness; + g = t; + b = p; + break; + case 1: + r = q; + g = brightness; + b = p; + break; + case 2: + r = p; + g = brightness; + b = t; + break; + case 3: + r = p; + g = q; + b = brightness; + break; + case 4: + r = t; + g = p; + b = brightness; + break; + case 5: + r = brightness; + g = p; + b = q; + break; + } + } } - else - { - // the color wheel consists of 6 sectors. - Float sectorPos = hue / 60.0f; - int sectorNumber = (int)(Math.floor(sectorPos)); - // get the fractional part of the sector - Float fractionalSector = sectorPos - sectorNumber; - - // calculate values for the three axes of the color. - Float p = brightness * (1.0f - saturation); - Float q = brightness * (1.0f - (saturation * fractionalSector)); - Float t = brightness * (1.0f - (saturation * (1f - fractionalSector))); - - // assign the fractional colors to r, g, and b based on the sector the angle is in. - switch (sectorNumber) - { - case 0: - r = brightness; - g = t; - b = p; - break; - case 1: - r = q; - g = brightness; - b = p; - break; - case 2: - r = p; - g = brightness; - b = t; - break; - case 3: - r = p; - g = q; - b = brightness; - break; - case 4: - r = t; - g = p; - b = brightness; - break; - case 5: - r = brightness; - g = p; - b = q; - break; - } - } - + //Check if any value is out of byte range if (r < 0f) { @@ -114,10 +122,106 @@ public class ColorDecode { rgb.add((int)Math.round(r*255)); rgb.add((int)Math.round(g*255)); rgb.add((int)Math.round(b*255)); - log.debug("Color change with HSB: " + hsb + ". Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1) + " " + log.info("Color change with HSB: " + hsb + ". Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1) + " " + rgb.get(2)); + + int theRGB = Color.HSBtoRGB(hue, saturation, brightness); + Color decodedRGB = new Color(theRGB); + log.info("Color change with HSB using java Color: " + hsb + ". Resulting RGB Values: " + decodedRGB.getRed() + " " + decodedRGB.getGreen() + " " + + decodedRGB.getBlue()); + return rgb; } + */ + public static List convertHSBtoRGB(HueSatBri hsb) { + List rgb; + Float hue = (Float)(hsb.getHue()*1.0f); + Float saturation = (Float)(hsb.getSat()*1.0f); + Float brightness = (Float)(hsb.getBri()*1.0f); + log.info("Hue = " + hue + ", Sat = " + saturation + ", Bri = " + brightness); + //Convert Hue into degrees for HSB + // hue = hue / 182.04f; + hue = (hue / 65535.0f); + //Bri and Sat must be values from 0-1 (~percentage) + // ightness = brightness / 255.0f; + // saturation = saturation / 255.0f; + + brightness = brightness / 254.0f; + saturation = saturation / 254.0f; + + Float r = 0f; + Float g = 0f; + Float b = 0f; + Float temp2 = 0f; + Float temp1 = 0f; + + if(brightness > 0.0f) { + if (saturation == 0) + { + r = g = b = brightness; + } + else + { + temp2 = (brightness < 0.5f) ? brightness * (1.0f + saturation) : brightness + saturation - (brightness * saturation); + temp1 = 2.0f * brightness - temp2; + + r = GetColorComponent(temp1, temp2, hue + 1.0f/3.0f); + g = GetColorComponent(temp1, temp2, hue); + b = GetColorComponent(temp1, temp2, hue - 1.0f/3.0f); + } + } + + //Check if any value is out of byte range + if (r < 0f) + { + r = 0f; + } + if (g < 0f) + { + g = 0f; + } + if (b < 0f) + { + b = 0f; + } + + rgb = new ArrayList(); + rgb.add((int)Math.round(r*255)); + rgb.add((int)Math.round(g*255)); + rgb.add((int)Math.round(b*255)); + log.debug("Color change with HSB New: " + hsb + ". Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1) + " " + + rgb.get(2)); + + return rgb; + } + + private static Float GetColorComponent(Float temp1, Float temp2, Float temp3) + { + temp3 = MoveIntoRange(temp3); + if (temp3 < 1.0f/6.0f) + { + return temp1 + (temp2 - temp1) * 6.0f * temp3; + } + + if (temp3 < 0.5f) + { + return temp2; + } + + if (temp3 < 2.0f/3.0f) + { + return temp1 + ((temp2 - temp1) * ((2.0f/3.0f) - temp3) * 6.0f); + } + + return temp1; + } + + private static Float MoveIntoRange(Float temp3) + { + if (temp3 < 0.0f) return temp3 + 1f; + if (temp3 > 1.0f) return temp3 - 1f; + return temp3; + } public static List convertCIEtoRGB(List xy, int brightness) { List rgb; @@ -133,7 +237,7 @@ public class ColorDecode { rgb.add(rgbInt[0]); rgb.add(rgbInt[1]); rgb.add(rgbInt[2]); - log.debug("Color change with XY: " + xy.get(0) + " " + xy.get(1) + " Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1) + log.debug("Color change with XY: " + xy.get(0) + " " + xy.get(1) + " " + brightness + " Resulting RGB Values: " + rgb.get(0) + " " + rgb.get(1) + " " + rgb.get(2)); return rgb; } @@ -179,10 +283,10 @@ public class ColorDecode { private static double assureBounds(double value) { if (value < 0.0) { - value = 0; + value = 0.0; } if (value > 255.0) { - value = 255; + value = 255.0; } return value; } @@ -252,8 +356,9 @@ public class ColorDecode { List xyData = (List) colorData.getData(); request = request.replace(COLOR_XY, String.format("%f,%f", xyData.get(0), xyData.get(1))); } else { - List xyData = (List) colorData.getData(); - request = request.replace(COLOR_XY, String.format("%f,%f", xyData.get(0), xyData.get(1))); + float[] xyz = ColorConverter.RGBtoXYZ(rgb.get(0), rgb.get(1), rgb.get(2)); + XYColorSpace theXYcolor = ColorConverter.XYZtoXY(xyz[0], xyz[1], xyz[2]); + request = request.replace(COLOR_XY, String.format("%f,%f",theXYcolor.getXy()[0], theXYcolor.getXy()[1])); } notDone = true; } @@ -263,9 +368,9 @@ public class ColorDecode { HueSatBri hslData = (HueSatBri) colorData.getData(); request = request.replace(COLOR_H, String.format("%d", hslData.getHue())); } else { - float[] hsb = new float[3]; - Color.RGBtoHSB(rgb.get(0), rgb.get(1), rgb.get(2), hsb); - float hue = hsb[0] * (float) 360.0; + float[] hsb; + hsb = ColorConverter.RGBtoHSL(rgb.get(0), rgb.get(1), rgb.get(2)); + float hue = hsb[0]; request = request.replace(COLOR_H, String.format("%f", hue)); } notDone = true; @@ -276,8 +381,8 @@ public class ColorDecode { HueSatBri hslData = (HueSatBri) colorData.getData(); request = request.replace(COLOR_S, String.format("%d", hslData.getSat())); } else { - float[] hsb = new float[3]; - Color.RGBtoHSB(rgb.get(0), rgb.get(1), rgb.get(2), hsb); + float[] hsb; + hsb = ColorConverter.RGBtoHSL(rgb.get(0), rgb.get(1), rgb.get(2)); float sat = hsb[1] * (float) 100.0; request = request.replace(COLOR_S, String.format("%f", sat)); } @@ -289,7 +394,7 @@ public class ColorDecode { HueSatBri hslData = (HueSatBri) colorData.getData(); request = request.replace(COLOR_BRI, String.format("%d", hslData.getBri())); } else { - request = request.replace(COLOR_BRI, String.format("%f", setIntensity)); + request = request.replace(COLOR_BRI, String.format("%d", setIntensity)); } notDone = true; } @@ -301,8 +406,8 @@ public class ColorDecode { String.format("%d,%d,%d", hslData.getHue(), hslData.getSat(), hslData.getBri())); } else { float[] hsb = new float[3]; - Color.RGBtoHSB(rgb.get(0), rgb.get(1), rgb.get(2), hsb); - float hue = hsb[0] * (float) 360.0; + hsb = ColorConverter.RGBtoHSL(rgb.get(0), rgb.get(1), rgb.get(2)); + float hue = hsb[0]; float sat = hsb[1] * (float) 100.0; float bright = hsb[2] * (float) 100.0; request = request.replace(COLOR_HSB, String.format("%f,%f,%f", hue, sat, bright)); diff --git a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java index 254708f..a136a38 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java +++ b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java @@ -1221,12 +1221,41 @@ public class HueMulator { isOnRequest = true; } + if(device.isOnFirstDim()) { + if(isDimRequest && !device.getDeviceState().isOn()) { + isOnRequest = true; + theStateChanges.setOn(true); + // isDimRequest = false; + // isColorRequest = false; + } else if (isDimRequest && device.getDeviceState().isOn()) { + if (device.getDeviceState().getBri() == theStateChanges.getBri()) { + isOnRequest = true; + theStateChanges.setOn(true); + // isDimRequest = false; + // isColorRequest = false; + } else { + isOnRequest = false; + // isDimRequest = true; + // isColorRequest = false; + } + } + } else if (device.isOnWhenDimPresent()) { + if (isDimRequest) { + isOnRequest = true; + theStateChanges.setOn(true); + } + } else if (device.isDimNoOn()) { + if (isDimRequest && isOnRequest) { + isOnRequest = false; + } + } + + +/* Old code supperceded by the above block if (!device.isOnFirstDim() && device.isOnWhenDimPresent() && isDimRequest && !isOnRequest) { isOnRequest = true; theStateChanges.setOn(true); - } else if (!device.isOnFirstDim() && !device.isOnWhenDimPresent() && isDimRequest) { - // isOnRequest = false; - } + } else if (device.isOnFirstDim() && isDimRequest && !device.getDeviceState().isOn()) { isOnRequest = true; @@ -1245,6 +1274,7 @@ public class HueMulator { isColorRequest = false; } } +*/ if (isOnRequest) { if (bridgeSettings.isTracestate()) diff --git a/src/main/resources/public/scripts/app.js b/src/main/resources/public/scripts/app.js index 8cee1e9..a67ea1b 100644 --- a/src/main/resources/public/scripts/app.js +++ b/src/main/resources/public/scripts/app.js @@ -1547,26 +1547,42 @@ app.service('bridgeService', function ($rootScope, $http, $base64, $location, ng }; this.toXY = function (red, green, blue) { - //Gamma corrective - red = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92); - green = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92); - blue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92); + var r = red / 255; + var g = green / 255; + var b = blue / 255; + + //R + if ( r > 0.04045) + r = Math.pow(( ( r + 0.055 ) / 1.055 ), 2.4); + else + r /= 12.92; + + //G + if ( g > 0.04045) + g = Math.pow(( ( g + 0.055 ) / 1.055 ), 2.4); + else + g /= 12.92; + + //B + if ( b > 0.04045) + b = Math.pow(( ( b + 0.055 ) / 1.055 ), 2.4); + else + b /= 12.92; + + r *= 100; + g *= 100; + b *= 100; + + var x = 0.412453 * r + 0.35758 * g + 0.180423 * b; + var y = 0.212671 * r + 0.71516 * g + 0.072169 * b; + var z = 0.019334 * r + 0.119193 * g + 0.950227 * b; + + var newX = x / (x + y + z); + var newY = y / (x + y + z); + var interBright = (y / 100) * 254; + var newBright = Math.round(interBright); - //Apply wide gamut conversion D65 - var X = red * 0.664511 + green * 0.154324 + blue * 0.162028; - var Y = red * 0.283881 + green * 0.668433 + blue * 0.047685; - var Z = red * 0.000088 + green * 0.072310 + blue * 0.986039; - - var fx = X / (X + Y + Z); - var fy = Y / (X + Y + Z); - if (isNaN(fx)) { - fx = 0.0; - } - if (isNaN(fy)) { - fy = 0.0; - } - - return [fx.toPrecision(4), fy.toPrecision(4)]; + return [newX.toPrecision(6), newY.toPrecision(6), newBright]; }; this.testUrl = function (device, type, value, valueType) { @@ -1592,7 +1608,7 @@ app.service('bridgeService', function ($rootScope, $http, $base64, $location, ng if (valueType === "color" && value) { if (addComma) testBody = testBody + ","; - testBody = testBody + "\"xy\": [" + value[0] + "," + value[1] + "]"; + testBody = testBody + "\"xy\": [" + value[0] + "," + value[1] + "],\"bri\":" + value[2]; } testBody = testBody + "}"; if (testBody === "{}") { diff --git a/src/main/resources/public/views/editdevice.html b/src/main/resources/public/views/editdevice.html index 96a0de0..9630f4a 100644 --- a/src/main/resources/public/views/editdevice.html +++ b/src/main/resources/public/views/editdevice.html @@ -114,6 +114,12 @@ ng-model="device.onFirstDim" ng-true-value=true ng-false-value=false> {{device.onFirstDim}} + + + {{device.dimNoOn}} + xy = new ArrayList(Arrays.asList(Double.parseDouble("0.671254"), Double.parseDouble("0.303273"))); + ArrayList xy = new ArrayList(Arrays.asList(Double.parseDouble("0.20821628789344535"), Double.parseDouble("0.22503526273269103"))); XYColorSpace xyColor = new XYColorSpace(); - xyColor.setBrightness(50); + xyColor.setBrightness(56); float[] xyFloat = new float[2]; xyFloat[0] = xy.get(0).floatValue(); xyFloat[1] = xy.get(1).floatValue(); @@ -32,12 +33,29 @@ public class ConvertCIEColorTestCase { rgbDecode.add(1, rgb[1]); rgbDecode.add(2, rgb[2]); List assertDecode = new ArrayList(); - assertDecode.add(0, 255); - assertDecode.add(1, 0); - assertDecode.add(2, 5); + assertDecode.add(0, 60); + assertDecode.add(1, 134); + assertDecode.add(2, 196); Assert.assertEquals(rgbDecode, assertDecode); } + @Test + public void testColorConverterRGBtoXY() { + int red = 60; + int green = 134; + int blue = 196; + + float[] xyz = ColorConverter.RGBtoXYZ(red, green, blue); + XYColorSpace theColorSpace = ColorConverter.XYZtoXY(xyz[0], xyz[1], xyz[2]); + List xyDecode = new ArrayList(); + xyDecode.add(0, theColorSpace.getXy()[0]); + xyDecode.add(1, theColorSpace.getXy()[1]); + List assertDecode = new ArrayList(); + assertDecode.add(0, 0.20821705f); + assertDecode.add(1, 0.22506176f); + Assert.assertEquals(xyDecode, assertDecode); + } + @Test public void testColorConversionXYtoRGB1() { ArrayList xy = new ArrayList(Arrays.asList(Double.parseDouble("0.671254"), Double.parseDouble("0.303273"))); @@ -70,6 +88,22 @@ public class ConvertCIEColorTestCase { Assert.assertEquals(rgbIntVal, 15270119); } + @Test + public void testColorConversionXYtoRGB3() { + ArrayList xy = new ArrayList(Arrays.asList(Double.parseDouble("0.20821628789344535"), Double.parseDouble("0.22503526273269103"))); + + List colorDecode = ColorDecode.convertCIEtoRGB(xy, 56); + List assertDecode = new ArrayList(); + assertDecode.add(0, 60); + assertDecode.add(1, 134); + assertDecode.add(2, 196); + Assert.assertEquals(colorDecode, assertDecode); + +// ColorData colorData = new ColorData(ColorData.ColorMode.XY, xy); +// int rgbIntVal = ColorDecode.getIntRGB(colorData, 56); +// Assert.assertEquals(rgbIntVal, 15270119); + } + @Test public void testColorConversionHSBtoRGB1() { HueSatBri hsb = new HueSatBri(); @@ -79,12 +113,30 @@ public class ConvertCIEColorTestCase { List colorDecode = ColorDecode.convertHSBtoRGB(hsb); List assertDecode = new ArrayList(); - assertDecode.add(0, 60); - assertDecode.add(1, 97); - assertDecode.add(2, 128); + assertDecode.add(0, 61); + assertDecode.add(1, 134); + assertDecode.add(2, 196); Assert.assertEquals(colorDecode, assertDecode); } + @Test + public void testColorConverterRGBtoHSB() { + int red = 61; + int green = 134; + int blue = 196; + + float[] hsl = ColorConverter.RGBtoHSL(red, green, blue); + List hsbDecode = new ArrayList(); + hsbDecode.add(0, (int) (hsl[0] / 360f * 65535f)); + hsbDecode.add(1, (int) (hsl[1] * 254f)); + hsbDecode.add(2, (int) (hsl[2] * 254f)); + List assertDecode = new ArrayList(); + assertDecode.add(0, 37783); + assertDecode.add(1, 135); + assertDecode.add(2, 127); + Assert.assertEquals(hsbDecode, assertDecode); + } + @Test public void testColorConversionCTtoRGB() { Integer ct = 500;