#include <stdexcept>
using namespace std;
+static const float default_height = 12.0;
+
GlSequence::GlSequence(const Sequence &s,
boost::shared_ptr<AnnotationColors> cm)
: Sequence(s),
DrawableRef GlSequence::default_drawable()
{
ColorRef c(new Color(0.0, 0.0, 0.0));
- DrawableRef d(new Drawable(0.0, 0.0, 1.0, 12.0, c));
+ DrawableRef d(new Drawable(0.0, 0.0, 1.0, default_height, c));
return d;
}
return d;
}
+SeqSpanRef GlSequence::make_undefined_sequence_annotation(
+ Drawable::draw_func_ptr draw,
+ size_type start,
+ size_type count)
+{
+ // create all the components of our annotation
+ // (should seq_i-start_i
+ SeqSpanRef empty_seq(seq->subseq(start, count));
+ AnnotationsRef empty_seq_annot(new Annotations("null"));
+ DrawableRef drawable(default_drawable());
+ // glue everything to gether
+ drawable->setDrawFunction(draw);
+ empty_seq->setAnnotations(empty_seq_annot);
+ empty_seq->setDrawable(drawable);
+ return empty_seq;
+}
+
+void GlSequence::add_annotations_for_undefined_sequence(Drawable::draw_func_ptr draw)
+{
+ Sequence::const_iterator start_i = begin();
+ Sequence::const_iterator seq_i = begin();
+ Sequence::const_iterator end_i = end();
+
+ Sequence::const_iterator start_block_i = end();
+ for(; seq_i != end_i; ++seq_i)
+ {
+ // need a better set of characters to serch for
+ if (*seq_i == 'N' or *seq_i == 'n') {
+ if (start_block_i == end_i) {
+ start_block_i = seq_i;
+ }
+ } else {
+ if (start_block_i != end_i) {
+ // we got one.
+ size_type start = start_block_i - start_i;
+ size_type count = seq_i - start_block_i;
+ // add the annotation
+ add_annotation(make_undefined_sequence_annotation(draw, start, count));
+ // reset our counter...
+ start_block_i = end_i;
+ }
+ }
+ }
+ // catch stuff at the end
+ if( start_block_i != end_i ) {
+ size_type start = start_block_i - start_i;
+ size_type count = seq_i - start_block_i;
+ add_annotation(make_undefined_sequence_annotation(draw, start, count));
+ }
+}
+
+
void GlSequence::setX(float value)
{
seq->drawable()->setX(value);
return viewport[3]; // grab the viewport width
}
-GLfloat GlSequence::pixelWidth(GLfloat left, GLfloat right) const
+GLfloat GlSequence::pixelWidth(GLfloat left, GLfloat right)
{
return pixelWidth(left, right, get_viewport_width_in_pixels());
}
GLfloat
-GlSequence::pixelWidth(GLfloat left, GLfloat right, int vp_width) const
+GlSequence::pixelWidth(GLfloat left, GLfloat right, int vp_width)
{
return round((right-left)/vp_width);
}
void GlSequence::draw_box(GLfloat world_left, GLfloat world_right,
GLfloat left, GLfloat right,
- GLfloat height, GLfloat z) const
+ GLfloat height, GLfloat y, GLfloat z)
{
GLfloat pixel_width = pixelWidth(world_left, world_right);
GLfloat offset = height/2.0;
- GLfloat top = y() + offset;
- GLfloat bottom = y() - offset;
+ GLfloat top = y + offset;
+ GLfloat bottom = y - offset;
// make our box be at least 1 pixel
if ((right-left) < pixel_width) {
{
glColor3fv(color()->get());
// draw main sequence track
- draw_box(left, right, x(), x()+Sequence::size(), height(), 0.0);
+ draw_box(left, right, x(), x()+Sequence::size(), height(), y(), 0.0);
}
void GlSequence::draw_annotations(GLfloat left, GLfloat right) const
annot_itor != annots.end();
++annot_itor)
{
- glColor3f(0.0, 0.8, 0.0);
- draw_box(left, right, x()+(*annot_itor)->start(), x()+(*annot_itor)->stop(),
- height(), annotation_z);
+ DrawableRef drawable((*annot_itor)->drawable());
+ if (drawable and drawable->drawFunction()) {
+ assert((*annot_itor)->parent() == seq);
+ drawable->drawFunction()((*annot_itor), left, right);
+ } else {
+ glColor3f(0.0, 0.8, 0.0);
+ draw_box(left, right, x()+(*annot_itor)->start(), x()+(*annot_itor)->stop(),
+ height(), y(), annotation_z);
+ }
}
// if motifs?
for (MotifList::const_iterator motifs_itor = motifs.begin();
{
glColor3fv(color_mapper->lookup("motif", motifs_itor->sequence).get());
draw_box(left, right, x()+motifs_itor->begin, x()+motifs_itor->end,
- height(), annotation_z+1.0);
+ height(), y(), annotation_z+1.0);
}
}
(left.color() == right.color()));
}
+void draw_narrow_track(SeqSpanRef s, float left, float right)
+{
+ SeqSpanRef parent(s->parent());
+ DrawableRef parent_draw(parent->drawable());
+ float x( (parent_draw) ? parent_draw->x() : 0);
+ float y( (parent_draw) ? parent_draw->y() : 0);
+ float z( (parent_draw) ? parent_draw->z() : 10 );
+ float height( (parent_draw) ? parent_draw->height() : default_height );
+
+ glColor3f(1.0, 1.0, 1.0);
+ float hsmall = height * 3.0/4.0;
+ GlSequence::draw_box(left, right, x+s->start(), x+s->stop(),
+ hsmall, y, z+10);
+}
\ No newline at end of file