require File.dirname(__FILE__) + '/base' # EXPERIMENTAL! # # Doesn't work yet. # class Gruff::PhotoBar < Gruff::Base # TODO # # define base and cap in yml # allow for image directory to be located elsewhere # more exact measurements for bar heights (go all the way to the bottom of the graph) # option to tile images instead of use a single image # drop base label a few px lower so photo bar graphs can have a base dropping over the lower marker line # # The name of a pre-packaged photo-based theme. attr_accessor :theme # def initialize(target_width=800) # super # init_photo_bar_graphics() # end def draw super return unless @has_data return # TODO Remove for further development init_photo_bar_graphics() #Draw#define_clip_path() #Draw#clip_path(pathname) #Draw#composite....with bar graph image OverCompositeOp # # See also # # Draw.pattern # define an image to tile as the filling of a draw object # # Setup spacing. # # Columns sit side-by-side. spacing_factor = 0.9 @bar_width = @norm_data[0][DATA_COLOR_INDEX].columns @norm_data.each_with_index do |data_row, row_index| data_row[1].each_with_index do |data_point, point_index| data_point = 0 if data_point.nil? # Use incremented x and scaled y left_x = @graph_left + (@bar_width * (row_index + point_index + ((@data.length - 1) * point_index))) left_y = @graph_top + (@graph_height - data_point * @graph_height) + 1 right_x = left_x + @bar_width * spacing_factor right_y = @graph_top + @graph_height - 1 bar_image_width = data_row[DATA_COLOR_INDEX].columns bar_image_height = right_y.to_f - left_y.to_f # Crop to scale for data bar_image = data_row[DATA_COLOR_INDEX].crop(0, 0, bar_image_width, bar_image_height) @d.gravity = NorthWestGravity @d = @d.composite(left_x, left_y, bar_image_width, bar_image_height, bar_image) # Calculate center based on bar_width and current row label_center = @graph_left + (@data.length * @bar_width * point_index) + (@data.length * @bar_width / 2.0) draw_label(label_center, point_index) end end @d.draw(@base_image) end # Return the chosen theme or the default def theme @theme || 'plastik' end protected # Sets up colors with a list of images that will be used. # Images should be 340px tall def init_photo_bar_graphics color_list = Array.new theme_dir = File.dirname(__FILE__) + '/../../assets/' + theme Dir.open(theme_dir).each do |file| next unless /\.png$/.match(file) color_list << Image.read("#{theme_dir}/#{file}").first end @colors = color_list end end