/*
* Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.jemmy.image;
import java.awt.image.BufferedImage;
import org.jemmy.image.pixel.PixelEqualityRasterComparator;
/**
* Compares two images with color mapping defined by
* ColorModel
implementation.
*
* @author Alexandre Iline (alexandre.iline@sun.com)
* @deprecated Use classes form org.jemmy.image.pixel instead.
*/
@Deprecated
public class ColorImageComparator implements ImageComparator {
ColorMap leftMap, rightMap;
ImageComparator comparator = null;
/**
* Creates a comparator with a color maps. Object created by this
* constructor behaves like
* StrictImageComparator
. Object created works faster because
* it does not create intermediate images for another comparator.
*
* @param map Map applied to both left and right images during comparision.
*/
public ColorImageComparator(ColorMap map) {
this(map, new StrictImageComparator());
}
/**
* Creates a comparator with
* map
color mapping. Actual comparision perfomed by
* comparator
parameter.
*
* @param map Map applied to both left and right images during comparision.
* @param subComparator comporator to perform a comparision of to images
* with mapped colors.
*/
public ColorImageComparator(ColorMap map, ImageComparator subComparator) {
this(map, map, subComparator);
}
/**
* Creates a comparator with two color maps. Object created by this
* constructor behaves like
* StrictImageComparator
. Object created works faster because
* it does not create intermediate images for another comparator.
*
* @param leftMap Map applied to the left image during comparision.
* @param rightMap Map applied to the right image during comparision.
*/
public ColorImageComparator(ColorMap leftMap, ColorMap rightMap) {
this(leftMap, rightMap, new BufferedImageComparator(new PixelEqualityRasterComparator(0)));
}
/**
* Creates a comparator with two color maps. Actual comparision perfomed by
* comparator
parameter.
*
* @param leftMap Map applied to the left image during comparision.
* @param rightMap Map applied to the right image during comparision.
* @param subComparator comporator to perform a comparision of to images
* with mapped colors.
*/
public ColorImageComparator(ColorMap leftMap, ColorMap rightMap, ImageComparator subComparator) {
this.leftMap = leftMap;
this.rightMap = rightMap;
this.comparator = subComparator;
}
/**
* Compares images by
* ImageComparator
passed into constructor, or itself if no
* ImageComparator
was passed, processing both images by
* ColorMap
instance before comparision.
*/
@Override
public Image compare(Image image1, Image image2) {
return (comparator.compare(
recolor((AWTImage)image1, leftMap),
recolor((AWTImage)image2, rightMap)));
}
private AWTImage recolor(AWTImage isrc, ColorMap map) {
BufferedImage src = isrc.getTheImage();
BufferedImage result = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());
for (int x = 0; x < src.getWidth(); x++) {
for (int y = 0; y < src.getWidth(); y++) {
result.setRGB(x, y, map.mapColor(src.getRGB(x, y)));
}
}
return new AWTImage(result);
}
protected final boolean compareColors(int rgb1, int rgb2) {
return (leftMap.mapColor(rgb1) == rightMap.mapColor(rgb2));
}
public String getID() {
return ColorImageComparator.class.getName();
}
/**
* Interface to map colors during the comparision.
*/
public static interface ColorMap {
/**
* Maps one color into another.
*
* @param rgb an original color.
* @return a converted color.
*/
public int mapColor(int rgb);
}
/**
* Turns
* foreground
color to white, other - to black.
*/
public static class ForegroundColorMap implements ColorMap {
int foreground;
/**
* Constructs a ColorImageComparator$ForegroundColorMap object.
*
* @param foreground Foreground color.
*/
public ForegroundColorMap(int foreground) {
this.foreground = foreground;
}
public int mapColor(int rgb) {
return ((rgb == foreground) ? 0xffffff : 0);
}
}
/**
* Turns
* background
color to black, left others unchanged.
*/
public static class BackgroundColorMap implements ColorMap {
int background;
/**
* Constructs a ColorImageComparator$BackgroundColorMap object.
*
* @param background Background color.
*/
public BackgroundColorMap(int background) {
this.background = background;
}
public int mapColor(int rgb) {
return ((rgb == background) ? 0 : rgb);
}
}
}