summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/Chart.pm59
-rw-r--r--template/en/default/reports/chart.png.tmpl1
2 files changed, 60 insertions, 0 deletions
diff --git a/Bugzilla/Chart.pm b/Bugzilla/Chart.pm
index f161d1555..5c71eb818 100644
--- a/Bugzilla/Chart.pm
+++ b/Bugzilla/Chart.pm
@@ -18,6 +18,8 @@
# Rights Reserved.
#
# Contributor(s): Gervase Markham <gerv@gerv.net>
+# Albert Ting <altlst@sonic.net>
+# A. Karl Kornel <karl@kornel.name>
use strict;
use lib ".";
@@ -207,6 +209,7 @@ sub data {
sub readData {
my $self = shift;
my @data;
+ my @maxvals;
# Note: you get a bad image if getSeriesIDs returns nothing
# We need to handle errors better.
@@ -254,10 +257,15 @@ sub readData {
my $gt_index = $self->{'gt'} ? scalar(@{$self->{'lines'}}) : undef;
my $line_index = 0;
+ $maxvals[$gt_index] = 0 if $gt_index;
+
+ my @datediff_total;
+
foreach my $line (@{$self->{'lines'}}) {
# Even if we end up with no data, we need an empty arrayref to prevent
# errors in the PNG-generating code
$data[$line_index] = [];
+ $maxvals[$line_index] = 0;
foreach my $series (@$line) {
@@ -274,18 +282,69 @@ sub readData {
my ($datediff, $value) = @$point;
$data[$line_index][$datediff] ||= 0;
$data[$line_index][$datediff] += $value;
+ if ($data[$line_index][$datediff] > $maxvals[$line_index]) {
+ $maxvals[$line_index] = $data[$line_index][$datediff];
+ }
+
+ $datediff_total[$datediff] += $value;
# Add to the grand total, if we are doing that
if ($gt_index) {
$data[$gt_index][$datediff] ||= 0;
$data[$gt_index][$datediff] += $value;
+ if ($data[$gt_index][$datediff] > $maxvals[$gt_index]) {
+ $maxvals[$gt_index] = $data[$gt_index][$datediff];
+ }
}
}
}
+ # We are done with the series making up this line, go to the next one
$line_index++;
}
+ # calculate maximum y value
+ if ($self->{'cumulate'}) {
+ # Make sure we do not try to take the max of an array with undef values
+ my @processed_datediff;
+ while (@datediff_total) {
+ my $datediff = shift @datediff_total;
+ push @processed_datediff, $datediff if defined($datediff);
+ }
+ $self->{'y_max_value'} = Bugzilla::Util::max(@processed_datediff);
+ }
+ else {
+ $self->{'y_max_value'} = Bugzilla::Util::max(@maxvals);
+ }
+ $self->{'y_max_value'} |= 1; # For log()
+
+ # Align the max y value:
+ # For one- or two-digit numbers, increase y_max_value until divisible by 8
+ # For larger numbers, see the comments below to figure out what's going on
+ if ($self->{'y_max_value'} < 100) {
+ do {
+ ++$self->{'y_max_value'};
+ } while ($self->{'y_max_value'} % 8 != 0);
+ }
+ else {
+ # First, get the # of digits in the y_max_value
+ my $num_digits = 1+int(log($self->{'y_max_value'})/log(10));
+
+ # We want to zero out all but the top 2 digits
+ my $mask_length = $num_digits - 2;
+ $self->{'y_max_value'} /= 10**$mask_length;
+ $self->{'y_max_value'} = int($self->{'y_max_value'});
+ $self->{'y_max_value'} *= 10**$mask_length;
+
+ # Add 10^$mask_length to the max value
+ # Continue to increase until it's divisible by 8 * 10^($mask_length-1)
+ # (Throwing in the -1 keeps at least the smallest digit at zero)
+ do {
+ $self->{'y_max_value'} += 10**$mask_length;
+ } while ($self->{'y_max_value'} % (8*(10**($mask_length-1))) != 0);
+ }
+
+
# Add the x-axis labels into the data structure
my $date_progression = generateDateProgression($datefrom, $dateto);
unshift(@data, $date_progression);
diff --git a/template/en/default/reports/chart.png.tmpl b/template/en/default/reports/chart.png.tmpl
index e8e911629..119ff344f 100644
--- a/template/en/default/reports/chart.png.tmpl
+++ b/template/en/default/reports/chart.png.tmpl
@@ -35,6 +35,7 @@
graph.set(x_label => x_label,
y_label => y_label,
y_tick_number => 8,
+ y_max_value => chart.y_max_value,
x_label_position => 0.5,
x_labels_vertical => 1,
x_label_skip => x_label_skip,