lines.pm
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:4k
- #==========================================================================
- # 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;