line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package GD::Graph::Thermometer; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
23829
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
33
|
|
4
|
1
|
|
|
1
|
|
5
|
use strict; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
32
|
|
5
|
1
|
|
|
1
|
|
4
|
use Carp; |
|
1
|
|
|
|
|
6
|
|
|
1
|
|
|
|
|
92
|
|
6
|
1
|
|
|
1
|
|
15467
|
use CGI; |
|
1
|
|
|
|
|
24581
|
|
|
1
|
|
|
|
|
7
|
|
7
|
1
|
|
|
1
|
|
480
|
use GD; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
use GD::Text::Align; |
9
|
|
|
|
|
|
|
use Data::Dumper; |
10
|
|
|
|
|
|
|
use constant PI => 3.14; |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
use vars qw($VERSION); |
13
|
|
|
|
|
|
|
$VERSION = '0.05'; |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
my $cgi = CGI->new(); |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
sub new { |
18
|
|
|
|
|
|
|
my $self = shift; |
19
|
|
|
|
|
|
|
my $args = shift; |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
my $missing_arguments = 0; |
22
|
|
|
|
|
|
|
foreach my $key qw( goal current ){ |
23
|
|
|
|
|
|
|
if(!defined($args->{$key})) { $missing_arguments++ }; |
24
|
|
|
|
|
|
|
} |
25
|
|
|
|
|
|
|
if($missing_arguments){ |
26
|
|
|
|
|
|
|
croak "GD::Graph::Thermometer requires that the 'goal' and 'current' keys be defined in its constructor. All other arguments are optional and default values will be substituted for any missing values"; |
27
|
|
|
|
|
|
|
} |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
if(!defined($args->{'title'})){ |
30
|
|
|
|
|
|
|
$args->{'title'} = ""; |
31
|
|
|
|
|
|
|
carp "The call to GD::Graph::Thermometer failed to define a title for the resulting graph."; |
32
|
|
|
|
|
|
|
} |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
if(!defined($args->{'width'})){ |
35
|
|
|
|
|
|
|
$args->{'width'} = '100'; |
36
|
|
|
|
|
|
|
} |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
if(!defined($args->{'height'})){ |
39
|
|
|
|
|
|
|
$args->{'height'} = '200'; |
40
|
|
|
|
|
|
|
} |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
my $image = new GD::Image($args->{width},$args->{height}); |
43
|
|
|
|
|
|
|
my $colors = $self->_define_colors($image, { |
44
|
|
|
|
|
|
|
background_color => $args->{'background_color'}, |
45
|
|
|
|
|
|
|
outline_color => $args->{'outline_color'}, |
46
|
|
|
|
|
|
|
text_color => $args->{'text_color'}, |
47
|
|
|
|
|
|
|
mercury_color => $args->{'mercury_color'} |
48
|
|
|
|
|
|
|
}); |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
my $top = ($args->{'height'} * .04); |
51
|
|
|
|
|
|
|
my $bottom = ($args->{'height'} * .80); |
52
|
|
|
|
|
|
|
my $diff = $bottom - $top; |
53
|
|
|
|
|
|
|
my $left_text_margin = ($args->{'width'} * .38); |
54
|
|
|
|
|
|
|
my $diameter = ($args->{'width'} * .36); |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
# background, set tranparent if you want |
57
|
|
|
|
|
|
|
$image->filledRectangle( 0, 0, $args->{'width'}, $args->{'height'}, $colors->{'background_color'} ); |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
# $image->rectangle($x1,$y1,$x2,$y2,$color) |
60
|
|
|
|
|
|
|
if($args->{'transparent'} == '1'){ |
61
|
|
|
|
|
|
|
$image->transparent($colors->{'background_color'}); |
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
$image->rectangle(($args->{'width'} * .16),($args->{'height'} * .04),($args->{'width'} * .32),($args->{'height'} * .85),$colors->{'outline_color'}); |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
# $image->filledEllipse($cx,$cy,$width,$height,$color) |
66
|
|
|
|
|
|
|
$image->filledEllipse(($args->{'width'} * .24),($args->{'height'} * .90),($args->{'width'} * .36),($args->{'width'} * .36),$colors->{'mercury_color'}); |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
# mercury rising . . . |
69
|
|
|
|
|
|
|
$image->filledRectangle(($args->{'width'} * .16),($args->{'height'} * .80),($args->{'width'} * .32),($args->{'height'} * .85),$colors->{'mercury_color'}); |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
# add labels to graph |
72
|
|
|
|
|
|
|
$image = $self->_add_labels($image,$args->{'goal'},$args->{'current'},$colors->{'text_color'},$colors->{'mercury_color'},$left_text_margin,$top,$bottom,$diff,$args->{'width'},$args->{'height'}); |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
# display title |
75
|
|
|
|
|
|
|
$self->_display_title($image,$colors->{'text_color'},$args->{'title'},$args->{'width'},$bottom); |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
# render image as a .png file |
78
|
|
|
|
|
|
|
$self->_render_image($image, $args->{'image_path'}, $args->{'type'}); |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
return; |
81
|
|
|
|
|
|
|
} |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
sub _render_image { |
84
|
|
|
|
|
|
|
my $self = shift; |
85
|
|
|
|
|
|
|
my $image = shift; |
86
|
|
|
|
|
|
|
my $image_path = shift; |
87
|
|
|
|
|
|
|
my $type = shift; |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
if(!defined($type)){ |
90
|
|
|
|
|
|
|
$type = 'png'; |
91
|
|
|
|
|
|
|
} |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
if(defined($image_path)){ |
94
|
|
|
|
|
|
|
open( "IMAGE", ">", "$image_path") || die "Couldn't open file: $image_path. $!\n"; |
95
|
|
|
|
|
|
|
binmode( IMAGE ); |
96
|
|
|
|
|
|
|
print IMAGE $image->$type(); |
97
|
|
|
|
|
|
|
close IMAGE; |
98
|
|
|
|
|
|
|
} else { |
99
|
|
|
|
|
|
|
print $cgi->header("image/$type"); |
100
|
|
|
|
|
|
|
binmode STDOUT; |
101
|
|
|
|
|
|
|
print $image->$type; |
102
|
|
|
|
|
|
|
} |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
return; |
105
|
|
|
|
|
|
|
} |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
sub _add_labels { |
108
|
|
|
|
|
|
|
my($self,$image,$goal,$current,$text_color,$red,$left_text_margin,$top,$bottom,$diff,$w,$h) = @_; |
109
|
|
|
|
|
|
|
my $text = new GD::Text::Align( |
110
|
|
|
|
|
|
|
$image, |
111
|
|
|
|
|
|
|
font => gdTinyFont, |
112
|
|
|
|
|
|
|
text => $goal.' Goal', |
113
|
|
|
|
|
|
|
color => $text_color, |
114
|
|
|
|
|
|
|
valign => "center", |
115
|
|
|
|
|
|
|
halign => "left", |
116
|
|
|
|
|
|
|
); |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
#draw goal at top |
119
|
|
|
|
|
|
|
$text->draw($left_text_margin,$top); |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
#draw start at bottom |
122
|
|
|
|
|
|
|
if (($current / $goal) > .10){ |
123
|
|
|
|
|
|
|
$text->set_text('0 Start'); |
124
|
|
|
|
|
|
|
$text->draw($left_text_margin,$bottom); |
125
|
|
|
|
|
|
|
} |
126
|
|
|
|
|
|
|
my $curpix = ($h * .80) - ($diff/$goal) * $current; |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
# draw |
129
|
|
|
|
|
|
|
$text->set_text("$current Current"); |
130
|
|
|
|
|
|
|
$text->draw($left_text_margin,$curpix); |
131
|
|
|
|
|
|
|
$image->filledRectangle(($w * .16),$curpix,($w * .32),($h * .85),$red); |
132
|
|
|
|
|
|
|
return $image; |
133
|
|
|
|
|
|
|
} |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
sub _display_title { |
136
|
|
|
|
|
|
|
my ($self,$image,$color,$title,$w,$bottom) = @_; |
137
|
|
|
|
|
|
|
my $set_title = GD::Text::Align->new($image, |
138
|
|
|
|
|
|
|
vtitle => 'top', |
139
|
|
|
|
|
|
|
htitle => 'right', |
140
|
|
|
|
|
|
|
color => $color, |
141
|
|
|
|
|
|
|
); |
142
|
|
|
|
|
|
|
$set_title->set_font('arial', 12); |
143
|
|
|
|
|
|
|
$set_title->set_text($title); |
144
|
|
|
|
|
|
|
my @bb = $set_title->bounding_box(($w * .10), $bottom, (PI/2)); |
145
|
|
|
|
|
|
|
$set_title->draw(($w * .10),$bottom,(PI/2)); |
146
|
|
|
|
|
|
|
return $image; |
147
|
|
|
|
|
|
|
} |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
sub _define_colors { |
150
|
|
|
|
|
|
|
my $self = shift; |
151
|
|
|
|
|
|
|
my $image = shift; |
152
|
|
|
|
|
|
|
my $custom_colors = shift; |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
my $background_color; |
155
|
|
|
|
|
|
|
if (defined($custom_colors->{'background_color'})) { |
156
|
|
|
|
|
|
|
$background_color = $image->colorAllocate( |
157
|
|
|
|
|
|
|
$custom_colors->{'background_color'}[0], |
158
|
|
|
|
|
|
|
$custom_colors->{'background_color'}[1], |
159
|
|
|
|
|
|
|
$custom_colors->{'background_color'}[2] |
160
|
|
|
|
|
|
|
); |
161
|
|
|
|
|
|
|
} else { |
162
|
|
|
|
|
|
|
$background_color = $self->_white($image); |
163
|
|
|
|
|
|
|
} |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
my $outline_color; |
166
|
|
|
|
|
|
|
if (defined($custom_colors->{'outline_color'})) { |
167
|
|
|
|
|
|
|
$outline_color = $image->colorAllocate( |
168
|
|
|
|
|
|
|
$custom_colors->{'outline_color'}[0], |
169
|
|
|
|
|
|
|
$custom_colors->{'outline_color'}[1], |
170
|
|
|
|
|
|
|
$custom_colors->{'outline_color'}[2] |
171
|
|
|
|
|
|
|
); |
172
|
|
|
|
|
|
|
} else { |
173
|
|
|
|
|
|
|
$outline_color = $self->_black($image); |
174
|
|
|
|
|
|
|
} |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
my $text_color; |
177
|
|
|
|
|
|
|
if (defined($custom_colors->{'text_color'})) { |
178
|
|
|
|
|
|
|
$text_color = $image->colorAllocate( |
179
|
|
|
|
|
|
|
$custom_colors->{'text_color'}[0], |
180
|
|
|
|
|
|
|
$custom_colors->{'text_color'}[1], |
181
|
|
|
|
|
|
|
$custom_colors->{'text_color'}[2] |
182
|
|
|
|
|
|
|
); |
183
|
|
|
|
|
|
|
} else { |
184
|
|
|
|
|
|
|
$text_color = $self->_black($image); |
185
|
|
|
|
|
|
|
} |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
my $mercury_color; |
188
|
|
|
|
|
|
|
if (defined($custom_colors->{'mercury_color'})) { |
189
|
|
|
|
|
|
|
$mercury_color = $image->colorAllocate( |
190
|
|
|
|
|
|
|
$custom_colors->{'mercury_color'}[0], |
191
|
|
|
|
|
|
|
$custom_colors->{'mercury_color'}[1], |
192
|
|
|
|
|
|
|
$custom_colors->{'mercury_color'}[2] |
193
|
|
|
|
|
|
|
); |
194
|
|
|
|
|
|
|
} else { |
195
|
|
|
|
|
|
|
$mercury_color = $self->_red($image); |
196
|
|
|
|
|
|
|
} |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
my $colors = { |
199
|
|
|
|
|
|
|
background_color => $background_color, |
200
|
|
|
|
|
|
|
outline_color => $outline_color, |
201
|
|
|
|
|
|
|
text_color => $text_color, |
202
|
|
|
|
|
|
|
mercury_color => $mercury_color |
203
|
|
|
|
|
|
|
}; |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
return $colors; |
206
|
|
|
|
|
|
|
} |
207
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
sub _black { |
209
|
|
|
|
|
|
|
my $self = shift; |
210
|
|
|
|
|
|
|
my $image = shift; |
211
|
|
|
|
|
|
|
my $color = $image->colorAllocate(0,0,0); |
212
|
|
|
|
|
|
|
return $color; |
213
|
|
|
|
|
|
|
} |
214
|
|
|
|
|
|
|
|
215
|
|
|
|
|
|
|
sub _white { |
216
|
|
|
|
|
|
|
my $self = shift; |
217
|
|
|
|
|
|
|
my $image = shift; |
218
|
|
|
|
|
|
|
my $color = $image->colorAllocate(255,255,255); |
219
|
|
|
|
|
|
|
return $color; |
220
|
|
|
|
|
|
|
} |
221
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
sub _red { |
223
|
|
|
|
|
|
|
my $self = shift; |
224
|
|
|
|
|
|
|
my $image = shift; |
225
|
|
|
|
|
|
|
my $color = $image->colorAllocate(255,0,0); |
226
|
|
|
|
|
|
|
return $color; |
227
|
|
|
|
|
|
|
} |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
1; # Magic true value required at end of module |
230
|
|
|
|
|
|
|
__END__ |