rabbit 2.2.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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