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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +79 -0
- data/.rubocop.yml +29 -31
- data/CHANGELOG.md +43 -0
- data/README.md +11 -5
- data/gruff.gemspec +8 -10
- data/lib/gruff/accumulator_bar.rb +4 -2
- data/lib/gruff/area.rb +9 -12
- data/lib/gruff/bar.rb +46 -31
- data/lib/gruff/base.rb +236 -207
- data/lib/gruff/bezier.rb +6 -8
- data/lib/gruff/box_plot.rb +174 -0
- data/lib/gruff/bullet.rb +17 -16
- data/lib/gruff/candlestick.rb +112 -0
- data/lib/gruff/dot.rb +14 -14
- data/lib/gruff/font.rb +42 -0
- data/lib/gruff/helper/bar_conversion.rb +5 -5
- data/lib/gruff/helper/bar_value_label.rb +26 -20
- data/lib/gruff/helper/stacked_mixin.rb +4 -3
- data/lib/gruff/histogram.rb +9 -7
- data/lib/gruff/line.rb +96 -83
- data/lib/gruff/mini/bar.rb +9 -6
- data/lib/gruff/mini/legend.rb +16 -12
- data/lib/gruff/mini/pie.rb +9 -6
- data/lib/gruff/mini/side_bar.rb +9 -6
- data/lib/gruff/net.rb +16 -22
- data/lib/gruff/patch/rmagick.rb +0 -1
- data/lib/gruff/patch/string.rb +2 -1
- data/lib/gruff/pie.rb +42 -75
- data/lib/gruff/renderer/bezier.rb +8 -9
- data/lib/gruff/renderer/circle.rb +8 -9
- data/lib/gruff/renderer/dash_line.rb +10 -10
- data/lib/gruff/renderer/dot.rb +15 -14
- data/lib/gruff/renderer/ellipse.rb +8 -9
- data/lib/gruff/renderer/line.rb +8 -11
- data/lib/gruff/renderer/polygon.rb +9 -10
- data/lib/gruff/renderer/polyline.rb +8 -9
- data/lib/gruff/renderer/rectangle.rb +11 -8
- data/lib/gruff/renderer/renderer.rb +25 -40
- data/lib/gruff/renderer/text.rb +21 -37
- data/lib/gruff/scatter.rb +86 -85
- data/lib/gruff/side_bar.rb +50 -37
- data/lib/gruff/side_stacked_bar.rb +26 -35
- data/lib/gruff/spider.rb +52 -28
- data/lib/gruff/stacked_area.rb +20 -16
- data/lib/gruff/stacked_bar.rb +44 -22
- data/lib/gruff/store/store.rb +6 -10
- data/lib/gruff/store/xy_data.rb +2 -0
- data/lib/gruff/themes.rb +6 -6
- data/lib/gruff/version.rb +1 -1
- data/lib/gruff.rb +70 -57
- data/rails_generators/gruff/templates/controller.rb +1 -1
- metadata +15 -32
- data/.rubocop_todo.yml +0 -182
- data/.travis.yml +0 -23
- data/assets/plastik/blue.png +0 -0
- data/assets/plastik/green.png +0 -0
- data/assets/plastik/red.png +0 -0
- data/lib/gruff/photo_bar.rb +0 -93
- data/lib/gruff/scene.rb +0 -198
- 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 {#
|
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
|
+
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
|
19
|
-
attr_writer :
|
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.
|
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
|
-
|
33
|
-
|
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
|
-
|
47
|
+
private
|
48
|
+
|
49
|
+
def initialize_attributes
|
38
50
|
super
|
39
|
-
@
|
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
|
-
|
44
|
-
|
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
|
-
|
56
|
-
hide_line_markers
|
57
|
-
|
58
|
-
super
|
58
|
+
@hide_line_markers = true
|
59
|
+
@hide_line_markers.freeze
|
59
60
|
|
60
|
-
|
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|
|
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 ||= @
|
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
|
-
|
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(:
|
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
|
-
|
164
|
+
(size * 100.0).round
|
200
165
|
end
|
201
166
|
|
202
167
|
def degrees
|
203
|
-
|
168
|
+
size * 360.0
|
204
169
|
end
|
205
170
|
|
206
|
-
|
207
|
-
|
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
|
13
|
-
|
14
|
-
draw.
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
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
|
13
|
-
|
14
|
-
draw.
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
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
|
13
|
-
|
14
|
-
draw.
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
18
|
-
draw.
|
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
|
data/lib/gruff/renderer/dot.rb
CHANGED
@@ -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
|
14
|
-
|
15
|
-
|
16
|
-
draw.
|
17
|
-
draw.
|
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(
|
21
|
+
square(new_x, new_y, circle_radius)
|
21
22
|
else
|
22
|
-
circle(
|
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(
|
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(
|
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
|
13
|
-
|
14
|
-
draw.
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
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
|
data/lib/gruff/renderer/line.rb
CHANGED
@@ -5,15 +5,14 @@ module Gruff
|
|
5
5
|
class Renderer::Line
|
6
6
|
EPSILON = 0.001
|
7
7
|
|
8
|
-
def initialize(color:, width: 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
|
34
|
-
|
35
|
-
draw.
|
36
|
-
draw.
|
37
|
-
draw.
|
38
|
-
draw.
|
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
|
14
|
-
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
18
|
-
draw.
|
19
|
-
draw.
|
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
|
13
|
-
|
14
|
-
draw.
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
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
|
12
|
-
|
13
|
-
draw.
|
14
|
-
draw.
|
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
|
-
|
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
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
32
|
-
|
13
|
+
@scale = scale
|
14
|
+
@draw.scale(scale, scale)
|
15
|
+
@image = background(columns, rows, scale, theme_options)
|
33
16
|
end
|
34
17
|
|
35
|
-
def
|
36
|
-
draw
|
37
|
-
draw.font = font if font
|
38
|
-
end
|
18
|
+
def finish
|
19
|
+
@draw.draw(@image)
|
39
20
|
|
40
|
-
|
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
|
-
|
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
|
-
|
100
|
+
Magick::Image.new(columns, rows) do |img|
|
101
|
+
img.background_color = 'transparent'
|
117
102
|
end
|
118
103
|
end
|
119
104
|
end
|