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

SNMP编程

开发平台:

C/C++

  1. #==========================================================================
  2. #              Copyright (c) 1995-1998 Martien Verbruggen
  3. #--------------------------------------------------------------------------
  4. #
  5. # Name:
  6. # GIFgraph::colour.pm
  7. #
  8. # Description:
  9. # Package of colour manipulation routines, to be used 
  10. # with GIFgraph.
  11. #
  12. # $Id: colour.pm,v 1.1.1.1 2002/02/26 10:16:37 oetiker Exp $
  13. #
  14. #==========================================================================
  15.  
  16. package GIFgraph::colour;
  17. use vars qw( @EXPORT_OK %EXPORT_TAGS );
  18. use strict qw( vars refs subs );
  19. require Exporter;
  20. @GIFgraph::colour::ISA = qw( Exporter );
  21. $GIFgraph::colour::prog_name    = 'GIFgraph::colour.pm';
  22. $GIFgraph::colour::prog_rcs_rev = '$Revision: 1.1.1.1 $';
  23. $GIFgraph::colour::prog_version = 
  24. ($GIFgraph::colour::prog_rcs_rev =~ /s+(d*.d*)/) ? $1 : "0.0";
  25. @EXPORT_OK = qw( 
  26. _rgb _luminance _hue 
  27. colour_list sorted_colour_list
  28. read_rgb
  29. );
  30. %EXPORT_TAGS = ( 
  31. colours => [qw( _rgb _luminance _hue )],
  32. lists => [qw( colour_list sorted_colour_list )],
  33. files => [qw( read_rgb )],
  34. );
  35. {
  36.     my %RGB = (
  37.         white => [0xFF,0xFF,0xFF], 
  38.         lgray => [0xBF,0xBF,0xBF], 
  39. gray => [0x7F,0x7F,0x7F],
  40. dgray => [0x3F,0x3F,0x3F],
  41. black => [0x00,0x00,0x00],
  42.         lblue => [0x00,0x00,0xFF], 
  43. blue => [0x00,0x00,0xBF],
  44.         dblue => [0x00,0x00,0x7F], 
  45. gold => [0xFF,0xD7,0x00],
  46.         lyellow => [0xFF,0xFF,0x00], 
  47.         yellow => [0xBF,0xBF,0x00], 
  48. dyellow => [0x7F,0x7F,0x00],
  49.         lgreen => [0x00,0xFF,0x00], 
  50.         green => [0x00,0xBF,0x00], 
  51. dgreen => [0x00,0x7F,0x00],
  52.         lred => [0xFF,0x00,0x00], 
  53. red => [0xBF,0x00,0x00],
  54. dred => [0x7F,0x00,0x00],
  55.         lpurple => [0xFF,0x00,0xFF], 
  56.         purple => [0xBF,0x00,0xBF],
  57. dpurple => [0x7F,0x00,0x7F],
  58.         lorange => [0xFF,0xB7,0x00], 
  59. orange => [0xFF,0x7F,0x00],
  60.         pink => [0xFF,0xB7,0xC1], 
  61. dpink => [0xFF,0x69,0xB4],
  62.         marine => [0x7F,0x7F,0xFF], 
  63. cyan => [0x00,0xFF,0xFF],
  64.         lbrown => [0xD2,0xB4,0x8C], 
  65. dbrown => [0xA5,0x2A,0x2A],
  66.     );
  67.     sub colour_list 
  68. {
  69.         my $n = ( $_[0] ) ? $_[0] : keys %RGB;
  70. return (keys %RGB)[0 .. $n-1]; 
  71.     }
  72.     sub sorted_colour_list 
  73. {
  74.         my $n = $_[0] ? $_[0] : keys %RGB;
  75.         return (sort by_luminance keys %RGB)[0 .. $n-1];
  76. #        return (sort by_hue keys %rgb)[0..$n-1];
  77.         sub by_luminance 
  78.         { 
  79.             _luminance(@{$RGB{$b}}) <=> _luminance(@{$RGB{$a}}); 
  80.         }
  81.         sub by_hue 
  82.         { 
  83.             _hue(@{$RGB{$b}}) <=> _hue(@{$RGB{$a}}); 
  84.         }
  85.     }
  86. # return the luminance of the colour (RGB)
  87.     sub _luminance 
  88. (0.212671 * $_[0] + 0.715160 * $_[1] + 0.072169 * $_[2])/0xFF; 
  89. }
  90. # return the hue of the colour (RGB)
  91.     sub _hue 
  92. ($_[0] + $_[1] + $_[2])/(3 * 0xFF); 
  93. }
  94. my %WarnedColours = ();
  95. # return the RGB values of the colour name
  96.     sub _rgb 
  97. my $clr = shift;
  98. my $rgb_ref;
  99. $rgb_ref = $RGB{$clr} or do {
  100. $rgb_ref = $RGB{'black'};
  101. unless ($WarnedColours{$clr})
  102. {
  103. $WarnedColours{$clr} = 1;
  104. warn "Colour $clr is not defined, reverting to black"; 
  105. }
  106. };
  107. @{$rgb_ref};
  108. }
  109.     sub version 
  110. {
  111.         return $GIFgraph::colour::prog_version;
  112.     }
  113. sub dump_colours
  114. {
  115. my $max = $_[0] ? $_[0] : keys %RGB;
  116. my $n = 0;
  117. my $clr;
  118. foreach $clr (sorted_colour_list($max))
  119. {
  120. last if $n > $max;
  121. print "colour: $clr, " . 
  122. "${$RGB{$clr}}[0], ${$RGB{$clr}}[1], ${$RGB{$clr}}[2]n"
  123. }
  124. }
  125. #
  126. # Read a rgb.txt file (X11)
  127. #
  128. # Expected format of the file:
  129. #
  130. # R G B colour name
  131. #
  132. # Fields can be separated by any number of whitespace
  133. # Lines starting with an exclamation mark (!) are comment and 
  134. # will be ignored.
  135. #
  136. # returns number of colours read
  137. sub read_rgb($) # (filename)
  138. {
  139. my $fn = shift;
  140. my $n = 0;
  141. my $line;
  142. open(RGB, $fn) or return 0;
  143. while (defined($line = <RGB>))
  144. {
  145. next if ($line =~ /s*!/);
  146. chomp($line);
  147. # remove leading white space
  148. $line =~ s/^s+//;
  149. # get the colours
  150. my ($r, $g, $b, $name) = split(/s+/, $line, 4);
  151. # Ignore bad lines
  152. next unless (defined $name);
  153. $RGB{$name} = [$r, $g, $b];
  154. $n++;
  155. }
  156. close(RGB);
  157. return $n;
  158. }
  159.  
  160.     $GIFgraph::colour::prog_name;
  161. } # End of package Colour
  162. __END__
  163. =head1 NAME
  164. Colour - Colour manipulation routines for use with GIFgraph
  165. =head1 SYNOPSIS
  166. use GIFgraph::colour qw( :colours :lists :files );
  167. =head1 DESCRIPTION
  168. The B<Colour> Package provides a few routines to convert some colour
  169. names to RGB values. Also included are some functions to calculate
  170. the hue and luminance of the colours, mainly to be able to sort them.
  171. The :colours tags can be used to import the I<_rgb>, I<_hue>, and
  172. I<_luminance> functions, the :lists tag for I<colour_list> and
  173. I<sorted_colour_list>, and the :files tag exports the I<read_rgb>
  174. function.
  175. =head1 FUNCTIONS
  176. =over 4
  177. =item Colour::colour_list( I<number of colours> )
  178. Returns a list of I<number of colours> colour names known to the package.
  179. =item Colour::sorted_colour_list( I<number of colours> )
  180. Returns a list of I<number of colours> colour names known to the package, 
  181. sorted by luminance or hue.
  182. B<NB.> Right now it always sorts by luminance. Will add an option in a later
  183. stage to decide sorting method at run time.
  184. =item Colour::_rgb( I<colour name> )
  185. Returns a list of the RGB values of I<colour name>.
  186. =item Colour::_hue( I<R,G,B> )
  187. Returns the hue of the colour with the specified RGB values.
  188. =item Colour::_luminance( I<R,G,B> )
  189. Returns the luminance of the colour with the specified RGB values.
  190. =item Colour::read_rgb( F<file name> )
  191. Reads in colours from a rgb file as used by the X11 system.
  192. Doing something like:
  193.     use GIFgraph::bars;
  194.     use GIFgraph::colour;
  195.     GIFgraph::colour::read_rgb("rgb.txt") or die "cannot read colours";
  196. Will allow you to use any colours defined in rgb.txt in your graph.
  197. =back 
  198. =head1 PREDEFINED COLOUR NAMES
  199. white,
  200. lgray,
  201. gray,
  202. dgray,
  203. black,
  204. lblue,
  205. blue,
  206. dblue,
  207. gold,
  208. lyellow,
  209. yellow,
  210. dyellow,
  211. lgreen,
  212. green,
  213. dgreen,
  214. lred,
  215. red,
  216. dred,
  217. lpurple,
  218. purple,
  219. dpurple,
  220. lorange,
  221. orange,
  222. pink,
  223. dpink,
  224. marine,
  225. cyan,
  226. lbrown,
  227. dbrown.
  228. =cut