package aliview.gui.pane;
import org.apache.log4j.Logger;
import aliview.AminoAcid;
import aliview.NucleotideUtilities;
import aliview.alignment.Alignment;
import aliview.alignment.NucleotideHistogram;
import aliview.sequences.AminoAcidAndPosition;
import aliview.sequences.Sequence;
public abstract class SequencePainter implements Runnable{
private static final Logger logger = Logger.getLogger(SequencePainter.class);
private Sequence seq;
private int seqYPos;
private int clipPosY;
private int xMinSeqPos;
private int xMaxSeqPos;
private double seqPerPix;
private double charWidth;
private double charHeight;
private double highDPIScaleFactor;
private RGBArray clipRGB;
private AlignmentPane aliPane;
private Alignment alignment;
public SequencePainter(Sequence seq, int seqYPos, int clipPosY, int xMinSeqPos,
int xMaxSeqPos, double seqPerPix, double charWidth, double charHeight,
double highDPIScaleFactor, RGBArray clipRGB, AlignmentPane aliPane, Alignment alignment) {
super();
this.seq = seq;
this.seqYPos = seqYPos;
this.clipPosY = clipPosY;
this.xMinSeqPos = xMinSeqPos;
this.xMaxSeqPos = xMaxSeqPos;
this.seqPerPix = seqPerPix;
this.charWidth = charWidth;
this.charHeight = charHeight;
this.highDPIScaleFactor = highDPIScaleFactor;
this.clipRGB = clipRGB;
this.aliPane = aliPane;
this.alignment = alignment;
}
public void run(){
// TODO maybe check before that sequence not is null
if(seq != null){
drawSequence(seq, seqYPos, clipPosY, xMinSeqPos, xMaxSeqPos, seqPerPix, charWidth, charHeight, highDPIScaleFactor, clipRGB, aliPane, alignment);
}
}
public void drawSequence(Sequence seq, int seqYPos, int clipPosY, int xMin, int xMax, double seqPerPix, double charWidth, double charHeight, double highDPIScaleFactor,
RGBArray clipRGB, AlignmentPane aliPane, Alignment alignment){
// Make sure not outside length of seq
int seqLength = seq.getLength();
int clipPosX = 0;
for(int x = xMin; x < xMax && x >=0 ; x ++){
int seqXPos = (int)((double)x * seqPerPix);
if(seqXPos >=0 && seqXPos < seqLength){
int pixelPosX = (int)(clipPosX*charWidth*highDPIScaleFactor);
int pixelPosY = (int)(clipPosY*charHeight*highDPIScaleFactor);
if(pixelPosX < clipRGB.getScanWidth() && pixelPosY < clipRGB.getHeight()){
copyPixels(seq, clipRGB, seqXPos, seqYPos,pixelPosX, pixelPosY, aliPane, alignment);
}
}
clipPosX ++;
}
}
abstract void copyPixels(Sequence seq, RGBArray clipRGB, int seqXPos, int seqYPos, int pixelPosX, int pixelPosY, AlignmentPane aliPane, Alignment alignment);
}