/*
* #%L
* gitools-ui-platform
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.platform.imageviewer;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
/**
* An overlay is a layer on top of an image. It can be used to add annotations, arbitrary
* shapes to an image. Drawing is implemented in the <code>paint</code> method.
* <p/>
* The following is an implementation of a simple example overlay that draws a cross over
* the image:
* <pre>
*
* class XPainter extends Overlay {
* public void paint(Graphics2D g, BufferedImage image, AffineTransform transform) {
* g.setColor(Color.RED);
* double[] bounds={
* 0, 0,
* image.getWidth(), 0,
* image.getWidth(), image.getHeight(),
* 0, image.getHeight()};
* transform.transform(bounds, 0, bounds, 0, 4);
* g.drawLine((int)bounds[0], (int)bounds[1], (int)bounds[4], (int)bounds[5]);
* g.drawLine((int)bounds[2], (int)bounds[3], (int)bounds[6], (int)bounds[7]);
* }
* }
* </pre>
* It can be added to a viewer by calling <code>viewer.addOverlay(new XPainter(), 10)</code>.
*
* @author Kazó Csaba
*/
public abstract class Overlay {
List<OverlayComponent> overlayComponents = new ArrayList<>(1);
final void addOverlayComponent(OverlayComponent c) {
overlayComponents.add(c);
}
final void removeOverlayComponent(OverlayComponent c) {
overlayComponents.remove(c);
}
/**
* Causes the overlay to be repainted.
*/
public void repaint() {
for (OverlayComponent overlayComponent : overlayComponents)
overlayComponent.repaint();
}
/**
* Called to paint the contents of this overlay. The graphics context to paint on is a copy
* for this overlay and can be freely modified.
* <p/>
* The method receives the currently displayed image. The image is never <code>null</code> -
* if there is currently no image being displayed in the image viewer, then the
* <code>paint</code> method is not called.
* <p/>
* This method also receives the transformation that is applied to the image before it
* is displayed. This transformation is most commonly the concatenation of a uniform scale
* and a translation. The original image bounds (0, 0)
* - (image.getWidth(), image.getHeight()) are mapped using this transformation to get the
* final display bounds. The overlay should not rely on whether painting outside these
* final bounds will be visible or not.
*
* @param g the graphics context to draw onto
* @param image the current image
* @param transform the transformation applied to the image before displaying
*/
public abstract void paint(Graphics2D g, BufferedImage image, AffineTransform transform);
}