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

SNMP编程

开发平台:

C/C++

  1. #==========================================================================
  2. #    Copyright (c) 1995-1998 Martien Verbruggen
  3. #--------------------------------------------------------------------------
  4. #
  5. # Name:
  6. # GIFgraph::bars.pm
  7. #
  8. # $Id: bars.pm,v 1.1.1.1 2002/02/26 10:16:37 oetiker Exp $
  9. #
  10. #==========================================================================
  11.  
  12. package GIFgraph::bars;
  13. use strict qw(vars refs subs);
  14. use GIFgraph::axestype;
  15. use GIFgraph::utils qw(:all);
  16. @GIFgraph::bars::ISA = qw( GIFgraph::axestype );
  17. my %Defaults = (
  18. # Spacing between the bars
  19. bar_spacing  => 0,
  20. );
  21. {
  22. sub initialise()
  23. {
  24. my $self = shift;
  25. $self->SUPER::initialise();
  26. my $key;
  27. foreach $key (keys %Defaults)
  28. {
  29. $self->set( $key => $Defaults{$key} );
  30. }
  31. }
  32. # PRIVATE
  33. sub draw_data{
  34. my $s = shift;
  35. my $g = shift;
  36. my $d = shift;
  37. if ( $s->{overwrite} ) 
  38. {
  39. $s->draw_data_overwrite($g, $d);
  40. else 
  41. {
  42. $s->SUPER::draw_data($g, $d);
  43. }
  44. # redraw the 'zero' axis
  45. $g->line( 
  46. $s->{left}, $s->{zeropoint}, 
  47. $s->{right}, $s->{zeropoint}, 
  48. $s->{fgci} );
  49. }
  50.  
  51. # Draws the bars on top of each other
  52.  
  53. sub draw_data_overwrite {
  54. my $s = shift;
  55. my $g = shift;
  56. my $d = shift;
  57. my $bar_s = _round($s->{bar_spacing}/2);
  58. my $zero = $s->{zeropoint};
  59. my $i;
  60. for $i (0 .. $s->{numpoints}) 
  61. {
  62. my $bottom = $zero;
  63. my ($xp, $t);
  64. my $j;
  65. for $j (1 .. $s->{numsets}) 
  66. {
  67. next unless (defined $d->[$j][$i]);
  68. # get data colour
  69. my $dsci = $s->set_clr( $g, $s->pick_data_clr($j) );
  70. # get coordinates of top and center of bar
  71. ($xp, $t) = $s->val_to_pixel($i + 1, $d->[$j][$i], $j);
  72. # calculate left and right of bar
  73. my $l = $xp - _round($s->{x_step}/2) + $bar_s;
  74. my $r = $xp + _round($s->{x_step}/2) - $bar_s;
  75. # calculate new top
  76. $t -= ($zero - $bottom) if ($s->{overwrite} == 2);
  77. # draw the bar
  78. if ($d->[$j][$i] >= 0)
  79. {
  80. # positive value
  81. $g->filledRectangle( $l, $t, $r, $bottom, $dsci );
  82. $g->rectangle( $l, $t, $r, $bottom, $s->{acci} );
  83. }
  84. else
  85. {
  86. # negative value
  87. $g->filledRectangle( $l, $bottom, $r, $t, $dsci );
  88. $g->rectangle( $l, $bottom, $r, $t, $s->{acci} );
  89. }
  90. # reset $bottom to the top
  91. $bottom = $t if ($s->{overwrite} == 2);
  92. }
  93. }
  94.  }
  95. sub draw_data_set($$$)
  96. {
  97. my $s = shift;
  98. my $g = shift;
  99. my $d = shift;
  100. my $ds = shift;
  101. my $bar_s = _round($s->{bar_spacing}/2);
  102. # Pick a data colour
  103. my $dsci = $s->set_clr( $g, $s->pick_data_clr($ds) );
  104. my $i;
  105. for $i (0 .. $s->{numpoints}) 
  106. {
  107. next unless (defined $d->[$i]);
  108. # get coordinates of top and center of bar
  109. my ($xp, $t) = $s->val_to_pixel($i + 1, $d->[$i], $ds);
  110. # calculate left and right of bar
  111. my ($l, $r);
  112. if ($s->{mixed})
  113. {
  114. $l = $xp - _round($s->{x_step}/2) + $bar_s;
  115. $r = $xp + _round($s->{x_step}/2) - $bar_s;
  116. }
  117. else
  118. {
  119. $l = $xp 
  120. - _round($s->{x_step}/2)
  121. + _round(($ds - 1) * $s->{x_step}/$s->{numsets})
  122. + $bar_s;
  123. $r = $xp 
  124. - _round($s->{x_step}/2)
  125. + _round($ds * $s->{x_step}/$s->{numsets})
  126. - $bar_s;
  127. }
  128. # draw the bar
  129. if ($d->[$i] >= 0)
  130. {
  131. # positive value
  132. $g->filledRectangle( $l, $t, $r, $s->{zeropoint}, $dsci );
  133. $g->rectangle( $l, $t, $r, $s->{zeropoint}, $s->{acci} );
  134. }
  135. else
  136. {
  137. # negative value
  138. $g->filledRectangle( $l, $s->{zeropoint}, $r, $t, $dsci );
  139. $g->rectangle( $l, $s->{zeropoint}, $r, $t, $s->{acci} );
  140. }
  141. }
  142. }
  143.  
  144. } # End of package GIFgraph::bars
  145. 1;