use GD; #NOTE: yInc should normally be a multiple of ygrid, if not specifying low # and high values for y. #THIS FUNCTION PLOTS BOTH BARS AND LINES ON SAME CHART. #TO PRINT LINES IN ADDITION TO BARS, INCLUDE THE FOLLOWING ARGS: # # lnlegend => \@list (like xlegend) # ylnvals => \@list (like yvals) sub BarLnChart { my %parm; my (@barcolrs, @linecolrs, $linecolr); my ($g, $v); my ($ycnt, $ylncnt, $h, $i, $j, $k, $legendx, $legendy, $mapstr, @l); #print "

entering GDbarchart!\n"; while (@_) { $v = shift; $v =~ s/^\-//; $parm{$v} = shift; #print "
111 parm name=$v= set to =$parm{$v}=\n"; } #print "
????? *START* ????? barysiz=$parm{barysiz}=\n"; #print "
HELLO WORLD: xcnt=$#{$parm{xvals}}= ycnt=$#{$parm{yvals}}=\n"; for ($i=0;$i<$#{$parm{xvals}};$i++) { #print "
xxxx=${$parm{xvals}}[$i]=\n"; } for ($i=0;$i<=$#{$parm{yvals}};$i++) { #print "
yyyy=${$parm{yvals}}[$i]= cnt=$#{$parm{yvals}}=\n"; } my ($sfw,$sfh) = (gdSmallFont->width,gdSmallFont->height); my ($lfw,$lfh) = (gdLargeFont->width,gdSmallFont->height); my ($sfh2) = $sfh + 2; my ($sfh_2) = $sfh / 2; #SET UP PARAMETER DEFAULTS. #$parm{lmgn} = 60 unless($parm{lmgn}); $parm{minlmgn} ||= 20; #ADDED 20030910. #REMOVED 20030616: $parm{rmgn} = 20 unless($parm{rmgn}); #$parm{bmgn} = 80 unless($parm{bmgn}); my @titles; #NEXT LINE ADDED 20030527 TO SUPPORT 2 KINDS OF "BOTTOM" VALUES. $parm{showvalues} =~ s/\bbottom/lnbottom,xbottom/; #NEXT LINE ADDED 20030527 TO SUPPORT MULTILINE TITLES! @titles = split(/\n|\/i, $parm{title}) if (defined($parm{title})); unless($tmgn) { $parm{tmgn} = $parm{minlmgn}; #$parm{tmgn} += $lfh if (defined($parm{title})); $parm{tmgn} += ($lfh+2)*scalar(@titles) + $sfh if ($#titles >= 0); #ADDED 20030527 TO SUPPORT MULTILINE TITLES! } #$parm{border} = 3 unless (defined($parm{border})); #FOR DEBUG ONLY. #$parm{barcolor} = 'blue' unless ($parm{barcolor}); #$parm{bgcolor} = 'white' unless ($parm{bgcolor}); $parm{valcolor} = 'white' unless ($parm{valcolor}); my ($contrastchk) = 0; $contrastchk = 1 if ($parm{valcolor} eq 'white'); $parm{axiscolor} = 'black' unless ($parm{axiscolor}); $parm{titlecolor} = $parm{axiscolor} unless ($parm{titlecolor}); $parm{valxcolor} = $parm{axiscolor} unless ($parm{valxcolor}); #$parm{barcolors} = [qw(Steelblue4 DarkGreen brown4 Yellow3 darkorchid skyblue darkorange gray khaki salmon bisque4 olivedrab)] unless(defined($parm{barcolors})); $parm{barcolors} = [qw(SteelBlue gray brown4 khaki3 DarkGreen salmon skyblue bisque3 purple darkorange olivedrab yellow3)] unless(defined($parm{barcolors})); for ($j=0;$j<$parm{shiftcolors};$j++) { $ix = shift(@{$parm{barcolors}}); @{$parm{barcolors}} = (@{$parm{barcolors}},$ix); } if (defined($parm{barcolor})) { $parm{barcolors} = [$parm{barcolor}]; } #elsif (defined($parm{xlegend}) && $#{$parm{barcolors}} > 0 && $#{$parm{xlegend}} > 0) #CHGD. TO NEXT 20030630. elsif (defined($parm{xlegend}) && $#{$parm{barcolors}} > 0 && $#{$parm{xlegend}} >= 0) { $_ = 0; $_ = $#{$parm{xlegend}} if (defined($parm{xlegend})); $_ += $#{$parm{lnlegend}}+1 if (defined($parm{lnlegend}) && $#{$parm{lnlegend}} >= 0); $#{$parm{barcolors}} = $_ if ($#{$parm{barcolors}} > $_); $parm{barcolor} = ${$parm{barcolors}}[0]; } else { $parm{barcolor} = ${$parm{barcolors}}[0]; } my ($shadowcolor) = 'black'; if (defined($parm{shadowcolor})) { $shadowcolor = $parm{shadowcolor}; } else { if (defined($parm{bgcolor})) { $shadowcolor = 'gray' if ($parm{bgcolor} =~ /black/i); } } $parm{gridcolor} = $parm{barcolor} unless ($parm{gridcolor}); $parm{headercolor} = $parm{barcolor} unless ($parm{headercolor}); $parm{bordercolor} = 'black' unless ($parm{bordercolor}); $parm{shadowcolor} = $shadowcolor; $ycnt = $#{$parm{xlegend}} + 1 if (defined($parm{xlegend})); $ycnt = 1 unless ($ycnt > 1); my $lnlegendsz = 0; if (defined($parm{lnlegend})) { $ylncnt = $#{$parm{lnlegend}} + 1; #$lnlegendsz = $ylncnt; #CHGD. TO NEXT 4 20020626. for ($i=0;$i<$ylncnt;$i++) { ++$lnlegendsz if (defined(${$parm{lnlegend}}[$i])); } } my $ybottomcnt = 0; if (defined($parm{xlegend})) { for ($i=0;$i<$ycnt;$i++) { ++$ybottomcnt if (defined(${$parm{xlegend}}[$i]) && length(${$parm{xlegend}}[$i])); } } #print "
1ycnt=$ycnt= ylncnt=$ylncnt= lnsz=$lnlegendsz=\n"; $ylncnt = 1 unless ($ylncnt > 1); #print "
2ycnt=$ycnt= ylncnt=$ylncnt= lnsz=$lnlegendsz=\n"; my ($yvalcnt) = $ycnt * ($#{$parm{xvals}}+1); #NO. OF YVALS THERE "SHOULD" BE. for ($i=0;$i<$yvalcnt;$i++) #MAKE SURE ALL Y-VALUES HAVE A VALUE! { ${$parm{yvals}}[$i] = '0' unless (${$parm{yvals}}[$i]); #print "
yyyy=${$parm{yvals}}[$i]= cnt=$#{$parm{yvals}}=\n"; } if ($parm{debug}) { $ix = 0; for ($j=0;$j<=$#{$parm{yvals}};$j+=$ycnt) { for ($i=0;$i<$ycnt;$i++) #DRAW ALL MULTIBARS FOR EACH X-VALUE. { $g .= "
$parm{xvals}[$i]: $parm{yvals}[$ix]\n"; } } $g .= '
---- LINE VALUES '.$#{$parm{ylnvals}}.'----' if (defined($parm{ylnvals})); for ($j=0;$j<=$#{$parm{ylnvals}};$j+=$ycnt) { for ($i=0;$i<$ylncnt;$i++) #DRAW ALL MULTIBARS FOR EACH X-VALUE. { $g .= "
$parm{xvals}[$i]= $parm{ylnvals}[$ix]\n"; } } print "
$g
\n"; return ($g); } #print "
-at 2: ylncnt=".$#{$parm{ylnvals}}."=\n"; if (defined($parm{yloval})) { #print "
----yloval defined as $parm{yloval}.\n"; $parm{ymin} = $parm{yloval}; $ymin = $parm{ymin}; } else { $parm{ymin} = 99999; $parm{ymin} = 0 if (defined($parm{yhival})); } if (defined($parm{yhival})) { #print "
----yhival defined as $parm{yhival}.\n"; $parm{ymax} = $parm{yhival}; $ymax = $parm{ymax}; } else { $parm{ymax} = -99999; } #$parm{ymax} = $parm{yhival}; my $ymaxwidthval = '0'; #ADDED 20030619 my $ymax2widthval = '0'; #ADDED 20030703 unless (defined($parm{yhival}) && defined($parm{yloval})) #CALCULATE HIGH AND LO Y-VALUES. { #print"
????? either yloval or yhival not defined! ycnt=$ycnt\n"; for ($j=0;$j<=$#{$parm{yvals}};$j+=$ycnt) #FIND LOWEST & HIGHEST Y. { for ($i=0;$i<$ycnt;$i++) { $_ = $i + $j; if (defined(${$parm{yvals}}[$_])) { $parm{ymin} = ${$parm{yvals}}[$_] unless ($parm{ymin} <= ${$parm{yvals}}[$_]); $parm{ymax} = ${$parm{yvals}}[$_] unless ($parm{ymax} >= ${$parm{yvals}}[$_]); } #print "
???? ymin=$parm{ymin}= val=${$parm{yvals}}[$_]=\n"; } } #NEXT 3 LINES ADDED 20030619 TO PREVENT WIDE NUMBERS FROM DISPLAYING ON BARS. $ymaxwidthval = &commatize($parm{ymax}, $parm{commatize}); $ymaxwidthval = &commatize($parm{ymin}, $parm{commatize}) if (length($parm{ymin}) > length($parm{ymax})); unless (defined $parm{ylnmin} || defined $parm{ylnmax}) { if (defined $parm{ylnvals}) { for ($j=0;$j<=$#{$parm{ylnvals}};$j+=$ylncnt) #FIND LOWEST & HIGHEST Y. { for ($i=0;$i<$ylncnt;$i++) { $_ = $i + $j; if (defined(${$parm{ylnvals}}[$_])) { $parm{ymin} = ${$parm{ylnvals}}[$_] unless ($parm{ymin} <= ${$parm{ylnvals}}[$_]); $parm{ymax} = ${$parm{ylnvals}}[$_] unless ($parm{ymax} >= ${$parm{ylnvals}}[$_]); } #print "
???? ymax=$parm{ymax}= cash=$_= val=${$parm{ylnvals}}[$_]=\n"; } } } } $ymin = $parm{ymin}; $ymax = $parm{ymax}; #if (defined($parm{yHival}) && defined($parm{ybase})) #{ $parm{ygrid} = 4 unless(defined($parm{ygrid})); # $parm{yInc} = &fincx($parm{yHival},$parm{ygrid}); # $parm{ymax} = ($parm{ygrid} * $parm{yInc}) - $parm{yLoval}; # $parm{ymin} = $parm{yLoval}; #print "
!!! grid=$parm{ygrid}= inc=$parm{yInc}= min=$parm{ymin}= max=$parm{ymax}=\n"; #} #elsif ($parm{yInc} && defined($parm{ybase})) #FIND NEXT EVEN GRIDPOINTS. if ($parm{yInc} && defined($parm{ybase})) #FIND NEXT EVEN GRIDPOINTS. { unless ($parm{yloval}) { $y = $parm{ybase}; $y -= $parm{yInc} while ($y > $parm{ymin}); $parm{ymin} = $y; } unless ($parm{yhival}) { $y = $parm{ybase}; #print "
??? y=$y= inc by=$parm{yInc}= min=$parm{ymin}= max=$parm{ymax}=\n"; $y += $parm{yInc} while ($y < $parm{ymax}); $parm{ymax} = $y; } $parm{yInc} = ($parm{ymax} - $parm{ymin}) / $parm{ygrid} if ($parm{ygrid} > 0); } else { my ($ygrid); if (defined($parm{ygrid})) { $ygrid = $parm{ygrid}; } else { $parm{ygrid} = 4; } if (defined($parm{ybase})) { $parm{ymin} = $parm{ybase} if ($parm{ymin} > $parm{ybase}); $parm{ymax} = $parm{ybase} if ($parm{ymax} < $parm{ybase}); my ($yrange) = $parm{ymax} - $parm{ymin}; if ($parm{ymin} < $parm{ybase} && $parm{ymax} > $parm{ybase}) { for ($j=$parm{ygrid};$j>=$parm{ygrid}-1;$j--) { $parm{yInc} = &fincx($yrange,$j); $ymin = $parm{ybase}; while ($ymin > $parm{ymin}) { $ymin -= $parm{yInc}; } $ymax = $ymin + $parm{yInc} * $parm{ygrid}; #print "
???2 Inc=$parm{yInc}= grid=$j= ymin=$ymin= ymax=$ymax= parm(ymax)=$parm{ymax}=\n"; last if ($ymax >= $parm{ymax}); } $parm{ymin} = $ymin; unless ($ygrid) { while ($parm{ygrid} && $ymax > $parm{ymax}) { --$parm{ygrid}; $ymax -= $parm{yInc}; } $parm{ygrid} = 1 unless ($parm{ygrid}); #print "
???3 Inc=$parm{yInc}= grid=$j= ymax=$ymax= parm(ymax)=$parm{ymax}=\n"; unless ($ymax >= $parm{ymax}) { ++$parm{ygrid}; $ymax += $parm{yInc}; } } $parm{ymax} = $ymax; #print "
???4 Inc=$parm{yInc}= grid=$j= ymax=$ymax= parm(ymax)=$parm{ymax}=\n"; } else { $parm{yInc} = &fincx($yrange,$parm{ygrid}); $parm{ymax} = $parm{yInc} * $parm{ygrid}; } } else { unless ($parm{yInc}) { $parm{yInc} = &fincx(($parm{ymax} - $parm{ymin}), $parm{ygrid}); $parm{ymax} = $parm{ymin} + $parm{yInc} * $parm{ygrid}; #print "
??? Inc=$parm{yInc}= grid=$parm{ygrid}= ymax=$ymax= parm(ymax)=$parm{ymax}=\n"; } } } } else #ADDED 20030619 TO PREVENT WIDE NUMBERS FROM DISPLAYING ON BARS. { $ymaxwidthval = &commatize($parm{yhival}, $parm{commatize}); $ymaxwidthval = &commatize($parm{yloval}, $parm{commatize}) if (length($parm{yloval}) > length($parm{yhival})); } unless ($ycnt == 1 || $parm{showvalues} =~ /nobar|top/) #ADDED 20030703 { my @l = (); my @l2 = (); for ($i=0;$i<=$#{$parm{yvals}};$i+=$ycnt) { @l = (); for (my $j=0;$j<$ycnt;$j++) { $l[$j] = ${$parm{yvals}}[$i+$j] unless ($l[$j] > ${$parm{yvals}}[$i+$j]); } @l2 = sort {$b <=> $a} @l; $ymax2widthval = $l2[1] unless ($ymax2widthval > $l2[1]); #print "-???- yc=$ycnt= ymax2v=$ymax2widthval= l2=".join('|',@l2)."=\n"; } } else { $ymax2widthval = 9999; } $parm{ymax} = $parm{ygrid} unless ($parm{ymin} || $parm{ymax}); #print "
ymin=$parm{ymin}; ymax=$parm{ymax}; yInc=$parm{yInc}; \n"; #print "
-at 300: ylncnt=$ylncnt/".$#{$parm{ylnvals}}."=\n"; #ADDED 20030616 TO HANDLE DUAL RANGES! $rightlegend = 1; if (defined $parm{ylnmin} && defined $parm{ylnmax}) { $parm{ylnInc} = ($parm{ylnmax} - $parm{ylnmin}) / $parm{ygrid}; } elsif (defined $parm{ylnmin} && defined $parm{ylnvals}) { for ($j=0;$j<=$#{$parm{ylnvals}};$j+=$ylncnt) #FIND LOWEST & HIGHEST Y. { for ($i=0;$i<$ylncnt;$i++) { $_ = $i + $j; if (defined(${$parm{ylnvals}}[$_])) { $parm{ylnmax} = ${$parm{ylnvals}}[$_] unless ($parm{ylnmax} >= ${$parm{ylnvals}}[$_]); } #print "
???? ylnmax=$parm{ylnmax}= cash=$_= val=${$parm{ylnvals}}[$_]=\n"; } } $parm{ylnInc} = &fincx(($parm{ylnmax}-$parm{ylnmin}), $parm{ygrid}); } elsif (defined $parm{ylnmax} && defined $parm{ylnvals}) { for ($j=0;$j<=$#{$parm{ylnvals}};$j+=$ylncnt) #FIND LOWEST & HIGHEST Y. { for ($i=0;$i<$ylncnt;$i++) { $_ = $i + $j; if (defined(${$parm{ylnvals}}[$_])) { $parm{ylnmin} = ${$parm{ylnvals}}[$_] unless ($parm{ylnmin} <= ${$parm{ylnvals}}[$_]); } #print "
???? ylnmax=$parm{ylnmax}= cash=$_= val=${$parm{ylnvals}}[$_]=\n"; } } $parm{ylnInc} = &fincx(($parm{ylnmax}-$parm{ylnmin}), $parm{ygrid}); } else { $parm{ylnmin} = $parm{ymin}; $parm{ylnmax} = $parm{ymax}; $parm{ylnInc} = $parm{yInc}; $rightlegend = 0; } $parm{ylnbase} ||= $parm{ybase}; my $prelegendlength = 0; #ADDED 20030910. unless ($parm{lmgn}) #CALCULATE LEFT MARGIN, IF NOT SPECIFIED. { if (length("$parm{ymin}") > length("$parm{ymax}")) { $x = length(&commatize($parm{ymin}, $parm{commatize})); } else { $x = length(&commatize($parm{ymax}, $parm{commatize})); } #$parm{lmgn} = ($x*$sfw) + 23; $parm{lmgn} = ($x*$sfw) + $sfw + $parm{minlmgn}; $parm{lmgn} += $sfh + 2 if (defined($parm{ytitle})); if (defined($parm{prelegend})) #ADDED 20030910 TO SUPPORT HEADERS LEFT OF X-VALUES. { @l = split(/\n/, $parm{prelegend}); foreach my $i (@l) { $prelegendlength = length($i) if ($prelegendlength < length($i)); } if ($prelegendlength > 0) { $prelegendlength *= $sfw; $_ = $prelegendlength + $parm{minlmgn} + $sfh; $parm{lmgn} = $_ if ($parm{lmgn} < $_); } } } if ($rightlegend) #ADDED 20030616 TO HANDLE DUAL RANGES! { unless ($parm{rmgn}) #CALCULATE RIGHT MARGIN, IF NOT SPECIFIED. { if (length("$parm{ylnmin}") > length("$parm{ylnmax}")) { $x = length(&commatize($parm{ylnmin}, $parm{commatize})); } else { $x = length(&commatize($parm{ylnmax}, $parm{commatize})); } $parm{rmgn} = ($x*$sfw) + $sfw + $parm{minlmgn}; $parm{rmgn} += $sfh + 2 if (defined($parm{ylntitle})); } } unless ($parm{rmgn}) { $parm{rmgn} = $parm{minlmgn}; $parm{rmgn} += $sfh + 2 if (defined($parm{ylntitle})); } my ($pointdiam) = 0; #$pointdiam = abs($parm{points}) if (defined($parm{points})); #my ($pointdiam0) = $pointdiam; #$pointdiam0 = 1 if ($parm{points} > 0); #$pointrad = $pointdiam / 2; $pointrad = 0; if (defined ($parm{points}) && @{$parm{points}}) { for ($i=0;$i<=$#{$parm{points}};$i++) { $pointrad = ${$parm{points}}[$i] if ($pointrad < ${$parm{points}}[$i]); } } elsif ($parm{points} > 0) { $pointrad = $parm{points}; } my ($xvallines) = 0; foreach (@{@parm{xvals}}) #REPLACED WITH NEXT ADDITION 20030408. { (@l) = split(/\n/); $xvallines = $#l if ($#l > $xvallines); } #print "
0:bmgn=$parm{bmgn}= show=$parm{showvalues}=\n"; $truebmgn = $parm{bmgn} || 30; #print "
-at 400: ylncnt=".$#{$parm{ylnvals}}."=\n"; unless ($parm{bmgn}) #CALCULATE BOTTOM MARGIN, IF NOT SPECIFIED. { #print "
-xvallines=$xvallines= ycnt=$ycnt= ybottomcnt=$ybottomcnt=\n"; #print "
6:bmgn=$parm{bmgn}=\n"; $parm{bmgn} = ($xvallines*$sfh) + $sfh2 + 12 unless ($parm{bmgn}); #CALCULATE BOTTOM MARGIN, IF NOT SPECIFIED. #print "
7:bmgn=$parm{bmgn}=\n"; #$parm{bmgn} += $sfh2 if (defined($parm{xtitle})); #CHGD. TO NEXT 20030820! $parm{bmgn} += 2 * $sfh2 if (defined($parm{xtitle})); #print "
8:bmgn=$parm{bmgn}=\n"; $parm{bmgn} += $sfh2 if ($parm{showvalues} =~ /total/i); #print "
9:bmgn=$parm{bmgn}=\n"; $parm{bmgn} += $sfh if ($parm{ymin} < $parm{ybase}); #ALLOW ROOM FOR VALUES BELOW DOWNWARD BARS. #print "
10:bmgn=$parm{bmgn}=\n"; #$parm{bmgn} += $sfh2 if (defined($parm{xlegend})); $parm{bmgn} += $sfh2 if (defined($parm{xlegend}) || defined($parm{barseplegend}) || defined($parm{lnlegend}) || defined($parm{lnprelegend})); #print "
11:bmgn=$parm{bmgn}=\n"; $parm{bmgn} += $sfh2 if (defined($parm{ylnvals})); #NEEDED! #print "
12:bmgn=$parm{bmgn}=\n"; $parm{bmgn} += $sfh2 if (defined($parm{ylnvals}) || defined($parm{xlegend})); #print "
13:bmgn=$parm{bmgn}=\n"; $parm{bmgn} += $sfh2 if (defined($parm{barseplegend})); #$parm{bmgn} += $xvallines * $sfh; #print "
20:bmgn=$parm{bmgn}= SV=$parm{showvalues}=\n"; #print "-21:xlegend defined($parm{xlegend})\n" if (defined($parm{xlegend})); #print "-22:ylnvals defined($parm{ylnvals})\n" if (defined($parm{ylnvals})); #print "-23:ylnvals defined($parm{barseplegend})\n" if (defined($parm{barseplegend})); if ($parm{showvalues} =~ /xbottom/i && $ybottomcnt > 0) #ADDED 20030527. { #$parm{bmgn} += ($ycnt * $sfh2) + 2; #CHGD. TO NEXT 20030626. $parm{bmgn} += ($ybottomcnt * $sfh2) + 2; } #print "
26:bmgn=$parm{bmgn}= sv=$parm{showvalues}= ybc=$ybottomcnt=\n"; if ($parm{showvalues} =~ /lnbottom/i && $lnlegendsz > 0) #ADDED 20030408. { $parm{bmgn} += ($lnlegendsz * $sfh2) + 2; } } #print "
30:bmgn=$parm{bmgn}=\n"; unless ($parm{maxxsiz}) { #$parm{barxsiz} = 60 unless ($parm{barxsiz}); unless ($parm{barxsiz}) { $x = 0; foreach (@{$parm{xvals}}) #FIND WIDEST X HEADER TO COMPUTE BAR SIZE. { #$i = $sfw * length($_); #$x = $i unless ($x > $i); (@l) = split(/\n/); for ($k=0;$k<=$#l;$k++) { $i = $sfw * length($l[$k]); $x = $i unless ($x > $i); } } foreach (@{$parm{yvals}}) #FIND WIDEST Y-VALUE TO COMPUTE BAR SIZE. { $i = $sfw * length($_); $x = $i unless ($x > $i); } #BARXSIZ REPRESENTS WIDTH OF *ALL* BARS IN SET AND ONLY A SINGLE #XVALUE PRINTS PER *SET*! #$parm{barxsiz} = ($x + 4) * $ycnt; #CHGD. TO NEXT 20030619. $parm{barxsiz} = $x + 4; } if ($parm{xbreak} > 0 && $ycnt > 0) #XBREAK STUFF ADDED 20001204 TO ALLOW GROUPING. (ADD HORIZONTAL SPACE AFTER EVERY NTH BAR). { $parm{maxxsiz} = ($parm{barxsiz} * ($#{$parm{xvals}}+1+int(($#{$parm{xvals}}/$parm{xbreak})*(1/$ycnt)))) + $parm{lmgn} + $parm{rmgn}; } else { $parm{maxxsiz} = ($parm{barxsiz} * ($#{$parm{xvals}}+1)) + $parm{lmgn} + $parm{rmgn}; } if (defined($parm{xlegend})) #IF LEGENDS WIDER THAN CHART, WIDEN CHART! { #$legendx = $parm{lmgn} / 2; #CHGD TO NEXT 20030910. $legendx = $parm{minlmgn}; $ix = 0; $i = $sfh + 7; foreach (@{$parm{xlegend}}) { $_ = length(${$parm{xlegend}}[$ix]); $legendx += $i + ($sfw * $_) if ($_); ++$ix; } $parm{maxxsiz} = $legendx if ($parm{maxxsiz} < $legendx); } } else { #print "
??? xvalscnt=$#{$parm{xvals}}=\n"; if ($parm{xbreak} > 0 && $ycnt > 0) { $parm{barxsiz} = ($parm{maxxsiz} - ($parm{lmgn} + $parm{rmgn})) / ($#{$parm{xvals}}+1+int(($#{$parm{xvals}}/$parm{xbreak})*(1/$ycnt))) unless ($parm{barxsiz}); } else { if ($#{$parm{xvals}} >= 0) #PREVENT DIVIDE-BY-ZERO ERRORS! { $parm{barxsiz} = ($parm{maxxsiz} - ($parm{lmgn} + $parm{rmgn})) / ($#{$parm{xvals}}+1) unless ($parm{barxsiz}); } else { $parm{barxsiz} = $parm{maxxsiz} - ($parm{lmgn} + $parm{rmgn}); } } #NEXT 12 LINES ADDED 20030619 TO ENSURE BARS WIDE ENOUGH TO #ACCOMMODATE X-VALUES (LATER WE PREVENT PRINTING BARS OFF RIGHT #EDGE OF CHART). $x = 0; foreach (@{$parm{xvals}}) #FIND WIDEST X HEADER TO COMPUTE BAR SIZE. { (@l) = split(/\n/); for ($k=0;$k<=$#l;$k++) { $i = $sfw * length($l[$k]); $x = $i unless ($x > $i); #print "
---- l($k) =$l[$k]= i=$i= x=$x=\n"; } } #DON'T NEED NEXT 5 HERE, I DON'T THINK. # foreach (@{$parm{yvals}}) #FIND WIDEST Y-VALUE TO COMPUTE BAR SIZE. # { # $i = $sfw * length($_); # $x = $i unless ($x > $i); # } #print "
-barxsiz WAS =$parm{barxsiz}=\n"; $parm{barxsiz} = $x+4 if ($parm{barxsiz} < $x+4); #print "
-barxsiz NOW =$parm{barxsiz}= x=$x=\n"; } #print "
-at 500: ylncnt=".$#{$parm{ylnvals}}."=\n"; unless ($parm{barpct}) { $parm{barpct} = 80; $parm{barpct} = 100 if ($parm{barxsiz} < 10); } my $barxpix = (($parm{barxsiz} * $parm{barpct}) / 100) / $ycnt; #NEXT 24 LINES ADDED 20030619 TO PREVENT NUMBERS WIDER THAN BARS FROM BEING #DISPLAYED ON THE BARS (IF *ANY* Y-VALUE TOO WIDE, FORCE ALL TO BOTTOM! my $ymaxwidth = length($ymaxwidthval) * $sfw; my $ymax2width = length($ymax2widthval) * $sfw; #print "-!!!- ymaxwidth=$ymaxwidth($ymaxwidthval) = 2=$ymax2width($ymax2widthval)= barxpix=$barxpix= maxval=$ymaxwidthval= barxsiz=$parm{barxsiz}= barpct=$parm{barpct}= ycnt=$ycnt=\n"; if ($ymaxwidth > $barxpix && $ymax2width > $barxpix && ($ycnt > 1 || $ymaxwidth > $parm{barxsiz})) { $parm{commatize} = 0; #1ST, TRY STRIPPING COMMAS, SEE IF FITS NOW. $ymaxwidthval =~ s/\,//g; $ymaxwidth = length($ymaxwidthval) * $sfw; my $addedbottom = 0; #print "----- wont fit in bar!\n"; if ($ymaxwidth > $barxpix) { #print "----- still wont fit after decommatizing, ymaxwidth=$ymaxwidth=\n"; #STILL WON'T FIT, FORCE OFF OF BAR AND ONTO BOTTOM OF CHART. $addedbottom = 1; } #IF STILL WON'T FIT WITHIN THE ALLOWED SPACE AT BOTTOM, DON'T SHOW AT ALL!!! if ($ymaxwidth > $parm{barxsiz}) { #print "-!!!- wont fit at bottom either!\n"; $parm{bmgn} -= $sfh2 + 2 if ($parm{showvalues} =~ s/(?:xbottom|total)//g); $parm{showvalues} .= ',nobar'; } elsif ($addedbottom) { unless ($parm{showvalues} =~ /xbottom/) { #$parm{bmgn} += $sfh2 + 2; #CHGD. TO NEXT 20030903. $parm{bmgn} += ($ybottomcnt * $sfh2) + 2; } $parm{showvalues} .= ',nobar,xbottom'; #print "----- added to bottom, showvalues=$parm{showvalues}=\n"; } #print "
-???- sv=$parm{showvalues}=\n"; } unless ($parm{maxysiz}) { $parm{barysiz} = 1 unless ($parm{barysiz}); #print "
????? 1 ????? barysiz=$parm{barysiz}=\n"; $parm{maxysiz} = ($parm{barysiz} * ($parm{ymax} - $parm{ymin})) + $parm{bmgn} + $parm{tmgn}; } else { #print "
??? maxy=$parm{maxysiz}, t=$parm{tmgn}; b=$parm{bmgn}; ymax=$parm{ymax}; ymin=$parm{ymin}; barysiz=$parm{barysiz}.\n"; $parm{barysiz} = ($parm{maxysiz} - ($parm{tmgn} + $parm{bmgn})) / ($parm{ymax} - $parm{ymin}) unless ($parm{barysiz}); } #print "
barxsiz=$parm{barxsiz}; barysiz=$parm{barysiz};\n"; my ($ydiff) = $parm{ymax} - $parm{ymin}; #print "--- ydiff=$ydiff= ym=$parm{ymin}= YM=$parm{ymax}=\n"; if ($parm{xbreak} > 0 && $ycnt > 0) { $chartxsiz = $parm{barxsiz} * ($#{$parm{xvals}}+1+int(($#{$parm{xvals}}/$parm{xbreak})*(1/$ycnt))); #(PIXELS) } else { $chartxsiz = $parm{barxsiz} * ($#{$parm{xvals}}+1); #(PIXELS) } $chartxsiz = $parm{maxxsiz} - ($parm{lmgn} + $parm{rmgn}) if ($chartxsiz > $parm{maxxsiz} - ($parm{lmgn} + $parm{rmgn})); $chartysiz = $parm{barysiz} * $ydiff; #print "
????????? bysz=$parm{barysiz}= sfh=$sfh= cys=$chartysiz=\n"; #print "
-at 600: ylncnt=".$#{$parm{ylnvals}}."=\n"; unless ($parm{ygrid}) #CALCULATE YGRID (# OF GRID LINES), IF NECESSARY. { ##IF Y IS AN LOV, SET YGRID TO # OF ELEMENTS IN LOV! if ($parm{yInc}) #IF YINC SET, USE YINC. { $parm{ygrid} = $ydiff / $parm{yInc} if ($parm{yInc}); } else { $parm{ygrid} = 4; } } unless ($parm{yInc}) { $parm{yInc} = $ydiff / $parm{ygrid}; } if ($parm{ybreak}) { while ( (($ymax == 0) || (($ymax * $parm{ybreak}) < $parm{ymax})) && (($ymin == 0) || (($ymin * $parm{ybreak}) > $parm{ymin}))) { $parm{ymax} /= 2; $parm{ymin} /= 2; $parm{yInc} /= 2; $parm{yinc} /= 2; $parm{barysiz} *= 2; } } $parm{ybase} = $parm{ymin} unless (defined($parm{ybase})); #print "
----final values: maxxsiz=$parm{maxxsiz}; maxysiz=$parm{maxysiz}; ybase=$parm{ybase}; yInc=$parm{yInc}; ygrid=$parm{ygrid}= ymax=$parm{ymax}.\n"; $g = new GD::Image($parm{maxxsiz},$parm{maxysiz}); #CONVERT COLOR NAMES TO RGB VALUES. #print "
-at 700: ylncnt=".$#{$parm{ylnvals}}."=\n"; @linecolrs = (); if (open(RGB,") { chomp; ($rr,$gg,$bb,$color) = split(' '); $color = "\L$color\E"; foreach (qw(bar bg val axis grid title valx header border shadow line barsep)) { $x = $parm{$_."color"}; ${$_."colr"} = $g->colorAllocate($rr,$gg,$bb) if ($color eq "\L$x\E"); } for($j=0;$j<=$#{$parm{barcolors}};$j++) { if ($color eq "\L${$parm{barcolors}}[$j]\E") { $i = $g->colorAllocate($rr,$gg,$bb); $bcweights[$j] = ($rr > $gg) ? (($bb > $rr) ? $bb : $rr) : (($bb > $gg) ? $bb : $gg); $barcolrs[$j] = $i; } } if (defined($parm{linecolors})) { for($j=0;$j<=$#{$parm{linecolors}};$j++) { if ($color eq "\L${$parm{linecolors}}[$j]\E") { $i = $g->colorAllocate($rr,$gg,$bb); # $bcweights[$j] = ($rr > $gg) ? (($bb > $rr) ? $bb : $rr) : # (($bb > $gg) ? $bb : $gg); $linecolrs[$j] = $i; } } } if (defined($parm{barsepcolors})) { for($j=0;$j<=$#{$parm{barsepcolors}};$j++) { if ($color eq "\L${$parm{barsepcolors}}[$j]\E") { $i = $g->colorAllocate($rr,$gg,$bb); $barsepcolrs[$j] = $i; } } } } close (RGB); } $j = 0; $j += $ycnt if (defined($parm{xlegend}) && !defined($parm{linecolor}) && $#linecolrs < 0); while ($#linecolrs < $ylncnt) { push(@linecolrs, defined($linecolr) ? $linecolr : $barcolrs[$j++]); } #SET UP DEFAULTS FOR ANY MISSING COLORS. $black = $g->colorAllocate(0,0,0); $barcolr = $black unless ($barcolr); $valcolr = $black unless ($valcolr); $axiscolr = $black unless ($axiscolr); $gridcolr = $black unless ($gridcolr); $shadowcolr = $g->colorAllocate(0,0,0) unless ($shadowcolr); $bgcolr = $g->colorAllocate(127,127,127) unless ($bgcolr); if ($#barcolrs <= 0) #FILL OUT COLOR ARRAY WITH BAR-COLOR IF NOT SPECIFIED. { for ($j=0;$j<=$ycnt;$j++) { $barcolrs[$j] = $barcolr; } } elsif ($#barcolrs < $ycnt) #FILL OUT COLOR ARRAY TO MATCH Y-ARRAY. { for ($j=$#barcolrs+1;$j<$ycnt;$j++) { $barcolrs[$j] = $barcolrs[($j % $#barcolrs)]; } } if (defined($parm{bgcolor})) { #print "
??? bgcolor=$parm{bgcolor}= bgcolr=$bgcolr=\n"; #$g->transparent($bgcolr); #MAKE THE BACKGROUND COLOR TRANSPARENT. $g->fill(1,1,$bgcolr); } for (0..($parm{border}-1)) { $g->rectangle($_,$_,($parm{maxxsiz}-($_+1)),($parm{maxysiz}-($_+1)),$bordercolr); } my $barylo = $parm{tmgn} + ($chartysiz * (($parm{ymax}-$parm{ybase}) / ($parm{ymax}-$parm{ymin}))); #print "
-at 800: ylncnt=".$#{$parm{ylnvals}}."=\n"; #goto SKIPIT1; #DRAW THE X AND Y AXES. my $maxygridarea = $parm{maxxsiz} - $parm{rmgn}; my $maxygridarea3 = $maxygridarea + 3; #CHGD. TO NEXT 20030619 SO THAT AXIS SPANS CHART EVEN IF ZERO OR FEW BARS. #$g->line($parm{lmgn},$barylo,($parm{lmgn}+$chartxsiz),$barylo,$axiscolr); $g->line($parm{lmgn},$barylo,$maxygridarea,$barylo,$axiscolr); $g->line($parm{lmgn},$parm{tmgn},$parm{lmgn},($parm{tmgn}+$chartysiz),$axiscolr); my $xzonewidth = ((100-$parm{barpct})*$parm{barxsiz}) / 200; #print "-1 zonewidth=$xzonewidth= barpct=$parm{barpct}= barxsiz=$parm{barxsiz}=\n"; if (defined $parm{barseps}) #ADDED 20030730 TO SUPPORT VERTICAL SEPARATORS BETWEEN BARS. { my $s; my $justify = '|'; my $x; if (ref($parm{barseps}) =~ /ARRAY/i) { for (my $i=0;$i<=$#{$parm{barseps}};$i++) { $g->line($parm{lmgn}+($parm{barseps}->[$i]*$parm{barxsiz}),$parm{tmgn}-4, $parm{lmgn}+($parm{barseps}->[$i]*$parm{barxsiz}),($parm{tmgn}+$chartysiz+4), (defined $barsepcolrs[$i]) ? $barsepcolrs[$i] : ($barsepcolr||$axiscolr)); #ADDED 20030903 TO SUPPORT LEGEND TEXT ABOVE VERTICAL LINES. if (defined $parm{barseptoplegend} && ref($parm{barseptoplegend}) =~ /ARRAY/i) { $s = $parm{barseptoplegend}->[$x]; $justify = $1 if ($s =~ s/^([\<\|\>])//); $x = $parm{lmgn}+($parm{barseps}->[$i]*$parm{barxsiz})+2; if ($justify eq '<') { $x -= (length($s)*$sfw) + 2; } elsif ($justify eq '|') { $x -= (length($s)*$sfw) / 2; } $g->string(gdSmallFont, $x, $parm{tmgn}-(2+$sfh), $s, $headercolr); } } } else { $g->line($parm{lmgn}+($parm{barseps}*$parm{barxsiz}),$parm{tmgn}-4, $parm{lmgn}+($parm{barseps}*$parm{barxsiz}),($parm{tmgn}+$chartysiz+4), ($barsepcolr||$axiscolr)); #ADDED 20030903 TO SUPPORT LEGEND TEXT ABOVE VERTICAL LINES. if (defined $parm{barseptoplegend}) { $s = $parm{barseptoplegend}; $justify = $1 if ($s =~ s/^([\<\|\>])//); $x = $parm{lmgn}+($parm{barseps}*$parm{barxsiz})+2; if ($justify eq '<') { $x -= (length($s)*$sfw) + 2; } elsif ($justify eq '|') { $x -= (length($s)*$sfw) / 2; } $g->string(gdSmallFont, $x, $parm{tmgn}-(2+$sfh), $s, $headercolr); } } } #NOW DRAW THE HORIZ. GRID LINES my $yhead = $parm{ybase}; my $yhead2 = $parm{ylnbase}; my $ydelta = $parm{barysiz} * $parm{yInc}; #print "
??? ydelta=$ydelta= barylo=$barylo= barysiz=$parm{barysiz}= Inc=$parm{yInc}.\n"; my $yheadxmax; $yheadxmax = length("$yhead") if(defined($parm{ytitle})); my $yheadxmax2; $yheadxmax2 = length("$yhead2") if(defined($parm{ylntitle})); #UNNEEDED? $g->string(gdSmallFont,$parm{lmgn}-((length("$yhead")*$sfw)+5),$barylo-($sfh/2), # "$yhead",$headercolr); #print "
-init: h=$yhead2, mx=$parm{maxxsiz}, r=$parm{rmgn}, l=".length($yhead2).", sfw=$sfw\n"; #UNNEEDED? $g->string(gdSmallFont,$maxygridarea3,$barylo-($sfh/2), # "$yhead2",$headercolr) if ($rightlegend); ## $yhead = $parm{ybase} + $parm{yInc}; ## $y = $barylo - $ydelta; $y = $barylo; my ($myyval); while ($y >= $parm{tmgn}-1) { $myyval = &commatize($yhead,$parm{commatize}); #CHGD. TO NEXT 20030619 SO THAT AXIS SPANS CHART EVEN IF ZERO OR FEW BARS. #$g->line($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); $g->line($parm{lmgn}-4,$y,$maxygridarea,$y,$gridcolr); #DRAW HORIZ. GRID-LINE. #print "
???+LINE($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr)\n"; $g->string(gdSmallFont,$parm{lmgn}-((length($myyval)*$sfw)+5),$y-($sfh/2), $myyval,$headercolr); #DRAW LEFT LEGEND VALUES. $yheadxmax = length($myyval) if (defined($parm{ytitle}) && (length($myyval) > $yheadxmax)); $myyval = &commatize($yhead2,$parm{commatize}); $yheadxmax2 = length($myyval) if (defined($parm{ylntitle}) && (length($myyval) > $yheadxmax2)); #print "
-loop: h=$yhead2, mx=$parm{maxxsiz}, r=$parm{rmgn}, l=".length($myyval).", sfw=$sfw\n"; $g->string(gdSmallFont,$maxygridarea3,$y-($sfh/2), $myyval,$headercolr) if ($rightlegend); #DRAW RIGHT LEGEND VALUES. $y -= $ydelta; $yhead += $parm{yInc}; $yhead2 += $parm{ylnInc}; } $yhead = $parm{ybase} - $parm{yInc}; $y = $barylo + $ydelta; #print "
--- y=$y= tmgn=$parm{tmgn}= cys=$chartysiz=\n"; while ($y <= ($parm{tmgn} + $chartysiz)+1) { $myyval = &commatize($yhead,$parm{commatize}); #CHGD. TO NEXT 20030619 SO THAT AXIS SPANS CHART EVEN IF ZERO OR FEW BARS. #$g->line($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); $g->line($parm{lmgn}-4,$y,$maxygridarea,$y,$gridcolr); #print "
???-LINE($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr)\n"; $g->string(gdSmallFont,$parm{lmgn}-((length($myyval)*$sfw)+3),$y-($sfh/2), $myyval,$headercolr); $y += $ydelta; $yhead -= $parm{yInc}; } if ($parm{yinc} > 1) #DRAW THE HORIZ. TICKMARKS, IF NEEDED. { $ydelta = ($parm{barysiz} * $parm{yInc}) / $parm{yinc}; $y = $barylo; while ($y > $parm{tmgn}) { $g->line($parm{lmgn}-2,$y,$parm{lmgn},$y,$gridcolr); $y -= $ydelta; } $y = $barylo; while ($y < ($parm{tmgn} + $chartysiz)) { $g->line($parm{lmgn}-2,$y,$parm{lmgn},$y,$gridcolr); $y += $ydelta; } } #SET UP IMAGE MAPPING, IF APPLICABLE. if (defined($parm{links}) || defined($parm{mouseovers}) || defined($parm{link}) || defined($parm{mouseover})) { $parm{mapname} = "BarChart.$$" unless (defined($parm{mapname})); $mapstr = '' . "\n"; } #DRAW THE BARS. SKIPIT: #print "
-at 900: ylncnt=".$#{$parm{ylnvals}}."=\n"; #print "-2 zonewidth=$xzonewidth= barpct=$parm{barpct}= barxsiz=$parm{barxsiz}=\n"; my $barxbase = $parm{lmgn} + $xzonewidth; my $barxlo = $barxbase; $ix = 0; #$barcolr = $barcolrs[$ix]; #$legendx = $parm{lmgn} / 2; #CHGD TO NEXT 20030910. $legendx = $parm{minlmgn}; my $rightedge = $parm{lmgn} + $chartxsiz; my $colorcnt = $#barcolrs + 1; my $barxpix1 = $barxpix + 1; #print "-!!!- COLORCNT=$colorcnt= ycnt=$ycnt=\n"; $colorcnt = $ycnt if (($ycnt > 1 || defined($parm{xlegend})) && $colorcnt > $ycnt); $colorcnt = 1 if ($colorcnt <= 0); #SOME VARIABLES TO SAVE ARITHMETIC IN LOOPS. my ($linkbottom) = $parm{tmgn} + $chartysiz + $sfh + 4; $sfh2 = $sfh + 2; my ($chartbottom) = $parm{tmgn} + $chartysiz; #print "-cb=$chartbottom= cyz=$chartysiz= tm=$parm{tmgn}=\n"; $chartbottom += $sfh if ($parm{ymin} < $parm{ybase}); #ALLOW ROOM FOR VALUES BELOW DOWNWARD BARS. my ($chartbottom2) = $chartbottom + 2; my ($chartbottom2x) = $chartbottom2 + ($xvallines+1) * $sfh; my ($chartbottom3) = $chartbottom + $sfh2 + $sfh*$xvallines; $chartbottom3 += + ($sfh2*$ybottomcnt) + 2 if ($parm{showvalues} =~ /xbottom/i && $ybottomcnt > 0); $chartbottom3 += + ($sfh2*$lnlegendsz) + 2 if ($parm{showvalues} =~ /lnbottom/i && $lnlegendsz > 0); $legendy = $chartbottom3 + $sfh2 + 2; #print "-1: cb3=$chartbottom3= ybc=$ybottomcnt= lnlsz=$lnlegendsz= ly=$legendy= xvl=$xvallines=\n"; $legendy += $sfh2 if (defined($parm{xtitle})); #print "-2: ly=$legendy=\n"; #$legendy += $sfh2 if (defined($parm{barseplegend})); $legendy += $sfh2 if ($parm{showvalues} =~ /total/i); #ADDED 20030408. #print "-3: ly=$legendy=\n"; if (defined($parm{xtitle})) { $_ = ($chartxsiz - ($sfw*length($parm{xtitle})))/2; $_ = $parm{lmgn} if ($_ < $parm{lmgn}); $g->string(gdSmallFont, $_ + $parm{lmgn}, ($legendy-$sfh2), $parm{xtitle}, $titlecolr); } my $totalxlo = $parm{lmgn} + $xzonewidth; my @ysum; $g->string(gdSmallFont, $barxlo, $chartbottom2, ($parm{nodata}||'..No data to plot.'), $headercolr) unless ($#{$parm{xvals}} >= 0); $ycenter = $chartbottom2x+2; my $bottomix = 0; my $bottomi = 0; for ($j=0;$j<=$#{$parm{yvals}};$j+=$ycnt) { $barxbase += $parm{barxsiz}*(1/$ycnt) if ($ix && $parm{xbreak} && ($ycnt > 0) && !($ix % $parm{xbreak})); $barxlo = $barxbase; if (defined($parm{links}[$ix]) || defined($parm{mouseovers}) #ADD HYPERLINK, IF ANY, TO BAR. || defined($parm{link}) || defined($parm{mouseover})) { $l = 'HREF="//'; if (defined($parm{links}[$ix]) || defined($parm{link})) { $parm{links}[$ix] = $parm{link} unless($parm{links}[$ix]); $l = ' HREF="' . $parm{links}[$ix]; unless ($l =~ m#\"\s*(http\:|\/)#) { $l = 'HREF="' . $parm{linkpath}; $l .= $parm{links}[$ix] unless ($l =~ s#\*#$parm{links}[$ix]#); } } $l .= '"'; $l = '' if ($l eq 'HREF="//"' && !defined($parm{mouseovers}[$ix])); $mapstr .= 'AT ONE: l=$l= ix=$ix=
mapstr now ===$mapstr===\n"; } elsif (defined($parm{mouseover})) #ADD DEFAULT MOUSEOVER LINK, IF ANY. { $l = $parm{mouseover}; $l =~ s/\'/\"/g; $mapstr .= " onmouseover=\"window.status='$l'; return true\""; #print "
-2: l=$l= mo=".$parm{mouseover}."= mapstr now =$mapstr=\n"; } $mapstr .= ">\n"; } $bottomi = 0; for ($i=0;$i<$ycnt;$i++) #DRAW ALL MULTIBARS FOR EACH X-VALUE. { #print "
-???- i=$i= j=$j= bxlo=$barxlo rightedge=$rightedge=\n"; next if ($barxlo > $rightedge); #AVOID PRINTING BARS OFF CHART! $_ = $i + $j; $ysum[$ix] += ${$parm{yvals}}[$_] if (defined(${$parm{yvals}}[$_])); #print "--ix=$ix= j=$j= cash=$_= yval=${$parm{yvals}}[$_]= \n"; $myyval = &commatize(${$parm{yvals}}[$_], $parm{commatize}); #19991223 #THIS WRITES THE Y-VALUES OUT IN ROWS FOR "BOTTOM" OPTION. if ((defined($parm{xlegend})||$parm{showvalues} =~ /nobar/i) && $parm{showvalues} =~ /xbottom/i) { # $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))), #!!!!!!!!! ($chartbottom2x+2+($i*$sfh)),$myyval,$headercolr); if (length(${$parm{xlegend}}[$i])) #COND. ADDED 20030626. { $g->string(gdSmallFont, ($totalxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))), ($chartbottom2x+2+($bottomi*$sfh2)),$myyval,$headercolr); ++$bottomi; } #print "
ix=$ix= CASH=$_= myval=$myyval= X=".($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw)))."= i=$i= j=$j=\n"; #print "-???- yval=$myyval= comma=$parm{commatize}=\n"; } #PRINT X HEADERS unless ($i) { #WRITE OUT TOTAL LINE FOR BARS HERE IF NO LINES DEFINED. if ((!defined($parm{ylnvals}) || $#{$parm{ylnvals}} < 0) && $parm{showvalues} =~ /total/i) { $myyval = &commatize($ysum[$j],$parm{commatize}); $g->line($parm{lmgn}, $chartbottom3, ($parm{lmgn}+$chartxsiz), $chartbottom3, $headercolr); $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))), $chartbottom3+2,$myyval,$valxcolr); #print "
TOTAL: write =$myyval= at (".($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))/2)."/$chartbottom3)\n"; } #THIS CODE DRAWS THE VERTICAL COLUMN OF SYMBOLS JUST LEFT OF THE "BOTTOM" VALUES #AND THE HORIZONTAL ROW OF SYMBOLS FOR THE "XLEGEND" VALUES. #print "
SV=$parm{showvalues}= ycnt=$ycnt= xlegend($ix)=$parm{xlegend}[$ix]=\n"; if ($parm{showvalues} =~ /xbottom/i && $ybottomcnt > 0) { #THIS DRAWS THE VERTICAL COLUMN OF RECTANGLES JUST LEFT OF EACH ROW OF "BOTTOM" VALUES". #if (defined($parm{xlegend}) && defined($parm{xlegend}[$ix]) && $parm{showvalues} =~ /xbottom/i) #LAST COND. CHGD. TO NEXT 20030626 TO SKIP EMPTY XLEGEND VALUES. if (defined($parm{xlegend}) && defined($parm{xlegend}[$ix]) && length($parm{xlegend}[$ix]) && $parm{showvalues} =~ /xbottom/i) { $xcenter = $parm{lmgn} - $sfh; #$ycenter = int($chartbottom2x+2+($ix*$sfh2)); $g->filledRectangle($xcenter, $ycenter, ($xcenter+$sfh), ($ycenter+$sfh), $barcolrs[$ix]); #print "
ix=$ix= i=$i= j=$j= cash=$_= sfh2=$sfh2= yc=$ycenter=\n"; #print "-X???????-- xc=$xcenter= lm=$parm{lmgn}= sfh=$sfh=\n"; $ycenter += $sfh2; ++$bottomix; } } #$g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length(${$parm{xvals}}[$ix])*$sfw))/2), # $chartbottom2,${$parm{xvals}}[$ix],$headercolr); if (!$ix && $prelegendlength > 0) #ADDED 20030910 TO SUPPORT HEADERS LEFT OF X-VALUES. { @l = split(/\n/, $parm{prelegend}); for ($k=0;$k<=$#l;$k++) { $g->string(gdSmallFont, $parm{lmgn}-($prelegendlength+$sfh), ($chartbottom2+($k*$sfh)), $l[$k] ,$headercolr); } } (@l) = split(/\n/,${$parm{xvals}}[$ix]); for ($k=0;$k<=$#l;$k++) { @ll = split(/\n/,$l[$k]); for ($ll=0;$ll<=$#ll;$ll++) { #print "
k=$k= ll=$ll= ll($ll)=$ll[$ll]= l($k)=$l[$k]=\n"; $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($ll[$ll])*$sfw))/2), ($chartbottom2+(($k+$ll)*$sfh)), $ll[$ll] ,$headercolr); } } # if ($parm{showvalues} =~ /total/i) # { #print "
TOTAL: write =$myyval= at (".($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))/2)."/$chartbottom2)\n"; # $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))/2), # $chartbottom2,"$myyval",$headercolr); # #$chartbottom2 += $sfh; # } #THIS WRITES OUT THE X-LEGEND (BAR) HEADERS HORIZONTALLY BELOW X-TITLE AND X-VALUES. #print "
X-LEGEND($legendx,$legendy)=${$parm{xlegend}}[$ix]=\n"; #if (defined($parm{xlegend}) && defined(${$parm{xlegend}}[$ix])) #LAST COND. CHGD. TO NEXT 20030626 TO SKIP EMPTY XLEGEND VALUES. if (defined($parm{xlegend}) && defined(${$parm{xlegend}}[$ix]) && length(${$parm{xlegend}}[$ix])) { $g->filledRectangle($legendx,$legendy,($legendx+$sfh),($legendy+$sfh),$barcolrs[$ix]); $legendx += $sfh2 + 2; $g->string(gdSmallFont,$legendx,$legendy,${$parm{xlegend}}[$ix],$headercolr); $legendx += ($sfw * length(${$parm{xlegend}}[$ix])) + 5; } if (defined($parm{barseplegend})) #MOVED HERE 20030903. { my $mylegendx = ($parm{lmgn} / 2) + $sfh_2; #CHGD TO NEXT 20030910. my $mylegendx = $parm{minlmgn} + $sfh_2; my $myycenter = $legendy + $sfh2; for (my $x=0;$x<=$#{$parm{barseplegend}};$x++) { $g->line($mylegendx, $myycenter, $mylegendx, ($myycenter+$sfh), (defined $barsepcolrs[$x]) ? $barsepcolrs[$x] : ($barsepcolr||$axiscolr)); $g->string(gdSmallFont, $mylegendx+$sfw, $myycenter, $parm{barseplegend}->[$x], $headercolr); $mylegendx += ($sfw * length($parm{barseplegend}->[$x])) + 10 + $sfw; } } } #$barypix = $parm{barysiz} * (${$parm{yvals}}[$_] - $parm{ymin}); $baryhi = $parm{tmgn} + ($chartysiz * (($parm{ymax}-${$parm{yvals}}[$_]) / ($parm{ymax}-$parm{ymin}))); #DRAW EACH INDIVIDUAL BAR. #BARS ARE DRAWN(IN ORDER 3 x-values, 4 ys per x): 1,2,3,4 5,6,7,8 9,10,11,12 if ($barylo < $baryhi) #BAR IS BELOW AXIS. { #print "
??? barxpix=$barxpix= lxp=". (length("$myyval")*$sfw) ."=\n"; $g->filledRectangle($barxlo,$barylo,($barxlo+$barxpix),$baryhi,$barcolrs[($_ % $colorcnt)]); if ($parm{shadow}) { $g->filledRectangle($barxlo+$barxpix, $barylo, ($barxlo+$barxpix+$parm{shadow}), ($baryhi-$parm{shadow}), $shadowcolr); } unless ($parm{showvalues} =~ /nobar/i) { if (($parm{showvalues} !~ /top/i) && ($baryhi >= ($barylo+$sfh)) && ((length("$myyval")*$sfw) <= $barxpix1)) { if (!$contrastchk || $bcweights[($_ % $colorcnt)] < 36500) { $g->string(gdSmallFont,($barxlo+($barxpix-(length($myyval)*$sfw))/2), $baryhi-$sfh,"$myyval",$valcolr); } else { $g->string(gdSmallFont,($barxlo+($barxpix-(length($myyval)*$sfw))/2), # $baryhi+1,"$myyval",$valxcolr); #FIXED TO NEXT 20030703. $baryhi-$sfh,"$myyval",$valxcolr); } } else { #print "
---does not fit!\n"; $g->string(gdSmallFont,($barxlo+($barxpix-(length($myyval)*$sfw))/2), $baryhi+1,"$myyval",$valxcolr); } } } else #BAR IS ABOVE AXIS. { $g->filledRectangle($barxlo,$baryhi,($barxlo+$barxpix),$barylo,$barcolrs[($_ % $colorcnt)]); if ($parm{shadow}) { $g->filledRectangle(($barxlo+$parm{shadow}), ($baryhi-$parm{shadow}), ($barxlo+$barxpix+$parm{shadow}), ($baryhi-1), $shadowcolr); $g->filledRectangle($barxlo+$barxpix, $baryhi, ($barxlo+$barxpix+$parm{shadow}), ($barylo-$parm{shadow}), $shadowcolr); } #print "
??? sv=$parm{showvalues}=\n"; unless ($parm{showvalues} =~ /nobar/i) { if (($parm{showvalues} !~ /top/i) && ($barylo >= ($baryhi+$sfh)) && ((length("$myyval")*$sfw) <= $barxpix1)) { #print "
contrast=$contrastchk= weight=$bcweights[($_ % $colorcnt)]=\n"; if (!$contrastchk || $bcweights[($_ % $colorcnt)] < 190) { $g->string(gdSmallFont,($barxlo+($barxpix-(length($myyval)*$sfw))/2), $baryhi+1,"$myyval",$valcolr); } else { $g->string(gdSmallFont,($barxlo+($barxpix-(length($myyval)*$sfw))/2), $baryhi+1,"$myyval",$valxcolr); } } else { $g->string(gdSmallFont,($barxlo+($barxpix-(length($myyval)*$sfw))/2), ($baryhi-$sfh)-$parm{shadow},"$myyval",$valxcolr); } } } $barxlo += $barxpix; } $ix++; $barxbase += $parm{barxsiz}; $totalxlo += $parm{barxsiz}; } #print "
-at 1100: ylncnt=".$#{$parm{ylnvals}}."=\n"; ####START #SOME VARIABLES TO SAVE ARITHMETIC IN LOOPS. $barxpix = (($parm{barxsiz} * $parm{barpct}) / 100) / $ycnt; #$barxbase = $parm{lmgn} + $xzonewidth; $barxbase = $parm{lmgn}; $barxlo = $barxbase + $xzonewidth; $ix = 0; #$barcolr = $barcolrs[$ix]; $legendx = $parm{lmgn} / 2; #CHGD TO NEXT 20030910. $legendx = $parm{minlmgn}; # $rightedge = $parm{lmgn} + $chartxsiz; $colorcnt = $#barcolrs + 1; $barxpix1 = $barxpix + 1; $colorcnt = $ycnt if ($ycnt > 1 && $colorcnt > $ycnt); $colorcnt = 1 if ($colorcnt <= 0); #SOME VARIABLES TO SAVE ARITHMETIC IN LOOPS. $linkbottom = $parm{tmgn} + $chartysiz + $sfh + 4; $sfh2 = $sfh + 2; $chartbottom = $parm{tmgn} + $chartysiz; $chartbottom += $sfh if ($parm{ylnmin} < $parm{ybase}); #ALLOW ROOM FOR VALUES BELOW DOWNWARD BARS. $chartbottom2 += ($xvallines+1) * $sfh; #print "
xvallines=$xvallines=\n"; $chartbottom3 = $chartbottom2 + ($lnlegendsz * $sfh2); $legendy += $sfh2; #print "
ly=$legendy= cb3=$chartbottom3= ylncnt=$lnlegendsz=\n"; my ($tmgn_2) = $parm{tmgn} - 2; my ($tmgn2) = $tmgn_2 + 4; $chartbottom = $parm{tmgn} + $chartysiz; my ($chartbottom1) = $chartbottom + $pointrad + 2; #print "
-at 1200: ylncnt=".$#{$parm{ylnvals}}."=\n"; my $lnlegendyoffset = 0; #$lnlegendyoffset = $sfh2 * ($#{$parm{xlegend}}+1) #CHGD. TO NEXT 20030626. $lnlegendyoffset = $sfh2 * $ybottomcnt if ((defined($parm{xlegend})||$parm{showvalues} =~ /nobar/i) && $parm{showvalues} =~ /xbottom/i); #print "-?????????- loffset=$lnlegendyoffset=\n"; my $totalbottom = $chartbottom2 + 4 + $lnlegendyoffset; $totalbottom += $lnlegendsz*$sfh2 if ($parm{showvalues} =~ /lnbottom/i); #print "
TB=$totalbottom= cb2=$chartbottom2= lncnt=".$#{$parm{ylnvals}}."= parm=$parm{ylnvals}=\n"; #print "
-at 1300: ylncnt=$ylncnt/".$#{$parm{ylnvals}}."=\n"; my ($linkbottom) = $chartbottom2 + 4; my ($ycnt_1) = $ycnt - 1; my $barxhi0; my ($mysymbol); my ($xcenter, $ycenter); my ($mycolrindx, $mycolr0, $mycolrindx2); #CHGD. TO NEXT 20030619 SO THAT AXIS SPANS CHART EVEN IF ZERO OR FEW BARS. #$g->line($parm{lmgn}, $chartbottom2, ($parm{lmgn}+$chartxsiz), $g->line($parm{lmgn}, $chartbottom2, $maxygridarea, $chartbottom2, $headercolr) if ($parm{showvalues} =~ /bottom/i); #$useindividualcolors = 2; $bottomix = 0; $bottomi = 0; #print "
99:ylncnt=$ylncnt=\n"; outer: for ($i=0;$i<$ylncnt;$i++) #DRAW ALL MULTILINES FOR EACH X-VALUE. { #print "
---i=$i; ix=$ix; barxlo=$barxlo.\n"; inner: for ($j=0;$j<=$#{$parm{ylnvals}};$j+=$ylncnt) { unless ($j) { # $barxlo = $barxbase; #CHGD. TO NEXT 20030528 TO LINE UP BOTTOM VALUES, IF BREAKS ANYTHING, REVERT. $barxlo = $barxbase + $xzonewidth; $barxlo0 = $barxbase - ($parm{barxsiz} / 2); $barxhi0 = $barxlo0 + $parm{barxsiz}; } # if ($useindividualcolors == 2) # { #$mycolr0 = $linecolr; #$mycolrindx = $i+$j; $mycolrindx = $ix; #$mycolrindx += $ycnt if (defined($parm{xlegend})); #print "
-i=$i= j=$j= ix=$ix= colrindx=$mycolrindx= bct=$ybottomcnt= colr=$linecolrs[$mycolrindx]=\n"; $mycolr0 = $linecolrs[$mycolrindx]; # } # else # { # $mycolr0 = $linecolrs[$i]; # $mycolrindx = $i; # } if (defined($parm{xsymbols}[$i])) { $mysymbol = $parm{xsymbols}[$i]; } elsif (defined($parm{xsymbol})) { $mysymbol = $parm{xsymbol}; } # else # { # $mysymbol = 'dot'; # } #print "-?- points =".join('|',@{$parm{points}})."=\n"; if (defined $parm{points}) { if (ref($parm{points}) eq 'ARRAY') { if (defined($parm{points}[$i])) { $pointdiam = $parm{points}[$i]; } else { $pointdiam = $parm{points}[0]; } } else { $pointdiam = $parm{points}; } } else { $pointdiam = 0; } $_ = $i + $j; #PRINT X HEADERS $ysum[$j] += ${$parm{ylnvals}}[$_] if (defined(${$parm{ylnvals}}[$_])); #print "--- j=$j= i=$i= yval($_) = ${$parm{yvals}}[$_]= ylnval=${$parm{ylnvals}}[$_]=\n"; $barylo = $baryhi; $baryhi = $parm{tmgn} + ($chartysiz * (($parm{ylnmax}-${$parm{ylnvals}}[$_]) / ($parm{ylnmax}-$parm{ylnmin}))); unless ($i) { if ($parm{xgriddashed}) { $g->dashedLine($barxhi0,$tmgn_2,$barxhi0,$chartbottom1,$axiscolr); } else #DRAW VERTICAL TIC-MARKS AT #BOTTOM AND TOP OF CHART. { #$g->line($barxhi0,$chartbottom,$barxhi0,$chartbottom1,$axiscolr); $g->line($barxhi0,$tmgn_2,$barxhi0,$tmgn2,$axiscolr); } #print "
-???- sv=$parm{showvalues}=\n"; #THIS CODE DRAWS THE VERTICAL COLUMN OF SYMBOLS JUST LEFT OF THE "LINE" "BOTTOM" VALUES #AND THE HORIZONTAL ROW OF SYMBOLS FOR THE "LNLEGEND" VALUES. #if (defined($parm{lnlegend}) && defined(${$parm{lnlegend}}[$ix])) #LAST COND. CHGD. TO NEXT 20030626. if (!$ix && defined($parm{lnprelegend})) #ADDED 20030910 TO SUPPORT CAPTION LEFT OF LN-LEGEND. { $g->string(gdSmallFont,$legendx,$legendy, $parm{lnprelegend},$headercolr); $legendx += ($sfw * length($parm{lnprelegend})) + 5; } if (defined($parm{lnlegend}) && defined(${$parm{lnlegend}}[$ix]) && length(${$parm{lnlegend}}[$ix])) { my ($mysymbol, $pointdiam); if (defined($parm{xsymbols}[$ix])) { $mysymbol = $parm{xsymbols}[$ix]; } elsif (defined($parm{xsymbol})) { $mysymbol = $parm{xsymbol}; } # else # { # $mysymbol = 'dot'; # } if (defined $parm{points}) { if (ref($parm{points}) eq 'ARRAY') { if (defined($parm{points}[$ix])) { $pointdiam = $parm{points}[$ix]; } else { $pointdiam = $parm{points}[0]; } } else { $pointdiam = $parm{points}; } } else { $pointdiam = 0; } my $dfltdiam = $pointdiam || $sfh_2; #THIS DRAWS SYMBOL FOR THE LINE-VALUES BOTH IN THE X-LEGEND AND FOR "BOTTOM" VALUES. if ($pointdiam) #ADDED 20030905. { if ($mysymbol =~ /square/i) { $xcenter = ($legendx + $sfh_2) - 1; $ycenter = $legendy + $sfh_2; #THIS DRAWS THE SQUARE ON THE X-LNLEGEND LINE. $g->filledRectangle( $xcenter-$dfltdiam, $ycenter-$dfltdiam, ($xcenter+$dfltdiam), ($ycenter+$dfltdiam), $linecolrs[$mycolrindx]); #print "-drew square lx=$legendx= dd=$dfltdiam= xc=$xcenter=\n"; #print "-drew square: colr($mycolrindx)=$linecolrs[$mycolrindx]= i=$i= j=$j= cash=$_= ix=$ix=\n"; #$legendx = $xcenter + int($dfltdiam / 2) + 4; if ($parm{showvalues} =~ /lnbottom/i) { #THIS DRAWS THE SQUARE LEFT OF THE ROW OF "BOTTOM" VALUES. $xcenter = $parm{lmgn} - $sfh_2; $ycenter = int($chartbottom2+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $lnlegendyoffset; #print "-drew square: LN???????- xc=$xcenter= lm=$parm{lmgn}= sh_2=$sfh_2= dflt=$dfltdiam=\n"; $g->filledRectangle( $xcenter-$dfltdiam, $ycenter-$dfltdiam, ($xcenter+$dfltdiam), ($ycenter+$dfltdiam), $linecolrs[$mycolrindx]); } #print "
??? ix=$ix= bc=$linecolrs[$mycolrindx]=\n"; } elsif ($mysymbol =~ /diamond/i) { $xcenter = ($legendx + $sfh_2) - 1; $ycenter = $legendy + $sfh_2; $g->line($xcenter-$dfltdiam, $ycenter, $xcenter, $ycenter+$dfltdiam, $linecolrs[$mycolrindx]); $g->line($xcenter, $ycenter+$dfltdiam, $xcenter+$dfltdiam, $ycenter, $linecolrs[$mycolrindx]); $g->line($xcenter+$dfltdiam, $ycenter, $xcenter, ($ycenter-$dfltdiam), $linecolrs[$mycolrindx]); $g->line($xcenter, $ycenter-$dfltdiam, $xcenter-$dfltdiam, $ycenter, $linecolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$linecolrs[$mycolrindx]); #$legendx = $xcenter + int($dfltdiam / 2) + 4; if ($parm{showvalues} =~ /lnbottom/i) { $xcenter = $parm{lmgn} - $sfh_2; $ycenter = int($chartbottom2+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $lnlegendyoffset; $g->line(($xcenter-$dfltdiam), $ycenter, $xcenter, ($ycenter-$dfltdiam), $linecolrs[$mycolrindx]); $g->line($xcenter, ($ycenter-$dfltdiam), ($xcenter+$dfltdiam), $ycenter, $linecolrs[$mycolrindx]); $g->line(($xcenter+$dfltdiam), $ycenter, $xcenter, ($ycenter+$dfltdiam), $linecolrs[$mycolrindx]); $g->line($xcenter, ($ycenter+$dfltdiam), ($xcenter-$dfltdiam), $ycenter, $linecolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$linecolrs[$mycolrindx]); } #print "
??? ix=$ix= bc=$linecolrs[$mycolrindx]=\n"; } else #CIRCLES AND DOTS. { $xcenter = ($legendx + $sfh_2) - 1; $ycenter = $legendy + $sfh_2; #print "
ly=$legendy= sfh_2=$sfh_2 ycenter=$ycenter=\n"; #$legendx = $xcenter + int($dfltdiam / 2) + 4; my ($rad) = $dfltdiam; $rad *= 2 if ($mysymbol =~ /circle/i); #THIS DRAWS THE SYMBOLS BEFORE YOUR LNLEGEND HEADERS! #print "-drew circle: colr($mycolrindx)=$linecolrs[$mycolrindx]= i=$i= j=$j= cash=$_= ix=$ix=\n"; $g->arc($xcenter,$ycenter,$rad,$rad,0,360, $linecolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$linecolrs[$mycolrindx]); #THIS DRAWS SYMBOLS TO LEFT OF EACH LINE OF "BOTTOM" VALUES! if ($parm{showvalues} =~ /lnbottom/i) { $rad = $dfltdiam; $rad *= 2 if ($mysymbol =~ /circle/i); #$xcenter = $parm{lmgn} - $sfh_2; #CHGD. TO NEXT: 20010820. $xcenter = $parm{lmgn} - $sfh_2; $ycenter = int($chartbottom2+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $lnlegendyoffset; #print "
ycnt=$ycnt= ix=$ix= cb3=$chartbottom2= color=$linecolrs[$mycolrindx] yc=$ycenter\n"; #print "
-center x=$xcenter y=$ycenter rad=$rad=\n"; $g->arc($xcenter,$ycenter,$rad,$rad,0,360, $linecolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$linecolrs[$mycolrindx]); #print "
??? ix=$ix= bc=$linecolrs[$mycolrindx]=\n"; #print "-1: ix=$ix= i=$i= j=$j= mycolrindx=$mycolrindx=\n"; } } } $ycenter = $legendy + $sfh_2; #print "---drew line lx=$legendx= dd=$sfh= xc=$xcenter=\n"; $g->line($legendx, $ycenter, ($legendx + $sfh), $ycenter, $linecolrs[$mycolrindx]); if ($parm{showvalues} =~ /lnbottom/i) { $xcenter = $parm{lmgn} - $sfh; $ycenter = int($chartbottom2+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $lnlegendyoffset; #print "---drew line: -LN???????- xc=$xcenter= lm=$parm{lmgn}= sh_2=$sfh_2= dflt=$sfh=\n"; $g->line( $xcenter, $ycenter, ($xcenter+$sfh), $ycenter, $linecolrs[$mycolrindx]); } #$legendx += (2 * ($sfh - $pointdiam)) + 3; #$legendx += (2 * $dfltdiam) + 4; $legendx += $sfh2 + 2; #print "-?????- ix=$ix= colorindx=$mycolrindx= bc=$linecolrs[$mycolrindx]=\n"; $g->string(gdSmallFont,$legendx,$legendy,${$parm{lnlegend}}[$ix],$headercolr); $legendx += ($sfw * length(${$parm{lnlegend}}[$ix])) + 5; } if (defined($parm{links}[$ix]) || defined($parm{mouseovers}) #ADD HYPERLINK, IF ANY, TO BAR. || defined($parm{link}) || defined($parm{mouseover})) { $l = 'HREF="//'; if (defined($parm{links}[$ix]) || defined($parm{link})) { $parm{links}[$ix] = $parm{link} unless($parm{links}[$ix]); $l = ' HREF="' . $parm{links}[$ix]; unless ($l =~ m#\"\s*(http\:|\/)#) { $l = 'HREF="' . $parm{linkpath}; $l .= $parm{links}[$ix] unless ($l =~ s#\*#$parm{links}[$ix]#); } } $l .= '"'; $l = '' if ($l eq 'HREF="//"' && !defined($parm{mouseovers}[$ix])); #ADDED 20000302! $mapstr .= 'i=$i= ycnt1=$ycnt_1= sv=$parm{showvalues}=\n"; # unless ($i < $ycnt_1) { if ($parm{showvalues} =~ /total/i) { $myyval = &commatize($ysum[$j],$parm{commatize}); $g->line($parm{lmgn}, $totalbottom, ($parm{lmgn}+$chartxsiz), $totalbottom, $headercolr); $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))), $totalbottom+2,$myyval,$valxcolr); #print "
TOTAL: write =$myyval= at (".($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))/2)."/$totalbottom)\n"; } } #if (defined(${$parm{ylnvals}}[$_]) && length(${$parm{ylnvals}}[$_]) && defined(${$parm{lnlegend}}[$i])) #PREV. LINE CHGD. TO NEXT 20030922 TO FIX SKIPPING SPACE FOR EMPTY LEGEND VALUES. if (defined($parm{lnlegend}) && defined(${$parm{lnlegend}}[$i]) && length(${$parm{lnlegend}}[$i]) && defined(${$parm{ylnvals}}[$_]) && defined(${$parm{lnlegend}}[$i])) { #print "
----YL($i)=$parm{lnlegend}[$i]= ylnval($_)=${$parm{ylnvals}}[$_]= y=".($chartbottom2+(($ybottomcnt-($i+1))*$sfh)+2)."= cash=$_=\n"; #THIS DISPLAYS THE Y-LINE-VALUES AT THE "BOTTOM", IF REQUESTED. if ($parm{showvalues} =~ /lnbottom/i) { $myyval = &commatize(${$parm{ylnvals}}[$_],$parm{commatize}); #print "
YCNT=$ycnt= i=$i= Y=".($chartbottom2+2+($ycnt+($i-1))*$sfh)."=\n"; #print "-8: i=$i= j=$j= cash=$_= yval=$myyval=\n"; $ycenter = $chartbottom2+2+$lnlegendyoffset; $ycenter += $bottomi*$sfh2 if ($parm{showvalues} =~ /xbottom/i); $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))), $ycenter,$myyval,$headercolr) } #THIS ACTUALLY DRAWS THE LINE!!!!! $mycolrindx2 = $i; #$mycolrindx2 += $ycnt if (defined($parm{xlegend})); #print "-i=$i= j=$j= ix=$ix= ycnt=$ycnt= ylncnt=$ylncnt= mycolrindx2=$mycolrindx2=\n"; if ($_ >= $ylncnt) { #print "-CASH=$_= i=$i= j=$j= ix=$ix= YLNCNT=$ylncnt= ? color=$mycolr0= colrindex=$mycolrindx2=\n"; #print "
++++++ i=$i= j=$j= s=$_= x0=$barxlo0; ylo=$barylo; yhi=$baryhi.\n"; $g->line($barxlo0,$barylo,$barxhi0,$baryhi,$linecolrs[$mycolrindx2]); } #print "-???- symbol=$mysymbol=\n"; if ($pointdiam > 0) { #print "
---DOT1($_) at ($barxlo0,$barylo) pd=$pointdiam=\n"; for $x (1..$pointdiam) { if ($mysymbol =~ /square/i) { $g->filledRectangle( $barxhi0-$x, $baryhi-$x, $barxhi0+$x, $baryhi+$x, $linecolrs[$mycolrindx2] ); } elsif ($mysymbol =~ /diamond/i) { $g->line(($barxhi0-$x), $baryhi, $barxhi0, ($baryhi-$x), $linecolrs[$mycolrindx2]); $g->line($barxhi0, ($baryhi-$x), ($barxhi0+$x), $baryhi, $linecolrs[$mycolrindx2]); $g->line(($barxhi0+$x), $baryhi, $barxhi0, ($baryhi+$x), $linecolrs[$mycolrindx2]); $g->line($barxhi0, ($baryhi+$x), ($barxhi0-$x), $baryhi, $linecolrs[$mycolrindx2]); } elsif ($mysymbol =~ /circle/i) { $g->arc($barxhi0,$baryhi,($x*2),($x*2),0,360, $linecolrs[$mycolrindx2]); } else { $g->arc($barxhi0,$baryhi,$x,$x,0,360, $linecolrs[$mycolrindx2]); #print "-2: ix=$ix= i=$i= j=$j= mycolrindx=$mycolrindx2=\n"; } } } #$g->string(gdSmallFont,($barxlo0+($barxpix-(length(${$parm{ylnvals}}[$_])*$sfw))/2), # $baryhi-($sfh+$pointdiam),"${$parm{ylnvals}}[$_]",$mycolr0) $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}-(length(${$parm{ylnvals}}[$_])*$sfw))/2), ($baryhi-($sfh+$pointrad)), "${$parm{ylnvals}}[$_]",$mycolr0) if ($parm{showvalues} =~ /line/i); ++$bottomix; } $barxlo0 = $barxhi0; $barxhi0 += $parm{barxsiz}; $barxlo += $parm{barxsiz}; $barxlo1 += $parm{barxsiz}; #print "
????? barxsiz=$parm{barxsiz}; barxlo=$barxlo.\n"; #print "
ix=$ix=\n"; $ix++; } ++$bottomi if (defined(${$parm{ylnvals}}[$_]) && defined(${$parm{lnlegend}}[$i]) && length(${$parm{lnlegend}}[$i])); } ####STOP! if (defined($parm{links}) || defined($parm{mouseovers}) || defined($parm{link}) || defined($parm{mouseover})) { $l = 'HREF="//'; if (defined($parm{link})) { $l = 'HREF="' . $parm{link}; #$l = $parm{linkpath} . $l unless ($l =~ m#^\s*(http\:|\/)#); unless ($l =~ m#\"\s*(http\:|\/)#) { $l = "HREF=\"$parm{linkpath}"; $l .= $parm{link} unless ($l =~ s#\*#$parm{link}#); } } $l .= '"'; #if (defined($parm{link}) || defined($parm{mouseover})) #JWT: 19990622 if (defined($parm{link})) { $mapstr .= '-3: l=$l= mapstr now =$mapstr=\n"; } $mapstr .= ">\n"; } $mapstr .= '
' . "\n"; } #PRINT MAIN HEADERS AND TITLES. if (defined($parm{title})) { #$g->string(gdLargeFont,(($chartxsiz - ($lfw*length($parm{title})))/2) + $parm{lmgn}, # ($parm{tmgn} - $lfh) / 2, $parm{title}, $titlecolr); for (my $i=0;$i<=$#titles;$i++) { #$g->string(gdLargeFont,(($chartxsiz - ($lfw*length($titles[$i])))/2) + $parm{lmgn}, $g->string(gdLargeFont,(($parm{maxxsiz} - ($lfw*length($titles[$i])))/2), (($parm{tmgn} - (scalar(@titles)*($lfh+2))) / 2)+(($lfh+2)*$i), $titles[$i], $titlecolr); } } if (defined($parm{ytitle})) { $i = $sfw*length($parm{ytitle}); $g->stringUp(gdSmallFont, ((($parm{lmgn}-$yheadxmax)-$sfh)-$sfh) / 2, (($chartysiz - $i)/2) + $i + $parm{tmgn}, $parm{ytitle}, $titlecolr); } if (defined($parm{ylntitle})) { $i = $sfw*length($parm{ylntitle}); #$g->stringUp(gdSmallFont, ((($parm{rmgn}-$yheadxmax2)-$sfh)-$sfh) / 2, $g->stringUp(gdSmallFont, $parm{maxxsiz} - ((($parm{rmgn}-($yheadxmax2*$sfw))+$sfh)/2), (($chartysiz - $i)/2) + $i + $parm{tmgn}, $parm{ylntitle}, $titlecolr); } if (defined($parm{lrtitle})) #ADDED 20030527 TO ADD LOWER-RIGHT CORNER TITLE. { # $_ = ($parm{lmgn}+$chartxsiz) - ($sfw*length($parm{lrtitle})); #CHGD. TO NEXT 20030619 SO THAT AXIS SPANS CHART EVEN IF ZERO OR FEW BARS. # $g->string(gdSmallFont, ($parm{lmgn}+$chartxsiz) - ($sfw*length($parm{lrtitle})), $g->string(gdSmallFont, $maxygridarea - ($sfw*length($parm{lrtitle})), ($parm{maxysiz}-(2*$sfh+2)), $parm{lrtitle}, $titlecolr); } return ($g,$mapstr); } sub fincx { my ($x,$grid) = @_; my ($i, $i1, $j, $k, $ystep, $yinc, $carry); $yinc = int($x / $grid); #print "
---yinc=$yinc= grid=$grid= x=$x=\n"; $yinc += 1 unless (($yinc * $grid) >= $x); $ylen = length($yinc); my @ydigits = split(//,$yinc); for ($i=$ylen-2;$i>=0;$i--) { $i1 = $i + 1; #print "
????? yinc=$yinc= digits($i,$i1) =$ydigits[$i]=$ydigits[$i1]=\n"; if ($ydigits[$i] > 0 && $ydigits[$i] <= 2) { if ($ydigits[$i1] > 0 && $ydigits[$i1] < 5) { $ydigits[$i1] = 5; for ($k=$i1+1;$k<=$#ydigits;$k++) { $ydigits[$k] = 0; } } elsif ($ydigits[$i1] > 5 && $ydigits[$i1] <= 9) { $ydigits[$i1] = 0; $j = $i; #print "****** dig($j)=$ydigits[$j]=\n"; while ($j >= 0) { if ($ydigits[$j] < 9) { ++$ydigits[$j]; #print "*** dig($j) now =$ydigits[$j]= ..done.\n"; $carry = 0; last; } for ($k=$j;$k<=$#ydigits;$k++) { $ydigits[$k] = 0; } $carry = 1; --$j; #print "*** j decremented=$j=\n"; } #print "*** appending 1 to left of ".join('',@ydigits)."!\n" if ($carry); @ydigits = (1,@ydigits) if ($carry); } } elsif ($ydigits[$i1] > 0) { #$ydigits[$i1] = 0; for ($k=$i1;$k<=$#ydigits;$k++) { $ydigits[$k] = 0; } $j = $i; while ($j >= 0) { if ($ydigits[$j] < 9) { ++$ydigits[$j]; $carry = 0; last; } for ($k=$j;$k<=$#ydigits;$k++) { $ydigits[$k] = 0; } $carry = 1; --$j; } @ydigits = (1,@ydigits) if ($carry); } } $yinc = join('',@ydigits); #print "
------- factor=$factor= yinc now=$yinc=\n"; return $yinc; } sub commatize { my ($val) = shift; my ($doit) = shift; return ($val) unless ($doit); $val = sprintf('%.0f',$val); $val =~ s/(\d)(\d\d\d)$/$1,$2/; $val =~ s/(\d)(\d\d\d),/$1,$2,/g; $val = '(' . $val . ')' if ($val =~ s/^\-//); return ("$val"); } 1