class Colors::Colormap

Constants

PNG_HEIGHT
PNG_WIDTH

Attributes

n_colors[R]
name[R]

Public Class Methods

new(name, n_colors) click to toggle source
# File lib/colors/colormap.rb, line 3
def initialize(name, n_colors)
  @name = name
  @n_colors = n_colors.to_int
  @bad_color = RGBA.new(0r, 0r, 0r, 0r)
  @under_color = nil
  @over_color = nil
  @under_index = self.n_colors
  @over_index = self.n_colors + 1
  @bad_index = self.n_colors + 2
  @initialized = false
end

Public Instance Methods

[](x) click to toggle source
# File lib/colors/colormap.rb, line 17
def [](x)
  init_colormap unless @initialized

  xs = Array(x)
  scalar_p = (xs.length == 1) && xs[0] == x

  if all_ratio?(xs)
    xs.map! do |v|
      v *= self.n_colors
      v = -1 if v < 0
      v = self.n_colors - 1 if v == self.n_colors
      v.clamp(-1, self.n_colors).to_i
    end
  end
  ys = xs.map do |v|
    v = case
        when v >= self.n_colors
          @over_index
        when v < 0
          @under_index
        else
          v
        end
    @lookup_table[v]
  end

  if scalar_p
    ys[0]
  else
    ys
  end
end
over_color() click to toggle source
# File lib/colors/colormap.rb, line 50
def over_color
  init_colormap unless @initialized
  @lookup_table[@over_index]
end
over_color=(color) click to toggle source
# File lib/colors/colormap.rb, line 55
def over_color=(color)
  @over_color = color
  update_extreme_colors if @initialized
end
reversed() click to toggle source
# File lib/colors/colormap.rb, line 70
def reversed
  rev_name = "#{self.name}_r" unless self.name.nil?
  rev = make_reverse_colormap(rev_name)
  rev.over_color = self.over_color
  rev.under_color = self.under_color
  return rev
end
to_html() click to toggle source
# File lib/colors/colormap.rb, line 97
def to_html
  require "base64"
  png_blob = to_png
  png_base64 = Base64.encode64(png_blob)
  html = %Q[<div style="vertical-align: middle;">] +
         %Q[<strong>#{self.name}</strong> ] +
         %Q[</div>] +
         %Q[<div class="cmap"><img alt="#{self.name} colormap" ] +
         %Q[title="#{self.name}" style="border: 1px solid #555;" ] +
         %Q[src="data:image/png;base64,#{png_base64}"></div>] +
         %Q[<div style="vertical-align: middle; ] +
         %Q[max-width: #{PNG_WIDTH + 2}px; ] +
         %Q[display: flex; justify-content: space-between;">] +
         %Q[<div style="float: left;">] +
         %Q[#{html_color_block(under_color)} under</div>] +
         # TODO: bad_color support
         # %Q[<div style="margin: 0 auto; display: inline-block;">] +
         # %Q[bad #{html_color_block(bad_color)}</div>] +
         %Q[<div style="float: right;">] +
         %Q[over #{html_color_block(over_color)}</div>]
  ["text/html", html]
end
to_png() click to toggle source
# File lib/colors/colormap.rb, line 85
def to_png
  require "chunky_png"
  png = ChunkyPNG::Image.new(PNG_WIDTH, PNG_HEIGHT, ChunkyPNG::Color::TRANSPARENT)
  x = Utils.linspace(0, 1, PNG_WIDTH)
  (0 ... PNG_WIDTH).each do |i|
    color = self[x[i].to_f]
    png_color = ChunkyPNG::Color.rgba(*color.components.map{|v| (v*255).to_i })
    png.line(i, 0, i, PNG_HEIGHT-1, png_color)
  end
  png.to_blob
end
under_color() click to toggle source
# File lib/colors/colormap.rb, line 60
def under_color
  init_colormap unless @initialized
  @lookup_table[@under_index]
end
under_color=(color) click to toggle source
# File lib/colors/colormap.rb, line 65
def under_color=(color)
  @under_color = color
  update_extreme_colors if @initialized
end

Private Instance Methods

all_ratio?(ary) click to toggle source
# File lib/colors/colormap.rb, line 133
        def all_ratio?(ary)
  ary.all? {|x| x.is_a?(Float) || x.is_a?(Rational) }
end
html_color_block(color) click to toggle source
# File lib/colors/colormap.rb, line 120
        def html_color_block(color)
  hex_color = color.to_hex_string
  html = %Q[<div title="#{hex_color}" style="display: inline-block; ] +
         %Q[width: 1em; height: 1em; margin: 0; vertical-align: middle; ] +
         %Q[border: 1px solid #555; background-color: #{hex_color};">] +
         %Q[</div>]
  html
end
init_colormap() click to toggle source
# File lib/colors/colormap.rb, line 129
        def init_colormap
  raise NotImplementedError
end
make_reverse_colormap(name) click to toggle source
# File lib/colors/colormap.rb, line 78
        def make_reverse_colormap(name)
  raise NotImplementedError
end
update_extreme_colors() click to toggle source
# File lib/colors/colormap.rb, line 137
        def update_extreme_colors
  @lookup_table[@under_index] = Utils.make_color(@under_color || @lookup_table[0]).to_rgba
  @lookup_table[@over_index] = Utils.make_color(@over_color || @lookup_table[self.n_colors - 1]).to_rgba
  @lookup_table[@bad_index] = Utils.make_color(@bad_color).to_rgba
end