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.viewmodel.seqfeatures.FeatureRendererModel;
28 import java.awt.Color;
29 import java.awt.Graphics;
30 import java.awt.image.BufferedImage;
33 * A helper class to find feature colour using an associated FeatureRenderer
38 public class FeatureColourFinder
41 * the class we delegate feature finding to
43 private FeatureRenderer featureRenderer;
46 * a 1-pixel image on which features can be drawn, for the case where
47 * transparency allows 'see-through' of multiple feature colours
49 private BufferedImage offscreenImage;
56 public FeatureColourFinder(FeatureRenderer fr)
59 offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
63 * Answers the feature colour to show for the given sequence and column
64 * position. This delegates to the FeatureRenderer to find the colour, which
65 * will depend on feature location, visibility, ordering, colour scheme, and
66 * whether or not transparency is applied. For feature rendering with
67 * transparency, this class provides a dummy 'offscreen' graphics context
68 * where multiple feature colours can be overlaid and the combined colour read
71 * This method is not thread-safe when transparency is applied, since a shared
72 * BufferedImage would be used by all threads to hold the composite colour at
73 * a position. Each thread should use a separate instance of this class.
75 * @param defaultColour
78 * alignment column position (0..)
81 public Color findFeatureColour(Color defaultColour, SequenceI seq,
84 if (noFeaturesDisplayed())
92 * if transparency applies, provide a notional 1x1 graphics context
93 * that has been primed with the default colour
95 if (featureRenderer.getTransparency() != 1f)
97 g = offscreenImage.getGraphics();
98 if (defaultColour != null)
100 offscreenImage.setRGB(0, 0, defaultColour.getRGB());
104 Color c = featureRenderer.findFeatureColour(seq, column + 1, g);
107 return defaultColour;
112 c = new Color(offscreenImage.getRGB(0, 0));
118 * Answers true if feature display is turned off, or there are no features
119 * configured to be visible
123 boolean noFeaturesDisplayed()
125 if (featureRenderer == null
126 || !featureRenderer.getViewport().isShowSequenceFeatures())
131 if (!((FeatureRendererModel) featureRenderer).hasRenderOrder())
136 FeaturesDisplayedI displayed = featureRenderer.getFeaturesDisplayed();
137 if (displayed == null || displayed.getVisibleFeatureCount() == 0)