package Bio::EnsEMBL::Renderer;
use strict;
sub new {
my ($class, $config, $container, $glyphsets_ref) = @_;
my $self = {
'glyphsets' => $glyphsets_ref,
'canvas' => undef,
'colourmap' => $config->colourmap(),
'config' => $config,
'container' => $container,
'spacing' => 5,
};
bless($self, $class);
$self->render();
return $self;
}
sub render {
my ($self) = @_;
my $config = $self->{'config'};
#########
# now set all our labels up with scaled negative coords
# and while we're looping, tot up the image height
#
my $spacing = $self->{'spacing'};
my $im_height = $spacing * 1.5;
for my $glyphset (@{$self->{'glyphsets'}}) {
next if (scalar @{$glyphset->{'glyphs'}} == 0);
my $fntheight = (defined $glyphset->label())?$config->texthelper->height($glyphset->label->font()):0;
my $gstheight = $glyphset->height();
$im_height += $spacing + ( $gstheight > $fntheight ? $gstheight : $fntheight );
}
$config->image_height($im_height);
my $im_width = $config->image_width();
#########
# create a fresh canvas
#
if($self->can('init_canvas')) {
$self->init_canvas($config, $im_width, $im_height);
}
for my $glyphset (@{$self->{'glyphsets'}}) {
next if(scalar @{$glyphset->{'glyphs'}} == 0);
#########
# loop through everything and draw it
#
for my $glyph ($glyphset->glyphs()) {
my $method = $self->method($glyph);
if($self->can($method)) {
$self->$method($glyph);
} else {
warn qq(Bio::EnsEMBL::Renderer::render: Do not know how to $method\n);
}
}
}
#########
# the last thing we do in the render process is add a frame
# so that it appears on the top of everything else...
$self->add_canvas_frame($config, $im_width, $im_height);
}
sub canvas {
my ($self, $canvas) = @_;
$self->{'canvas'} = $canvas if(defined $canvas);
return $self->{'canvas'};
}
sub method {
my ($self, $glyph) = @_;
my ($suffix) = ref($glyph) =~ /.*::(.*)/;
return qq(render_$suffix);
}
sub render_Composite {
my ($self, $glyph) = @_;
for my $subglyph (@{$glyph->{'composite'}}) {
my $method = $self->method($subglyph);
if($self->can($method)) {
$self->$method($subglyph);
} else {
warn qq(Bio::EnsEMBL::Renderer::render_Composite: Do not know how to $method\n);
}
}
}
#########
# empty stub for Blank spacer objects with no rendering at all
#
sub render_Space {
}
1;