X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FAnnotationRenderer.java;h=eb83f31945e3cc5f6f0f61a253cb8bd4dbd7ba1a;hb=fbfbbe26bee37143d5279fe4d254a5a89c96b021;hp=0aeb45ab8b511a8387c9c8cee0b6394a4261b965;hpb=7dd4345867987ee35d061be13ca3ad37bc179b94;p=jalview.git diff --git a/src/jalview/renderer/AnnotationRenderer.java b/src/jalview/renderer/AnnotationRenderer.java index 0aeb45a..eb83f31 100644 --- a/src/jalview/renderer/AnnotationRenderer.java +++ b/src/jalview/renderer/AnnotationRenderer.java @@ -25,12 +25,13 @@ import jalview.analysis.CodingUtils; import jalview.analysis.Rna; import jalview.analysis.StructureFrequency; import jalview.api.AlignViewportI; -import jalview.bin.Jalview; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.datamodel.ColumnSelection; import jalview.datamodel.HiddenColumns; import jalview.datamodel.ProfilesI; +import jalview.renderer.api.AnnotationRendererFactoryI; +import jalview.renderer.api.AnnotationRowRendererI; import jalview.schemes.ColourSchemeI; import jalview.schemes.NucleotideColourScheme; import jalview.schemes.ResidueProperties; @@ -68,7 +69,7 @@ public class AnnotationRenderer private FontMetrics fm; - private final boolean MAC = Platform.isAMac(); + private final boolean USE_FILL_ROUND_RECT = Platform.isAMacAndNotJS(); boolean av_renderHistogram = true, av_renderProfile = true, av_normaliseProfile = false; @@ -81,9 +82,9 @@ public class AnnotationRenderer private ProfilesI hconsensus; - private Hashtable[] complementConsensus; + private Hashtable[] complementConsensus; - private Hashtable[] hStrucConsensus; + private Hashtable[] hStrucConsensus; private boolean av_ignoreGapsConsensus; @@ -150,11 +151,13 @@ public class AnnotationRenderer */ public void dispose() { + hiddenColumns = null; hconsensus = null; complementConsensus = null; hStrucConsensus = null; fadedImage = null; annotationPanel = null; + rendererFactoryI = null; } void drawStemAnnot(Graphics g, Annotation[] row_annotations, int lastSSX, @@ -313,6 +316,7 @@ public class AnnotationRenderer useClip = false; } + rendererFactoryI = AnnotationRendererFactory.getRendererFactory(); updateFromAlignViewport(av); } @@ -419,6 +423,8 @@ public class AnnotationRenderer boolean rna = false; + private AnnotationRendererFactoryI rendererFactoryI; + /** * Render the annotation rows associated with an alignment. * @@ -449,7 +455,7 @@ public class AnnotationRenderer updateFromAwtRenderPanel(annotPanel, av); fm = g.getFontMetrics(); AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation(); - int temp = 0; + // int temp = 0; if (aa == null) { return false; @@ -462,8 +468,8 @@ public class AnnotationRenderer boolean validRes = false; boolean validEnd = false; boolean labelAllCols = false; - boolean centreColLabels; - boolean centreColLabelsDef = av.isCentreColumnLabels(); + // boolean centreColLabels; + // boolean centreColLabelsDef = av.isCentreColumnLabels(); boolean scaleColLabel = false; final AlignmentAnnotation consensusAnnot = av .getAlignmentConsensusAnnotation(); @@ -471,8 +477,6 @@ public class AnnotationRenderer .getAlignmentStrucConsensusAnnotation(); final AlignmentAnnotation complementConsensusAnnot = av .getComplementConsensusAnnotation(); - boolean renderHistogram = true, renderProfile = true, - normaliseProfile = false, isRNA = rna; BitSet graphGroupDrawn = new BitSet(); int charOffset = 0; // offset for a label @@ -483,38 +487,35 @@ public class AnnotationRenderer for (int i = 0; i < aa.length; i++) { AlignmentAnnotation row = aa[i]; - isRNA = row.isRNA(); + boolean renderHistogram = true; + boolean renderProfile = false; + boolean normaliseProfile = false; + boolean isRNA = row.isRNA(); + + // check if this is a consensus annotation row and set the display + // settings appropriately + // TODO: generalise this to have render styles for consensus/profile + // data + if (row.groupRef != null && row == row.groupRef.getConsensus()) { - // check if this is a consensus annotation row and set the display - // settings appropriately - // TODO: generalise this to have render styles for consensus/profile - // data - if (row.groupRef != null && row == row.groupRef.getConsensus()) - { - renderHistogram = row.groupRef.isShowConsensusHistogram(); - renderProfile = row.groupRef.isShowSequenceLogo(); - normaliseProfile = row.groupRef.isNormaliseSequenceLogo(); - } - else if (row == consensusAnnot || row == structConsensusAnnot - || row == complementConsensusAnnot) - { - renderHistogram = av_renderHistogram; - renderProfile = av_renderProfile; - normaliseProfile = av_normaliseProfile; - } - else - { - renderHistogram = true; - // don't need to set render/normaliseProfile since they are not - // currently used in any other annotation track renderer - } + renderHistogram = row.groupRef.isShowConsensusHistogram(); + renderProfile = row.groupRef.isShowSequenceLogo(); + normaliseProfile = row.groupRef.isNormaliseSequenceLogo(); + } + else if (row == consensusAnnot || row == structConsensusAnnot + || row == complementConsensusAnnot) + { + renderHistogram = av_renderHistogram; + renderProfile = av_renderProfile; + normaliseProfile = av_normaliseProfile; } + Annotation[] row_annotations = row.annotations; if (!row.visible) { continue; } - centreColLabels = row.centreColLabels || centreColLabelsDef; + // centreColLabels = row.centreColLabels || centreColLabelsDef; labelAllCols = row.showAllColLabels; scaleColLabel = row.scaleColLabel; lastSS = ' '; @@ -651,7 +652,6 @@ public class AnnotationRenderer && (displayChar.length() > 0)) { Graphics2D gg = ((Graphics2D) g); - AffineTransform oldTransform = gg.getTransform(); float fmWidth = fm.charsWidth(displayChar.toCharArray(), 0, displayChar.length()); @@ -687,6 +687,10 @@ public class AnnotationRenderer */ final int xPos = (x * charWidth) + charOffset; final int yPos = y + iconOffset; + + /* + * translate to drawing position _before_ applying any scaling + */ gg.translate(xPos, yPos); if (scaledToFit) { @@ -709,8 +713,16 @@ public class AnnotationRenderer { gg.drawString(displayChar, 0, 0); } + if (scaledToFit) + { + /* + * undo scaling before translating back + * (restoring saved transform does NOT work in JS PDFGraphics!) + */ + gg.transform(AffineTransform + .getScaleInstance(1D / fmScaling, 1.0)); + } gg.translate(-xPos, -yPos); - gg.setTransform(oldTransform); } } if (row.hasIcons) @@ -771,7 +783,7 @@ public class AnnotationRenderer if (x > -1) { - int nb_annot = x - temp; + // int nb_annot = x - temp; // System.out.println("\t type :"+lastSS+"\t x :"+x+"\t nbre // annot :"+nb_annot); switch (lastSS) @@ -780,7 +792,7 @@ public class AnnotationRenderer case ')': // and opposite direction drawStemAnnot(g, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); - temp = x; + // temp = x; break; case 'H': @@ -863,13 +875,13 @@ public class AnnotationRenderer drawNotCanonicalAnnot(g, nonCanColor, row_annotations, lastSSX, x, y, iconOffset, startRes, column, validRes, validEnd); - temp = x; + // temp = x; break; default: g.setColor(Color.gray); g.fillRect(lastSSX, y + 6 + iconOffset, (x * charWidth) - lastSSX, 2); - temp = x; + // temp = x; break; } } @@ -1059,6 +1071,32 @@ public class AnnotationRenderer row.graphMin, row.graphMax, y, renderHistogram, renderProfile, normaliseProfile); } + else + { + AnnotationRowRendererI renderer = rendererFactoryI + .getRendererFor(row); + if (renderer != null) + { + renderer.renderRow(g, charWidth, charHeight, + hasHiddenColumns, av, hiddenColumns, columnSelection, + row, row_annotations, startRes, endRes, row.graphMin, + row.graphMax, y); + } + if (debugRedraw) + { + if (renderer == null) + { + System.err.println("No renderer found for " + + row.toString()); + } + else + { + System.err.println("rendered with " + + renderer.getClass().toString()); + } + } + + } } } else @@ -1110,7 +1148,7 @@ public class AnnotationRenderer public static final Color STEM_COLOUR = Color.blue; - private Color sdNOTCANONICAL_COLOUR; + // private Color sdNOTCANONICAL_COLOUR; void drawGlyphLine(Graphics g, Annotation[] row, int lastSSX, int x, int y, int iconOffset, int startRes, int column, boolean validRes, @@ -1158,7 +1196,7 @@ public class AnnotationRenderer int x1 = lastSSX; int x2 = (x * charWidth); - if (MAC) + if (USE_FILL_ROUND_RECT) { int ofs = charWidth / 2; // Off by 1 offset when drawing rects and ovals @@ -1386,7 +1424,8 @@ public class AnnotationRenderer boolean isStructureProfile = profl[0] == AlignmentAnnotation.STRUCTURE_PROFILE; boolean isCdnaProfile = profl[0] == AlignmentAnnotation.CDNA_PROFILE; float ht = normaliseProfile ? y - _aa.graphHeight : y1; - double htn = normaliseProfile ? _aa.graphHeight : (y2 - y1);// aa.graphHeight; + final double normaliseFactor = normaliseProfile ? _aa.graphHeight + : (y2 - y1); /** * Render a single base for a sequence profile, a base pair for @@ -1437,8 +1476,14 @@ public class AnnotationRenderer s = new String(dc); } // next profl[] position is profile % for the character(s) - - double newHeight = htn * scale * profl[c++]; + + int percent = profl[c++]; + if (percent == 0) + { + // failsafe in case a count rounds down to 0% + continue; + } + double newHeight = normaliseFactor * scale * percent; /* * Set character colour as per alignment colour scheme; use the @@ -1464,9 +1509,9 @@ public class AnnotationRenderer // (int)(scl)); // g.setColor(profcolour.findColour(dc[0]).darker()); - double sx = 1f * charWidth / fm.charsWidth(dc, 0, dc.length); + double sx = 1f * charWidth / fm.charsWidth(dc, 0, dc.length); double sy = newHeight / asc; - double newAsc = asc * sy; + double newAsc = asc * sy; double newDec = dec * sy; // it is not necessary to recalculate lm for the new font. // note: lm.getBaselineOffsets()[lm.getBaselineIndex()]) must be 0 @@ -1474,7 +1519,7 @@ public class AnnotationRenderer // int hght = (int) (ht + (newAsc - newDec); // - lm.getBaselineOffsets()[lm.getBaselineIndex()])); - if (Jalview.isJS()) + if (Platform.isJS()) { /* * SwingJS does not implement font.deriveFont() @@ -1482,26 +1527,34 @@ public class AnnotationRenderer * this is off by a very small amount */ final int hght = (int) (ht2 + (newAsc - newDec)); - Graphics2D gg = (Graphics2D) g.create(); - gg.setFont(ofont); - int xShift = (int) (x * charWidth / sx); - int yShift = (int) (hght / sy); + Graphics2D gg = (Graphics2D) g; + int xShift = (int) Math.round(x * charWidth / sx); + int yShift = (int) Math.round(hght / sy); gg.transform(AffineTransform.getScaleInstance(sx, sy)); gg.drawString(s, xShift, yShift); - gg.dispose(); + gg.transform( + AffineTransform.getScaleInstance(1D / sx, 1D / sy)); ht2 += newHeight; } else + /** + * Java only + * + * @j2sIgnore + */ { + // Java ('normal') method is to scale the font to fit + final int hght = (int) (ht + (newAsc - newDec)); Font font = ofont .deriveFont(AffineTransform.getScaleInstance(sx, sy)); g.setFont(font); g.drawChars(dc, 0, dc.length, x * charWidth, hght); + g.setFont(ofont); + ht += newHeight; } } - g.setFont(ofont); } } x++; @@ -1512,7 +1565,7 @@ public class AnnotationRenderer Graphics2D g2 = (Graphics2D) g; g2.setStroke(new BasicStroke(1, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND, 3f, new float[] - { 5f, 3f }, 0f)); + { 5f, 3f }, 0f)); y2 = (int) (y - ((_aa.threshold.value - min) / range) * _aa.graphHeight);