gruff 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +18 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +93 -0
- data/.rubocop_todo.yml +23 -810
- data/.travis.yml +4 -4
- data/.yardopts +1 -0
- data/CHANGELOG.md +22 -0
- data/Gemfile +3 -1
- data/README.md +44 -21
- data/Rakefile +2 -206
- data/docker/Dockerfile +14 -0
- data/docker/build.sh +4 -0
- data/docker/launch.sh +4 -0
- data/gruff.gemspec +11 -8
- data/init.rb +2 -0
- data/lib/gruff.rb +23 -0
- data/lib/gruff/accumulator_bar.rb +6 -6
- data/lib/gruff/area.rb +13 -17
- data/lib/gruff/bar.rb +58 -41
- data/lib/gruff/base.rb +243 -566
- data/lib/gruff/bezier.rb +12 -14
- data/lib/gruff/bullet.rb +39 -57
- data/lib/gruff/dot.rb +25 -59
- data/lib/gruff/{bar_conversion.rb → helper/bar_conversion.rb} +13 -12
- data/lib/gruff/helper/bar_value_label_mixin.rb +30 -0
- data/lib/gruff/{stacked_mixin.rb → helper/stacked_mixin.rb} +7 -6
- data/lib/gruff/line.rb +95 -177
- data/lib/gruff/mini/bar.rb +6 -7
- data/lib/gruff/mini/legend.rb +16 -32
- data/lib/gruff/mini/pie.rb +6 -7
- data/lib/gruff/mini/side_bar.rb +4 -5
- data/lib/gruff/net.rb +37 -65
- data/lib/gruff/patch/rmagick.rb +33 -0
- data/lib/gruff/patch/string.rb +8 -0
- data/lib/gruff/photo_bar.rb +19 -19
- data/lib/gruff/pie.rb +22 -73
- data/lib/gruff/renderer/bezier.rb +21 -0
- data/lib/gruff/renderer/circle.rb +21 -0
- data/lib/gruff/renderer/dash_line.rb +22 -0
- data/lib/gruff/renderer/dot.rb +39 -0
- data/lib/gruff/renderer/ellipse.rb +21 -0
- data/lib/gruff/renderer/line.rb +34 -0
- data/lib/gruff/renderer/polygon.rb +23 -0
- data/lib/gruff/renderer/polyline.rb +21 -0
- data/lib/gruff/renderer/rectangle.rb +19 -0
- data/lib/gruff/renderer/renderer.rb +127 -0
- data/lib/gruff/renderer/text.rb +42 -0
- data/lib/gruff/scatter.rb +85 -156
- data/lib/gruff/scene.rb +22 -30
- data/lib/gruff/side_bar.rb +62 -58
- data/lib/gruff/side_stacked_bar.rb +47 -43
- data/lib/gruff/spider.rb +19 -36
- data/lib/gruff/stacked_area.rb +17 -21
- data/lib/gruff/stacked_bar.rb +50 -24
- data/lib/gruff/store/base_data.rb +34 -0
- data/lib/gruff/store/custom_data.rb +34 -0
- data/lib/gruff/store/store.rb +80 -0
- data/lib/gruff/store/xy_data.rb +55 -0
- data/lib/gruff/themes.rb +3 -3
- data/lib/gruff/version.rb +3 -1
- metadata +41 -30
- data/Manifest.txt +0 -81
- data/assets/bubble.png +0 -0
- data/assets/city_scene/background/0000.png +0 -0
- data/assets/city_scene/background/0600.png +0 -0
- data/assets/city_scene/background/2000.png +0 -0
- data/assets/city_scene/clouds/cloudy.png +0 -0
- data/assets/city_scene/clouds/partly_cloudy.png +0 -0
- data/assets/city_scene/clouds/stormy.png +0 -0
- data/assets/city_scene/grass/default.png +0 -0
- data/assets/city_scene/haze/true.png +0 -0
- data/assets/city_scene/number_sample/1.png +0 -0
- data/assets/city_scene/number_sample/2.png +0 -0
- data/assets/city_scene/number_sample/default.png +0 -0
- data/assets/city_scene/sky/0000.png +0 -0
- data/assets/city_scene/sky/0200.png +0 -0
- data/assets/city_scene/sky/0400.png +0 -0
- data/assets/city_scene/sky/0600.png +0 -0
- data/assets/city_scene/sky/0800.png +0 -0
- data/assets/city_scene/sky/1000.png +0 -0
- data/assets/city_scene/sky/1200.png +0 -0
- data/assets/city_scene/sky/1400.png +0 -0
- data/assets/city_scene/sky/1500.png +0 -0
- data/assets/city_scene/sky/1700.png +0 -0
- data/assets/city_scene/sky/2000.png +0 -0
- data/assets/pc306715.jpg +0 -0
- data/lib/gruff/deprecated.rb +0 -38
data/lib/gruff/mini/bar.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
##
|
2
4
|
#
|
3
5
|
# Makes a small bar graph suitable for display at 200px or even smaller.
|
4
6
|
#
|
5
7
|
module Gruff
|
6
8
|
module Mini
|
7
|
-
|
8
9
|
class Bar < Gruff::Bar
|
9
|
-
|
10
10
|
include Gruff::Mini::Legend
|
11
11
|
|
12
12
|
def initialize_ivars
|
@@ -17,10 +17,11 @@ module Gruff
|
|
17
17
|
@hide_line_numbers = true
|
18
18
|
|
19
19
|
@marker_font_size = 50.0
|
20
|
-
@minimum_value = 0.0
|
21
|
-
@maximum_value = 0.0
|
22
20
|
@legend_font_size = 60.0
|
21
|
+
|
22
|
+
@minimum_value = 0.0
|
23
23
|
end
|
24
|
+
private :initialize_ivars
|
24
25
|
|
25
26
|
def draw
|
26
27
|
expand_canvas_for_vertical_legend
|
@@ -28,10 +29,8 @@ module Gruff
|
|
28
29
|
super
|
29
30
|
|
30
31
|
draw_vertical_legend
|
31
|
-
|
32
|
+
Gruff::Renderer.finish
|
32
33
|
end
|
33
|
-
|
34
34
|
end
|
35
|
-
|
36
35
|
end
|
37
36
|
end
|
data/lib/gruff/mini/legend.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gruff
|
2
4
|
module Mini
|
3
5
|
module Legend
|
4
|
-
|
5
6
|
attr_accessor :hide_mini_legend, :legend_position
|
6
7
|
|
7
8
|
def initialize(*)
|
@@ -16,11 +17,9 @@ module Gruff
|
|
16
17
|
def expand_canvas_for_vertical_legend
|
17
18
|
return if @hide_mini_legend
|
18
19
|
|
19
|
-
@legend_labels =
|
20
|
+
@legend_labels = store.data.map(&:label)
|
20
21
|
|
21
|
-
legend_height = scale_fontsize(
|
22
|
-
@data.length * calculate_line_height +
|
23
|
-
@top_margin + @bottom_margin)
|
22
|
+
legend_height = scale_fontsize(store.length * calculate_line_height + @top_margin + @bottom_margin)
|
24
23
|
|
25
24
|
@original_rows = @raw_rows
|
26
25
|
@original_columns = @raw_columns
|
@@ -30,9 +29,10 @@ module Gruff
|
|
30
29
|
@rows = [@rows, legend_height].max
|
31
30
|
@columns += calculate_legend_width + @left_margin
|
32
31
|
else
|
33
|
-
@rows +=
|
32
|
+
@rows += store.length * calculate_caps_height(scale_fontsize(@legend_font_size)) * 1.7
|
34
33
|
end
|
35
|
-
|
34
|
+
|
35
|
+
Gruff::Renderer.setup(@columns, @rows, @font, @scale, @theme_options)
|
36
36
|
end
|
37
37
|
|
38
38
|
def calculate_line_height
|
@@ -54,10 +54,6 @@ module Gruff
|
|
54
54
|
@legend_left_margin = 100.0
|
55
55
|
legend_top_margin = 40.0
|
56
56
|
|
57
|
-
# May fix legend drawing problem at small sizes
|
58
|
-
@d.font = @font if @font
|
59
|
-
@d.pointsize = @legend_font_size
|
60
|
-
|
61
57
|
case @legend_position
|
62
58
|
when :right then
|
63
59
|
current_x_offset = @original_columns + @left_margin
|
@@ -67,32 +63,21 @@ module Gruff
|
|
67
63
|
current_y_offset = @original_rows + legend_top_margin
|
68
64
|
end
|
69
65
|
|
70
|
-
debug { @d.line 0.0, current_y_offset, @raw_columns, current_y_offset }
|
71
|
-
|
72
66
|
@legend_labels.each_with_index do |legend_label, index|
|
73
67
|
# Draw label
|
74
|
-
|
75
|
-
|
76
|
-
@
|
77
|
-
@d.stroke = 'transparent'
|
78
|
-
@d.font_weight = Magick::NormalWeight
|
79
|
-
@d.gravity = Magick::WestGravity
|
80
|
-
@d = @d.annotate_scaled(@base_image,
|
81
|
-
@raw_columns, 1.0,
|
82
|
-
current_x_offset + (legend_square_width * 1.7), current_y_offset,
|
83
|
-
truncate_legend_label(legend_label), @scale)
|
68
|
+
label = truncate_legend_label(legend_label)
|
69
|
+
text_renderer = Gruff::Renderer::Text.new(label, font: @font, size: @legend_font_size, color: @font_color)
|
70
|
+
text_renderer.render(@raw_columns, 1.0, current_x_offset + (legend_square_width * 1.7), current_y_offset, Magick::WestGravity)
|
84
71
|
|
85
72
|
# Now draw box with color of this dataset
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
current_y_offset + legend_square_width / 2.0)
|
73
|
+
rect_renderer = Gruff::Renderer::Rectangle.new(color: store.data[index].color)
|
74
|
+
rect_renderer.render(current_x_offset,
|
75
|
+
current_y_offset - legend_square_width / 2.0,
|
76
|
+
current_x_offset + legend_square_width,
|
77
|
+
current_y_offset + legend_square_width / 2.0)
|
92
78
|
|
93
79
|
current_y_offset += calculate_line_height
|
94
80
|
end
|
95
|
-
@color_index = 0
|
96
81
|
end
|
97
82
|
|
98
83
|
##
|
@@ -105,9 +90,8 @@ module Gruff
|
|
105
90
|
while calculate_width(scale_fontsize(@legend_font_size), truncated_label) > (@columns - @legend_left_margin - @right_margin) && (truncated_label.length > 1)
|
106
91
|
truncated_label = truncated_label[0..truncated_label.length - 2]
|
107
92
|
end
|
108
|
-
truncated_label + (truncated_label.length < label.to_s.length ?
|
93
|
+
truncated_label + (truncated_label.length < label.to_s.length ? '...' : '')
|
109
94
|
end
|
110
|
-
|
111
95
|
end
|
112
96
|
end
|
113
97
|
end
|
data/lib/gruff/mini/pie.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
##
|
2
4
|
#
|
3
5
|
# Makes a small pie graph suitable for display at 200px or even smaller.
|
4
6
|
#
|
5
7
|
module Gruff
|
6
8
|
module Mini
|
7
|
-
|
8
9
|
class Pie < Gruff::Pie
|
9
|
-
|
10
10
|
include Gruff::Mini::Legend
|
11
11
|
|
12
12
|
def initialize_ivars
|
@@ -19,6 +19,7 @@ module Gruff
|
|
19
19
|
@marker_font_size = 60.0
|
20
20
|
@legend_font_size = 60.0
|
21
21
|
end
|
22
|
+
private :initialize_ivars
|
22
23
|
|
23
24
|
def draw
|
24
25
|
expand_canvas_for_vertical_legend
|
@@ -27,10 +28,8 @@ module Gruff
|
|
27
28
|
|
28
29
|
draw_vertical_legend
|
29
30
|
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end # class Pie
|
34
|
-
|
31
|
+
Gruff::Renderer.finish
|
32
|
+
end
|
33
|
+
end
|
35
34
|
end
|
36
35
|
end
|
data/lib/gruff/mini/side_bar.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
##
|
2
4
|
#
|
3
5
|
# Makes a small pie graph suitable for display at 200px or even smaller.
|
4
6
|
#
|
5
7
|
module Gruff
|
6
8
|
module Mini
|
7
|
-
|
8
9
|
class SideBar < Gruff::SideBar
|
9
|
-
|
10
10
|
include Gruff::Mini::Legend
|
11
11
|
|
12
12
|
def initialize_ivars
|
@@ -18,6 +18,7 @@ module Gruff
|
|
18
18
|
@marker_font_size = 50.0
|
19
19
|
@legend_font_size = 50.0
|
20
20
|
end
|
21
|
+
private :initialize_ivars
|
21
22
|
|
22
23
|
def draw
|
23
24
|
expand_canvas_for_vertical_legend
|
@@ -26,10 +27,8 @@ module Gruff
|
|
26
27
|
|
27
28
|
draw_vertical_legend
|
28
29
|
|
29
|
-
|
30
|
+
Gruff::Renderer.finish
|
30
31
|
end
|
31
|
-
|
32
32
|
end
|
33
|
-
|
34
33
|
end
|
35
34
|
end
|
data/lib/gruff/net.rb
CHANGED
@@ -1,106 +1,84 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'gruff/base'
|
2
4
|
|
3
5
|
# Experimental!!! See also the Spider graph.
|
4
6
|
class Gruff::Net < Gruff::Base
|
5
|
-
|
6
7
|
# Hide parts of the graph to fit more datapoints, or for a different appearance.
|
7
8
|
attr_accessor :hide_dots
|
8
9
|
|
9
|
-
# Dimensions of lines and dots; calculated based on dataset size if left unspecified
|
10
|
+
# Dimensions of lines and dots; calculated based on dataset size if left unspecified.
|
10
11
|
attr_accessor :line_width
|
11
12
|
attr_accessor :dot_radius
|
12
13
|
|
13
|
-
def
|
14
|
+
def initialize_ivars
|
14
15
|
super
|
15
16
|
|
16
17
|
@hide_dots = false
|
17
18
|
@hide_line_numbers = true
|
18
19
|
@sorted_drawing = true
|
19
20
|
end
|
21
|
+
private :initialize_ivars
|
20
22
|
|
21
23
|
def draw
|
22
24
|
super
|
23
25
|
|
24
|
-
return unless
|
25
|
-
|
26
|
-
@radius = @graph_height / 2.0
|
27
|
-
@center_x = @graph_left + (@graph_width / 2.0)
|
28
|
-
@center_y = @graph_top + (@graph_height / 2.0) - 10 # Move graph up a bit
|
29
|
-
|
30
|
-
@x_increment = @graph_width / (@column_count - 1).to_f
|
31
|
-
circle_radius = dot_radius ||
|
32
|
-
clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 2.5), 5.0)
|
33
|
-
|
34
|
-
@d = @d.stroke_opacity 1.0
|
35
|
-
@d = @d.stroke_width line_width ||
|
36
|
-
clip_value_if_greater_than(@columns / (@norm_data.first[DATA_VALUES_INDEX].size * 4), 5.0)
|
37
|
-
|
38
|
-
if defined?(@norm_baseline)
|
39
|
-
level = @graph_top + (@graph_height - @norm_baseline * @graph_height)
|
40
|
-
@d = @d.push
|
41
|
-
@d.stroke_color @baseline_color
|
42
|
-
@d.fill_opacity 0.0
|
43
|
-
@d.stroke_dasharray(10, 20)
|
44
|
-
@d.stroke_width 5
|
45
|
-
@d.line(@graph_left, level, @graph_left + @graph_width, level)
|
46
|
-
@d = @d.pop
|
47
|
-
end
|
26
|
+
return unless data_given?
|
48
27
|
|
49
|
-
@norm_data.
|
50
|
-
|
51
|
-
@d = @d.fill data_row[DATA_COLOR_INDEX]
|
28
|
+
stroke_width = line_width || clip_value_if_greater_than(@columns / (store.norm_data.first.points.size * 4), 5.0)
|
29
|
+
circle_radius = dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.points.size * 2.5), 5.0)
|
52
30
|
|
53
|
-
|
31
|
+
store.norm_data.each do |data_row|
|
32
|
+
data_row.points.each_with_index do |data_point, index|
|
54
33
|
next if data_point.nil?
|
55
34
|
|
56
|
-
rad_pos = index * Math::PI * 2 /
|
35
|
+
rad_pos = index * Math::PI * 2 / column_count
|
57
36
|
point_distance = data_point * @radius
|
58
|
-
start_x = @center_x + Math
|
59
|
-
start_y = @center_y - Math
|
37
|
+
start_x = @center_x + Math.sin(rad_pos) * point_distance
|
38
|
+
start_y = @center_y - Math.cos(rad_pos) * point_distance
|
60
39
|
|
61
|
-
next_index = index + 1 < data_row
|
40
|
+
next_index = index + 1 < data_row.points.length ? index + 1 : 0
|
62
41
|
|
63
|
-
next_rad_pos = next_index * Math::PI * 2 /
|
64
|
-
next_point_distance = data_row[
|
65
|
-
end_x = @center_x + Math
|
66
|
-
end_y = @center_y - Math
|
42
|
+
next_rad_pos = next_index * Math::PI * 2 / column_count
|
43
|
+
next_point_distance = data_row.points[next_index] * @radius
|
44
|
+
end_x = @center_x + Math.sin(next_rad_pos) * next_point_distance
|
45
|
+
end_y = @center_y - Math.cos(next_rad_pos) * next_point_distance
|
67
46
|
|
68
|
-
|
47
|
+
Gruff::Renderer::Line.new(color: data_row.color, width: stroke_width).render(start_x, start_y, end_x, end_y)
|
69
48
|
|
70
|
-
|
49
|
+
Gruff::Renderer::Circle.new(color: data_row.color, width: stroke_width).render(start_x, start_y, start_x - circle_radius, start_y) unless @hide_dots
|
71
50
|
end
|
72
51
|
end
|
73
52
|
|
74
|
-
|
53
|
+
Gruff::Renderer.finish
|
75
54
|
end
|
76
55
|
|
77
|
-
|
78
|
-
|
79
|
-
|
56
|
+
private
|
57
|
+
|
58
|
+
def setup_drawing
|
59
|
+
super
|
80
60
|
|
81
|
-
# have to do this here (AGAIN)... see draw() in this class
|
82
|
-
# because this funtion is called before the @radius, @center_x and @center_y are set
|
83
61
|
@radius = @graph_height / 2.0
|
84
62
|
@center_x = @graph_left + (@graph_width / 2.0)
|
85
63
|
@center_y = @graph_top + (@graph_height / 2.0) - 10 # Move graph up a bit
|
64
|
+
end
|
86
65
|
|
87
|
-
|
88
|
-
|
89
|
-
|
66
|
+
# the lines connecting in the center, with the first line vertical
|
67
|
+
def draw_line_markers
|
68
|
+
return if @hide_line_markers
|
90
69
|
|
91
|
-
|
92
|
-
|
70
|
+
# Draw horizontal line markers and annotate with numbers
|
71
|
+
(0..column_count - 1).each do |index|
|
72
|
+
rad_pos = index * Math::PI * 2 / column_count
|
93
73
|
|
94
|
-
|
74
|
+
Gruff::Renderer::Line.new(color: @marker_color)
|
75
|
+
.render(@center_x, @center_y, @center_x + Math.sin(rad_pos) * @radius, @center_y - Math.cos(rad_pos) * @radius)
|
95
76
|
|
96
77
|
marker_label = labels[index] ? labels[index].to_s : '000'
|
97
|
-
|
98
78
|
draw_label(@center_x, @center_y, rad_pos * 360 / (2 * Math::PI), @radius, marker_label)
|
99
79
|
end
|
100
80
|
end
|
101
81
|
|
102
|
-
private
|
103
|
-
|
104
82
|
def draw_label(center_x, center_y, angle, radius, amount)
|
105
83
|
r_offset = 1.1
|
106
84
|
x_offset = center_x # + 15 # The label points need to be tweaked slightly
|
@@ -109,13 +87,7 @@ private
|
|
109
87
|
y = y_offset - (radius * r_offset * Math.cos(deg2rad(angle)))
|
110
88
|
|
111
89
|
# Draw label
|
112
|
-
|
113
|
-
|
114
|
-
@d.pointsize = scale_fontsize(20)
|
115
|
-
@d.stroke = 'transparent'
|
116
|
-
@d.font_weight = BoldWeight
|
117
|
-
@d.gravity = CenterGravity
|
118
|
-
@d.annotate_scaled(@base_image, 0, 0, x, y, amount, @scale)
|
90
|
+
text_renderer = Gruff::Renderer::Text.new(amount, font: @font, size: 20, color: @marker_color, weight: Magick::BoldWeight)
|
91
|
+
text_renderer.render(0, 0, x, y, Magick::CenterGravity)
|
119
92
|
end
|
120
|
-
|
121
93
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Magick
|
4
|
+
class Draw
|
5
|
+
# Additional method to scale annotation text since Draw.scale doesn't.
|
6
|
+
def annotate_scaled(img, width, height, x, y, text, scale)
|
7
|
+
scaled_width = (width * scale) >= 1 ? (width * scale) : 1
|
8
|
+
scaled_height = (height * scale) >= 1 ? (height * scale) : 1
|
9
|
+
|
10
|
+
annotate(img,
|
11
|
+
scaled_width, scaled_height,
|
12
|
+
x * scale, y * scale,
|
13
|
+
text.gsub('%', '%%'))
|
14
|
+
end
|
15
|
+
|
16
|
+
remove_method :stroke_opacity
|
17
|
+
def stroke_opacity(_opacity)
|
18
|
+
raise '#stroke_opacity method has different behavior between RMagick and RMagick4J. Should not use this method.'
|
19
|
+
end
|
20
|
+
|
21
|
+
if defined? JRUBY_VERSION
|
22
|
+
# FIXME(uwe): We should NOT need to implement this method.
|
23
|
+
# Remove this method as soon as RMagick4J Issue #16 is fixed.
|
24
|
+
# https://github.com/Serabe/RMagick4J/issues/16
|
25
|
+
def fill=(fill)
|
26
|
+
fill = { white: '#FFFFFF' }[fill.to_sym] || fill
|
27
|
+
@draw.fill = Magick4J.ColorDatabase.query_default(fill)
|
28
|
+
self
|
29
|
+
end
|
30
|
+
# EMXIF
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/gruff/photo_bar.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'gruff/base'
|
2
4
|
|
3
5
|
# EXPERIMENTAL!
|
4
6
|
#
|
5
7
|
# Doesn't work yet.
|
6
8
|
#
|
7
9
|
class Gruff::PhotoBar < Gruff::Base
|
8
|
-
|
9
10
|
# TODO
|
10
11
|
#
|
11
12
|
# define base and cap in yml
|
@@ -25,11 +26,11 @@ class Gruff::PhotoBar < Gruff::Base
|
|
25
26
|
|
26
27
|
def draw
|
27
28
|
super
|
28
|
-
return unless
|
29
|
+
return unless data_given?
|
29
30
|
|
30
|
-
return # TODO Remove for further development
|
31
|
+
return # TODO: Remove for further development
|
31
32
|
|
32
|
-
init_photo_bar_graphics
|
33
|
+
init_photo_bar_graphics
|
33
34
|
|
34
35
|
#Draw#define_clip_path()
|
35
36
|
#Draw#clip_path(pathname)
|
@@ -44,33 +45,33 @@ class Gruff::PhotoBar < Gruff::Base
|
|
44
45
|
#
|
45
46
|
# Columns sit side-by-side.
|
46
47
|
spacing_factor = 0.9
|
47
|
-
|
48
|
+
bar_width = store.norm_data[0].color.columns
|
48
49
|
|
49
|
-
|
50
|
-
data_row
|
50
|
+
store.norm_data.each_with_index do |data_row, row_index|
|
51
|
+
data_row.points.each_with_index do |data_point, point_index|
|
51
52
|
data_point = 0 if data_point.nil?
|
52
53
|
# Use incremented x and scaled y
|
53
|
-
left_x = @graph_left + (
|
54
|
+
left_x = @graph_left + (bar_width * (row_index + point_index + ((store.length - 1) * point_index)))
|
54
55
|
left_y = @graph_top + (@graph_height - data_point * @graph_height) + 1
|
55
|
-
right_x = left_x +
|
56
|
+
right_x = left_x + bar_width * spacing_factor
|
56
57
|
right_y = @graph_top + @graph_height - 1
|
57
58
|
|
58
|
-
bar_image_width = data_row
|
59
|
+
bar_image_width = data_row.color.columns
|
59
60
|
bar_image_height = right_y.to_f - left_y.to_f
|
60
61
|
|
61
62
|
# Crop to scale for data
|
62
|
-
bar_image = data_row
|
63
|
+
bar_image = data_row.color.crop(0, 0, bar_image_width, bar_image_height)
|
63
64
|
|
64
|
-
@d.gravity = NorthWestGravity
|
65
|
-
@d
|
65
|
+
@d.gravity = Magick::NorthWestGravity
|
66
|
+
@d.composite(left_x, left_y, bar_image_width, bar_image_height, bar_image)
|
66
67
|
|
67
68
|
# Calculate center based on bar_width and current row
|
68
|
-
label_center = @graph_left + (
|
69
|
+
label_center = @graph_left + (store.length * bar_width * point_index) + (store.length * bar_width / 2.0)
|
69
70
|
draw_label(label_center, point_index)
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
73
|
-
|
74
|
+
Gruff::Renderer.finish
|
74
75
|
end
|
75
76
|
|
76
77
|
# Return the chosen theme or the default
|
@@ -83,15 +84,14 @@ protected
|
|
83
84
|
# Sets up colors with a list of images that will be used.
|
84
85
|
# Images should be 340px tall
|
85
86
|
def init_photo_bar_graphics
|
86
|
-
color_list =
|
87
|
+
color_list = []
|
87
88
|
theme_dir = File.dirname(__FILE__) + '/../../assets/' + theme
|
88
89
|
|
89
90
|
Dir.open(theme_dir).each do |file|
|
90
91
|
next unless /\.png$/.match(file)
|
91
92
|
|
92
|
-
color_list << Image.read("#{theme_dir}/#{file}").first
|
93
|
+
color_list << Magick::Image.read("#{theme_dir}/#{file}").first
|
93
94
|
end
|
94
95
|
@colors = color_list
|
95
96
|
end
|
96
|
-
|
97
97
|
end
|