--- loncom/cgi/plot.gif 2001/12/07 22:52:38 1.1 +++ loncom/cgi/plot.gif 2001/12/11 13:47:36 1.3 @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# $Id: plot.gif,v 1.1 2001/12/07 22:52:38 matthew Exp $ +# $Id: plot.gif,v 1.3 2001/12/11 13:47:36 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -24,6 +24,8 @@ # # http://www.lon-capa.org/ # +########################################################################### +# # CGI-BIN interface to GD, used for making mathematical plots. # # User specifies the following variables (given are defaults): @@ -33,6 +35,7 @@ # xmax = " 10.0" # ymin = "-10.0" # ymax = " 10.0" +# transparent (doesn't work with gif?) # frame # drawaxes # drawtics @@ -51,6 +54,7 @@ # size of a labelN is one of : # giant, large, medium, small, tiny # +########################################################################### use GD; my @inputs = split(/&/,$ENV{'QUERY_STRING'}); @@ -73,22 +77,27 @@ $axis->{'ylen'} = $axis->{'ymax'} - $axi $vtic_every = &grab('vtic_every',1.0,\%In); $htic_every = &grab('htic_every',1.0,\%In); -my $image = new GD::Image($height,$width); +my $image = new GD::Image($width,$height); # allocate standard colors -my $white = $image->colorAllocate(255,255,255); -my $black = $image->colorAllocate( 0, 0, 0); - -# Draw a black frame around the picture -&drawtics($htic_every,$vtic_every) if (exists($In{"drawtics"})); -&drawaxes($axis) if (exists($In{"drawaxis"})); -&frame(1) if (exists($In{'frame'})); +my @BGvalues = split /,/,&grab('bgcolor','255,255,255',\%In); +my @FGvalues = split /,/,&grab('fgcolor','0,0,0',\%In); +my $bgcolor = $image->colorAllocate(@BGvalues); +my $fgcolor = $image->colorAllocate(@FGvalues); + +# Draw a fgcolor frame around the picture +&drawtics($htic_every,$vtic_every) if (exists($In{'drawtics'})); +&drawaxes($axis) if (exists($In{'drawaxis'})); +&drawframe(1) if (exists($In{'frame'})); +# make the background transparent if needed (this doesn't work, at least +# not for gif images, don't know if it works for png) +$image->transparent($bgcolor) if (exists($In{'transparent'})); ## Take care of labels and data series foreach (keys %In) { if (/^label/) { my ($x,$y,$size,$text) = split/,/,$In{$_}; - &drawstring($text,$x,$y,$black,$size); + &drawstring($text,$x,$y,$fgcolor,$size); delete ($In{$_}); next; } elsif (/^xseries/) { @@ -101,26 +110,21 @@ foreach (keys %In) { delete ($In{$yname}); if ($#X != $#Y) { &drawstring("size of $xname and $yname do not match", - 10,10,$black,"giant"); + 10,10,$fgcolor,"giant"); next; } &drawcurve(\@X,\@Y); } } -# make the background transparent and interlaced -$image->transparent($white); - -# make sure we are writing to a binary stream -binmode STDOUT; -# Convert the image to PNG and print it on standard output +# Tell the browser our mime-type print <plot(\@data)->png; +my $BinaryData=$image->png; undef $image; binmode(STDOUT); open IMG,"|pngtopnm|ppmtogif 2>/dev/null"; # convert into a gif image @@ -156,18 +160,18 @@ sub transformPoint{ sub drawaxes{ ($x1,$y1) = &transformPoint($axis->{"xmin"},0,$image,$axis); ($x2,$y2) = &transformPoint($axis->{"xmax"},0,$image,$axis); - $image->line($x1,$y1,$x2,$y2,$black); + $image->line($x1,$y1,$x2,$y2,$fgcolor); ($x1,$y1) = &transformPoint(0,$axis->{"ymin"},$image,$axis); ($x2,$y2) = &transformPoint(0,$axis->{"ymax"},$image,$axis); - $image->line($x1,$y1,$x2,$y2,$black); + $image->line($x1,$y1,$x2,$y2,$fgcolor); } sub drawtics{ my ($htic_every,$vtic_every) = @_; my ($width,$height) = $image->getBounds(); - $ticwidth = ($width > 99 ? 10 : int($width /10) + 1); - $ticheight = ($height > 99 ? 10 : int($height/10)); + $ticwidth = ($width > 99 ? 5 : int($width /20) + 1); + $ticheight = ($height > 99 ? 5 : int($height/20) + 1); # Do tics along y-axis for ($ntic = 0; $ntic <=int($axis->{"ylen"}/$vtic_every); $ntic++){ @@ -175,7 +179,7 @@ sub drawtics{ my ($x2,$y2) = &transformPoint(0,$axis->{"ymin"}+$ntic*$vtic_every); $x1 -= $ticwidth; $x2 += $ticwidth; - $image->line($x1,$y1,$x2,$y2,$black); + $image->line($x1,$y1,$x2,$y2,$fgcolor); } # Do tics along x-axis for ($ntic = 0; $ntic <=int($axis->{"xlen"}/$htic_every); $ntic++){ @@ -183,7 +187,7 @@ sub drawtics{ my ($x2,$y2) = &transformPoint( $axis->{"xmin"}+$ntic*$htic_every,0); $y1 -= $ticheight; $y2 += $ticheight; - $image->line($x1,$y1,$x2,$y2,$black); + $image->line($x1,$y1,$x2,$y2,$fgcolor); } } @@ -192,17 +196,17 @@ sub drawcurve{ for($i=0;$i< (@$X-1);$i++) { ($x1,$y1) = &transformPoint($X->[$i ],$Y->[$i ]); ($x2,$y2) = &transformPoint($X->[$i+1],$Y->[$i+1]); - $image->line($x1,$y1,$x2,$y2,$black); + $image->line($x1,$y1,$x2,$y2,$fgcolor); } } -sub frame{ +sub drawframe{ # Draw a frame around the picture. my ($xoffset,$yoffset) = @_; $xoffset = $xoffset || 1; $yoffset = $yoffset || $xoffset; my ($width,$height) = $image->getBounds(); - $image->rectangle($xoffset-1,$yoffset-1,$width-$xoffset,$height-$yoffset,$black); + $image->rectangle($xoffset-1,$yoffset-1,$width-$xoffset,$height-$yoffset,$fgcolor); } sub drawstring{