use GD; sub LineChart { my %parm; my (@barcolrs); my ($g, $v); while (@_) { $v = shift; $v =~ s/^\-//; $parm{$v} = shift; #print "
111 parm name=$v= set to =$parm{$v}=\n"; } #print "
========= *START* ????? barysiz=$parm{barysiz}=\n"; my ($ycnt, $h, $i, $j, $legendx, $legendy, $mapstr, @l); my ($sfw,$sfh) = (gdSmallFont->width,gdSmallFont->height); my ($lfw,$lfh) = (gdLargeFont->width,gdSmallFont->height); my ($sfh_1) = $sfh - 1; my ($sfh2) = $sfh + 2; my ($sfh_2) = int($sfh / 2); #SET UP PARAMETER DEFAULTS. #$parm{lmgn} = 60 unless($parm{lmgn}); $parm{rmgn} = 20 unless($parm{rmgn}); #$parm{bmgn} = 80 unless($parm{bmgn}); $parm{minlmgn} ||= 20; #ADDED 20030910. my @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); } #$parm{barcolor} = 'blue' unless ($parm{barcolor}); #$parm{bgcolor} = 'white' unless ($parm{bgcolor}); $parm{valcolor} = 'white' unless ($parm{valcolor}); $parm{axiscolor} = 'black' unless ($parm{axiscolor}); $parm{titlecolor} = $parm{axiscolor} unless ($parm{titlecolor}); $parm{valxcolor} = $parm{axiscolor} unless ($parm{valxcolor}); my ($useindividualcolors) = 0; $useindividualcolors = 1 if (defined($parm{barcolors})); $parm{barcolors} = [qw(Steelblue4 DarkGreen brown4 Yellow3 darkorchid skyblue darkorange olivedrab khaki salmon bisque4 gray)] unless(defined($parm{barcolors})); if (defined($parm{barcolor}) and !$useindividualcolors) { $parm{barcolors} = [$parm{barcolor}]; } #elsif (defined($parm{xlegend}) && $#{$parm{barcolors}} > 0) #{ # $#{$parm{barcolors}} = $#{$parm{xlegend}} if ($#{$parm{barcolors}} > $#{$parm{xlegend}}); #} #elsif (!$useindividualcolors and !defined($parm{barcolor})) #CHGD. TO NEXT 20050203. elsif (!defined($parm{barcolor})) { $parm{barcolor} = ${$parm{barcolors}}[0]; } $parm{gridcolor} = $parm{barcolor} unless ($parm{gridcolor}); $parm{headercolor} = $parm{barcolor} unless ($parm{headercolor}); #print "
headercolor=$parm{headercolor}= barcolor=$parm{barcolor}=\n"; $parm{bordercolor} = 'black' unless ($parm{bordercolor}); $ycnt = $#{$parm{xlegend}} + 1 if (defined($parm{xlegend})); $ycnt = 1 unless ($ycnt > 1); my ($yvalcnt) = $ycnt * ($#{$parm{xvals}}+1); #NO. OF YVALS THERE "SHOULD" BE. #THIS LOOP WAS COMMENTED OUT, NOT SURE WHY - I UNCOMMENTED 20041005 FOR ROCKPILE=2 TO GET IT TO FILL IN COLORS. for ($i=0;$i<$yvalcnt;$i++) #MAKE SURE ALL Y-VALUES HAVE A VALUE! { #if (defined(${$parm{yvals}}[$i])) #{ ${$parm{yvals}}[$i] = '0' unless (${$parm{yvals}}[$i]); #print "
YVALS($i)=${$parm{yvals}}[$i]=\n"; #} #print "
yyyy=${$parm{yvals}}[$i]= cnt=$#{$parm{yvals}}=\n"; } #print "
-yvalcnt=$yvalcnt= yvals=".join('|',@{$parm{yvals}})."=\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}; #YVALPREFIX & YVALSUFFIX ADDED 20050204 TO APPEND "$" AND OR "%" TO VALUES FOR DISPLAY! my $yvalprefix = defined $parm{yvalprefix} ? $parm{yvalprefix} : ''; my $yvalsuffix .= defined $parm{yvalsuffix} ? $parm{yvalsuffix} : ''; 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 "
???? i=$i= cash=$_= ymin=$parm{ymin}= ymax=$parm{ymax}= val=${$parm{yvals}}[$_]=\n"; } } $ymin = $parm{ymin}; $ymax = $parm{ymax}; my ($ygrid); 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}; $y += $parm{yInc} while ($y < $parm{ymax}); $parm{ymax} = $y; } $parm{yInc} = ($parm{ymax} - $parm{ymin}) / $parm{ygrid} if ($parm{ygrid} > 0); } else { 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"; } } } } #print "
ymin=$parm{ymin}; ymax=$parm{ymax}; yInc=$parm{yInc}; \n"; $parm{ymax} = $parm{ygrid} unless ($parm{ymin} || $parm{ymax}); unless ($parm{lmgn}) #CALCULATE LEFT MARGIN, IF NOT SPECIFIED. { if (length("$parm{ymin}") > length("$parm{ymax}")) { $x = length(&commatize($parm{ymin}, $parm{commatize}, $yvalprefix, $yvalsuffix)); } else { $x = length(&commatize($parm{ymax}, $parm{commatize}, $yvalprefix, $yvalsuffix)); } #$parm{lmgn} = ($x*$sfw) + 23; $parm{lmgn} = ($x*$sfw) + $sfw + $parm{minlmgn}; $parm{lmgn} += $sfh + 2 if (defined($parm{ytitle})); } 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; unless ($parm{bmgn}) #CALCULATE BOTTOM MARGIN, IF NOT SPECIFIED. { #print "-0: bmgn=$parm{bmgn}= xv=$xvallines= pr=$pointrad= sfh=$sfh= s2=$sfh2= min=$parm{minlmgn}\n"; $parm{bmgn} = ($xvallines+1)*$sfh + 3 + $pointrad + $parm{minlmgn}; #CALCULATE BOTTOM MARGIN, IF NOT SPECIFIED. #print "-1: bmgn=$parm{bmgn}= ycnt=$ycnt=\n"; $parm{bmgn} += ($ycnt*$sfh) + 4 if ($parm{showvalues} =~ /bottom/i); #print "-2: bmgn=$parm{bmgn}= \n"; $parm{bmgn} += $sfh + 4 if (defined($parm{xtitle})); #print "-3: bmgn=$parm{bmgn}= \n"; #$parm{bmgn} += ($pointrad*2) + 4 if (defined($parm{xlegend})); $parm{bmgn} += $sfh2 if (defined($parm{xlegend})); #print "-4: bmgn=$parm{bmgn}= \n"; $parm{bmgn} += $sfh + 4 if ($parm{showvalues} =~ /total/i); #print "-5: 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 LINE SIZE. { (@l) = split(/\n/); for ($k=0;$k<=$#l;$k++) { $i = $sfw * length($l[$k]); $x = $i unless ($x > $i); } } $parm{barxsiz} = $x + 4; } $parm{maxxsiz} = ($parm{barxsiz} * ($#{$parm{xvals}}+1)) + $parm{lmgn} + $parm{rmgn}; if (defined($parm{xlegend})) #IF LEGENDS WIDER THAN CHART, WIDEN CHART! { $legendx = $parm{minlmgn}; $ix = 0; $i = $sfh2 + 7; foreach (@{$parm{xlegend}}) { $_ = length(${$parm{xlegend}}[$ix]); $legendx += $i + ($sfw * $_) if ($_); ++$ix; } $legendx += 2 * $parm{minlmgn}; $parm{maxxsiz} = $legendx if ($parm{maxxsiz} < $legendx); #IF ANY TITLE LINE IS WIDER THAN CHART, WIDEN CHART. for (my $i=0;$i<=$#titles;$i++) { $_ = $lfw*length($titles[$i]) + (2 * $parm{minlmgn}); $parm{maxxsiz} = $_ if ($parm{maxxsiz} < $_); } } } else { unless ($parm{barxsiz}) { $parm{barxsiz} = ($#{$parm{xvals}} >= 0) ? ($parm{maxxsiz} - ($parm{lmgn} + $parm{rmgn})) / ($#{$parm{xvals}}+1) : 10; } } 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"; unless ($parm{barpct}) { $parm{barpct} = 80; $parm{barpct} = 100 if ($parm{barxsiz} < 10); } my ($ydiff) = $parm{ymax} - $parm{ymin}; $chartxsiz = $parm{barxsiz} * ($#{$parm{xvals}}+1); #(PIXELS) #$chartysiz = $parm{barysiz} * $ydiff; $chartysiz = $parm{barysiz} * ($parm{ymax} - $parm{ymin}); 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}; } $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}.\n"; my ($g) = new GD::Image($parm{maxxsiz},$parm{maxysiz}); #CONVERT COLOR NAMES TO RGB VALUES. #print "
barcolors=".join('|',@{$parm{barcolors}})."=\n"; #if (open(RGB,") { chomp; ($rr,$gg,$bb,$color) = split(' '); $color = "\L$color\E"; foreach (qw(bar bg val axis grid title valx header border)) { $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") #if ($color eq ${$parm{barcolors}}[$j]) { $i = $g->colorAllocate($rr,$gg,$bb); $barcolrs[$j] = $i; } } } close (RGB); my (@colorindex) = (0..$#{$parm{barcolors}}); for ($j=0;$j<$parm{shiftcolors};$j++) { $ix = shift(@barcolrs); @barcolrs = (@barcolrs,$ix); } } #SET UP DEFAULTS FOR ANY MISSING COLORS. $barcolr = $g->colorAllocate(0,0,0) unless ($barcolr); $valcolr = $g->colorAllocate(0,0,0) unless ($valcolr); $axiscolr = $g->colorAllocate(0,0,0) unless ($axiscolr); $gridcolr = $g->colorAllocate(0,0,0) unless ($gridcolr); #$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 ($useindividualcolors && $ycnt == 1) #SINGLE LINE, BUT COLOR EACH POINT INDIVIDUALLY 19991222. { my ($bc1) = scalar(@barcolrs); for ($j=0;$j<=$#{$parm{yvals}};$j++) { $barcolrs[$j] = $barcolrs[($j % $bc1)]; #print "
??? bc($j)=$barcolrs[$j]=\n"; } $useindividualcolors = 2; } elsif ($#barcolrs < $ycnt) #FILL OUT COLOR ARRAY TO MATCH Y-ARRAY. { my $barcolrcnt = $#barcolrs+1; #VARIABLE ADDED 20040412 TO FIX BUG. for ($j=$#barcolrs+1;$j<$ycnt;$j++) { $barcolrs[$j] = $barcolrs[($j % $barcolrcnt)]; } } #print "
ycnt=$ycnt=\n"; 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}))); #DRAW THE X AND Y AXES. $g->line($parm{lmgn},$barylo,($parm{lmgn}+$chartxsiz),$barylo,$axiscolr); $g->line($parm{lmgn},$parm{tmgn},$parm{lmgn},($parm{tmgn}+$chartysiz),$axiscolr); $g->line(($parm{lmgn}+$chartxsiz),$parm{tmgn},($parm{lmgn}+$chartxsiz), ($parm{tmgn}+$chartysiz),$axiscolr) if ($parm{rockpile}); #NOW DRAW THE HORIZONTAL GRID LINES. #print "-ygrid=$ygrid/$parm{ygrid}= yinc=$parm{yinc}= yInc=$parm{yInc}=\n"; my $ydelta = $parm{barysiz} * $parm{yInc}; #print "-1: delta=$ydelta=\n"; my $yhead = $parm{ybase}; my ($myyval) = &commatize($yhead,$parm{commatize}, $yvalprefix, $yvalsuffix); my $yheadxmax = length($myyval) if(defined($parm{ytitle})); #print "
yhead=$yhead= myyval=$myyval= yheadmax=$yheadxmax=\n"; $g->string(gdSmallFont,$parm{lmgn}-((length($myyval)*$sfw)+3),$barylo-($sfh/2), $myyval,$headercolr); ## $yhead = $parm{ybase} + $parm{yInc}; $yhead = $parm{ybase}; ## $y = $barylo - $ydelta; $y = $barylo; while ($y >= $parm{tmgn}-1) { $myyval = &commatize($yhead,$parm{commatize}, $yvalprefix, $yvalsuffix); unless ($parm{rockpile}) { if ($parm{ygriddashed}) { $g->dashedLine($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); } else { $g->line($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); } } $g->string(gdSmallFont,$parm{lmgn}-((length($myyval)*$sfw)+3),$y-($sfh/2), $myyval,$headercolr); $y -= $ydelta; $yheadxmax = length($myyval) if (defined($parm{ytitle}) && (length($myyval) > $yheadxmax)); #print "
??? yheadmax =$yheadmax= y=$myyval= l=".length($myyval)."=\n"; $yhead += $parm{yInc}; } $yhead = $parm{ybase} - $parm{yInc}; $y = $barylo + $ydelta; #print "
ydelta=$ydelta= tmgn=$parm{tmgn}= charty=$chartysiz= y=$y= ycnt=$ycnt=\n"; #goto SKIPIT; while ($y <= ($parm{tmgn} + $chartysiz)+1) { $myyval = &commatize($yhead,$parm{commatize}, $yvalprefix, $yvalsuffix); #$g->line($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); if ($parm{ygriddashed}) { $g->dashedLine($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); } else { $g->line($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); } $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 LINES. #my $barxpix = (($parm{barxsiz} * $parm{barpct}) / 100) / $ycnt; my $barxbase = $parm{lmgn}; $ix = 0; $jx = 0; #$barcolr = $barcolrs[$ix]; $legendx = $parm{minlmgn}; my $rightedge = $parm{lmgn} + $chartxsiz; my $colorcnt = $#barcolrs + 1; $colorcnt = $ycnt if ($ycnt > 1 && $colorcnt > $ycnt); $colorcnt = 1 if ($colorcnt <= 0); #SOME VARIABLES TO SAVE ARITHMETIC IN LOOPS. my ($tmgn_2) = $parm{tmgn} - 2; my ($tmgn2) = $tmgn_2 + 4; my ($chartbottom) = $parm{tmgn} + $chartysiz; #WHERE HORZ. AXIS DRAWN. my ($chartbottom1) = $chartbottom + $pointrad + 2; #my ($chartbottom1) = $chartbottom + $sfh2; my ($chartbottom2) = $chartbottom1; my ($chartbottom3) = $chartbottom2 + $sfh*($xvallines+1) + 4; #WHERE HORIZONTAL LINE ABOVE BOTTOM VALUES DRAWN. #$chartbottom3 += 4 if ($parm{showvalues} =~ /bottom/i); my ($totalbottom) = $chartbottom3; #WHERE HORZ. LINE BELOW TOTALS IS DRAWN. $totalbottom += $ycnt*$sfh + 4 if ($parm{showvalues} =~ /bottom/i); # $totalbottom += $ycnt*$sfh2 + 2 if ($parm{showvalues} =~ /bottom/i); my ($linkbottom) = $chartbottom2 + 4; my ($ycnt_1) = $ycnt - 1; my $barxlo; my $barxlo0; my $barxhi0; my @ysum; my ($mysymbol); my ($xcenter, $ycenter); my ($mycolrindx,$mycolr0,$mycolrH); $g->string(gdSmallFont, $barxbase, $chartbottom2, ($parm{nodata}||'..No data to plot.'), $headercolr) unless ($#{$parm{xvals}} >= 0); $legendy = $totalbottom + 4; $legendy += $sfh + 4 if (defined($parm{xtitle})); #$legendy += ($ycnt+1)*$sfh if ($parm{showvalues} =~ /bottom/i); $legendy += $sfh2 + 2 if ($parm{showvalues} =~ /total/i); #print "--- cb=$chartbottom= ly=$legendy cb3=$chartbottom3 bm=$parm{bmgn} BOTTOM=$parm{maxysiz}=\n"; #print "
??? bm=$parm{bmgn}= cys=$chartysiz= cb3=$chartbottom3 ly=$legendy=\n"; #print "
cb=$chartbottom= cb2=$chartbottom2= cb3=$chartbottom3= ly=$legendy=\n"; #print "
ycnt=$ycnt= sfh=$sfh=\n"; $g->line($parm{lmgn}, $chartbottom3, ($parm{lmgn}+$chartxsiz), $chartbottom3, $headercolr) if ($parm{showvalues} =~ /bottom/i); my $bottomix = 0; my $jcnt = 0; my @xpoints = (); my @ypoints = (); outer: for ($i=0;$i<$ycnt;$i++) #DRAW ALL MULTILINES FOR EACH X-VALUE. { #$ix = $i; $barxlo = $barxbase; $barxlo0 = $barxbase - ($parm{barxsiz} / 2); $barxhi0 = $barxlo0 + $parm{barxsiz}; #print "
--OUTER--i=$i; ix=$ix; barxlo=$barxlo= b0=$barxlo0= (0..$ycnt)\n"; $jcnt = 0; inner: for ($j=0;$j<=$#{$parm{yvals}};$j+=$ycnt) { #print "
----INNER---- j=$j= (0..$#{$parm{yvals}}|$ycnt); UIC=$useindividualcolors=\n"; if ($useindividualcolors == 2) { $mycolr0 = $barcolr; $mycolrindx = $i+$j; $mycolrH = $barcolrs[$mycolrindx] } else { $mycolr0 = $barcolrs[$i]; $mycolrindx = $i; $mycolrH = $headercolr; } if (defined($parm{xsymbols}[$i])) { $mysymbol = $parm{xsymbols}[$i]; } elsif (defined($parm{xsymbol})) { $mysymbol = $parm{xsymbol}; } else { $mysymbol = 'dot'; } $mysymbol = 'dot' if ($parm{rockpile} >= 2); #print "-?- points =".join('|',@{$parm{points}})."=\n"; if ($parm{rockpile} < 2 && 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 "-LOOP: cash=$_= i=$i= j=$j= ix=$ix=\n"; #PRINT X HEADERS $ysum[$j] += ${$parm{yvals}}[$_] if (defined(${$parm{yvals}}[$_])); $barylo = $baryhi; #print "-barylo=$barylo=\n"; if ($parm{rockpile}) { $baryhi = $parm{tmgn} + ($chartysiz * (($parm{ymax}-$ysum[$j]) / ($parm{ymax}-$parm{ymin}))); } else { $baryhi = $parm{tmgn} + ($chartysiz * (($parm{ymax}-${$parm{yvals}}[$_]) / ($parm{ymax}-$parm{ymin}))); } unless ($i) { #print "
------i=$i; j=$j; s=$_; ix=$ix; leg=${$parm{xlegend}}[$ix]= legcnt=$#{$parm{xlegend}}=\n"; #$g->string(gdSmallFont, ($barxlo+($parm{barxsiz}-(length(${$parm{xvals}}[$ix])*$sfw))/2), # $chartbottom2,${$parm{xvals}}[$ix],$headercolr); (@l) = split(/\n/,${$parm{xvals}}[$ix]); for ($k=0;$k<=$#l;$k++) { $g->string(gdSmallFont, ($barxhi0-(length($l[$k])*$sfw)/2), ($chartbottom2+($k*$sfh)), $l[$k] ,$mycolrH); } if ($parm{xgriddashed}) { $g->dashedLine($barxhi0,$tmgn_2,$barxhi0,$chartbottom1,$axiscolr); } else { $g->line($barxhi0,$chartbottom,$barxhi0,$chartbottom1,$axiscolr); $g->line($barxhi0,$tmgn_2,$barxhi0,$tmgn2,$axiscolr); } 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]); CHGD. TO NEXT 20050203. $parm{links}[$ix] = $parm{link} unless(defined $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]#); #CHGD. TO NEXT 20050204 TO GET ALL OF 'EM! $l .= $parm{links}[$ix] unless ($l =~ s#\*#$parm{links}[$ix]#g); } } $l .= '"'; $l = '' if ($l eq 'HREF="//"' && !defined($parm{mouseovers}[$ix])); #ADDED 20000302! $mapstr .= '= 2); if ($parm{rockpile} < 2 && defined $parm{points}) { if (ref($parm{points}) eq 'ARRAY') { if (defined($parm{points}[$jx])) { $pointdiam = $parm{points}[$jx]; } else { $pointdiam = $parm{points}[0]; } } else { $pointdiam = $parm{points}; } } else { $pointdiam = 0; } my $dfltdiam = $pointdiam || (($mysymbol !~ /dot/i) ? $sfh_2 : 0); #THIS DRAWS SYMBOL FOR THE LINE-VALUES BOTH IN THE X-LEGEND AND FOR "BOTTOM" VALUES. #print "-1: mysymbol=$mysymbol= pd=$pointdiam=\n"; if ($mysymbol =~ /square/i) { $xcenter = ($legendx + $sfh_2) + 1; $ycenter = $legendy + $sfh_2; #THIS DRAWS THE SQUARE ON THE X-xLEGEND LINE. $g->filledRectangle( $xcenter-$dfltdiam, $ycenter-$dfltdiam, ($xcenter+$dfltdiam), ($ycenter+$dfltdiam), $barcolrs[$mycolrindx]); #print "-drew square lx=$legendx= dd=$dfltdiam= xc=$xcenter=\n"; #print "-drew square: colr($mycolrindx)=$barcolrs[$mycolrindx]= i=$i= j=$j= cash=$_= jx=$jx=\n"; #$legendx = $xcenter + int($dfltdiam / 2) + 4; if ($parm{showvalues} =~ /bottom/i) { #THIS DRAWS THE SQUARE LEFT OF THE ROW OF "BOTTOM" VALUES. $xcenter = $parm{bottomsymbolmargin} || ($parm{lmgn} - $sfh_2); $ycenter = int($chartbottom3+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $xlegendyoffset; #print "-drew square: x???????- xc=$xcenter= lm=$parm{lmgn}= sh_2=$sfh_2= dflt=$dfltdiam=\n"; $g->filledRectangle( $xcenter-$dfltdiam, $ycenter-$dfltdiam, ($xcenter+$dfltdiam), ($ycenter+$dfltdiam), $barcolrs[$mycolrindx]); #I THINK THIS IS REDUNDANT - REMOVED 20041005, SEE OTHER 20041005 CHANGE! # $g->line(($xcenter - $sfh_2), $ycenter, # ($xcenter + $sfh_2), $ycenter, # $barcolrs[$mycolrindx]); } #print "
??? jx=$jx= bc=$barcolrs[$mycolrindx]=\n"; } elsif ($mysymbol =~ /diamond/i) { $xcenter = ($legendx + $sfh_2) + 1; $ycenter = $legendy + $sfh_2; $g->line($xcenter-$dfltdiam, $ycenter, $xcenter, $ycenter+$dfltdiam, $barcolrs[$mycolrindx]); $g->line($xcenter, $ycenter+$dfltdiam, $xcenter+$dfltdiam, $ycenter, $barcolrs[$mycolrindx]); $g->line($xcenter+$dfltdiam, $ycenter, $xcenter, ($ycenter-$dfltdiam), $barcolrs[$mycolrindx]); $g->line($xcenter, $ycenter-$dfltdiam, $xcenter-$dfltdiam, $ycenter, $barcolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$barcolrs[$mycolrindx]); #$legendx = $xcenter + int($dfltdiam / 2) + 4; if ($parm{showvalues} =~ /bottom/i) { $xcenter = $parm{bottomsymbolmargin} || ($parm{lmgn} - $sfh_2); $ycenter = int($chartbottom3+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $xlegendyoffset; $g->line(($xcenter-$dfltdiam), $ycenter, $xcenter, ($ycenter-$dfltdiam), $barcolrs[$mycolrindx]); $g->line($xcenter, ($ycenter-$dfltdiam), ($xcenter+$dfltdiam), $ycenter, $barcolrs[$mycolrindx]); $g->line(($xcenter+$dfltdiam), $ycenter, $xcenter, ($ycenter+$dfltdiam), $barcolrs[$mycolrindx]); $g->line($xcenter, ($ycenter+$dfltdiam), ($xcenter-$dfltdiam), $ycenter, $barcolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$barcolrs[$mycolrindx]); $g->line(($xcenter - $sfh_2), $ycenter, ($xcenter + $sfh_2), $ycenter, $barcolrs[$mycolrindx]); } #print "
??? jx=$jx= bc=$barcolrs[$mycolrindx]=\n"; } elsif ($mysymbol =~ /down/i) #DOWN-POINTING TRIANGLE. { $xcenter = $legendx + $sfh_2; $ycenter = $legendy + $sfh_2; my $triangrad = $dfltdiam * 0.866; #sin 60 degrees $g->line($xcenter, $ycenter+$triangrad+1, $xcenter-$dfltdiam, ($ycenter-$triangrad)+1, $barcolrs[$mycolrindx]); $g->line($xcenter-$dfltdiam, ($ycenter-$triangrad)+1, $xcenter+$dfltdiam, ($ycenter-$triangrad)+1, $barcolrs[$mycolrindx]); $g->line($xcenter+$dfltdiam, ($ycenter-$triangrad)+1, $xcenter, $ycenter+$triangrad+1, $barcolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$barcolrs[$mycolrindx]); #$legendx = $xcenter + int($dfltdiam / 2) + 4; if ($parm{showvalues} =~ /bottom/i) { # $xcenter = $parm{lmgn} - $sfh_2; # $ycenter = int($chartbottom2+2+(1+$bottomix)*$sfh)-$sfh_2; # $ycenter += $lnlegendyoffset; $xcenter = $parm{bottomsymbolmargin} || ($parm{lmgn} - $sfh_2); $ycenter = int($chartbottom3+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $xlegendyoffset; $g->line($xcenter, $ycenter+$triangrad, $xcenter-$dfltdiam, $ycenter-$triangrad, $barcolrs[$mycolrindx]); $g->line($xcenter-$dfltdiam, $ycenter-$triangrad, $xcenter+$dfltdiam, $ycenter-$triangrad, $barcolrs[$mycolrindx]); $g->line($xcenter+$dfltdiam, $ycenter-$triangrad, $xcenter, $ycenter+$triangrad, $barcolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$barcolrs[$mycolrindx]); $g->line(($xcenter - $sfh_2), $ycenter, ($xcenter + $sfh_2), $ycenter, $barcolrs[$mycolrindx]); } #print "
??? ix=$ix= bc=$barcolrs[$mycolrindx]=\n"; } elsif ($mysymbol =~ /up/i) #UP-POINTING TRIANGLE. { $xcenter = $legendx + $sfh_2; $ycenter = $legendy + $sfh_2; my $triangrad = $dfltdiam * 0.866; #sin 60 degrees $g->line($xcenter, $ycenter-$triangrad, $xcenter-$dfltdiam, $ycenter+$triangrad, $barcolrs[$mycolrindx]); $g->line($xcenter-$dfltdiam, $ycenter+$triangrad, $xcenter+$dfltdiam, $ycenter+$triangrad, $barcolrs[$mycolrindx]); $g->line($xcenter+$dfltdiam, $ycenter+$triangrad, $xcenter, $ycenter-$triangrad, $barcolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$barcolrs[$mycolrindx]); #$legendx = $xcenter + int($dfltdiam / 2) + 4; if ($parm{showvalues} =~ /bottom/i) { # $xcenter = $parm{lmgn} - $sfh_2; # $ycenter = int($chartbottom2+2+(1+$bottomix)*$sfh)-$sfh_2; # $ycenter += $lnlegendyoffset; $xcenter = $parm{bottomsymbolmargin} || ($parm{lmgn} - $sfh_2); $ycenter = int($chartbottom3+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $xlegendyoffset; $g->line($xcenter, $ycenter-$triangrad, $xcenter-$dfltdiam, $ycenter+$triangrad, $barcolrs[$mycolrindx]); $g->line($xcenter-$dfltdiam, $ycenter+$triangrad, $xcenter+$dfltdiam, $ycenter+$triangrad, $barcolrs[$mycolrindx]); $g->line($xcenter+$dfltdiam, $ycenter+$triangrad, $xcenter, $ycenter-$triangrad, $barcolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$barcolrs[$mycolrindx]); $g->line(($xcenter - $sfh_2), $ycenter, ($xcenter + $sfh_2), $ycenter, $barcolrs[$mycolrindx]); } #print "
??? ix=$ix= bc=$barcolrs[$mycolrindx]=\n"; } elsif ($parm{rockpile} >= 2) { $ycenter = $legendy + $sfh_2 / 2; $g->filledRectangle( $legendx, $ycenter+2, ($legendx+$sfh), ($ycenter+$sfh_2), $barcolrs[$mycolrindx]); #print "
ly=$legendy= sfh_2=$sfh_2 ycenter=$ycenter=\n"; #THIS DRAWS SYMBOLS TO LEFT OF EACH LINE OF "BOTTOM" VALUES! if ($parm{showvalues} =~ /bottom/i) { #print "-???- bsm=$parm{bottomsymbolmargin}=\n"; $xcenter = $parm{bottomsymbolmargin} || ($parm{lmgn} - $sfh_2); $ycenter = int($chartbottom3+2+(1+$bottomix)*$sfh)-$sfh_2; $ycenter += $xlegendyoffset; $ycenter -= $sfh_2 / 2; $g->filledRectangle( ($xcenter-$sfh_2), $ycenter+2, ($xcenter+$sfh_2), ($ycenter+$sfh_2), $barcolrs[$mycolrindx]); #NEXT LINE REMOVED 20041005 - PRINTED LINE ABOVE RECTANGLE, REDUNDANT! # $g->line(($xcenter - $sfh_2), $ycenter, # ($xcenter + $sfh_2), $ycenter, # $barcolrs[$mycolrindx]); } } 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 xLEGEND HEADERS! #print "-drew circle1 at ($xcenter,$ycenter): rad=$rad= colr($mycolrindx)=$barcolrs[$mycolrindx]= i=$i= j=$j= cash=$_= jx=$jx=\n"; $g->arc($xcenter,$ycenter,$rad,$rad,0,360, $barcolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$barcolrs[$mycolrindx]); #THIS DRAWS SYMBOLS TO LEFT OF EACH LINE OF "BOTTOM" VALUES! if ($parm{showvalues} =~ /bottom/i) { $rad = $dfltdiam; $rad *= 2 if ($mysymbol =~ /circle/i); #$xcenter = $parm{lmgn} - $sfh_2; #CHGD. TO NEXT: 20010820. $xcenter = $parm{bottomsymbolmargin} || ($parm{lmgn} - $sfh_2); $ycenter = int($chartbottom3+2+(1+$bottomix)*$sfh)-$sfh_2; #print "--yc=$ycenter= cb2=$chartbottom2 cb3=$chartbottom3= tb=$totalbottom= bx=$bottomix sf2=$sfh_2 xl=$xlegendyoffset\n"; $ycenter += $xlegendyoffset; #print "
ycnt=$ycnt= jx=$jx= cb3=$chartbottom2= color=$barcolrs[$mycolrindx] yc=$ycenter\n"; #print "
-center x=$xcenter y=$ycenter rad=$rad=\n"; $g->arc($xcenter,$ycenter,$rad,$rad,0,360, $barcolrs[$mycolrindx]); $g->fill($xcenter,$ycenter,$barcolrs[$mycolrindx]); $g->line(($xcenter - $sfh_2), $ycenter, ($xcenter + $sfh_2), $ycenter, $barcolrs[$mycolrindx]); #print "-drew circle2 at ($xcenter,$ycenter): rad=$rad= colr($mycolrindx)=$barcolrs[$mycolrindx]= i=$i= j=$j= cash=$_= jx=$jx=\n"; #print "
??? jx=$jx= bc=$barcolrs[$mycolrindx]=\n"; #print "-1: jx=$jx= 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, $barcolrs[$mycolrindx]); # $legendx += (2 * $pointdiam) + 3; #print "
-jx=$jx= i=$i= j=$j= lv=".${$parm{xlegend}}[$jx]."=\n"; # $g->string(gdSmallFont,$legendx,$legendy,${$parm{xlegend}}[$jx],$headercolr); # $legendx += ($sfw * length(${$parm{xlegend}}[$jx])) + 5; $legendx += $sfh2 + 2; $g->string(gdSmallFont,$legendx,$legendy,${$parm{xlegend}}[$jx],$headercolr); $legendx += ($sfw * length(${$parm{xlegend}}[$jx])) + 5; #print "-???- lx=$legendx= ly=$legendy= maxy=$parm{maxysiz}= l=".length(${$parm{xlegend}}[$jx])."= val=".${$parm{xlegend}}[$jx]."=\n"; ++$bottomix; } ++$jx; } unless ($i < $ycnt_1) { if ($parm{showvalues} =~ /total/i) { $myyval = &commatize($ysum[$j],$parm{commatize}, $yvalprefix, $yvalsuffix); $g->line($parm{lmgn}, $totalbottom, ($parm{lmgn}+$chartxsiz), $totalbottom, $headercolr); $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))), $totalbottom,$myyval,$valxcolr); } } if (defined(${$parm{yvals}}[$_])) { #print "
yval($_)=${$parm{yvals}}[$_]= i=$i= j=$j= ix=$ix= jx=$jx=\n"; $myyval = &commatize((defined(${$parm{showyvals}}[$_]) ? ${$parm{showyvals}}[$_] : ${$parm{yvals}}[$_]), $parm{commatize}, $yvalprefix, $yvalsuffix); $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}*($parm{barpct}/100)-(length($myyval)*$sfw))), ($chartbottom3+($i*$sfh)+2),$myyval,$headercolr) if ($parm{showvalues} =~ /bottom/i); if ($_ >= $ycnt) { #ACTUALLY DRAW THE LINE! #print "
-DRAW LINE! i=$i, yc=$ycnt= jcnt=$jcnt= jmax=$#{$parm{xvals}} j=$j, ($barxlo0,$barylo)->($barxhi0,$baryhi) colr=$mycolr0= yval=$myyval= cash=$_= yc=$ycnt\n"; $g->line($barxlo0,$barylo,$barxhi0,$baryhi, $mycolr0); $xpoints[$i][$jcnt] = $barxhi0; $ypoints[$i][$jcnt] = $baryhi; #print "-cash=$_= jcnt=$jcnt, ix=$ix, jx=$jx, i=$i, j=$j, len=".scalar(@xpoints)."=\n"; if ($parm{rockpile} && $jcnt >= $#{$parm{xvals}}) #DRAW FINAL SEGMENT FOR FILL! { #print "-CLOSE LINE! i=$i, yc=$ycnt= j=$j, jcnt=$jcnt= jmax=$#{$parm{xvals}}= ($barxhi0,$baryhi)->(".($parm{lmgn}+$chartxsiz).",$baryhi) colr=$mycolr0= yval=$myyval= cash=$cash= yc=$ycnt\n"; $g->line($barxhi0,$baryhi,($parm{lmgn}+$chartxsiz), $baryhi,$mycolr0); if ($parm{rockpile} >= 2) { for (my $k=0;$k<=$#{$parm{xvals}};$k++) { # $_ = $i ? ($ypoints[$i-1][$k] # - $ypoints[$i][$k]) : 0; $_ = ($i ? $ypoints[$i-1][$k] : ($parm{tmgn}+$chartysiz)) - $ypoints[$i][$k]; #print "-----gap=$_= yp1($i,$k)=".($i ? ($ypoints[$i-1][$k]-$ypoints[$i][$k]) : 0)."= yp=$ypoints[$i][$k]=\n"; $g->fill($xpoints[$i][$k], ($ypoints[$i][$k]+($_/2)), $mycolr0) if ($_ > 2); #print "+++DO NOT FILL!+++\n" unless ($_ > 2); } } } } elsif ($parm{rockpile}) #DRAW INITIAL SEGMENT TO SEAL FILL. { # $g->line($parm{lmgn},$baryhi,$barxhi0,$baryhi, #MOVED BELOW 20040412. # $mycolr0); unless ($barylo == $baryhi) #ADDED 20040412 TO FIX LINE & SHADING BUG IF ONLY A SINGLE X-POINT. { $g->line($parm{lmgn},$baryhi,$barxhi0,$baryhi, $mycolr0); unless ($#{$parm{xvals}}) { $g->line($barxhi0,$baryhi,($parm{lmgn}+$chartxsiz), $baryhi,$mycolr0); $g->fill(($parm{lmgn}+$chartxsiz)-1, ($baryhi+1), $mycolr0) unless ($baryhi >= $chartbottom); } } $xpoints[$i][$jcnt] = $barxhi0; $ypoints[$i][$jcnt] = $baryhi; } #print "-2: mysymbol=$mysymbol= pd=$pointdiam=\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, $barcolrs[$mycolrindx] ); } elsif ($mysymbol =~ /diamond/i) { $g->line(($barxhi0-$x), $baryhi, $barxhi0, ($baryhi-$x), $barcolrs[$mycolrindx]); $g->line($barxhi0, ($baryhi-$x), ($barxhi0+$x), $baryhi, $barcolrs[$mycolrindx]); $g->line(($barxhi0+$x), $baryhi, $barxhi0, ($baryhi+$x), $barcolrs[$mycolrindx]); $g->line($barxhi0, ($baryhi+$x), ($barxhi0-$x), $baryhi, $barcolrs[$mycolrindx]); } elsif ($mysymbol =~ /down/i) #DOWN-POINTING TRIANGLE. { my $triangrad = $x * 0.866; #sin 60 degrees $g->line($barxhi0, $baryhi+$triangrad+1, $barxhi0-$x, ($baryhi-$triangrad)+1, $barcolrs[$mycolrindx]); $g->line($barxhi0-$x, ($baryhi-$triangrad)+1, $barxhi0+$x, ($baryhi-$triangrad)+1, $barcolrs[$mycolrindx]); $g->line($barxhi0+$x, ($baryhi-$triangrad)+1, $barxhi0, $baryhi+$triangrad+1, $barcolrs[$mycolrindx]); } elsif ($mysymbol =~ /up/i) #UP-POINTING TRIANGLE. { my $triangrad = $x * 0.866; #sin 60 degrees $g->line($barxhi0, $baryhi-$triangrad, $barxhi0-$x, $baryhi+$triangrad, $barcolrs[$mycolrindx]); $g->line($barxhi0-$x, $baryhi+$triangrad, $barxhi0+$x, $baryhi+$triangrad, $barcolrs[$mycolrindx]); $g->line($barxhi0+$x, $baryhi+$triangrad, $barxhi0, $baryhi-$triangrad, $barcolrs[$mycolrindx]); } elsif ($mysymbol =~ /circle/i) { $g->arc($barxhi0,$baryhi,($x*2),($x*2),0,360, $barcolrs[$mycolrindx]); } else { $g->arc($barxhi0,$baryhi,$x,$x,0,360, $barcolrs[$mycolrindx]); } } } #$g->string(gdSmallFont,($barxlo0+($barxpix-(length(${$parm{yvals}}[$_])*$sfw))/2), # $baryhi-($sfh+$pointdiam),"${$parm{yvals}}[$_]",$mycolr0) $g->string(gdSmallFont, ($barxlo+($parm{barxsiz}-(length(${$parm{yvals}}[$_])*$sfw))/2), ($baryhi-($sfh+$pointrad)), "${$parm{yvals}}[$_]",$mycolr0) if ($parm{showvalues} =~ /bar/i); } $barxlo0 = $barxhi0; $barxhi0 += $parm{barxsiz}; $barxlo += $parm{barxsiz}; #print "
????? barxsiz=$parm{barxsiz}; barxlo=$barxlo.\n"; #print "
!!! ix=$ix= i=$i= j=$j=\n"; ++$ix; ++$jcnt; } } if ($parm{rockpile}) { #print "-2: delta=$ydelta=\n"; $ydelta = $parm{barysiz} * $parm{yInc}; $y = $parm{tmgn} + ($chartysiz * (($parm{ymax}-$parm{ybase}) / ($parm{ymax}-$parm{ymin}))); while ($y >= $parm{tmgn}-1) { if ($parm{ygriddashed}) { $g->dashedLine($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); } else { $g->line($parm{lmgn}-4,$y,($parm{lmgn}+$chartxsiz),$y,$gridcolr); } $y -= $ydelta; } } 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}#); #CHGD. TO NEXT 20050204 TO GET ALL OF 'EM! $l .= $parm{link} unless ($l =~ s#\*#$parm{link}#g); } } $l .= '"'; if (defined($parm{link}) || defined($parm{mouseover})) { $mapstr .= 'string(gdLargeFont,(($parm{maxxsiz} - ($lfw*length($parm{title})))/2), # ($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{xtitle})) { if ($parm{bmgn} > $sfh) { $j = $sfw * length($parm{xtitle}); $x = ($chartxsiz - $j)/2; $x = 0 if ($x < 0); $x += $parm{lmgn} unless (($j+$parm{lmgn}) > $parm{maxxsiz}); #print "
j=$j= x=$x= lmgn=$parm{lmgn}= maxx=$parm{maxxsiz}/$maxxsiz=\n"; $y = $legendy - ($sfh2+5); $g->string(gdSmallFont, $x, $y, $parm{xtitle}, $titlecolr); } } if (defined($parm{ytitle})) { $i = $sfw*length($parm{ytitle}); #$g->stringUp(gdSmallFont, ((($parm{lmgn}-$yheadxmax)-$sfh)-$sfh) / 2, #CHGD TO NEXT LINE 20010817 #$g->stringUp(gdSmallFont, ((($parm{lmgn}-($yheadxmax*$sfw))-$sfh)-$sfh) / 2, $g->stringUp(gdSmallFont, (($parm{lmgn}-($yheadxmax*$sfw))-$sfh) / 2, (($chartysiz - $i)/2) + $i + $parm{tmgn}, $parm{ytitle}, $titlecolr); } #print "-------legendx=$legendx= lrpos=".(($parm{maxxsiz} - $parm{rmgn}) - ($sfw*length($parm{lrtitle})))."=\n"; 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. #CHGD. TO NEXT 20031015 TO SUPPRESS IF LNLEGEND VALUES WOULD OVERWRITE IT. $_ = ($parm{maxxsiz} - $parm{rmgn}) - ($sfw*length($parm{lrtitle})); $g->string(gdSmallFont, $_, ($parm{maxysiz}-(2*$sfh+2)), $parm{lrtitle}, $titlecolr) if ($_ > $legendx + $sfw); } 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; my $valprefix = shift; my $valsuffix = shift; return ("${valprefix}${val}$valsuffix") 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 ("${valprefix}${val}$valsuffix"); } 1