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.AlignViewportI;
24 import jalview.api.FeatureRenderer;
25 import jalview.api.FeaturesDisplayedI;
26 import jalview.datamodel.SequenceI;
27 import jalview.viewmodel.seqfeatures.FeatureRendererModel;
29 import java.awt.Color;
30 import java.awt.Graphics;
31 import java.awt.image.BufferedImage;
34 * A helper class to find feature colour using an associated FeatureRenderer
39 public class FeatureColourFinder
42 * the class we delegate feature finding to
44 private FeatureRenderer featureRenderer;
47 * a 1-pixel image on which features can be drawn, for the case where
48 * transparency allows 'see-through' of multiple feature colours
50 private BufferedImage offscreenImage;
57 public FeatureColourFinder(FeatureRenderer fr)
60 offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
64 * Answers the feature colour to show for the given sequence and column
65 * position. This delegates to the FeatureRenderer to find the colour, which
66 * will depend on feature location, visibility, ordering, colour scheme, and
67 * whether or not transparency is applied. For feature rendering with
68 * transparency, this class provides a dummy 'offscreen' graphics context
69 * where multiple feature colours can be overlaid and the combined colour read
72 * This method is not thread-safe when transparency is applied, since a shared
73 * BufferedImage would be used by all threads to hold the composite colour at
74 * a position. Each thread should use a separate instance of this class.
76 * @param defaultColour
79 * alignment column position (0..)
82 public Color findFeatureColour(Color defaultColour, SequenceI seq,
85 if (noFeaturesDisplayed())
93 * if transparency applies, provide a notional 1x1 graphics context
94 * that has been primed with the default colour
96 if (featureRenderer.getTransparency() != 1f)
98 g = offscreenImage.getGraphics();
99 if (defaultColour != null)
101 offscreenImage.setRGB(0, 0, defaultColour.getRGB());
105 Color c = featureRenderer.findFeatureColour(seq, column + 1, g);
108 return defaultColour;
113 c = new Color(offscreenImage.getRGB(0, 0));
119 * Answers true if feature display is turned off, or there are no features
120 * configured to be visible
124 boolean noFeaturesDisplayed()
126 if (featureRenderer == null)
130 AlignViewportI av = featureRenderer.getViewport();
131 if (av.isShowComplementFeatures())
135 if (!av.isShowSequenceFeatures())
140 if (!((FeatureRendererModel) featureRenderer).hasRenderOrder())
145 FeaturesDisplayedI displayed = featureRenderer.getFeaturesDisplayed();
146 if (displayed == null || displayed.getVisibleFeatureCount() == 0)