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

SNMP编程

开发平台:

C/C++

  1. #==========================================================================
  2. #    Copyright (c) 1995-1998 Martien Verbruggen
  3. #--------------------------------------------------------------------------
  4. #
  5. # Name:
  6. # GIFgraph::legend.pm
  7. #
  8. # $Id: legend.pm,v 1.0 1999/02/18
  9. #
  10. #==========================================================================
  11. package GIFgraph::legend;
  12. use strict qw(vars refs subs);
  13.  
  14. use GIFgraph;
  15. use GIFgraph::utils qw(:all);
  16. @GIFgraph::legend::ISA = qw( GIFgraph );
  17. my %Defaults = (
  18.  
  19. # Size of the legend markers
  20. legend_marker_height => 8,
  21. legend_marker_width => 12,
  22. legend_spacing => 4,
  23. legend_placement => 'BC', # '[B][LCR]'
  24. );
  25. {
  26.  
  27. # PUBLIC
  28. sub plot_legend($) # GD::Image
  29. {
  30. my $s = shift;
  31. my $g = shift;
  32. $s->setup_legend();
  33. $s->draw_legend($g);
  34. }
  35. sub set_legend(@) # List of legend keys
  36. {
  37. my $self = shift;
  38. $self->set( legend => [@_]);
  39. }
  40. sub set_legend_font($) # (font name)
  41. {
  42. my $self = shift;
  43. $self->{lgf} = shift;
  44. $self->set( 
  45. lgfw => $self->{lgf}->width,
  46. lgfh => $self->{lgf}->height,
  47. );
  48. }
  49.  
  50. # PRIVATE
  51. # called on construction, by new
  52. # use inherited defaults
  53.  
  54. sub initialise()
  55. {
  56. my $self = shift;
  57.  
  58. $self->SUPER::initialise();
  59.  
  60. my $key;
  61. foreach $key (keys %Defaults) 
  62. {
  63. $self->set( $key => $Defaults{$key} );
  64. }
  65.  
  66. $self->set_legend_font(GD::gdTinyFont);
  67. }
  68.  
  69. #
  70. # Legend
  71. #
  72. sub setup_legend()
  73. {
  74. my $s = shift;
  75. return unless defined($s->{legend});
  76. my $maxlen = 0;
  77. my $num = 0;
  78. # Save some variables
  79. $s->{r_margin_abs} = $s->{r_margin};
  80. $s->{b_margin_abs} = $s->{b_margin};
  81. my $legend;
  82. foreach $legend (@{$s->{legend}})
  83. {
  84. if (defined($legend) and $legend ne "")
  85. {
  86. my $len = length($legend);
  87. $maxlen = ($maxlen > $len) ? $maxlen : $len;
  88. $num++;
  89. }
  90. }
  91. $s->{lg_num} = $num;
  92. # calculate the height and width of each element
  93. my $text_width = $maxlen * $s->{lgfw};
  94. my $legend_height = _max($s->{lgfh}, $s->{legend_marker_height});
  95. $s->{lg_el_width} = 
  96. $text_width + $s->{legend_marker_width} + 
  97. 3 * $s->{legend_spacing};
  98. $s->{lg_el_height} = $legend_height + 2 * $s->{legend_spacing};
  99. my ($lg_pos, $lg_align) = split(//, $s->{legend_placement});
  100. if ($lg_pos eq 'R')
  101. {
  102. # Always work in one column
  103. $s->{lg_cols} = 1;
  104. $s->{lg_rows} = $num;
  105. # Just for completeness, might use this in later versions
  106. $s->{lg_x_size} = $s->{lg_cols} * $s->{lg_el_width};
  107. $s->{lg_y_size} = $s->{lg_rows} * $s->{lg_el_height};
  108. # Adjust the right margin for the rest of the graph
  109. $s->{r_margin} += $s->{lg_x_size};
  110. # Set the x starting point
  111. $s->{lg_xs} = $s->{gifx} - $s->{r_margin};
  112. # Set the y starting point, depending on alignment
  113. if ($lg_align eq 'T')
  114. {
  115. $s->{lg_ys} = $s->{t_margin};
  116. }
  117. elsif ($lg_align eq 'B')
  118. {
  119. $s->{lg_ys} = $s->{gify} - $s->{b_margin} - $s->{lg_y_size};
  120. }
  121. else # default 'C'
  122. {
  123. my $height = $s->{gify} - $s->{t_margin} - $s->{b_margin};
  124. $s->{lg_ys} = 
  125. int($s->{t_margin} + $height/2 - $s->{lg_y_size}/2) ;
  126. }
  127. }
  128. else # 'B' is the default
  129. {
  130. # What width can we use
  131. my $width = $s->{gifx} - $s->{l_margin} - $s->{r_margin};
  132. (!defined($s->{lg_cols})) and 
  133. $s->{lg_cols} = int($width/$s->{lg_el_width});
  134. $s->{lg_cols} = _min($s->{lg_cols}, $num);
  135. $s->{lg_rows} = 
  136. int($num/$s->{lg_cols}) + (($num % $s->{lg_cols}) ? 1 : 0);
  137. $s->{lg_x_size} = $s->{lg_cols} * $s->{lg_el_width};
  138. $s->{lg_y_size} = $s->{lg_rows} * $s->{lg_el_height};
  139. # Adjust the bottom margin for the rest of the graph
  140. $s->{b_margin} += $s->{lg_y_size};
  141. # Set the y starting point
  142. $s->{lg_ys} = $s->{gify} - $s->{b_margin};
  143. # Set the x starting point, depending on alignment
  144. if ($lg_align eq 'R')
  145. {
  146. $s->{lg_xs} = $s->{gifx} - $s->{r_margin} - $s->{lg_x_size};
  147. }
  148. elsif ($lg_align eq 'L')
  149. {
  150. $s->{lg_xs} = $s->{l_margin};
  151. }
  152. else # default 'C'
  153. {
  154. $s->{lg_xs} =  
  155. int($s->{l_margin} + $width/2 - $s->{lg_x_size}/2);
  156. }
  157. }
  158. }
  159. sub draw_legend($) # (GD::Image)
  160. {
  161. my $s = shift;
  162. my $g = shift;
  163. return unless defined($s->{legend});
  164. my $xl = $s->{lg_xs} + $s->{legend_spacing};
  165. my $y = $s->{lg_ys} + $s->{legend_spacing} - 1;
  166. my $i = 0;
  167. my $row = 1;
  168. my $x = $xl; # start position of current element
  169. my $legend;
  170. foreach $legend (@{$s->{legend}})
  171. {
  172. $i++;
  173. my $xe = $x; # position within an element
  174. next unless (defined($legend) && $legend ne "");
  175. $s->draw_legend_marker($g, $i, $xe, $y);
  176. $xe += $s->{legend_marker_width} + $s->{legend_spacing};
  177. my $ys = int($y + $s->{lg_el_height}/2 - $s->{lgfh}/2);
  178. $g->string($s->{lgf}, $xe, $ys, $legend, $s->{tci});
  179. $x += $s->{lg_el_width};
  180. if (++$row > $s->{lg_cols})
  181. {
  182. $row = 1;
  183. $y += $s->{lg_el_height};
  184. $x = $xl;
  185. }
  186. }
  187. }
  188. # This will be virtual; every sub class should define their own
  189. # if this one doesn't suffice
  190. sub draw_legend_marker($$$$) # (GD::Image, data_set_number, x, y)
  191. {
  192. my $s = shift;
  193. my $g = shift;
  194. my $n = shift;
  195. my $x = shift;
  196. my $y = shift;
  197. my $ci = $s->set_clr( $g, $s->pick_data_clr($n) );
  198. $y += int($s->{lg_el_height}/2 - $s->{legend_marker_height}/2);
  199. $g->filledRectangle(
  200. $x, $y,
  201. $x + $s->{legend_marker_width}, $y + $s->{legend_marker_height},
  202. $ci
  203. );
  204. $g->rectangle(
  205. $x, $y, 
  206. $x + $s->{legend_marker_width}, $y + $s->{legend_marker_height},
  207. $s->{acci}
  208. );
  209. }
  210. } # End of package GIFgraph::legend
  211.  
  212. 1;