gruff 0.13.0-java → 0.16.0-java
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/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
|