X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2Fseqfeatures%2FFeatureColourFinder.java;h=8da880a60b01a9f07e433c402006e287daa248b2;hb=a83adb45bdf9554e270921b4baad94defd314b36;hp=9a1ecf9d7b8ba0e596331c8412a344824458b2f4;hpb=846f3f1ad573cad309d41356af68887a4a3348eb;p=jalview.git diff --git a/src/jalview/renderer/seqfeatures/FeatureColourFinder.java b/src/jalview/renderer/seqfeatures/FeatureColourFinder.java index 9a1ecf9..8da880a 100644 --- a/src/jalview/renderer/seqfeatures/FeatureColourFinder.java +++ b/src/jalview/renderer/seqfeatures/FeatureColourFinder.java @@ -1,5 +1,26 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview 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 3 + * of the License, or (at your option) any later version. + * + * Jalview 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 Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.renderer.seqfeatures; +import jalview.api.FeatureRenderer; import jalview.api.FeaturesDisplayedI; import jalview.datamodel.SequenceI; import jalview.viewmodel.seqfeatures.FeatureRendererModel; @@ -19,7 +40,7 @@ public class FeatureColourFinder /* * the class we delegate feature finding to */ - private jalview.api.FeatureRenderer featureRenderer; + private FeatureRenderer featureRenderer; /* * a 1-pixel image on which features can be drawn, for the case where @@ -27,15 +48,18 @@ public class FeatureColourFinder */ private BufferedImage offscreenImage; + private Graphics goff; + /** * Constructor * * @param fr */ - public FeatureColourFinder(jalview.api.FeatureRenderer fr) + public FeatureColourFinder(FeatureRenderer fr) { featureRenderer = fr; offscreenImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + goff = offscreenImage.getGraphics(); } /** @@ -46,45 +70,113 @@ public class FeatureColourFinder * transparency, this class provides a dummy 'offscreen' graphics context * where multiple feature colours can be overlaid and the combined colour read * back. + *

+ * This method is not thread-safe when transparency is applied, since a shared + * BufferedImage would be used by all threads to hold the composite colour at + * a position. Each thread should use a separate instance of this class. * * @param defaultColour * @param seq * @param column - * alignment column position (base zero) + * alignment column position (0..) * @return */ public Color findFeatureColour(Color defaultColour, SequenceI seq, int column) { - if (!((FeatureRendererModel) featureRenderer).hasRenderOrder()) + if (noFeaturesDisplayed()) { return defaultColour; } - FeaturesDisplayedI displayed = featureRenderer.getFeaturesDisplayed(); - if (displayed == null || displayed.getVisibleFeatureCount() == 0) + Graphics g = null; + + /* + * if transparency applies, provide a notional 1x1 graphics context + * that has been primed with the default colour + */ + if (featureRenderer.getTransparency() != 1f) + { + g = goff; + if (defaultColour != null) + { + offscreenImage.setRGB(0, 0, defaultColour.getRGB()); + } + } + + Color c = featureRenderer.findFeatureColour(seq, column + 1, g); + if (c == null) + { + return defaultColour; + } + + if (g != null) { - return defaultColour; // nothing to see here folks + c = new Color(offscreenImage.getRGB(0, 0)); } + return c; + } + + public int findFeatureColourInt(int defaultColour, SequenceI seq, + int column) + { + // if (noFeaturesDisplayed()) + // { + // return defaultColour; + // } Graphics g = null; /* - * if transparency applies, get colours drawn to a 1x1 pixel - * graphics context that has been primed with the default colour + * if transparency applies, provide a notional 1x1 graphics context + * that has been primed with the default colour */ if (featureRenderer.getTransparency() != 1f) { - g = offscreenImage.getGraphics(); - offscreenImage.setRGB(0, 0, defaultColour.getRGB()); + g = goff; + if (defaultColour != 0) + { + offscreenImage.setRGB(0, 0, defaultColour); + } } - Color c = featureRenderer.findFeatureColour(seq, column, g); + Color c = featureRenderer.findFeatureColour(seq, column + 1, g); + if (c == null) + { + return defaultColour; + } - if (c != null && g != null) + if (g != null) { - c = new Color(offscreenImage.getRGB(0, 0)); + return offscreenImage.getRGB(0, 0); } - return c == null ? defaultColour : c; + return c.getRGB(); + } + /** + * Answers true if feature display is turned off, or there are no features + * configured to be visible + * + * @return + */ + public boolean noFeaturesDisplayed() + { + if (featureRenderer == null + || !featureRenderer.getViewport().isShowSequenceFeatures()) + { + return true; + } + + if (!((FeatureRendererModel) featureRenderer).hasRenderOrder()) + { + return true; + } + + FeaturesDisplayedI displayed = featureRenderer.getFeaturesDisplayed(); + if (displayed == null || displayed.getVisibleFeatureCount() == 0) + { + return true; + } + + return false; } }