2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.renderer.seqfeatures;
23 import jalview.api.FeatureRenderer;
24 import jalview.api.FeaturesDisplayedI;
25 import jalview.datamodel.SequenceI;
26 import jalview.util.Platform;
27 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
29 import java.awt.Color;
30 import java.awt.Graphics;
31 import java.awt.Graphics2D;
32 import java.awt.image.BufferedImage;
35 * A helper class to find feature colour using an associated FeatureRenderer
40 public class FeatureColourFinder
43 * the class we delegate feature finding to
45 private FeatureRenderer featureRenderer;
48 * a 1-pixel image on which features can be drawn, for the case where
49 * transparency allows 'see-through' of multiple feature colours
51 private BufferedImage offscreenImage;
53 private Graphics goff;
60 public FeatureColourFinder(FeatureRenderer fr)
63 offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
64 goff = offscreenImage.getGraphics();
68 * Answers the feature colour to show for the given sequence and column
69 * position. This delegates to the FeatureRenderer to find the colour, which
70 * will depend on feature location, visibility, ordering, colour scheme, and
71 * whether or not transparency is applied. For feature rendering with
72 * transparency, this class provides a dummy 'offscreen' graphics context
73 * where multiple feature colours can be overlaid and the combined colour read
76 * This method is not thread-safe when transparency is applied, since a shared
77 * BufferedImage would be used by all threads to hold the composite colour at
78 * a position. Each thread should use a separate instance of this class.
80 * @param defaultColour
83 * alignment column position (0..)
86 public Color findFeatureColour(Color defaultColour, SequenceI seq,
89 if (noFeaturesDisplayed())
97 * if transparency applies, provide a notional 1x1 graphics context
98 * that has been primed with the default colour
100 if (featureRenderer.getTransparency() != 1f)
103 if (defaultColour != null)
105 offscreenImage.setRGB(0, 0, defaultColour.getRGB());
109 Color c = featureRenderer.findFeatureColour(seq, column + 1, g);
112 return defaultColour;
117 c = new Color(offscreenImage.getRGB(0, 0));
123 * Answers true if feature display is turned off, or there are no features
124 * configured to be visible
128 public boolean noFeaturesDisplayed()
130 if (featureRenderer == null
131 || !featureRenderer.getViewport().isShowSequenceFeatures())
136 if (!((FeatureRendererModel) featureRenderer).hasRenderOrder())
141 FeaturesDisplayedI displayed = featureRenderer.getFeaturesDisplayed();
142 if (displayed == null || displayed.getVisibleFeatureCount() == 0)