lines.pm
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:4k
源码类别:

SNMP编程

开发平台:

C/C++

  1. #==========================================================================
  2. #    Copyright (c) 1995-1998 Martien Verbruggen
  3. #--------------------------------------------------------------------------
  4. #
  5. # Name:
  6. # GIFgraph::lines.pm
  7. #
  8. # $Id: lines.pm,v 1.1.1.1 2002/02/26 10:16:37 oetiker Exp $
  9. #
  10. #==========================================================================
  11. package GIFgraph::lines;
  12. use strict qw(vars refs subs);
  13.  
  14. use GD;
  15. use GIFgraph::axestype;
  16. @GIFgraph::lines::ISA = qw( GIFgraph::axestype );
  17. my %Defaults = (
  18. # The width of the line to use in the lines and linespoints graphs
  19. # in pixels
  20.  
  21. line_width => 1,
  22. # Set the scale of the line types
  23. line_type_scale => 8,
  24. # Which line typess to use
  25. line_types => [1],
  26. );
  27. {
  28. sub initialise()
  29. {
  30. my $self = shift;
  31. $self->SUPER::initialise();
  32. my $key;
  33. foreach $key (keys %Defaults)
  34. {
  35. $self->set( $key => $Defaults{$key} );
  36. }
  37. }
  38. # PRIVATE
  39. sub draw_data_set($$$) # GD::Image, @data
  40. {
  41. my $s = shift;
  42. my $g = shift;
  43. my $d = shift;
  44. my $ds = shift;
  45. my $dsci = $s->set_clr( $g, $s->pick_data_clr($ds) );
  46. my $type = $s->pick_line_type($ds);
  47. my ($xb, $yb) = (defined $d->[0]) ?
  48. $s->val_to_pixel( 1, $d->[0], $ds) :
  49. (undef, undef);
  50. my $i;
  51. for $i (1 .. $s->{numpoints}) 
  52. {
  53. next unless (defined $d->[$i]);
  54. my ($xe, $ye) = $s->val_to_pixel($i+1, $d->[$i], $ds);
  55. $s->draw_line( $g, $xb, $yb, $xe, $ye, $type, $dsci ) 
  56. if defined $xb;
  57. ($xb, $yb) = ($xe, $ye);
  58.    }
  59. }
  60. sub pick_line_type($)
  61. {
  62. my $s = shift;
  63. my $num = shift;
  64. if ( exists $s->{line_types} )
  65. {
  66. return $s->{line_types}[ $num % (1 + $#{$s->{line_types}}) - 1 ];
  67. }
  68. return $num % 4 ? $num % 4 : 4;
  69. }
  70. sub draw_line($$$$$$) # ($xs, $ys, $xe, $ye, $type, $colour_index)
  71. {
  72. my $s = shift;
  73. my $g = shift;
  74. my ($xs, $ys, $xe, $ye, $type, $clr) = @_;
  75. my $lw = $s->{line_width};
  76. my $lts = $s->{line_type_scale};
  77. my $style = gdStyled;
  78. my @pattern = ();
  79. LINE: {
  80. ($type == 2) && do {
  81. # dashed
  82. for (1 .. $lts) { push(@pattern, $clr) }
  83. for (1 .. $lts) { push(@pattern, gdTransparent) }
  84. $g->setStyle(@pattern);
  85. last LINE;
  86. };
  87. ($type == 3) && do {
  88. # dotted,
  89. for (1 .. 2) { push(@pattern, $clr) }
  90. for (1 .. 2) { push(@pattern, gdTransparent) }
  91. $g->setStyle(@pattern);
  92. last LINE;
  93. };
  94. ($type == 4) && do {
  95. # dashed and dotted
  96. for (1 .. $lts) { push(@pattern, $clr) }
  97. for (1 .. 2)  { push(@pattern, gdTransparent) }
  98. for (1 .. 2)  { push(@pattern, $clr) }
  99. for (1 .. 2)  { push(@pattern, gdTransparent) }
  100. $g->setStyle(@pattern);
  101. last LINE;
  102. };
  103. # default: solid
  104. $style = $clr;
  105. }
  106. # Tried the line_width thing with setBrush, ugly results
  107. # TODO: This loop probably should be around the datasets 
  108. # for nicer results
  109. my $i;
  110. for $i (1..$lw)
  111. {
  112. my $yslw = $ys + int($lw/2) - $i;
  113. my $yelw = $ye + int($lw/2) - $i;
  114. # Need the setstyle to reset 
  115. $g->setStyle(@pattern) if (@pattern);
  116. $g->line( $xs, $yslw, $xe, $yelw, $style );
  117. }
  118. }
  119. sub draw_legend_marker($$$$) # (GD::Image, data_set_number, x, y)
  120. {
  121. my $s = shift;
  122. my $g = shift;
  123. my $n = shift;
  124. my $x = shift;
  125. my $y = shift;
  126. my $ci = $s->set_clr( $g, $s->pick_data_clr($n) );
  127. my $type = $s->pick_line_type($n);
  128. $y += int($s->{lg_el_height}/2);
  129. $s->draw_line(
  130. $g,
  131. $x, $y, 
  132. $x + $s->{legend_marker_width}, $y,
  133. $type, $ci
  134. );
  135. }
  136. } # End of package GIFgraph::lines
  137. 1;