X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FContactMapRenderer.java;h=9a295f98262d597ea7f6c86cca77e6c0f73e2899;hb=8b5ae15a094b5a90238bfe39ce10310ed92184d1;hp=04711458332fe89efcb67693caa501975f56af66;hpb=a50364b26e0ab302562f6c99dcf29ccbe54aa67d;p=jalview.git diff --git a/src/jalview/renderer/ContactMapRenderer.java b/src/jalview/renderer/ContactMapRenderer.java index 0471145..9a295f9 100644 --- a/src/jalview/renderer/ContactMapRenderer.java +++ b/src/jalview/renderer/ContactMapRenderer.java @@ -1,11 +1,31 @@ -/** +/* + * 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; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; -import java.util.Iterator; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.Stroke; import jalview.api.AlignViewportI; import jalview.datamodel.AlignmentAnnotation; @@ -35,10 +55,12 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI * shown when no data available from map */ Color no_data; + /** * shown for region not currently visible - should normally not see this */ Color hidden; + /** * linear shading scheme min/max */ @@ -49,6 +71,21 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI */ Color selMinColor, selMaxColor; + /** + * + * @param no_data + * - colour when no data available + * @param hidden + * - colour if this row is hidden + * @param maxColor + * - colour for maximum value of contact + * @param minColor + * - colour for minimum value of contact + * @param selMinColor + * - min colour if the contact has been selected + * @param selMaxColor + * - max colour if contact is selected + */ public Shading(Color no_data, Color hidden, Color maxColor, Color minColor, Color selMinColor, Color selMaxColor) { @@ -79,8 +116,8 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI { return new Shading(Color.pink, Color.red, - new Color(246, 252, 243), new Color(0, 60, 26), - new Color(26, 0, 60), new Color(243, 246, 252)); + new Color(247, 252, 245), new Color(0, 68, 28), + new Color(28, 0, 68), new Color(245, 247, 252)); } }; } @@ -101,8 +138,8 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI boolean hasHiddenColumns, AlignViewportI viewport, HiddenColumns hiddenColumns, ColumnSelection columnSelection, AlignmentAnnotation _aa, Annotation[] aa_annotations, int sRes, - int eRes, float min, float max, int y) - { + int eRes, float min, float max, int y, boolean isVectorRendering) + { if (sRes > aa_annotations.length) { return; @@ -113,12 +150,21 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI // uncomment below to render whole area of matrix as pink // g.setColor(shade.no_data); - // g.fillRect(x, topY-_aa.height, (eRes - sRes) * charWidth, _aa.graphHeight); - + // g.fillRect(x, topY-_aa.height, (eRes - sRes) * charWidth, + // _aa.graphHeight); + boolean showGroups = _aa.isShowGroupsForContactMatrix(); int column; int aaMax = aa_annotations.length - 1; ContactMatrixI cm = viewport.getContactMatrix(_aa); + if (cm == null) + { + return; + } + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_OFF); + g2d.setStroke(thinRectangularLineStroke); while (x < eRes - sRes) { column = sRes + x; @@ -169,14 +215,14 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI for (int ht = 0, botY = topY - _aa.height; ht < _aa.graphHeight; ht += cgeom.pixels_step) { - ContactGeometry.contactInterval ci = cgeom.mapFor(ht, - ht + cgeom.pixels_step); + ContactGeometry.contactInterval ci = cgeom.mapFor(ht); // cstart = (int) Math.floor(((double) y2 - ht) * contacts_per_pixel); // cend = (int) Math.min(contact_height, // Math.ceil(cstart + contacts_per_pixel * pixels_step)); Color col; - boolean rowsel = false, containsHidden = false; + boolean rowsel = false; + boolean containsHidden = false; if (columnSelection != null) { rowsel = cgeom.intersects(ci, columnSelection, hiddenColumns, @@ -208,20 +254,20 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI if (showGroups && gpcol != null && gpcol != Color.white) { // todo - could overlay group as a transparent rectangle ? - col = new Color( - (int) (((float) (col.getRed() + gpcol.getRed())) / 2f), - (int) (((float) (col.getGreen() + gpcol.getGreen())) - / 2f), - (int) (((float) (col.getBlue() + gpcol.getBlue())) / 2f)); + col = new Color((int) ((col.getRed() + gpcol.getRed()) / 2f), + (int) ((col.getGreen() + gpcol.getGreen()) / 2f), + (int) ((col.getBlue() + gpcol.getBlue()) / 2f)); } g.setColor(col); - if (cgeom.pixels_step > 1) + if (isVectorRendering || cgeom.pixels_step > 1) { - g.fillRect(x * charWidth, botY+ht, charWidth, 1 + cgeom.pixels_step); + g2d.fillRect(x * charWidth, botY + ht, charWidth, + cgeom.pixels_step); } else { - g.drawLine(x * charWidth, botY+ht, (x + 1) * charWidth, botY+ht); + g2d.drawLine(x * charWidth, botY + ht, (x + 1) * charWidth - 1, + botY + ht); } } x++; @@ -229,6 +275,9 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI } + private static Stroke thinRectangularLineStroke = new BasicStroke(1, + BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); + Color shadeFor(float min, float max, float value) { return jalview.util.ColorUtils.getGraduatedColour(value, 0, @@ -248,7 +297,7 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI { ContactRange cr = cl.getRangeFor(i, j); // average for moment - probably more interested in maxIntProj though - return jalview.util.ColorUtils.getGraduatedColour((float) cr.getMean(), + return jalview.util.ColorUtils.getGraduatedColour((float) cr.getMin(), 0, shade.selMinColor, max, shade.selMaxColor); }