my @map=( sub{( 0, 0, $_[0] * 255 )}, sub{( 0, $_[0]*255, 255 )}, sub{( 0, 255, (1-$_[0])*255 )}, sub{( $_[0]*255, 255, 0 )}, sub{( 255, (1-$_[0])*255, 0 )}, sub{( 255, 0, $_[0]*255 )}, sub{( 255, $_[0]*255, 255 )}, ); sub ramp { my( $v, $vmin, $vmax ) = @_; ## Peg $v to $vmax if it is greater than $vmax $v = $vmax if $v > $vmax; ## Or peg $v to $vmin if it is less tahn $vmin. $v = $vmin if $v < $vmin; ## Normalise $v relative to $vmax - $vmin $v = ( $v - $vmin ) / ( $vmax - $vmin ) ; ## Scale it to the range 0 .. 1784 $v *= 1785; my @a = map { int } $map[$v/255]->( ($v % 255) / 256 ); #print join(',',@a)."\n"; return ($a[2]<<8 ) | ($a[1]<<4 ) | ($a[0] ) ; };