/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2015 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.agents.metadata.rnd;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.util.List;
import java.util.Map;
import javax.swing.JComponent;
import omero.model.Length;
import omero.romio.PlaneDef;
import org.openmicroscopy.shoola.agents.util.ViewedByItem;
import omero.gateway.exception.DSOutOfServiceException;
import omero.gateway.exception.RenderingServiceException;
import org.openmicroscopy.shoola.env.rnd.RenderingControl;
import org.openmicroscopy.shoola.env.rnd.RndProxyDef;
import org.openmicroscopy.shoola.env.rnd.data.ResolutionLevel;
import org.openmicroscopy.shoola.util.file.modulo.ModuloInfo;
import org.openmicroscopy.shoola.util.ui.component.ObservableComponent;
import omero.gateway.model.ChannelData;
import omero.gateway.model.ImageData;
import omero.gateway.model.PixelsData;
/**
* Defines the interface provided by the renderer component.
* The Renderer provides a top-level component hosting the rendering controls.
*
* @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
* @since 3.0-Beta4
*/
public interface Renderer
extends ObservableComponent
{
/** Identifies the <code>red</code> color band. */
public static final int RED_BAND = 0;
/** Identifies the <code>green</code> color band. */
public static final int GREEN_BAND = 1;
/** Identifies the <code>blue</code> color band. */
public static final int BLUE_BAND = 2;
/** The value after which no ticks are displayed. */
public static final int MAX_NO_TICKS = 10;
/** Identifies the grey scale color model. */
public static final String GREY_SCALE_MODEL = RenderingControl.GREY_SCALE;
/** Identifies the RGB color model. */
public static final String RGB_MODEL = RenderingControl.RGB;
/**
* The maximum number of channels before displaying the channels
* buttons slider.
*/
public static final int MAX_CHANNELS = RenderingControl.MAX_CHANNELS;
/**
* Bound property name indicating to render the plane with the
* new rendering settings.
*/
public final static String RENDER_PLANE_PROPERTY = "renderPlane";
/** Bound property name indicating that a new channel is selected. */
public final static String SELECTED_CHANNEL_PROPERTY = "selectedChannel";
/**
* Bound property indicating that the pixels intensity interval is
* modified.
*/
public final static String INPUT_INTERVAL_PROPERTY = "inputInterval";
/** Bound property indicating that the range to deal with has changed. */
public final static String RANGE_INPUT_PROPERTY = "rangeInput";
/** Bound property indicating that the color model has changed. */
public final static String COLOR_MODEL_PROPERTY = "colorModel";
/** Bound property name indicating that a new z-section is selected. */
public final static String Z_SELECTED_PROPERTY = "zSelected";
/** Bound property name indicating that a new time-point is selected. */
public final static String T_SELECTED_PROPERTY = "tSelected";
/**
* Bound property name indicating to apply the rendering settings
* to all selected or displayed images.
*/
public final static String APPLY_TO_ALL_PROPERTY = "applyToAll";
/** Bound property indicating that the color of a channel has changed. */
public static final String CHANNEL_COLOR_PROPERTY = "channelColor";
/** Bound property indicating to reload the rendering engine. */
public static final String RELOAD_PROPERTY = "Reload";
/** Bound property indicating to load the rendering settings. */
public static final String VIEWED_BY_PROPERTY = "ViewedBy";
/**
* Bound property indicating that the rendering settings have been
* saved.
*/
public static final String SAVE_SETTINGS_PROPERTY = "saveSettings";
/**
* Bound property indicating that the rendering settings have been
* copied.
*/
public static final String COPY_SETTINGS_PROPERTY = "copySettings";
/**
* Sets the pixels intensity interval for the
* currently selected channel.
*
* @param s The lower bound of the interval.
* @param e The upper bound of the interval.
*/
void setInputInterval(double s, double e);
/**
* Sets the sub-interval of the device space.
*
* @param s The lower bound of the interval.
* @param e The upper bound of the interval.
*/
void setCodomainInterval(int s, int e);
/**
* Sets the bit resolution and updates the image.
*
* @param v The new bit resolution.
*/
void setBitResolution(int v);
/**
* Sets the selected channel. This method is invoked when
* the channel has been selected from the viewer.
*
* @param index The index of the selected channel.
*/
void setSelectedChannel(int index);
/**
* Sets the family and updates the image.
*
* @param channel The channel to handle.
* @param family The new family value.
*/
void setFamily(int channel, String family);
/**
* Sets the coefficient identifying a curve in the family
* and updates the image.
*
* @param channel The channel to handle.
* @param k The new curve coefficient.
*/
void setCurveCoefficient(int channel, double k);
/**
* Sets the noise reduction flag to select the mapping algorithm
* and updates the image.
*
* @param b The noise reduction flag.
*/
void setNoiseReduction(boolean b);
/**
* Returns the <code>Codomain map context</code> corresponding to
* the specified class.
*
* @param mapType The class identifying the context.
* @return See above.
*/
//CodomainMapContext getCodomainMapContext(Class mapType);
/**
* Fired if the color model has been changed from RGB -> Greyscale or
* vice versa.
*/
void setColorModelChanged();
/**
* Returns the current state.
*
* @return See above
*/
public int getState();
/** Closes and disposes. */
public void discard();
/**
* Returns the lower bound of the pixels intensity interval for the
* currently selected channel.
*
* @return See above.
*/
public double getWindowStart();
/**
* Returns the upper bound of the pixels intensity interval for the
* currently selected channel.
*
* @return See above.
*/
public double getWindowEnd();
/**
* Returns the global minimum for the currently selected channel.
*
* @return See above.
*/
public double getGlobalMin();
/**
* Returns the global maximum for the currently selected channel.
*
* @return See above.
*/
public double getGlobalMax();
/**
* Returns the global minimum for the currently selected channel.
*
* @return See above.
*/
public double getLowestValue();
/**
* Returns the global maximum for the currently selected channel.
*
* @return See above.
*/
public double getHighestValue();
/**
* Returns the {@link RendererUI View}.
*
* @return See above.
*/
public JComponent getUI();
/**
* Invokes when the state of the viewer has changed.
*
* @param b Pass <code>true</code> to enable the UI components,
* <code>false</code> otherwise.
*/
public void onStateChange(boolean b);
/**
* Indicates that a channel has been selected using the channel button.
*
* @param index The index of the channel.
* @param active Pass <code>true</code> to indicate that the channel is
* active, <code>false</code> otherwise.
*/
void setChannelSelection(int index, boolean active);
/**
* Sets the color of the specified channel depending on the current color
* model.
*
* @param index The index of the channel.
* @param color The color to set.
* @param preview Pass <code>true</code> to indicate that it is a color
* preview, <code>false</code> otherwise.
*/
void setChannelColor(int index, Color color, boolean preview);
/**
* Sets the color model.
*
* @param index One of the constants defined by this class.
* @param update Flag indicating to fire a property change
* indicating to update the image.
*/
void setColorModel(String index, boolean update);
/**
* Returns the color model.
*
* @return See above.
*/
String getColorModel();
/**
* Sets the selected XY-plane. A new plane is then rendered.
*
* @param z The selected z-section.
* @param t The selected timepoint.
* @param bin The selected bin, only used for lifetime.
*/
void setSelectedXYPlane(int z, int t, int bin);
/** Applies the rendering settings to the selected or displayed images. */
void applyToAll();
/**
* Notifies that the rendering settings have been applied.
*
* @param rndControl The rendering control to reset.
*/
void onSettingsApplied(RenderingControl rndControl);
/**
* Notifies that the rendering settings have been copied.
*/
void onSettingsCopied();
/**
* Returns the sizeX.
*
* @return See above.
*/
int getPixelsDimensionsX();
/**
* Returns the sizeY.
*
* @return See above.
*/
int getPixelsDimensionsY();
/**
* Returns the maximum number of z-sections.
*
* @return See above.
*/
int getPixelsDimensionsZ();
/**
* Returns the maximum number of timepoints.
*
* @return See above.
*/
int getPixelsDimensionsT();
/**
* Returns the number of channels.
*
* @return See above.
*/
int getPixelsDimensionsC();
/**
* Returns the currently selected z-section.
*
* @return See above.
*/
int getDefaultZ();
/**
* Returns the currently selected timepoint.
*
* @return See above.
*/
int getDefaultT();
/**
* Returns a sorted unmodifiable list of {@link ChannelData}s.
*
* @return See above
*/
List<ChannelData> getChannelData();
/**
* Returns the color associated to a channel.
*
* @param index The index of the channel.
* @return See above.
*/
Color getChannelColor(int index);
/**
* Returns <code>true</code> if the channel is mapped, <code>false</code>
* otherwise.
*
* @param w The channel's index.
* @return See above.
*/
boolean isChannelActive(int w);
/**
* Returns a list of active channels.
*
* @return See above.
*/
List<Integer> getActiveChannels();
/**
* Returns the size of a pixel along the X-axis.
*
* @return See above.
*/
Length getPixelsSizeX();
/**
* Returns the size of a pixel along the Y-axis.
*
* @return See above.
*/
Length getPixelsSizeY();
/**
* Returns the size of a pixel along the Y-axis.
*
* @return See above.
*/
Length getPixelsSizeZ();
/**
* Returns a 3-dimensional array of boolean value, one per color band.
* The first (resp. second, third) element is set to <code>true</code>
* if an active channel is mapped to <code>RED</code> (resp.
* <code>GREEN</code>, <code>BLUE</code>), to <code>false</code> otherwise.
*
* @return See above
*/
boolean[] hasRGB();
/**
* Returns <code>true</code> if the channel is mapped
* to <code>Red</code> if the band is {@link #RED_BAND},
* to <code>Green</code> if the band is {@link #GREEN_BAND},
* to <code>Blue</code> if the band is {@link #BLUE_BAND},
* <code>false</code> otherwise.
*
* @param band The color band.
* @param index The index of the channel.
* @return See above.
*/
boolean isColorComponent(int band, int index);
/**
* Returns a copy of the current rendering settings.
*
* @return See above.
*/
RndProxyDef getRndSettingsCopy();
/**
* Resets the rendering settings.
*
* @param settings The settings to reset.
* @param update Pass <code>true</code> to update the image,
* <code>false</code> otherwise.
*/
void resetSettings(RndProxyDef settings, boolean update);
/** Resets the default settings. */
void resetSettings();
/** Sets the original default settings. */
void setOriginalRndSettings();
/**
* Undoes the last change to the rendering settings
*/
void historyBack();
/**
* Redoes the previous change to the rendering settings
*/
void historyForward();
/**
* Stores the current rendering settings in the history
*/
void makeHistorySnapshot();
/**
* Returns <code>true</code> if the passed set of pixels is compatible
* with the pixels set currently rendered.
*
* @param pixels The pixels set to check.
* @return See above.
*/
boolean validatePixels(PixelsData pixels);
/**
* Returns <code>true</code> if the image is compressed,
* <code>false</code> otherwise.
*
* @return See above.
*/
boolean isCompressed();
/**
* Saves the rendering settings and returns the saved object.
*
* @return See above
* @throws RenderingServiceException If an error occurred while setting
* the value.
* @throws DSOutOfServiceException If the connection is broken.
*/
RndProxyDef saveCurrentSettings()
throws RenderingServiceException, DSOutOfServiceException;
/** Fires a property to indicate to save the settings. */
void saveSettings();
/**
* Sets the compression level.
*
* @param compressionLevel One of the compression level defined by
* {@link RenderingControl} I/F.
*/
void setCompression(int compressionLevel);
/**
* Returns the compression level.
*
* @return See above.
*/
int getCompressionLevel();
/**
* Returns <code>true</code> if the passed rendering settings are the same
* that the current one, <code>false</code> otherwise.
*
* @param def The settings to check.
* @param checkPlane Pass <code>true</code> to take into account the
* z-section and time-point, <code>false</code> otherwise.
* @return See above.
*/
boolean isSameSettings(RndProxyDef def, boolean checkPlane);
/**
* Turns on or off the specified channel.
*
* @param index The index of the channel
* @param active Pass <code>true</code> to turn the channel on,
* <code>false</code> to turn it off.
*/
void setActive(int index, boolean active);
/**
* Sets the interval of the pixels intensity values to map.
*
* @param index The index of the channel
* @param start The lower bound of the interval.
* @param end The upper bound of the interval.
*/
void setChannelWindow(int index, double start, double end);
/**
* Checks if the image pixel type is integer
* @return See above
*/
boolean isIntegerPixelData();
/**
* Renders the specified plane.
*
* @param pDef The plane to render.
* @param compression The compression level.
* @return See above.
*/
BufferedImage renderPlane(PlaneDef pDef, int compression);
/**
* Renders the specified plane.
*
* @param pDef The plane to render.
* @return See above.
*/
BufferedImage renderPlane(PlaneDef pDef);
/**
* Sets the maximum range for channels.
*
* @param absolute Pass <code>true</code> to set it to the absolute value,
* <code>false</code> to the minimum and maximum.
*/
void setRangeAllChannels(boolean absolute);
/**
* Returns <code>true</code> if the passed channels compose an RGB image,
* <code>false</code> otherwise.
*
* @param channels The collection of channels to handle.
* @return See above.
*/
boolean isMappedImageRGB(List channels);
/**
* Creates an image with only the passed channel turned on.
* All active channels will turn off then back on when the has been created.
*
* @param color Pass <code>true</code> for a color image,
* <code>false</code> for a greyscale image.
* @param channel The channel to handle.
* @param pDef The plane to render.
* @return See above.
*/
BufferedImage createSingleChannelImage(boolean color, int channel,
PlaneDef pDef);
/**
* Sets the overlays.
*
* @param tableID The id of the table.
* @param overlays The overlays to set, or <code>null</code> to turn
* the overlays off.
*/
public void setOverlays(long tableID, Map<Long, Integer> overlays);
/** Refreshes the renderer view. */
public void refresh();
/**
* Renders and displays the rendered image in the preview.
* Invokes only when the renderer is used for general purpose.
*/
public void renderPreview();
/**
* Returns the image or <code>null</code>.
*
* @return See above.
*/
ImageData getRefImage();
/**
* Returns the initial rendering settings.
*
* @return See above.
*/
RndProxyDef getInitialRndSettings();
/**
* Retrieves the rendering settings set by other users.
*/
void retrieveRelatedSettings();
/**
* Indicates that the rendering settings are being loaded if
* the passed value is <code>true</code>, loaded if <code>false</code>.
*
* @param loading Pass <code>true</code> to indicate that the settings are
* being loaded, <code>false</code> when loaded.
* @param results The list of objects displaying the rendering settings
* and the associated images.
*/
void loadRndSettings(boolean loading, List<ViewedByItem> results);
/**
* Returns the size of a tile.
*
* @return See above.
*/
Dimension getTileSize();
/**
* Returns the possible resolution levels. This method should only be used
* when dealing with large images.
*
* @return See above.
*/
int getResolutionLevels();
/**
* Returns the currently selected resolution level. This method should only
* be used when dealing with large images.
*
* @return See above.
*/
int getSelectedResolutionLevel();
/**
* Sets resolution level. This method should only be used when dealing with
* large images.
*
* @param level The value to set.
*/
void setSelectedResolutionLevel(int level);
/**
* Returns <code>true</code> if it is a large image,
* <code>false</code> otherwise.
*
* @return See above.
*/
boolean isBigImage();
/** Posts an event to view the image.*/
void viewImage();
/**
* Invokes when the channels have been modified. Updates the values
* displayed in the measurement tool.
*
* @param channels The channels to handle.
*/
void onUpdatedChannels(List<ChannelData> channels);
/**
* Returns <code>true</code> if the object can be annotated,
* <code>false</code> otherwise, depending on the permission.
*
* @return See above.
*/
boolean canAnnotate();
/**
* Returns the collection of rendering controls. This method should only
* be invoked when loading tiles.
*
* @return See above.
*/
List<RenderingControl> getRenderingControls();
/**
* Returns the list of the levels.
*
* @return See above.
*/
List<ResolutionLevel> getResolutionDescriptions();
/**
* Returns the currently selected time-point.
*
* @return See above.
*/
int getRealSelectedT();
/**
* Returns the number of time points if modulo available.
*
* @return See above.
*/
int getRealT();
/**
* Returns the number of bins per time interval.
*
* @return See above
*/
int getMaxLifetimeBin();
/**
* Returns the selected bin for lifetime image.
*
* @return See above.
*/
int getSelectedBin();
/**
* Returns <code>true</code> if the image is a lifetime image,
* <code>false</code> otherwise.
*
* @return See above.
*/
boolean isLifetimeImage();
/**
* Returns the modulo info if it exists.
*
* @return See above.
*/
ModuloInfo getModuloT();
/**
* Returns <code>true</code> if the rendering settings
* have been modified
*
* @return See above.
*/
boolean isModified();
/**
* Enables/Disables the paste action
*/
void updatePasteAction();
/**
* Returns the selected rendering settings under "User Settings".
* @return See above.
*/
RndProxyDef getSelectedDef();
}