import java.awt.geom.AffineTransform;
import java.awt.image.ImageObserver;
import java.util.BitSet;
-import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
-import java.util.List;
import java.util.Map;
import org.jfree.graphics2d.svg.SVGGraphics2D;
import jalview.datamodel.ColumnSelection;
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.ProfilesI;
-import jalview.datamodel.annotations.AnnotationColouringI;
import jalview.renderer.api.AnnotationRendererFactoryI;
import jalview.renderer.api.AnnotationRowRendererI;
import jalview.schemes.ColourSchemeI;
continue;
}
- boolean individualColour = false;
if (aa_annotations[column].colour == null)
{
g.setColor(Color.black);
else
{
g.setColor(aa_annotations[column].colour);
- individualColour = true;
}
boolean value1Exists = column > 0
&& aa_annotations[column - 1] != null;
float value1 = 0f;
- Color color1 = null;
if (value1Exists)
{
value1 = aa_annotations[column - 1].value;
- color1 = aa_annotations[column - 1].colour;
}
float value2 = aa_annotations[column].value;
boolean nextValueExists = aa_annotations.length > column + 1
y1 = y - yValueToPixelHeight(value1, min, range, graphHeight);
y2 = y - yValueToPixelHeight(value2, min, range, graphHeight);
- float v1 = value1;
- float v2 = value2;
int a1 = (x - 1) * charWidth + charWidth / 2;
int b1 = y1;
int a2 = x * charWidth + charWidth / 2;
// only draw an initial half-line
a1 = x * charWidth;
b1 = y1 + (y2 - y1) / 2;
- v1 = value1 + (value2 - value1) / 2;
}
else if (x == eRes - sRes)
{
// line
a2 = x * charWidth - 1;
b2 = y1 + (y2 - y1) / 2;
- v2 = value1 + (value2 - value1) / 2;
}
else
{
}
- AnnotationColouringI ac = aa_annotations[column]
- .getAnnotationColouring();
- List<Map.Entry<Float, Color>> valCols = ac == null ? null
- : ac.rangeColours(v1, v2);
- if (valCols != null)
- {
- drawSegmentedLine(g, valCols, a1, b1, a2, b2);
- }
- else
- {
- drawLine(g, a1, b1, a2, b2);
- }
+ drawLine(g, a1, b1, a2, b2);
x++;
}
return dashedLineLookup.get(charWidth);
}
- private void drawSegmentedLine(Graphics g,
- List<Map.Entry<Float, Color>> valCols, int x1, int y1, int x2,
- int y2)
- {
- if (valCols == null || valCols.size() == 0)
- {
- return;
- }
- // let's only go forwards+up|down -- try and avoid providing right to left
- // x values
- if (x2 < x1)
- {
- int tmp = y2;
- y2 = y1;
- y1 = tmp;
- tmp = x2;
- x2 = x1;
- x1 = tmp;
- Collections.reverse(valCols);
- }
- Graphics2D g2d = (Graphics2D) g.create();
- float yd = y2 - y1;
- boolean reverse = yd > 0; // reverse => line going DOWN (y increasing)
- Map.Entry<Float, Color> firstValCol = valCols.remove(0);
- float firstVal = firstValCol.getKey();
- Color firstCol = firstValCol.getValue();
- int yy1 = 0;
- yy1 = reverse ? (int) Math.ceil(y1 + firstVal * yd)
- : (int) Math.floor(y1 + firstVal * yd);
- Color thisCol = firstCol;
- for (int i = 0; i < valCols.size(); i++)
- {
- Map.Entry<Float, Color> valCol = valCols.get(i);
- float val = valCol.getKey();
- Color col = valCol.getValue();
- int clipX = x1 - 1;
- int clipW = x2 - x1 + 2;
- int clipY = 0;
- int clipH = 0;
- int yy2 = 0;
- if (reverse) // line going down
- {
- yy2 = (int) Math.ceil(y1 + val * yd);
- g2d.setColor(thisCol);
- clipY = yy1 - 1;
- clipH = yy2 - yy1;
- if (i == 0)
- {
- // highest segment, don't clip at the top
- clipY -= 2;
- clipH += 2;
- }
- if (i == valCols.size() - 1)
- {
- // lowest segment, don't clip at the bottom
- clipH += 2;
- }
- }
- else // line going up (or level)
- {
- yy2 = (int) Math.floor(y1 + val * yd);
- // g2d.setColor(Color.cyan); g2d.drawRect(x1 - 1, yy1, x2 - x1 + 1, yy2
- // -
- // yy1 + 1);
- g2d.setColor(col);
- clipY = yy2;
- clipH = yy1 - yy2;
- if (i == 0)
- {
- // lowest segment, don't clip at the bottom
- clipH += 2;
- }
- if (i == valCols.size() - 1)
- {
- // highest segment, don't clip at the top
- clipY -= 2;
- clipH += 2;
- }
- }
- g2d.setClip(clipX, clipY, clipW, clipH);
- drawLine(g2d, x1, y1, x2, y2);
- yy1 = yy2;
- thisCol = col;
- }
- g2d.dispose();
- }
-
private static int yValueToPixelHeight(float value, float min,
float range, int graphHeight)
{