File Coverage

blib/lib/SVG/Graph/Glyph/tree.pm
Criterion Covered Total %
statement 50 51 98.0
branch 10 12 83.3
condition 3 3 100.0
subroutine 6 6 100.0
pod 1 2 50.0
total 70 74 94.5


line stmt bran cond sub pod time code
1             package SVG::Graph::Glyph::tree;
2              
3 1     1   7 use base SVG::Graph::Glyph;
  1         1  
  1         718  
4 1     1   7 use Data::Dumper;
  1         3  
  1         46  
5 1     1   6 use strict;
  1         1  
  1         869  
6              
7             =head2 draw
8              
9             Title : draw
10             Usage :
11             Function:
12             Example :
13             Returns :
14             Args :
15              
16              
17             =cut
18              
19             sub draw{
20 1     1 1 3 my ($self,@args) = @_;
21              
22 1         11 my $id = 'n'.sprintf("%07d",int(rand(9999999)));
23             # my $frame_transform = $self->frame_transform;
24 1         5 my $group = $self->svg->group(id=>"tree$id");
25              
26 1         88 my($data) = $self->group->data;
27 1         7 my $root = $data->root;
28 1         5 my $xsize = $self->xsize;
29 1         3 my $ysize = $self->ysize;
30 1         6 my $yscale = $ysize / $root->depth;
31 1         12 my $xscale = $xsize / (scalar($root->leaves_under));
32 1         776 my $xoffset = $self->xoffset;
33 1         6 my $yoffset = $self->yoffset;
34              
35              
36 1         8 $group->line(x1=>$xoffset+($xsize/2),x2=>$xoffset+($xsize/2),y1=>$yoffset,y2=>$yoffset+($yscale*$root->branch_length),style=>{$self->_style});
37              
38 1         108 my $maxy = $self->getmaxy(node=>$root, yscale=>$yscale, yoffset=>$yoffset+($yscale*$root->branch_length));
39            
40             #root branch
41 1         7 $self->_draw(group=>$group,node=>$root,
42             xsize=>$xsize,
43             yscale=>$yscale,
44             xoffset=>$xoffset,yoffset=>$yoffset+($yscale*$root->branch_length),
45             maxy=>$maxy
46             );
47             }
48              
49             sub getmaxy {
50 22     22 0 76 my($self,%a) = @_;
51 22         34 my $maxy = $a{yoffset};
52 22         61 foreach my $d ($a{node}->daughters){
53 21         179 my $temp = $self->getmaxy(node=>$d, yscale=>$a{yscale}, yoffset => $a{yoffset} + ($d->branch_length * $a{yscale}));
54 21 50       48 if ($temp > $maxy) {
55 21         43 $maxy = $temp;
56             }
57             }
58            
59 22         65 return $maxy;
60              
61             }
62              
63             =head2 _draw
64              
65             Title : _draw
66             Usage :
67             Function:
68             Example :
69             Returns :
70             Args :
71              
72              
73             =cut
74              
75             sub _draw {
76 22     22   130 my($self,%a) = @_;
77              
78 22         38 my $xoffset = $a{xoffset};
79 22         24 my $xoffset_old;
80 22         36 my $maxy = $a{maxy};
81 22         27 my $c = 1;
82              
83 22         78 foreach my $d ($a{node}->daughters){
84              
85 21 100       195 my %style = $a{node}->_style ? $a{node}->_style : $self->_style;
86              
87 21         79 my $frac = $d->leaves_under / $a{node}->leaves_under;
88 21         13977 $xoffset_old = $xoffset;
89              
90             #horizontal bar spanning the domain of a child subtree
91 21 100 100     74 if(!$d->left_sisters and !$d->right_sisters){
    100          
    50          
92             } elsif(!$d->left_sisters){
93 1         99 $a{group}->line(x1=>$xoffset+($frac*$a{xsize}/2),
94             y1=>$a{yoffset},
95             x2=>$xoffset+($frac*$a{xsize}),
96             y2=>$a{yoffset},
97             style=>{%style});
98              
99             #warn join ' ', $a{node}->_style;
100              
101             } elsif(!$d->right_sisters){
102 1         69 $a{group}->line(x1=>$xoffset,
103             y1=>$a{yoffset},
104             x2=>$xoffset+($frac*$a{xsize}/2),
105             y2=>$a{yoffset},
106             style=>{%style});
107             } else {
108 0         0 $a{group}->line(x1=>$xoffset,
109             y1=>$a{yoffset},
110             x2=>$xoffset+($frac*$a{xsize}),
111             y2=>$a{yoffset},
112             style=>{%style});
113             }
114              
115              
116              
117 21 100       594 if($d->depth_under <= 1) {
118 3         173 $a{group}->line(x1=>(($frac*$a{xsize}+$xoffset)+($xoffset))/2,x2=>(($frac*$a{xsize}+$xoffset)+($xoffset))/2,
119             y1=>$a{yoffset},
120             y2=>$maxy,
121             style=>{%style}
122             );
123             }
124             else {
125             #root branch of the child subtree
126 18         5062 $a{group}->line(x1=>(($frac*$a{xsize}+$xoffset)+($xoffset))/2,x2=>(($frac*$a{xsize}+$xoffset)+($xoffset))/2,
127             y1=>$a{yoffset},
128             y2=>$a{yoffset}+($a{yscale}*$d->branch_length),
129             style=>{%style}
130             );
131             }
132            
133             #root branch label
134 21         1490 my($cx,$cy) = ((($frac*$a{xsize}+$xoffset)+($xoffset))/2 , $maxy);
135             #my($cx,$cy) = ((($frac*$a{xsize}+$xoffset)+($xoffset))/2 , $a{yoffset}+($a{yscale}*$d->branch_length));
136 21         92 $a{group}->text(x=>$cx,
137             y=>$cy,
138             # style=>{'font-size'=>'15px'},
139             style=>{$self->_style,'stroke-width'=>0.5},
140             transform=>"rotate(90,$cx,$cy)"
141             )->cdata($d->branch_label());
142             #->cdata($d->name);
143              
144              
145 21         2182 $xoffset += $frac*$a{xsize};
146 21         28 $c++;
147              
148 21         92 $self->_draw(group=>$a{group},node=>$d,
149             xsize=>$xoffset - $xoffset_old,
150             yscale=>$a{yscale},
151             xoffset => $xoffset_old,
152             yoffset => $a{yoffset} + ($d->branch_length * $a{yscale}),
153             maxy => $maxy
154             );
155             }
156              
157              
158             }
159              
160             1;