/* * org.openmicroscopy.shoola.util.roi.figures.MeasureMaskFigure * *------------------------------------------------------------------------------ * Copyright (C) 2006-2009 University of Dundee. All rights reserved. * * * 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 2 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, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.util.roi.figures; //Java imports import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; //Third-party libraries import org.jhotdraw.draw.FigureListener; //Application-internal dependencies import org.openmicroscopy.shoola.util.roi.model.annotation.MeasurementAttributes; import org.openmicroscopy.shoola.util.ui.drawingtools.figures.FigureUtil; /** * Mask with measurement * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Donald MacDonald      * <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a> * @version 3.0 * <small> * (<b>Internal version:</b> $Revision: $Date: $) * </small> * @since 3.0-Beta4 */ public class MeasureMaskFigure extends MeasureRectangleFigure implements ROIFigure { /** The BufferedImage of the Mask. */ protected BufferedImage mask; /** Flag indicating if the user can move or resize the shape.*/ private boolean interactable; /** Creates a new instance. */ public MeasureMaskFigure() { this(DEFAULT_TEXT); } /** * Creates a new instance. * @param text text of the ellipse. * */ public MeasureMaskFigure(String text) { this(text, 0, 0, 0, 0, null, false, true, true, true, true); } /** * Creates a new instance. * * @param x coordinate of the figure. * @param y coordinate of the figure. * @param width of the figure. * @param height of the figure. * */ public MeasureMaskFigure(double x, double y, double width, double height, BufferedImage mask) { this(DEFAULT_TEXT, x, y, width, height, mask, false, true, true, true, true); } /** * Creates a new instance. * * @param x coordinate of the figure. * @param y coordinate of the figure. * @param width of the figure. * @param height of the figure. * @param readOnly Is the figure read only. * @param clientObject the figure is a client object. * @param editable Flag indicating the figure can/cannot be edited. * @param deletable Flag indicating the figure can/cannot be deleted. * @param annotatable Flag indicating the figure can/cannot be annotated. * */ public MeasureMaskFigure(double x, double y, double width, double height, BufferedImage mask, boolean readOnly, boolean clientObject, boolean editable, boolean deletable, boolean annotatable) { this(DEFAULT_TEXT, x, y, width, height, mask, readOnly, clientObject, editable, deletable, annotatable); } /** * Creates a new instance. * * @param text text of the ellipse. * @param x coordinate of the figure. * @param y coordinate of the figure. * @param width of the figure. * @param height of the figure. * @param readOnly the figure is readOnly * @param clientObject the figure is a client object * */ public MeasureMaskFigure(String text, double x, double y, double width, double height, BufferedImage mask, boolean readOnly, boolean clientObject, boolean editable, boolean deletable, boolean annotatable) { super(text, x, y, width, height, readOnly, clientObject, editable, deletable, annotatable); setAttribute(MeasurementAttributes.FONT_FACE, DEFAULT_FONT); setAttribute(MeasurementAttributes.FONT_SIZE, new Double(FONT_SIZE)); setMask(mask); interactable = true; } /** * Set the mask of the maskFigure to the mask parameter. * @param mask See above. */ public void setMask(BufferedImage mask) { if (mask == null) throw new IllegalArgumentException("No Mask"); this.mask = mask; } /** * get the mask of the maskFigure. * return See above. */ public BufferedImage getMask() { return mask; } /** * Implemented as specified by the {@link ROIFigure} interface. * @see ROIFigure#getType() */ public String getType() { return FigureUtil.MASK_TYPE; } /** * Draws the image. * @see #draw(Graphics2D) */ public void draw(Graphics2D g) { g.drawImage(mask, (int) getX(), (int) getY(), (int) getWidth(), (int) getHeight(), null); } /** * Has the mask got a pixel. * @param rgb * @return */ private boolean hasColour(int rgb) { Color toColor = new Color(rgb); return (toColor.getAlpha() != 0); } /** * Implemented as specified by the {@link ROIFigure} interface. * @see ROIFigure#getPoints() */ public List<Point> getPoints() { Rectangle r = rectangle.getBounds(); List<Point> vector = new ArrayList<Point>(r.height*r.width); int xEnd = r.x+r.width, yEnd = r.y+r.height; int x, y; for (y = r.y; y < yEnd; ++y) for (x = r.x; x < xEnd; ++x) if (hasColour(mask.getRGB(x-r.x,y-r.y))) vector.add(new Point(x, y)); return vector; } /** * Implemented as specified by the {@link ROIFigure} interface. * @see ROIFigure#getSize() */ public int getSize() { Rectangle r = rectangle.getBounds(); int total = 0; int xEnd = r.x+r.width, yEnd = r.y+r.height; int x, y; for (y = r.y; y < yEnd; ++y) for (x = r.x; x < xEnd; ++x) if (hasColour(mask.getRGB(x-r.x,y-r.y))) total++; return total; } /** * Clones the mask. * @see MeasureMaskFigure#clone() */ public MeasureMaskFigure clone() { MeasureMaskFigure that = (MeasureMaskFigure) super.clone(); that.setReadOnly(this.isReadOnly()); that.setClientObject(this.isClientObject()); that.setObjectDirty(true); that.setMask(this.getMask()); that.setInteractable(true); return that; } /** * Implemented as specified by the {@link ROIFigure} interface * @see ROIFigure#getFigureListeners() */ public List<FigureListener> getFigureListeners() { List<FigureListener> figListeners = new ArrayList<FigureListener>(); Object[] listeners = listenerList.getListenerList(); for (Object listener : listeners) if (listener instanceof FigureListener) figListeners.add((FigureListener)listener); return figListeners; } /** * Implemented as specified by the {@link ROIFigure} interface * @see ROIFigure#setInteractable(boolean) */ public void setInteractable(boolean interactable) { this.interactable = interactable; } /** * Implemented as specified by the {@link ROIFigure} interface * @see ROIFigure#canInteract() */ public boolean canInteract() { return interactable; } }