#========================================================================== # Copyright (c) 1995-1998 Martien Verbruggen #-------------------------------------------------------------------------- # # Name: # GIFgraph::lines.pm # # $Id: lines.pm,v 1.1.1.1 2002/02/26 10:16:37 oetiker Exp $ # #========================================================================== package GIFgraph::lines; use strict qw(vars refs subs); use GD; use GIFgraph::axestype; @GIFgraph::lines::ISA = qw( GIFgraph::axestype ); my %Defaults = ( # The width of the line to use in the lines and linespoints graphs # in pixels line_width => 1, # Set the scale of the line types line_type_scale => 8, # Which line typess to use line_types => [1], ); { sub initialise() { my $self = shift; $self->SUPER::initialise(); my $key; foreach $key (keys %Defaults) { $self->set( $key => $Defaults{$key} ); } } # PRIVATE sub draw_data_set($$$) # GD::Image, \@data { my $s = shift; my $g = shift; my $d = shift; my $ds = shift; my $dsci = $s->set_clr( $g, $s->pick_data_clr($ds) ); my $type = $s->pick_line_type($ds); my ($xb, $yb) = (defined $d->[0]) ? $s->val_to_pixel( 1, $d->[0], $ds) : (undef, undef); my $i; for $i (1 .. $s->{numpoints}) { next unless (defined $d->[$i]); my ($xe, $ye) = $s->val_to_pixel($i+1, $d->[$i], $ds); $s->draw_line( $g, $xb, $yb, $xe, $ye, $type, $dsci ) if defined $xb; ($xb, $yb) = ($xe, $ye); } } sub pick_line_type($) { my $s = shift; my $num = shift; if ( exists $s->{line_types} ) { return $s->{line_types}[ $num % (1 + $#{$s->{line_types}}) - 1 ]; } return $num % 4 ? $num % 4 : 4; } sub draw_line($$$$$$) # ($xs, $ys, $xe, $ye, $type, $colour_index) { my $s = shift; my $g = shift; my ($xs, $ys, $xe, $ye, $type, $clr) = @_; my $lw = $s->{line_width}; my $lts = $s->{line_type_scale}; my $style = gdStyled; my @pattern = (); LINE: { ($type == 2) && do { # dashed for (1 .. $lts) { push(@pattern, $clr) } for (1 .. $lts) { push(@pattern, gdTransparent) } $g->setStyle(@pattern); last LINE; }; ($type == 3) && do { # dotted, for (1 .. 2) { push(@pattern, $clr) } for (1 .. 2) { push(@pattern, gdTransparent) } $g->setStyle(@pattern); last LINE; }; ($type == 4) && do { # dashed and dotted for (1 .. $lts) { push(@pattern, $clr) } for (1 .. 2) { push(@pattern, gdTransparent) } for (1 .. 2) { push(@pattern, $clr) } for (1 .. 2) { push(@pattern, gdTransparent) } $g->setStyle(@pattern); last LINE; }; # default: solid $style = $clr; } # Tried the line_width thing with setBrush, ugly results # TODO: This loop probably should be around the datasets # for nicer results my $i; for $i (1..$lw) { my $yslw = $ys + int($lw/2) - $i; my $yelw = $ye + int($lw/2) - $i; # Need the setstyle to reset $g->setStyle(@pattern) if (@pattern); $g->line( $xs, $yslw, $xe, $yelw, $style ); } } sub draw_legend_marker($$$$) # (GD::Image, data_set_number, x, y) { my $s = shift; my $g = shift; my $n = shift; my $x = shift; my $y = shift; my $ci = $s->set_clr( $g, $s->pick_data_clr($n) ); my $type = $s->pick_line_type($n); $y += int($s->{lg_el_height}/2); $s->draw_line( $g, $x, $y, $x + $s->{legend_marker_width}, $y, $type, $ci ); } } # End of package GIFgraph::lines 1;