gruff 0.13.0-java → 0.16.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +79 -0
  3. data/.rubocop.yml +29 -31
  4. data/CHANGELOG.md +43 -0
  5. data/README.md +11 -5
  6. data/gruff.gemspec +8 -10
  7. data/lib/gruff/accumulator_bar.rb +4 -2
  8. data/lib/gruff/area.rb +9 -12
  9. data/lib/gruff/bar.rb +46 -31
  10. data/lib/gruff/base.rb +236 -207
  11. data/lib/gruff/bezier.rb +6 -8
  12. data/lib/gruff/box_plot.rb +174 -0
  13. data/lib/gruff/bullet.rb +17 -16
  14. data/lib/gruff/candlestick.rb +112 -0
  15. data/lib/gruff/dot.rb +14 -14
  16. data/lib/gruff/font.rb +42 -0
  17. data/lib/gruff/helper/bar_conversion.rb +5 -5
  18. data/lib/gruff/helper/bar_value_label.rb +26 -20
  19. data/lib/gruff/helper/stacked_mixin.rb +4 -3
  20. data/lib/gruff/histogram.rb +9 -7
  21. data/lib/gruff/line.rb +96 -83
  22. data/lib/gruff/mini/bar.rb +9 -6
  23. data/lib/gruff/mini/legend.rb +16 -12
  24. data/lib/gruff/mini/pie.rb +9 -6
  25. data/lib/gruff/mini/side_bar.rb +9 -6
  26. data/lib/gruff/net.rb +16 -22
  27. data/lib/gruff/patch/rmagick.rb +0 -1
  28. data/lib/gruff/patch/string.rb +2 -1
  29. data/lib/gruff/pie.rb +42 -75
  30. data/lib/gruff/renderer/bezier.rb +8 -9
  31. data/lib/gruff/renderer/circle.rb +8 -9
  32. data/lib/gruff/renderer/dash_line.rb +10 -10
  33. data/lib/gruff/renderer/dot.rb +15 -14
  34. data/lib/gruff/renderer/ellipse.rb +8 -9
  35. data/lib/gruff/renderer/line.rb +8 -11
  36. data/lib/gruff/renderer/polygon.rb +9 -10
  37. data/lib/gruff/renderer/polyline.rb +8 -9
  38. data/lib/gruff/renderer/rectangle.rb +11 -8
  39. data/lib/gruff/renderer/renderer.rb +25 -40
  40. data/lib/gruff/renderer/text.rb +21 -37
  41. data/lib/gruff/scatter.rb +86 -85
  42. data/lib/gruff/side_bar.rb +50 -37
  43. data/lib/gruff/side_stacked_bar.rb +26 -35
  44. data/lib/gruff/spider.rb +52 -28
  45. data/lib/gruff/stacked_area.rb +20 -16
  46. data/lib/gruff/stacked_bar.rb +44 -22
  47. data/lib/gruff/store/store.rb +6 -10
  48. data/lib/gruff/store/xy_data.rb +2 -0
  49. data/lib/gruff/themes.rb +6 -6
  50. data/lib/gruff/version.rb +1 -1
  51. data/lib/gruff.rb +70 -57
  52. data/rails_generators/gruff/templates/controller.rb +1 -1
  53. metadata +15 -32
  54. data/.rubocop_todo.yml +0 -182
  55. data/.travis.yml +0 -23
  56. data/assets/plastik/blue.png +0 -0
  57. data/assets/plastik/green.png +0 -0
  58. data/assets/plastik/red.png +0 -0
  59. data/lib/gruff/photo_bar.rb +0 -93
  60. data/lib/gruff/scene.rb +0 -198
  61. data/lib/gruff/store/custom_data.rb +0 -36
data/lib/gruff/pie.rb CHANGED
@@ -9,59 +9,62 @@
9
9
  # g.data 'Hamburgers', 50
10
10
  # g.write("pie_keynote.png")
11
11
  #
12
- # To control where the pie chart starts creating slices, use {#zero_degree=}.
12
+ # To control where the pie chart starts creating slices, use {#start_degree=}.
13
13
  #
14
14
  class Gruff::Pie < Gruff::Base
15
- DEFAULT_TEXT_OFFSET_PERCENTAGE = 0.15
15
+ DEFAULT_TEXT_OFFSET_PERCENTAGE = 0.1
16
16
 
17
17
  # Can be used to make the pie start cutting slices at the top (-90.0)
18
- # or at another angle. Default is +0.0+, which starts at 3 o'clock.
19
- attr_writer :zero_degree
18
+ # or at another angle. Default is +-90.0+, which starts at 3 o'clock.
19
+ attr_writer :start_degree
20
+
21
+ # Set the number output format lambda.
22
+ attr_writer :label_formatting
20
23
 
21
24
  # Do not show labels for slices that are less than this percent. Use 0 to always show all labels.
22
25
  # Defaults to +0+.
23
26
  attr_writer :hide_labels_less_than
24
27
 
25
28
  # Affect the distance between the percentages and the pie chart.
26
- # Defaults to +0.15+.
29
+ # Defaults to +0.1+.
27
30
  attr_writer :text_offset_percentage
28
31
 
29
32
  ## Use values instead of percentages.
30
33
  attr_writer :show_values_as_labels
31
34
 
32
- def initialize_store
33
- @store = Gruff::Store.new(Gruff::Store::CustomData)
35
+ # Set to +true+ if you want the data sets sorted with largest avg values drawn
36
+ # first. Default is +true+.
37
+ attr_writer :sort
38
+
39
+ # Can be used to make the pie start cutting slices at the top (-90.0)
40
+ # or at another angle. Default is +-90.0+, which starts at 3 o'clock.
41
+ # @deprecated Please use +start_degree+ attribute instead.
42
+ def zero_degree=(value)
43
+ warn '#zero_degree= is deprecated. Please use `start_degree` attribute instead'
44
+ @start_degree = value
34
45
  end
35
- private :initialize_store
36
46
 
37
- def initialize_ivars
47
+ private
48
+
49
+ def initialize_attributes
38
50
  super
39
- @zero_degree = 0.0
51
+ @start_degree = -90.0
40
52
  @hide_labels_less_than = 0.0
41
53
  @text_offset_percentage = DEFAULT_TEXT_OFFSET_PERCENTAGE
42
54
  @show_values_as_labels = false
43
- end
44
- private :initialize_ivars
45
-
46
- def options
47
- {
48
- zero_degree: @zero_degree,
49
- hide_labels_less_than: @hide_labels_less_than,
50
- text_offset_percentage: @text_offset_percentage,
51
- show_values_as_labels: @show_values_as_labels
52
- }
53
- end
55
+ @marker_font.bold = true
56
+ @sort = true
54
57
 
55
- def draw
56
- hide_line_markers
57
-
58
- super
58
+ @hide_line_markers = true
59
+ @hide_line_markers.freeze
59
60
 
60
- return unless data_given?
61
+ @label_formatting = ->(value, percentage) { @show_values_as_labels ? value.to_s : "#{percentage}%" }
62
+ end
61
63
 
64
+ def draw_graph
62
65
  slices.each do |slice|
63
66
  if slice.value > 0
64
- Gruff::Renderer::Ellipse.new(color: slice.color, width: radius)
67
+ Gruff::Renderer::Ellipse.new(renderer, color: slice.color, width: radius)
65
68
  .render(center_x, center_y, radius / 2.0, radius / 2.0, chart_degrees, chart_degrees + slice.degrees + 0.5)
66
69
  process_label_for slice
67
70
  update_chart_degrees_with slice.degrees
@@ -69,11 +72,9 @@ class Gruff::Pie < Gruff::Base
69
72
  end
70
73
  end
71
74
 
72
- private
73
-
74
75
  def slices
75
76
  @slices ||= begin
76
- slices = store.data.map { |data| slice_class.new(data, options) }
77
+ slices = store.data.map { |data| Gruff::Pie::PieSlice.new(data.label, data.points.first, data.color) }
77
78
 
78
79
  slices.sort_by(&:value) if @sort
79
80
 
@@ -84,32 +85,19 @@ private
84
85
 
85
86
  # General Helper Methods
86
87
 
87
- def hide_line_markers
88
- @hide_line_markers = true
89
- end
90
-
91
88
  def update_chart_degrees_with(degrees)
92
89
  @chart_degrees = chart_degrees + degrees
93
90
  end
94
91
 
95
- def slice_class
96
- PieSlice
97
- end
98
-
99
92
  # Spatial Value-Related Methods
100
93
 
101
94
  def chart_degrees
102
- @chart_degrees ||= @zero_degree
95
+ @chart_degrees ||= @start_degree
103
96
  end
104
97
 
105
98
  attr_reader :graph_height
106
-
107
99
  attr_reader :graph_width
108
100
 
109
- def diameter
110
- graph_height
111
- end
112
-
113
101
  def half_width
114
102
  graph_width / 2.0
115
103
  end
@@ -147,13 +135,13 @@ private
147
135
  def process_label_for(slice)
148
136
  if slice.percentage >= @hide_labels_less_than
149
137
  x, y = label_coordinates_for slice
150
-
151
- draw_label(x, y, slice.label)
138
+ label = @label_formatting.call(slice.value, slice.percentage)
139
+ draw_label_at(1.0, 1.0, x, y, label, Magick::CenterGravity)
152
140
  end
153
141
  end
154
142
 
155
143
  def label_coordinates_for(slice)
156
- angle = chart_degrees + slice.degrees / 2
144
+ angle = chart_degrees + (slice.degrees / 2.0)
157
145
 
158
146
  [x_label_coordinate(angle), y_label_coordinate(angle)]
159
147
  end
@@ -166,45 +154,24 @@ private
166
154
  center_y + (radius_offset * Math.sin(deg2rad(angle)))
167
155
  end
168
156
 
169
- # Drawing-Related Methods
170
-
171
- def draw_label(x, y, value)
172
- text_renderer = Gruff::Renderer::Text.new(value, font: @font, size: @marker_font_size, color: @font_color, weight: Magick::BoldWeight)
173
- text_renderer.add_to_render_queue(0, 0, x, y, Magick::CenterGravity)
174
- end
175
-
176
157
  # Helper Classes
177
158
  #
178
159
  # @private
179
- class PieSlice < Struct.new(:data_array, :options)
160
+ class PieSlice < Struct.new(:label, :value, :color)
180
161
  attr_accessor :total
181
162
 
182
- def name
183
- data_array[0]
184
- end
185
-
186
- def value
187
- data_array[1].first
188
- end
189
-
190
- def color
191
- data_array[2]
192
- end
193
-
194
- def size
195
- @size ||= value / total
196
- end
197
-
198
163
  def percentage
199
- @percentage ||= (size * 100.0).round
164
+ (size * 100.0).round
200
165
  end
201
166
 
202
167
  def degrees
203
- @degrees ||= size * 360.0
168
+ size * 360.0
204
169
  end
205
170
 
206
- def label
207
- options[:show_values_as_labels] ? value.to_s : "#{percentage}%"
171
+ private
172
+
173
+ def size
174
+ value / total
208
175
  end
209
176
  end
210
177
  end
@@ -3,20 +3,19 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Bezier
6
- def initialize(color:, width: 1.0)
6
+ def initialize(renderer, color:, width: 1.0)
7
+ @renderer = renderer
7
8
  @color = color
8
9
  @width = width
9
10
  end
10
11
 
11
12
  def render(points)
12
- draw = Renderer.instance.draw
13
-
14
- draw.push
15
- draw.stroke(@color)
16
- draw.stroke_width(@width)
17
- draw.fill_opacity(0.0)
18
- draw.bezier(*points)
19
- draw.pop
13
+ @renderer.draw.push
14
+ @renderer.draw.stroke(@color)
15
+ @renderer.draw.stroke_width(@width)
16
+ @renderer.draw.fill_opacity(0.0)
17
+ @renderer.draw.bezier(*points)
18
+ @renderer.draw.pop
20
19
  end
21
20
  end
22
21
  end
@@ -3,20 +3,19 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Circle
6
- def initialize(color:, width: 1.0)
6
+ def initialize(renderer, color:, width: 1.0)
7
+ @renderer = renderer
7
8
  @color = color
8
9
  @width = width
9
10
  end
10
11
 
11
12
  def render(origin_x, origin_y, perim_x, perim_y)
12
- draw = Renderer.instance.draw
13
-
14
- draw.push
15
- draw.fill(@color)
16
- draw.stroke(@color)
17
- draw.stroke_width(@width)
18
- draw.circle(origin_x, origin_y, perim_x, perim_y)
19
- draw.pop
13
+ @renderer.draw.push
14
+ @renderer.draw.fill(@color)
15
+ @renderer.draw.stroke(@color)
16
+ @renderer.draw.stroke_width(@width)
17
+ @renderer.draw.circle(origin_x, origin_y, perim_x, perim_y)
18
+ @renderer.draw.pop
20
19
  end
21
20
  end
22
21
  end
@@ -3,21 +3,21 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::DashLine
6
- def initialize(color:, width:)
6
+ def initialize(renderer, color:, width:, dasharray: [10, 20])
7
+ @renderer = renderer
7
8
  @color = color
8
9
  @width = width
10
+ @dasharray = dasharray
9
11
  end
10
12
 
11
13
  def render(start_x, start_y, end_x, end_y)
12
- draw = Renderer.instance.draw
13
-
14
- draw.push
15
- draw.stroke_color(@color)
16
- draw.fill_opacity(0.0)
17
- draw.stroke_dasharray(10, 20)
18
- draw.stroke_width(@width)
19
- draw.line(start_x, start_y, end_x, end_y)
20
- draw.pop
14
+ @renderer.draw.push
15
+ @renderer.draw.stroke_color(@color)
16
+ @renderer.draw.fill_opacity(0.0)
17
+ @renderer.draw.stroke_dasharray(*@dasharray)
18
+ @renderer.draw.stroke_width(@width)
19
+ @renderer.draw.line(start_x, start_y, end_x, end_y)
20
+ @renderer.draw.pop
21
21
  end
22
22
  end
23
23
  end
@@ -3,38 +3,39 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Dot
6
- def initialize(style, color:, width: 1.0)
6
+ def initialize(renderer, style, color:, width: 1.0, opacity: 1.0)
7
+ @renderer = renderer
7
8
  @style = style
8
9
  @color = color
9
10
  @width = width
11
+ @opacity = opacity
10
12
  end
11
13
 
12
14
  def render(new_x, new_y, circle_radius)
13
- draw = Renderer.instance.draw
14
-
15
- # draw.push # TODO
16
- draw.stroke_width(@width)
17
- draw.stroke(@color)
18
- draw.fill(@color)
15
+ # @renderer.draw.push # TODO
16
+ @renderer.draw.stroke_width(@width)
17
+ @renderer.draw.stroke(@color)
18
+ @renderer.draw.fill(@color)
19
+ @renderer.draw.fill_opacity(@opacity)
19
20
  if @style.to_s == 'square'
20
- square(draw, new_x, new_y, circle_radius)
21
+ square(new_x, new_y, circle_radius)
21
22
  else
22
- circle(draw, new_x, new_y, circle_radius)
23
+ circle(new_x, new_y, circle_radius)
23
24
  end
24
- # draw.pop # TODO
25
+ # @renderer.draw.pop # TODO
25
26
  end
26
27
 
27
- def circle(draw, new_x, new_y, circle_radius)
28
- draw.circle(new_x, new_y, new_x - circle_radius, new_y)
28
+ def circle(new_x, new_y, circle_radius)
29
+ @renderer.draw.circle(new_x, new_y, new_x - circle_radius, new_y)
29
30
  end
30
31
 
31
- def square(draw, new_x, new_y, circle_radius)
32
+ def square(new_x, new_y, circle_radius)
32
33
  offset = (circle_radius * 0.8).to_i
33
34
  corner1 = new_x - offset
34
35
  corner2 = new_y - offset
35
36
  corner3 = new_x + offset
36
37
  corner4 = new_y + offset
37
- draw.rectangle(corner1, corner2, corner3, corner4)
38
+ @renderer.draw.rectangle(corner1, corner2, corner3, corner4)
38
39
  end
39
40
  end
40
41
  end
@@ -3,20 +3,19 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Ellipse
6
- def initialize(color:, width: 1.0)
6
+ def initialize(renderer, color:, width: 1.0)
7
+ @renderer = renderer
7
8
  @color = color
8
9
  @width = width
9
10
  end
10
11
 
11
12
  def render(origin_x, origin_y, width, height, arc_start, arc_end)
12
- draw = Renderer.instance.draw
13
-
14
- draw.push
15
- draw.stroke_width(@width)
16
- draw.stroke(@color)
17
- draw.fill('transparent')
18
- draw.ellipse(origin_x, origin_y, width, height, arc_start, arc_end)
19
- draw.pop
13
+ @renderer.draw.push
14
+ @renderer.draw.stroke_width(@width)
15
+ @renderer.draw.stroke(@color)
16
+ @renderer.draw.fill('transparent')
17
+ @renderer.draw.ellipse(origin_x, origin_y, width, height, arc_start, arc_end)
18
+ @renderer.draw.pop
20
19
  end
21
20
  end
22
21
  end
@@ -5,15 +5,14 @@ module Gruff
5
5
  class Renderer::Line
6
6
  EPSILON = 0.001
7
7
 
8
- def initialize(color:, width: nil, shadow_color: nil)
8
+ def initialize(renderer, color:, width: nil)
9
+ @renderer = renderer
9
10
  @color = color
10
11
  @width = width
11
- @shadow_color = shadow_color
12
12
  end
13
13
 
14
14
  def render(start_x, start_y, end_x, end_y)
15
15
  render_line(start_x, start_y, end_x, end_y, @color)
16
- render_line(start_x, start_y + 1, end_x, end_y + 1, @shadow_color) if @shadow_color
17
16
  end
18
17
 
19
18
  private
@@ -30,14 +29,12 @@ module Gruff
30
29
  end_y += EPSILON
31
30
  end
32
31
 
33
- draw = Renderer.instance.draw
34
-
35
- draw.push
36
- draw.stroke(color)
37
- draw.fill(color)
38
- draw.stroke_width(@width) if @width
39
- draw.line(start_x, start_y, end_x, end_y)
40
- draw.pop
32
+ @renderer.draw.push
33
+ @renderer.draw.stroke(color)
34
+ @renderer.draw.fill(color)
35
+ @renderer.draw.stroke_width(@width) if @width
36
+ @renderer.draw.line(start_x, start_y, end_x, end_y)
37
+ @renderer.draw.pop
41
38
  end
42
39
  end
43
40
  end
@@ -3,22 +3,21 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Polygon
6
- def initialize(color:, width: 1.0, opacity: 1.0)
6
+ def initialize(renderer, color:, width: 1.0, opacity: 1.0)
7
+ @renderer = renderer
7
8
  @color = color
8
9
  @width = width
9
10
  @opacity = opacity
10
11
  end
11
12
 
12
13
  def render(points)
13
- draw = Renderer.instance.draw
14
-
15
- draw.push
16
- draw.stroke_width(@width)
17
- draw.stroke(@color)
18
- draw.fill(@color)
19
- draw.fill_opacity(@opacity)
20
- draw.polygon(*points)
21
- draw.pop
14
+ @renderer.draw.push
15
+ @renderer.draw.stroke_width(@width)
16
+ @renderer.draw.stroke(@color)
17
+ @renderer.draw.fill(@color)
18
+ @renderer.draw.fill_opacity(@opacity)
19
+ @renderer.draw.polygon(*points)
20
+ @renderer.draw.pop
22
21
  end
23
22
  end
24
23
  end
@@ -3,20 +3,19 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Polyline
6
- def initialize(color:, width:)
6
+ def initialize(renderer, color:, width:)
7
+ @renderer = renderer
7
8
  @color = color
8
9
  @width = width
9
10
  end
10
11
 
11
12
  def render(points)
12
- draw = Renderer.instance.draw
13
-
14
- draw.push
15
- draw.stroke(@color)
16
- draw.fill('transparent')
17
- draw.stroke_width(@width)
18
- draw.polyline(*points)
19
- draw.pop
13
+ @renderer.draw.push
14
+ @renderer.draw.stroke(@color)
15
+ @renderer.draw.fill('transparent')
16
+ @renderer.draw.stroke_width(@width)
17
+ @renderer.draw.polyline(*points)
18
+ @renderer.draw.pop
20
19
  end
21
20
  end
22
21
  end
@@ -3,18 +3,21 @@
3
3
  module Gruff
4
4
  # @private
5
5
  class Renderer::Rectangle
6
- def initialize(color: nil)
6
+ def initialize(renderer, color: nil, width: 1.0, opacity: 1.0)
7
+ @renderer = renderer
7
8
  @color = color
9
+ @width = width
10
+ @opacity = opacity
8
11
  end
9
12
 
10
13
  def render(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
11
- draw = Renderer.instance.draw
12
-
13
- draw.push
14
- draw.stroke('transparent')
15
- draw.fill(@color) if @color
16
- draw.rectangle(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
17
- draw.pop
14
+ @renderer.draw.push
15
+ @renderer.draw.stroke_width(@width)
16
+ @renderer.draw.stroke(@color) if @width > 1.0
17
+ @renderer.draw.fill_opacity(@opacity)
18
+ @renderer.draw.fill(@color) if @color
19
+ @renderer.draw.rectangle(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
20
+ @renderer.draw.pop
18
21
  end
19
22
  end
20
23
  end
@@ -1,53 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'singleton'
4
-
5
3
  module Gruff
6
4
  # @private
7
5
  class Renderer
8
- include Singleton
9
-
10
- attr_accessor :draw, :image, :scale, :text_renderers
11
-
12
- def self.setup(columns, rows, font, scale, theme_options)
13
- draw = Magick::Draw.new
14
- draw.font = font if font
15
- # Scale down from 800x600 used to calculate drawing.
16
- draw.scale(scale, scale)
17
-
18
- image = Renderer.instance.background(columns, rows, scale, theme_options)
6
+ attr_accessor :text_renderers
7
+ attr_reader :draw, :image, :scale
19
8
 
20
- Renderer.instance.draw = draw
21
- Renderer.instance.scale = scale
22
- Renderer.instance.image = image
23
- Renderer.instance.text_renderers = []
24
- end
25
-
26
- def self.setup_transparent_background(columns, rows)
27
- image = Renderer.instance.render_transparent_background(columns, rows)
28
- Renderer.instance.image = image
29
- end
9
+ def initialize(columns, rows, scale, theme_options)
10
+ @draw = Magick::Draw.new
11
+ @text_renderers = []
30
12
 
31
- def self.background_image=(image)
32
- Renderer.instance.image = image
13
+ @scale = scale
14
+ @draw.scale(scale, scale)
15
+ @image = background(columns, rows, scale, theme_options)
33
16
  end
34
17
 
35
- def self.font=(font)
36
- draw = Renderer.instance.draw
37
- draw.font = font if font
38
- end
18
+ def finish
19
+ @draw.draw(@image)
39
20
 
40
- def self.finish
41
- draw = Renderer.instance.draw
42
- image = Renderer.instance.image
43
-
44
- draw.draw(image)
45
-
46
- Renderer.instance.text_renderers.each do |renderer|
21
+ @text_renderers.each do |renderer|
47
22
  renderer.render(renderer.width, renderer.height, renderer.x, renderer.y, renderer.gravity)
48
23
  end
49
24
  end
50
25
 
26
+ def background_image=(image)
27
+ @image = image
28
+ end
29
+
51
30
  def background(columns, rows, scale, theme_options)
52
31
  case theme_options[:background_colors]
53
32
  when Array
@@ -59,10 +38,14 @@ module Gruff
59
38
  end
60
39
  end
61
40
 
41
+ def transparent_background(columns, rows)
42
+ @image = render_transparent_background(columns, rows)
43
+ end
44
+
62
45
  # Make a new image at the current size with a solid +color+.
63
46
  def solid_background(columns, rows, color)
64
- Magick::Image.new(columns, rows) do
65
- self.background_color = color
47
+ Magick::Image.new(columns, rows) do |img|
48
+ img.background_color = color
66
49
  end
67
50
  end
68
51
 
@@ -101,6 +84,8 @@ module Gruff
101
84
  end
102
85
  end
103
86
 
87
+ private
88
+
104
89
  # Use with a theme to use an image (800x600 original) background.
105
90
  def image_background(scale, image_path)
106
91
  image = Magick::Image.read(image_path)
@@ -112,8 +97,8 @@ module Gruff
112
97
 
113
98
  # Use with a theme to make a transparent background
114
99
  def render_transparent_background(columns, rows)
115
- Magick::Image.new(columns, rows) do
116
- self.background_color = 'transparent'
100
+ Magick::Image.new(columns, rows) do |img|
101
+ img.background_color = 'transparent'
117
102
  end
118
103
  end
119
104
  end