blob: 5dceb1c0e6077bae69411a6a300e73cfadeb81d0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2008 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Junji MAEDA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.visualization.engines.lowvision.checker;
import org.eclipse.actf.visualization.engines.lowvision.color.ColorIRGB;
public class W3CColorChecker extends ColorChecker {
private static final double THRESHOLD_Y = 125.0;
private static final int THRESHOLD_C = 500;
private double diffY;
private int diffC;
private double sevY;
private double sevC;
private double severity;
public W3CColorChecker(ColorIRGB _c1, ColorIRGB _c2) {
super(_c1, _c2);
int r1 = color1.getR();
int g1 = color1.getG();
int b1 = color1.getB();
int r2 = color2.getR();
int g2 = color2.getG();
int b2 = color2.getB();
double y1 = calcY(r1, g1, b1);
double y2 = calcY(r2, g2, b2);
diffY = Math.abs(y1 - y2);
diffC = Math.abs(r1 - r2) + Math.abs(g1 - g2) + Math.abs(b1 - b2);
sevY = calcSevY(diffY);
sevC = calcSevC(diffC);
severity = Math.min(sevY, sevC);
}
public W3CColorChecker(int _i1, int _i2) {
this(new ColorIRGB(_i1), new ColorIRGB(_i2));
}
public double calcSeverity() {
return (this.severity);
}
public static double calcSeverity(ColorIRGB _c1, ColorIRGB _c2) {
return ((new W3CColorChecker(_c1, _c2)).calcSeverity());
}
public double calcLuminanceSeverity() {
return (this.sevY);
}
public static double calcLuminanceSeverity(ColorIRGB _c1, ColorIRGB _c2) {
return ((new W3CColorChecker(_c1, _c2)).calcLuminanceSeverity());
}
public double calcChrominanceSeverity() {
return (this.sevC);
}
public static double calcChrominanceSeverity(ColorIRGB _c1, ColorIRGB _c2) {
return ((new W3CColorChecker(_c1, _c2)).calcChrominanceSeverity());
}
public int calcLuminanceDifference() {
int iDiff = (int) (Math.round(this.diffY));
if (iDiff < 0)
iDiff = 0;
else if (255 < iDiff)
iDiff = 255;
return (iDiff);
}
public static int calcLuminanceDifference(ColorIRGB _c1, ColorIRGB _c2) {
return ((new W3CColorChecker(_c1, _c2)).calcLuminanceDifference());
}
public int calcChrominanceDifference() {
return (this.diffC);
}
public static int calcChrominanceDifference(ColorIRGB _c1, ColorIRGB _c2) {
return ((new W3CColorChecker(_c1, _c2)).calcChrominanceDifference());
}
private static double calcY(int _r, int _g, int _b) {
return ((double) (_r * 299 + _g * 587 + _b * 114) / 1000.0);
}
private static double calcSevY(double _diffY) {
double sevY = 0.0;
if (_diffY < THRESHOLD_Y) {
sevY = -_diffY / THRESHOLD_Y + 1.0;
}
if (sevY < 0.0)
sevY = 0.0;
else if (1.0 < sevY)
sevY = 1.0;
return (sevY);
}
private static double calcSevC(int _diffC) {
double sevC = 0.0;
if (_diffC < THRESHOLD_C) {
sevC = -(double) _diffC / (double) THRESHOLD_C + 1.0;
}
if (sevC < 0.0)
sevC = 0.0;
else if (1.0 < sevC)
sevC = 1.0;
return (sevC);
}
}