Blob Blame History Raw
#==========================================================================
#			   Copyright (c) 1995-1998 Martien Verbruggen
#--------------------------------------------------------------------------
#
#	Name:
#		GIFgraph::bars.pm
#
# $Id: bars.pm,v 1.1.1.1 2002/02/26 10:16:37 oetiker Exp $
#
#==========================================================================
 
package GIFgraph::bars;

use strict qw(vars refs subs);

use GIFgraph::axestype;
use GIFgraph::utils qw(:all);

@GIFgraph::bars::ISA = qw( GIFgraph::axestype );

my %Defaults = (
	
	# Spacing between the bars
	bar_spacing 	=> 0,
);

{
	sub initialise()
	{
		my $self = shift;

		$self->SUPER::initialise();

		my $key;
		foreach $key (keys %Defaults)
		{
			$self->set( $key => $Defaults{$key} );
		}
	}
	
	# PRIVATE
	sub draw_data{

		my $s = shift;
		my $g = shift;
		my $d = shift;

		if ( $s->{overwrite} ) 
		{
			$s->draw_data_overwrite($g, $d);
		} 
		else 
		{
			$s->SUPER::draw_data($g, $d);
		}

		# redraw the 'zero' axis
		$g->line( 
			$s->{left}, $s->{zeropoint}, 
			$s->{right}, $s->{zeropoint}, 
			$s->{fgci} );
	}
 
	# Draws the bars on top of each other
 
	sub draw_data_overwrite {

		my $s = shift;
		my $g = shift;
		my $d = shift;
		my $bar_s = _round($s->{bar_spacing}/2);

		my $zero = $s->{zeropoint};

		my $i;
		for $i (0 .. $s->{numpoints}) 
		{
			my $bottom = $zero;
			my ($xp, $t);

			my $j;
			for $j (1 .. $s->{numsets}) 
			{
				next unless (defined $d->[$j][$i]);

				# get data colour
				my $dsci = $s->set_clr( $g, $s->pick_data_clr($j) );

				# get coordinates of top and center of bar
				($xp, $t) = $s->val_to_pixel($i + 1, $d->[$j][$i], $j);

				# calculate left and right of bar
				my $l = $xp - _round($s->{x_step}/2) + $bar_s;
				my $r = $xp + _round($s->{x_step}/2) - $bar_s;

				# calculate new top
				$t -= ($zero - $bottom) if ($s->{overwrite} == 2);

				# draw the bar
				if ($d->[$j][$i] >= 0)
				{
					# positive value
					$g->filledRectangle( $l, $t, $r, $bottom, $dsci );
					$g->rectangle( $l, $t, $r, $bottom, $s->{acci} );
				}
				else
				{
					# negative value
					$g->filledRectangle( $l, $bottom, $r, $t, $dsci );
					$g->rectangle( $l, $bottom, $r, $t, $s->{acci} );
				}

				# reset $bottom to the top
				$bottom = $t if ($s->{overwrite} == 2);
			}
		}
	 }

	sub draw_data_set($$$)
	{
		my $s = shift;
		my $g = shift;
		my $d = shift;
		my $ds = shift;
		my $bar_s = _round($s->{bar_spacing}/2);

		# Pick a data colour
		my $dsci = $s->set_clr( $g, $s->pick_data_clr($ds) );

		my $i;
		for $i (0 .. $s->{numpoints}) 
		{
			next unless (defined $d->[$i]);

			# get coordinates of top and center of bar
			my ($xp, $t) = $s->val_to_pixel($i + 1, $d->[$i], $ds);

			# calculate left and right of bar
			my ($l, $r);

			if ($s->{mixed})
			{
				$l = $xp - _round($s->{x_step}/2) + $bar_s;
				$r = $xp + _round($s->{x_step}/2) - $bar_s;
			}
			else
			{
				$l = $xp 
					- _round($s->{x_step}/2)
					+ _round(($ds - 1) * $s->{x_step}/$s->{numsets})
					+ $bar_s;
				$r = $xp 
					- _round($s->{x_step}/2)
					+ _round($ds * $s->{x_step}/$s->{numsets})
					- $bar_s;
			}

			# draw the bar
			if ($d->[$i] >= 0)
			{
				# positive value
				$g->filledRectangle( $l, $t, $r, $s->{zeropoint}, $dsci );
				$g->rectangle( $l, $t, $r, $s->{zeropoint}, $s->{acci} );
			}
			else
			{
				# negative value
				$g->filledRectangle( $l, $s->{zeropoint}, $r, $t, $dsci );
				$g->rectangle( $l, $s->{zeropoint}, $r, $t, $s->{acci} );
			}
		}
	}
 
} # End of package GIFgraph::bars

1;