panda_canvas 0.5.0 → 0.6.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.
- data/LICENSE +2 -2
- data/README.rdoc +1 -1
- data/lib/panda_canvas/animation_canvas.rb +8 -9
- data/lib/panda_canvas/{animation_clean_room.rb → drawing_agent.rb} +13 -6
- data/lib/panda_canvas/drawing_canvas.rb +13 -21
- data/lib/panda_canvas/drawing_clean_room.rb +4 -3
- data/lib/panda_canvas/drawing_methods.rb +6 -3
- data/lib/panda_canvas/drawing_with_clean_room.rb +35 -0
- data/lib/panda_canvas/drawing_with_fibers.rb +30 -0
- data/lib/panda_canvas/version.rb +12 -3
- data/lib/panda_canvas.rb +2 -2
- metadata +9 -27
data/LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2010 Dimitry Solovyov
|
1
|
+
Copyright (c) 2010-2011 Dimitry Solovyov
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
of this software and associated documentation files (the "Software"), to deal
|
@@ -16,4 +16,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
16
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
17
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
18
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
-
THE SOFTWARE.
|
19
|
+
THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -15,26 +15,25 @@ module PandaCanvas
|
|
15
15
|
self.caption = 'Panda Canvas'
|
16
16
|
@block = block
|
17
17
|
@image = TexPlay.create_image(self, width, height)
|
18
|
-
@
|
19
|
-
@
|
20
|
-
@clean_room.frame = 0
|
18
|
+
@agent = DrawingAgent.new(self, @image)
|
19
|
+
@agent.frame = 0
|
21
20
|
end
|
22
21
|
|
23
22
|
# Draws the image in memory.
|
24
23
|
def draw
|
25
24
|
@image.draw(0, 0, 0)
|
26
|
-
@
|
25
|
+
@agent.canvas_calls.each {|call| send call[0], *call[1..-1] }
|
27
26
|
end
|
28
27
|
|
29
28
|
# Runs an animation block.
|
30
29
|
def update
|
31
30
|
@image.rect 0, 0, width, height, :color => :black, :fill => true
|
32
31
|
DrawingMethods::CANVAS_UPDATE.each {|call| send call[0], *call[1..-1] }
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@
|
32
|
+
@agent.canvas_calls = []
|
33
|
+
@agent.frame += 1
|
34
|
+
@agent.instance_eval &@block
|
36
35
|
end
|
37
36
|
|
38
|
-
end
|
37
|
+
end # AnimationCanvas
|
39
38
|
|
40
|
-
end # PandaCanvas
|
39
|
+
end # PandaCanvas
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module PandaCanvas
|
2
2
|
|
3
|
-
#
|
4
|
-
|
3
|
+
# DrawingAgent is used to capture drawing method calls
|
4
|
+
# and pass them to the active window and a TextPlay image
|
5
|
+
# in the correct order.
|
6
|
+
class DrawingAgent
|
5
7
|
|
6
8
|
# Array of methods that need to be passed to canvas.
|
7
9
|
attr_accessor :canvas_calls
|
@@ -9,9 +11,12 @@ module PandaCanvas
|
|
9
11
|
# Current frame number.
|
10
12
|
attr_accessor :frame
|
11
13
|
|
12
|
-
# Initializes the clean object
|
14
|
+
# Initializes the clean object in a given +window+
|
15
|
+
# for method call capturing.
|
13
16
|
# TexPlay +image+ is used for TexPlay drawing methods.
|
14
|
-
def initialize(image)
|
17
|
+
def initialize(window, image)
|
18
|
+
@canvas_calls = []
|
19
|
+
@window = window
|
15
20
|
@image = image
|
16
21
|
end
|
17
22
|
|
@@ -21,11 +26,13 @@ module PandaCanvas
|
|
21
26
|
@canvas_calls << [sym, *args]
|
22
27
|
elsif Gosu::Image.public_instance_methods.include? sym
|
23
28
|
@image.send sym, *args
|
29
|
+
elsif @window.respond_to? sym
|
30
|
+
@window.send sym, *args
|
24
31
|
else
|
25
32
|
super
|
26
33
|
end
|
27
34
|
end
|
28
35
|
|
29
|
-
end #
|
36
|
+
end # DrawingAgent
|
30
37
|
|
31
|
-
end # PandaCanvas
|
38
|
+
end # PandaCanvas
|
@@ -5,6 +5,16 @@ module PandaCanvas
|
|
5
5
|
|
6
6
|
include DrawingMethods
|
7
7
|
|
8
|
+
# Include platform-specific update behavior.
|
9
|
+
if RUBY_PLATFORM =~ /mswin|mingw/
|
10
|
+
require 'panda_canvas/drawing_with_clean_room'
|
11
|
+
include DrawingWithCleanRoom
|
12
|
+
else
|
13
|
+
require 'fiber'
|
14
|
+
require 'panda_canvas/drawing_with_fibers'
|
15
|
+
include DrawingWithFibers
|
16
|
+
end
|
17
|
+
|
8
18
|
# TexPlay image, which is drawn in the window.
|
9
19
|
attr_reader :image
|
10
20
|
|
@@ -14,10 +24,8 @@ module PandaCanvas
|
|
14
24
|
super(width, height, false)
|
15
25
|
self.caption = 'Panda Canvas'
|
16
26
|
@image = TexPlay.create_image(self, width, height)
|
17
|
-
clean_room = DrawingCleanRoom.new
|
18
|
-
clean_room.instance_eval(&block)
|
19
|
-
@calls = clean_room.calls
|
20
27
|
@canvas_calls = []
|
28
|
+
prepare &block
|
21
29
|
end
|
22
30
|
|
23
31
|
# Draws the image in memory.
|
@@ -26,22 +34,6 @@ module PandaCanvas
|
|
26
34
|
@canvas_calls.each {|call| send call[0], *call[1..-1] }
|
27
35
|
end
|
28
36
|
|
29
|
-
|
30
|
-
def update
|
31
|
-
DrawingMethods::CANVAS_UPDATE.each {|call| send call[0], *call[1..-1] }
|
32
|
-
unless @calls.empty?
|
33
|
-
flush_index = @calls.index(DrawingCleanRoom::FLUSH)
|
34
|
-
@calls.slice!(0...flush_index).each do |call|
|
35
|
-
if DrawingMethods::CANVAS_CALLS.include? call[0]
|
36
|
-
@canvas_calls << call
|
37
|
-
else
|
38
|
-
@image.send call[0], *call[1..-1]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
@calls.shift
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
end # Canvas
|
37
|
+
end # DrawingCanvas
|
46
38
|
|
47
|
-
end # PandaCanvas
|
39
|
+
end # PandaCanvas
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module PandaCanvas
|
2
2
|
|
3
|
-
# DrawingCleanRoom is used to capture and store method calls
|
3
|
+
# DrawingCleanRoom is used to capture and store method calls
|
4
|
+
# for delayed execution.
|
4
5
|
class DrawingCleanRoom
|
5
6
|
|
6
7
|
# Signature for the +flush+ method.
|
@@ -30,6 +31,6 @@ module PandaCanvas
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
end #
|
34
|
+
end # DrawingCleanRoom
|
34
35
|
|
35
|
-
end # PandaCanvas
|
36
|
+
end # PandaCanvas
|
@@ -1,14 +1,17 @@
|
|
1
1
|
module PandaCanvas
|
2
2
|
|
3
|
+
# DrawingMethods is a set of drawing methods used by PandaCanvas canvases.
|
3
4
|
module DrawingMethods
|
4
5
|
|
5
6
|
# Signature set for defaults that are executed in each update event.
|
6
7
|
CANVAS_UPDATE = [[:font, 12]]
|
7
8
|
|
8
|
-
# Names of calls that need to be sent directly to Canvas
|
9
|
+
# Names of calls that need to be sent directly to Canvas
|
10
|
+
# instead of the TexPlay image on draw.
|
9
11
|
CANVAS_CALLS = [:font, :text, :text_rel].freeze
|
10
12
|
|
11
|
-
# Sets the font with name +font_name+ and +height+ in pixels
|
13
|
+
# Sets the font with name +font_name+ and +height+ in pixels
|
14
|
+
# to be used when drawing text.
|
12
15
|
# All subsequent text drawing calls will use the given font.
|
13
16
|
def font(height, font_name=Gosu::default_font_name)
|
14
17
|
@used_fonts ||= {}
|
@@ -47,4 +50,4 @@ module PandaCanvas
|
|
47
50
|
|
48
51
|
end # DrawingMethods
|
49
52
|
|
50
|
-
end # PandaCanvas
|
53
|
+
end # PandaCanvas
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module PandaCanvas
|
2
|
+
|
3
|
+
# DrawingWithCleanRoom adds behavior to perform canvas updates
|
4
|
+
# using method capturing and delayed execution.
|
5
|
+
# This is faster, but somewhat ugly and should only be used in environments
|
6
|
+
# where resuming fibers in the Gosu draw loop results in a segfault.
|
7
|
+
module DrawingWithCleanRoom
|
8
|
+
|
9
|
+
# Evaluates the drawing block in a DrawingCleanRoom instance
|
10
|
+
# and captures drawing method sequence.
|
11
|
+
def prepare(&block)
|
12
|
+
clean_room = DrawingCleanRoom.new
|
13
|
+
clean_room.instance_eval(&block)
|
14
|
+
@calls = clean_room.calls
|
15
|
+
end
|
16
|
+
|
17
|
+
# Performs drawing until the next flush using the captured sequence.
|
18
|
+
def update
|
19
|
+
unless @calls.empty?
|
20
|
+
DrawingMethods::CANVAS_UPDATE.each {|call| send call[0], *call[1..-1] }
|
21
|
+
flush_index = @calls.index(DrawingCleanRoom::FLUSH)
|
22
|
+
@calls.slice!(0...flush_index).each do |call|
|
23
|
+
if DrawingMethods::CANVAS_CALLS.include? call[0]
|
24
|
+
@canvas_calls << call
|
25
|
+
else
|
26
|
+
@image.send call[0], *call[1..-1]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
@calls.shift
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end # DrawingWithCleanRoom
|
34
|
+
|
35
|
+
end # PandaCanvas
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module PandaCanvas
|
2
|
+
|
3
|
+
# DrawingWithFibers adds behavior to perform canvas updates
|
4
|
+
# using fibers. Test show that this behavior is only suitable for unixes.
|
5
|
+
module DrawingWithFibers
|
6
|
+
|
7
|
+
# Yields control back to calling context.
|
8
|
+
def flush
|
9
|
+
Fiber.yield
|
10
|
+
end
|
11
|
+
|
12
|
+
# Creates a new fiber that evaluates the given +block+ in this instance.
|
13
|
+
def prepare(&block)
|
14
|
+
@agent = agent = DrawingAgent.new(self, @image)
|
15
|
+
@fiber = Fiber.new { agent.instance_eval &block }
|
16
|
+
end
|
17
|
+
|
18
|
+
# Performs drawing until the next flush by resuming the fiber.
|
19
|
+
def update
|
20
|
+
if @fiber.alive?
|
21
|
+
@agent.canvas_calls = []
|
22
|
+
DrawingMethods::CANVAS_UPDATE.each {|call| send call[0], *call[1..-1] }
|
23
|
+
@fiber.resume
|
24
|
+
@canvas_calls = @agent.canvas_calls
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end # DrawingWithCleanRoom
|
29
|
+
|
30
|
+
end # PandaCanvas
|
data/lib/panda_canvas/version.rb
CHANGED
data/lib/panda_canvas.rb
CHANGED
@@ -3,8 +3,8 @@ $:.unshift(libdir) unless $:.include?(libdir)
|
|
3
3
|
|
4
4
|
require 'texplay'
|
5
5
|
require 'panda_canvas/drawing_methods'
|
6
|
+
require 'panda_canvas/drawing_agent'
|
6
7
|
require 'panda_canvas/animation_canvas'
|
7
|
-
require 'panda_canvas/animation_clean_room'
|
8
8
|
require 'panda_canvas/drawing_canvas'
|
9
9
|
require 'panda_canvas/drawing_clean_room'
|
10
10
|
|
@@ -33,4 +33,4 @@ module PandaCanvas
|
|
33
33
|
|
34
34
|
end # class << self
|
35
35
|
|
36
|
-
end # PandaCanvas
|
36
|
+
end # PandaCanvas
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: panda_canvas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 5
|
8
|
-
- 0
|
9
|
-
version: 0.5.0
|
4
|
+
prerelease:
|
5
|
+
version: 0.6.0
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Dimitry Solovyov
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date:
|
13
|
+
date: 2011-05-06 00:00:00 +03:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
@@ -25,10 +21,6 @@ dependencies:
|
|
25
21
|
requirements:
|
26
22
|
- - ~>
|
27
23
|
- !ruby/object:Gem::Version
|
28
|
-
segments:
|
29
|
-
- 0
|
30
|
-
- 7
|
31
|
-
- 24
|
32
24
|
version: 0.7.24
|
33
25
|
type: :runtime
|
34
26
|
version_requirements: *id001
|
@@ -40,15 +32,11 @@ dependencies:
|
|
40
32
|
requirements:
|
41
33
|
- - ~>
|
42
34
|
- !ruby/object:Gem::Version
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
- 2
|
46
|
-
- 981
|
47
35
|
version: 0.2.981
|
48
36
|
type: :runtime
|
49
37
|
version_requirements: *id002
|
50
38
|
description: Educational 2D drawing canvas on top of Gosu and TexPlay.
|
51
|
-
email:
|
39
|
+
email: dimituri@gmail.com
|
52
40
|
executables: []
|
53
41
|
|
54
42
|
extensions: []
|
@@ -57,16 +45,18 @@ extra_rdoc_files: []
|
|
57
45
|
|
58
46
|
files:
|
59
47
|
- lib/panda_canvas/animation_canvas.rb
|
60
|
-
- lib/panda_canvas/
|
48
|
+
- lib/panda_canvas/drawing_agent.rb
|
61
49
|
- lib/panda_canvas/drawing_canvas.rb
|
62
50
|
- lib/panda_canvas/drawing_clean_room.rb
|
63
51
|
- lib/panda_canvas/drawing_methods.rb
|
52
|
+
- lib/panda_canvas/drawing_with_clean_room.rb
|
53
|
+
- lib/panda_canvas/drawing_with_fibers.rb
|
64
54
|
- lib/panda_canvas/version.rb
|
65
55
|
- lib/panda_canvas.rb
|
66
56
|
- LICENSE
|
67
57
|
- README.rdoc
|
68
58
|
has_rdoc: true
|
69
|
-
homepage:
|
59
|
+
homepage: http://github.com/dimituri/panda_canvas
|
70
60
|
licenses: []
|
71
61
|
|
72
62
|
post_install_message:
|
@@ -79,25 +69,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
69
|
requirements:
|
80
70
|
- - ~>
|
81
71
|
- !ruby/object:Gem::Version
|
82
|
-
segments:
|
83
|
-
- 1
|
84
|
-
- 9
|
85
|
-
- 2
|
86
72
|
version: 1.9.2
|
87
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
74
|
none: false
|
89
75
|
requirements:
|
90
76
|
- - ">="
|
91
77
|
- !ruby/object:Gem::Version
|
92
|
-
segments:
|
93
|
-
- 1
|
94
|
-
- 3
|
95
|
-
- 6
|
96
78
|
version: 1.3.6
|
97
79
|
requirements: []
|
98
80
|
|
99
81
|
rubyforge_project:
|
100
|
-
rubygems_version: 1.
|
82
|
+
rubygems_version: 1.5.2
|
101
83
|
signing_key:
|
102
84
|
specification_version: 3
|
103
85
|
summary: Educational 2D drawing canvas on top of Gosu and TexPlay.
|