rabbit 2.2.1 → 3.0.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.
Files changed (177) hide show
  1. checksums.yaml +5 -5
  2. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  3. data/doc/_config.yml +2 -2
  4. data/doc/_layouts/en.html +1 -1
  5. data/doc/_layouts/ja.html +1 -1
  6. data/doc/en/news.rd +140 -0
  7. data/doc/en/sample/hiki/rabbit.hiki +2 -2
  8. data/doc/en/sample/markdown/rabbit.md +1 -1
  9. data/doc/en/sample/rd/rabbit.rd +1 -1
  10. data/doc/en/usage/rabbit-slide.rd +3 -3
  11. data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
  12. data/doc/images/screenshots/en/blue-circle.png +0 -0
  13. data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
  14. data/doc/images/screenshots/en/clear-blue.png +0 -0
  15. data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
  16. data/doc/images/screenshots/en/cozmixng.png +0 -0
  17. data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
  18. data/doc/images/screenshots/en/dark-gradation.png +0 -0
  19. data/doc/images/screenshots/en/day-white-raw.png +0 -0
  20. data/doc/images/screenshots/en/day-white.png +0 -0
  21. data/doc/images/screenshots/en/debian-raw.png +0 -0
  22. data/doc/images/screenshots/en/debian.png +0 -0
  23. data/doc/images/screenshots/en/green-circle-raw.png +0 -0
  24. data/doc/images/screenshots/en/green-circle.png +0 -0
  25. data/doc/images/screenshots/en/night-black-raw.png +0 -0
  26. data/doc/images/screenshots/en/night-black.png +0 -0
  27. data/doc/images/screenshots/en/rabbit-raw.png +0 -0
  28. data/doc/images/screenshots/en/rabbit.png +0 -0
  29. data/doc/images/screenshots/en/ranguba-raw.png +0 -0
  30. data/doc/images/screenshots/en/ranguba.png +0 -0
  31. data/doc/images/screenshots/en/red-frame-raw.png +0 -0
  32. data/doc/images/screenshots/en/red-frame.png +0 -0
  33. data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  34. data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
  35. data/doc/images/screenshots/en/rubykaigi2011-raw.png +0 -0
  36. data/doc/images/screenshots/en/rubykaigi2011.png +0 -0
  37. data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
  38. data/doc/images/screenshots/ja/blue-circle.png +0 -0
  39. data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
  40. data/doc/images/screenshots/ja/clear-blue.png +0 -0
  41. data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
  42. data/doc/images/screenshots/ja/cozmixng.png +0 -0
  43. data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
  44. data/doc/images/screenshots/ja/dark-gradation.png +0 -0
  45. data/doc/images/screenshots/ja/day-white-raw.png +0 -0
  46. data/doc/images/screenshots/ja/day-white.png +0 -0
  47. data/doc/images/screenshots/ja/debian-raw.png +0 -0
  48. data/doc/images/screenshots/ja/debian.png +0 -0
  49. data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
  50. data/doc/images/screenshots/ja/green-circle.png +0 -0
  51. data/doc/images/screenshots/ja/night-black-raw.png +0 -0
  52. data/doc/images/screenshots/ja/night-black.png +0 -0
  53. data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
  54. data/doc/images/screenshots/ja/rabbit.png +0 -0
  55. data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
  56. data/doc/images/screenshots/ja/ranguba.png +0 -0
  57. data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
  58. data/doc/images/screenshots/ja/red-frame.png +0 -0
  59. data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  60. data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
  61. data/doc/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
  62. data/doc/images/screenshots/ja/rubykaigi2011.png +0 -0
  63. data/doc/ja/how-to-make/index.rd +1 -1
  64. data/doc/ja/news.rd +143 -0
  65. data/doc/ja/sample/hiki/rabbit.hiki +2 -2
  66. data/doc/ja/sample/markdown/rabbit.md +1 -1
  67. data/doc/ja/sample/rd/rabbit.rd +1 -1
  68. data/doc/ja/slides.rd +1 -1
  69. data/doc/ja/usage/rabbit-slide.rd +3 -3
  70. data/doc/ja/users.rd +1 -1
  71. data/lib/rabbit/action.rb +23 -4
  72. data/lib/rabbit/canvas.rb +70 -14
  73. data/lib/rabbit/command/rabbit-slide.rb +252 -67
  74. data/lib/rabbit/command/rabbit-slide.ui +180 -0
  75. data/lib/rabbit/command/rabbit.rb +14 -20
  76. data/lib/rabbit/console.rb +9 -3
  77. data/lib/rabbit/dependency-canvas.rb +19 -1
  78. data/lib/rabbit/element.rb +34 -7
  79. data/lib/rabbit/element/poppler-page.rb +1 -2
  80. data/lib/rabbit/element/text-container-element.rb +2 -2
  81. data/lib/rabbit/element/text-renderer.rb +5 -4
  82. data/lib/rabbit/element/title-slide.rb +8 -0
  83. data/lib/rabbit/element/video.rb +1 -2
  84. data/lib/rabbit/filename.rb +39 -0
  85. data/lib/rabbit/formatter.rb +61 -30
  86. data/lib/rabbit/frame.rb +1 -19
  87. data/lib/rabbit/front.rb +23 -2
  88. data/lib/rabbit/gesture/handler.rb +21 -2
  89. data/lib/rabbit/graffiti/config-dialog.rb +15 -18
  90. data/lib/rabbit/gtk.rb +2 -191
  91. data/lib/rabbit/html/generator.rb +38 -30
  92. data/lib/rabbit/image-data-loader.rb +6 -1
  93. data/lib/rabbit/image.rb +22 -4
  94. data/lib/rabbit/image/base.rb +34 -2
  95. data/lib/rabbit/image/default.rb +1 -1
  96. data/lib/rabbit/image/eps.rb +1 -1
  97. data/lib/rabbit/image/gimp.rb +1 -1
  98. data/lib/rabbit/info-window.rb +27 -15
  99. data/lib/rabbit/logger/gui.rb +21 -23
  100. data/lib/rabbit/logger/stderr.rb +1 -1
  101. data/lib/rabbit/pango-markup.rb +44 -0
  102. data/lib/rabbit/parser.rb +20 -3
  103. data/lib/rabbit/parser/ext/image.rb +25 -8
  104. data/lib/rabbit/parser/ext/video.rb +21 -2
  105. data/lib/rabbit/parser/markdown.rb +1 -2
  106. data/lib/rabbit/parser/pdf.rb +23 -7
  107. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +20 -0
  108. data/lib/rabbit/progress.rb +34 -23
  109. data/lib/rabbit/renderer.rb +17 -23
  110. data/lib/rabbit/renderer/base.rb +31 -57
  111. data/lib/rabbit/renderer/color.rb +46 -53
  112. data/lib/rabbit/renderer/display/base.rb +71 -62
  113. data/lib/rabbit/renderer/display/button-handler.rb +2 -1
  114. data/lib/rabbit/renderer/display/clutter-embed.rb +60 -26
  115. data/lib/rabbit/renderer/display/drawing-area-base.rb +1 -1
  116. data/lib/rabbit/renderer/display/drawing-area-primitive.rb +34 -21
  117. data/lib/rabbit/renderer/display/graffiti.rb +1 -3
  118. data/lib/rabbit/renderer/display/hook-handler.rb +8 -4
  119. data/lib/rabbit/renderer/display/key-handler.rb +7 -2
  120. data/lib/rabbit/renderer/display/magnifier.rb +2 -2
  121. data/lib/rabbit/renderer/display/progress.rb +10 -2
  122. data/lib/rabbit/renderer/display/spotlight.rb +2 -2
  123. data/lib/rabbit/renderer/engine/cairo.rb +0 -3
  124. data/lib/rabbit/renderer/kernel.rb +54 -0
  125. data/lib/rabbit/renderer/offscreen.rb +14 -6
  126. data/lib/rabbit/renderer/print-layout.rb +150 -0
  127. data/lib/rabbit/renderer/printer.rb +236 -0
  128. data/lib/rabbit/renderer/screen.rb +288 -0
  129. data/lib/rabbit/renderer/widget/drawing-area.rb +93 -0
  130. data/lib/rabbit/size.rb +52 -25
  131. data/lib/rabbit/slide-configuration.rb +56 -12
  132. data/lib/rabbit/source.rb +24 -8
  133. data/lib/rabbit/task/slide.rb +1 -1
  134. data/lib/rabbit/theme/applier.rb +26 -9
  135. data/lib/rabbit/theme/base/base.rb +7 -7
  136. data/lib/rabbit/theme/clear-blue/clear-blue.rb +1 -1
  137. data/lib/rabbit/theme/image-timer/image-timer.rb +3 -1
  138. data/lib/rabbit/theme/image-viewer/image-viewer.rb +13 -1
  139. data/lib/rabbit/theme/image/image.rb +4 -4
  140. data/lib/rabbit/theme/lightning-talk-toolkit/lightning-talk-toolkit.rb +3 -1
  141. data/lib/rabbit/theme/tag/tag.rb +12 -4
  142. data/lib/rabbit/version.rb +2 -2
  143. data/lib/rabbit/video-window.rb +75 -89
  144. data/misc/emacs/rabbit-mode.el +11 -7
  145. data/po/en/rabbit.edit.po +189 -185
  146. data/po/en/rabbit.po +15 -12
  147. data/po/fr/rabbit.edit.po +189 -185
  148. data/po/fr/rabbit.po +15 -12
  149. data/po/ja/rabbit.edit.po +190 -186
  150. data/po/ja/rabbit.po +16 -13
  151. data/rabbit.gemspec +34 -16
  152. data/test/command/test-rabbit.rb +100 -0
  153. data/test/{rabbit-test-utils.rb → helper.rb} +7 -4
  154. data/test/{rabbit-test-utils → helper}/fixture.rb +2 -2
  155. data/test/{rabbit-test-utils → helper}/parser.rb +2 -2
  156. data/test/image/test-dia.rb +2 -2
  157. data/test/image/test-eps.rb +2 -2
  158. data/test/parser/test-markdown.rb +3 -5
  159. data/test/parser/test-rd.rb +1 -3
  160. data/test/parser/test-wiki.rb +3 -5
  161. data/test/run-test.rb +3 -3
  162. data/test/test-applier.rb +60 -29
  163. data/test/test-canvas.rb +70 -0
  164. data/test/test-color.rb +18 -9
  165. data/test/test-element.rb +15 -3
  166. data/test/test-size.rb +25 -22
  167. data/test/test-slide-configuration.rb +16 -6
  168. data/test/test-source.rb +15 -5
  169. data/test/test-utils.rb +15 -1
  170. metadata +55 -84
  171. data/lib/rabbit/renderer/print.rb +0 -31
  172. data/lib/rabbit/renderer/print/base.rb +0 -78
  173. data/lib/rabbit/renderer/print/cairo.rb +0 -122
  174. data/lib/rabbit/renderer/print/layout.rb +0 -123
  175. data/lib/rabbit/renderer/print/multiple.rb +0 -202
  176. data/lib/rabbit/source/hiki.rb +0 -36
  177. data/lib/rabbit/source/slide-share.rb +0 -53
@@ -291,7 +291,7 @@ module Rabbit
291
291
 
292
292
  def paint(color_name)
293
293
  context = @drawable.create_cairo_context
294
- context.set_source_rgb(*Color.parse(color_name).to_gdk_rgb)
294
+ context.set_source_rgba(*Color.parse(color_name).to_a)
295
295
  context.paint
296
296
  end
297
297
 
@@ -24,12 +24,21 @@ module Rabbit
24
24
  end
25
25
 
26
26
  def attach_to(window, container=nil)
27
- init_gl(@area)
28
27
  super
28
+
29
+ set_configure_event
30
+
31
+ init_gl(@area)
29
32
  end
30
33
 
31
34
  def detach
32
35
  finalize_gl
36
+
37
+ if !@window.destroyed? and @configure_signal_id
38
+ @window.signal_handler_disconnect(@configure_signal_id)
39
+ @configure_signal_id = nil
40
+ end
41
+
33
42
  super
34
43
  end
35
44
 
@@ -132,25 +141,14 @@ module Rabbit
132
141
 
133
142
  def mapped(widget)
134
143
  set_drawable(widget.window)
135
- prepare_renderer(@drawable)
136
144
  end
137
145
 
138
146
  def set_draw
139
- stop_events = false
140
- if @area.class.signals.include?("draw")
141
- @area.signal_connect("draw") do |widget, context|
142
- init_context(context)
143
- draw(widget)
144
- finish_renderer
145
- stop_events
146
- end
147
- else
148
- @area.signal_connect("expose_event") do |widget, event|
149
- init_renderer(@drawable)
150
- draw(widget)
151
- finish_renderer
152
- stop_events
153
- end
147
+ @area.signal_connect("draw") do |widget, context|
148
+ init_context(context)
149
+ draw(widget)
150
+ finish_renderer
151
+ Gdk::Event::PROPAGATE
154
152
  end
155
153
  end
156
154
 
@@ -170,6 +168,20 @@ module Rabbit
170
168
  end
171
169
  end
172
170
 
171
+ def set_configure_event
172
+ id = @window.signal_connect("configure_event") do |widget, event|
173
+ configured(event.x, event.y, event.width, event.height)
174
+ false
175
+ end
176
+ @configure_signal_id = id
177
+ end
178
+
179
+ def configured(x, y, w, h)
180
+ @real_width = @drawable.width
181
+ @real_height = @drawable.height
182
+ @size_dirty = true
183
+ end
184
+
173
185
  def set_configure_event_after
174
186
  prev_x = prev_y = prev_width = prev_height = nil
175
187
  @area.signal_connect_after("configure_event") do |widget, event|
@@ -190,6 +202,7 @@ module Rabbit
190
202
  end
191
203
 
192
204
  def configured_after(widget, event)
205
+ update_size(event.width, event.height)
193
206
  reload_theme if @drawable
194
207
  end
195
208
 
@@ -216,19 +229,19 @@ module Rabbit
216
229
  end
217
230
 
218
231
  def grab
219
- Gtk.grab_add(@area)
232
+ @area.grab_add
220
233
  Gdk.pointer_grab(@area.window, false,
221
234
  Gdk::EventMask::BUTTON_PRESS_MASK |
222
235
  Gdk::EventMask::BUTTON_RELEASE_MASK |
223
236
  Gdk::EventMask::SCROLL_MASK |
224
237
  Gdk::EventMask::POINTER_MOTION_MASK,
225
238
  nil, nil,
226
- Gdk::Event::CURRENT_TIME)
239
+ Gdk::CURRENT_TIME)
227
240
  end
228
241
 
229
242
  def ungrab
230
- Gtk.grab_remove(@area)
231
- Gdk.pointer_ungrab(Gdk::Event::CURRENT_TIME)
243
+ @area.grab_remove
244
+ Gdk.pointer_ungrab(Gdk::CURRENT_TIME)
232
245
  end
233
246
 
234
247
  def pointer
@@ -97,9 +97,7 @@ module Rabbit
97
97
  @graffiti.dragging? and
98
98
  pressed_button == target_button
99
99
  @graffiti.button_motion(event.x, event.y, width, height)
100
- init_renderer(@drawable)
101
- @graffiti.draw_last_segment(self)
102
- finish_renderer
100
+ redraw
103
101
  true
104
102
  else
105
103
  false
@@ -11,7 +11,8 @@ module Rabbit
11
11
  procs.any? {|proc| proc.call(*args)}
12
12
  end
13
13
 
14
- def add_motion_notify_hook(hook=Proc.new)
14
+ def add_motion_notify_hook(hook=nil, &block)
15
+ hook ||= Proc.new(&block)
15
16
  @motion_notify_hook_procs << hook
16
17
  end
17
18
 
@@ -19,7 +20,8 @@ module Rabbit
19
20
  @motion_notify_hook_procs.clear
20
21
  end
21
22
 
22
- def add_scroll_hook(hook=Proc.new)
23
+ def add_scroll_hook(hook=nil, &block)
24
+ hook ||= Proc.new(&block)
23
25
  @scroll_hook_procs << hook
24
26
  end
25
27
 
@@ -27,7 +29,8 @@ module Rabbit
27
29
  @scroll_hook_procs.clear
28
30
  end
29
31
 
30
- def add_button_press_hook(hook=Proc.new)
32
+ def add_button_press_hook(hook=nil, &block)
33
+ hook ||= Proc.new(&block)
31
34
  @button_press_hook_procs << hook
32
35
  end
33
36
 
@@ -35,7 +38,8 @@ module Rabbit
35
38
  @button_press_hook_procs.clear
36
39
  end
37
40
 
38
- def add_button_release_hook(hook=Proc.new)
41
+ def add_button_release_hook(hook=nil, &block)
42
+ hook ||= Proc.new(&block)
39
43
  @button_release_hook_procs << hook
40
44
  end
41
45
 
@@ -60,6 +60,11 @@ module Rabbit
60
60
  end
61
61
  end
62
62
 
63
+ def have_slide_number_related_mask?(modifier)
64
+ modifier.control_mask? or
65
+ modifier.mod1_mask?
66
+ end
67
+
63
68
  def calc_slide_number(val, modifier)
64
69
  val += 10 if modifier.control_mask?
65
70
  val += 20 if modifier.mod1_mask?
@@ -266,14 +271,14 @@ module Rabbit
266
271
  modifier = event.state
267
272
  case event.keyval
268
273
  when *prev_keys
269
- if modifier.nonzero?
274
+ if have_slide_number_related_mask?(modifier)
270
275
  index = calc_slide_number(0, modifier)
271
276
  @canvas.activate("JumpTo") {@canvas.current_index - index}
272
277
  else
273
278
  @canvas.activate("PreviousSlide")
274
279
  end
275
280
  when *next_keys
276
- if modifier.nonzero?
281
+ if have_slide_number_related_mask?(modifier)
277
282
  index = calc_slide_number(0, modifier)
278
283
  @canvas.activate("JumpTo") {@canvas.current_index + index}
279
284
  else
@@ -75,9 +75,9 @@ module Rabbit
75
75
  add_scroll_hook do |event|
76
76
  if magnifying?
77
77
  case event.direction
78
- when Gdk::EventScroll::Direction::UP
78
+ when Gdk::ScrollDirection::UP
79
79
  @magnifier_ratio = [0.5, @magnifier_ratio - 0.1].max
80
- when Gdk::EventScroll::Direction::DOWN
80
+ when Gdk::ScrollDirection::DOWN
81
81
  @magnifier_ratio = [3, @magnifier_ratio + 0.1].min
82
82
  end
83
83
  queue_draw
@@ -23,27 +23,35 @@ module Rabbit
23
23
  private
24
24
  def init_progress
25
25
  @progress = Rabbit::Progress.new
26
+ @progress_end_id = nil
26
27
  end
27
28
 
28
29
  def start_progress(max)
29
30
  return if max.zero?
30
31
 
32
+ if @progress_end_id
33
+ GLib::Source.remove(@progress_end_id)
34
+ @progress_end_id = nil
35
+ @progress.hide
36
+ end
31
37
  update_menu
32
38
  @progress.start_progress(max, @canvas.window)
33
39
  adjust_progress_window
34
40
  end
35
41
 
36
42
  def update_progress(i)
43
+ return if @progress_end_id
37
44
  @progress.update_progress(i)
38
45
  Utils.process_pending_events
39
46
  end
40
47
 
41
48
  def end_progress
42
49
  @progress.end_progress
43
- GLib::Timeout.add(100) do
50
+ @progress_end_id = GLib::Timeout.add(100) do
44
51
  @progress.hide
45
52
  update_menu
46
- false
53
+ @progress_end_id = nil
54
+ GLib::Source::REMOVE
47
55
  end
48
56
  end
49
57
 
@@ -63,10 +63,10 @@ module Rabbit
63
63
  add_scroll_hook do |event|
64
64
  if spotlighting?
65
65
  case event.direction
66
- when Gdk::EventScroll::Direction::UP
66
+ when Gdk::ScrollDirection::UP
67
67
  @spotlight_radius_ratio =
68
68
  [0.1, @spotlight_radius_ratio - 0.1].max
69
- when Gdk::EventScroll::Direction::DOWN
69
+ when Gdk::ScrollDirection::DOWN
70
70
  @spotlight_radius_ratio =
71
71
  [1, @spotlight_radius_ratio + 0.1].min
72
72
  end
@@ -25,9 +25,6 @@ module Rabbit
25
25
  pixbuf
26
26
  end
27
27
 
28
- def prepare_renderer(drawable)
29
- end
30
-
31
28
  def init_renderer(drawable)
32
29
  init_context(drawable.create_cairo_context)
33
30
  end
@@ -1,3 +1,21 @@
1
+ # Copyright (C) 2006-2018 Kouhei Sutou <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ require "rabbit/pango-markup"
18
+
1
19
  require "rabbit/renderer/color"
2
20
 
3
21
  module Rabbit
@@ -242,6 +260,42 @@ module Rabbit
242
260
 
243
261
  def set_font_resolution(context)
244
262
  end
263
+
264
+ def setup_flag_params(pole_height, default_flag_width_ratio, params)
265
+ params = params.dup
266
+
267
+ text = params["text"]
268
+ text_attrs = params["text_attributes"] || {}
269
+ if text
270
+ markupped_text = PangoMarkup.new("span", text_attrs, text)
271
+ layout = make_layout(markupped_text.to_s)
272
+ text_width, text_height = layout.pixel_size
273
+ params["layout"] = layout
274
+ params["text_width"] = text_width
275
+ params["text_height"] = text_height
276
+ flag_width_default = [
277
+ text_width * default_flag_width_ratio,
278
+ pole_height / 2
279
+ ].max
280
+ flag_height_default = [text_height, flag_width_default].max
281
+ else
282
+ params["layout"] = nil
283
+ flag_width_default = flag_height_default = nil
284
+ end
285
+
286
+ params["pole_width"] = params["pole_width"] || 2
287
+ params["pole_color"] ||= "black"
288
+ flag_height = params["flag_height"] ||
289
+ flag_height_default || pole_height / 2
290
+ flag_height = [flag_height, pole_height].min
291
+ params["flag_height"] = flag_height
292
+ params["flag_width"] ||= flag_width_default || flag_height
293
+ params["flag_color"] ||= "red"
294
+ params["flag_frame_width"] ||= params["pole_width"]
295
+ params["flag_frame_color"] ||= params["pole_color"]
296
+
297
+ params
298
+ end
245
299
  end
246
300
  end
247
301
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2016 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2016-2019 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -25,15 +25,23 @@ module Rabbit
25
25
  include Renderer::Base
26
26
  include Engine::Cairo
27
27
 
28
- attr_accessor :width, :height, :pango_context
28
+ attr_accessor :filename
29
+ attr_accessor :pango_context
29
30
 
30
- def initialize(canvas, width=nil, height=nil)
31
+ def initialize(canvas)
31
32
  super(canvas)
32
- @width = width
33
- @height = height
33
+ @filename = nil
34
34
  @pango_context = nil
35
35
  end
36
36
 
37
+ def width
38
+ @base_width
39
+ end
40
+
41
+ def height
42
+ @base_height
43
+ end
44
+
37
45
  def post_apply_theme
38
46
  end
39
47
 
@@ -71,7 +79,7 @@ module Rabbit
71
79
 
72
80
  def to_pixbuf(slide)
73
81
  pixbuf = nil
74
- ::Cairo::ImageSurface.new(@width, @height) do |surface|
82
+ ::Cairo::ImageSurface.new(@base_width, @base_height) do |surface|
75
83
  context = ::Cairo::Context.new(surface)
76
84
  init_context(context)
77
85
  slide.draw(@canvas)
@@ -0,0 +1,150 @@
1
+ # Copyright (C) 2005-2018 Kouhei Sutou <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ require "rabbit/rabbit"
18
+
19
+ module Rabbit
20
+ module Renderer
21
+ class PrintLayout
22
+ class << self
23
+ def create(renderer, canvas)
24
+ map = MAPPING.find do |key, value|
25
+ key === renderer.slides_per_page
26
+ end
27
+ if map.nil?
28
+ raise InvalidPages.new(renderer.slides_per_page)
29
+ else
30
+ map[1].new(renderer, canvas)
31
+ end
32
+ end
33
+ end
34
+
35
+ def initialize(renderer, canvas)
36
+ @renderer = renderer
37
+ @canvas = canvas
38
+ @margin_left = renderer.margin_left
39
+ @margin_right = renderer.margin_right
40
+ @margin_top = renderer.margin_top
41
+ @margin_bottom = renderer.margin_bottom
42
+ end
43
+ end
44
+
45
+ class PrintLayout1 < PrintLayout
46
+ def slide_width
47
+ @renderer.page_width
48
+ end
49
+
50
+ def slide_height
51
+ @renderer.page_height
52
+ end
53
+
54
+ def normalize_x(x)
55
+ x
56
+ end
57
+
58
+ def normalize_y(y)
59
+ y
60
+ end
61
+ end
62
+
63
+ class PrintLayout2 < PrintLayout
64
+ def initialize(renderer, canvas)
65
+ super
66
+ @margin_left ||= 50
67
+ @margin_right ||= 50
68
+ @margin_top ||= 30
69
+ @margin_bottom ||= 30
70
+ end
71
+
72
+ def slide_width
73
+ @renderer.page_width - @margin_left - @margin_right
74
+ end
75
+
76
+ def slide_height
77
+ (@renderer.page_height / 2) - @margin_top - @margin_bottom
78
+ end
79
+
80
+ def normalize_x(x)
81
+ x + @margin_left
82
+ end
83
+
84
+ def normalize_y(y)
85
+ base = @margin_bottom
86
+ if below?
87
+ base += @margin_top + @margin_bottom + slide_height
88
+ end
89
+ y + base
90
+ end
91
+
92
+ private
93
+ def below?
94
+ (@canvas.current_index % 2) == 1
95
+ end
96
+ end
97
+
98
+ class PrintLayoutMore < PrintLayout
99
+ def initialize(renderer, canvas)
100
+ super
101
+ @margin_left ||= 10
102
+ @margin_right ||= 10
103
+ @margin_top ||= 10
104
+ @margin_bottom ||= 10
105
+ end
106
+
107
+ def slide_width
108
+ (@renderer.page_width / 2) - @margin_left - @margin_right
109
+ end
110
+
111
+ def slide_height
112
+ base = @renderer.page_height / (@renderer.slides_per_page / 2.0).ceil
113
+ base - @margin_top - @margin_bottom
114
+ end
115
+
116
+ def normalize_x(x)
117
+ base = @margin_left
118
+ unless left?
119
+ base += @margin_left + @margin_right + slide_width
120
+ end
121
+ x + base
122
+ end
123
+
124
+ def normalize_y(y)
125
+ nth_col = (normalized_current_index / 2.0).truncate
126
+ base = @margin_top * (nth_col + 1)
127
+ base += @margin_bottom * nth_col
128
+ base += slide_height * nth_col
129
+ y + base
130
+ end
131
+
132
+ private
133
+ def left?
134
+ (normalized_current_index % 2).zero?
135
+ end
136
+
137
+ def normalized_current_index
138
+ @canvas.current_index % @renderer.slides_per_page
139
+ end
140
+ end
141
+
142
+ class PrintLayout
143
+ MAPPING = [
144
+ [1, PrintLayout1],
145
+ [2, PrintLayout2],
146
+ [3..(1.0/0), PrintLayoutMore],
147
+ ]
148
+ end
149
+ end
150
+ end