package ru.yandex.qatools.ashot.comparison; import java.awt.Point; import java.awt.image.BufferedImage; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; /** * @author Rovniakov Viacheslav rovner@yandex-team.ru * */ public class PointsMarkupPolicy extends DiffMarkupPolicy { private Set<Point> diffPoints = new LinkedHashSet<>(); private Set<Point> deposedPoints = new LinkedHashSet<>(); private BufferedImage transparentMarkedImage = null; @Override public BufferedImage getMarkedImage() { if (!marked) { markDiffPoints(diffImage); marked = true; } return diffImage; } @Override public BufferedImage getTransparentMarkedImage() { if (transparentMarkedImage == null) { transparentMarkedImage = getTransparentDiffImage(diffImage); markDiffPoints(transparentMarkedImage); } return transparentMarkedImage; } @Override public void addDiffPoint(int x, int y) { diffPoints.add(new Point(x, y)); } @Override public boolean equals(Object obj) { if (obj instanceof PointsMarkupPolicy) { PointsMarkupPolicy item = (PointsMarkupPolicy) obj; if (diffPoints.size() != item.diffPoints.size()) { return false; } Set<Point> referencedPoints = getDeposedPoints(); Set<Point> itemReferencedPoints = item.getDeposedPoints(); for (Point point : referencedPoints) { if(!itemReferencedPoints.contains(point)) { return false; } } return true; } return false; } @Override public int hashCode() { return getDeposedPoints().hashCode(); } @Override public boolean hasDiff() { return diffPoints.size() > diffSizeTrigger; } @Override public int getDiffSize() { return diffPoints.size(); } protected void markDiffPoints(BufferedImage image) { int rgb = diffColor.getRGB(); for (Point dot : diffPoints) { image.setRGB(dot.x, dot.y, rgb); } } private Set<Point> getDeposedPoints() { if (deposedPoints.isEmpty()) { deposedPoints = deposeReference(); } return deposedPoints; } private Point getReferenceCorner() { Iterator<Point> iterator = diffPoints.iterator(); Point diffPoint = iterator.next(); double x = diffPoint.getX(); double y = diffPoint.getY(); while(iterator.hasNext()) { diffPoint = iterator.next(); x = Math.min(x, diffPoint.getX()); y = Math.min(y, diffPoint.getY()); } return new Point((int) x, (int) y); } private Set<Point> deposeReference() { Point reference = getReferenceCorner(); Set<Point> referenced = new HashSet<>(); for (Point point : diffPoints) { referenced.add(new Point(point.x - reference.x, point.y - reference.y)); } return referenced; } }