rubydraw 0.2.5 → 0.2.7
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/lib/rubydraw.rb +1 -0
- data/lib/rubydraw/color.rb +34 -10
- data/lib/rubydraw/image.rb +3 -1
- data/lib/rubydraw/surface.rb +49 -0
- data/lib/rubydraw/window.rb +32 -9
- metadata +3 -2
data/lib/rubydraw.rb
CHANGED
data/lib/rubydraw/color.rb
CHANGED
@@ -34,31 +34,51 @@ module Rubydraw
|
|
34
34
|
raise IndexError, "One or more color values are out of bounds (must be between 0 and 255)"
|
35
35
|
end
|
36
36
|
@red, @green, @blue, @alpha = red, green, blue, alpha
|
37
|
-
|
37
|
+
calc_num_vals
|
38
38
|
end
|
39
39
|
|
40
|
-
# Calculate and store the numerical
|
41
|
-
#
|
42
|
-
def
|
40
|
+
# Calculate and store the numerical values. You shouldn't need
|
41
|
+
# this (see Rubydraw::Color.new).
|
42
|
+
def calc_num_vals
|
43
43
|
# Get the hex string for each value.
|
44
44
|
hex_alpha = (@alpha.to_s(16)).color_string
|
45
45
|
hex_red = (@red.to_s(16)).color_string
|
46
46
|
hex_green = (@green.to_s(16)).color_string
|
47
47
|
hex_blue = (@blue.to_s(16)).color_string
|
48
|
-
# Construct a hex string
|
49
|
-
#
|
50
|
-
|
51
|
-
|
48
|
+
# Construct a hex string (only compatible with surfaces other than
|
49
|
+
# the window) using the previously determined hex colors. Not sure
|
50
|
+
# how alpha comes in here yet... I'll figure it out.
|
51
|
+
surf_color_string = hex_red + hex_green + hex_blue
|
52
|
+
@surface_num_val = surf_color_string.to_i(16)
|
53
|
+
# *Note:* SDL's color format for the display is different than other
|
54
|
+
# ordinary surfaces. It is: +BBGGRRAA+.
|
55
|
+
display_color_string = hex_blue + hex_green + hex_red + hex_alpha
|
56
|
+
@display_num_val = display_color_string.to_i(16)
|
52
57
|
end
|
53
58
|
|
54
59
|
# Convert this color to a numerical value, which only makes sense when
|
55
60
|
# read as a hex number, e.g. red would be: +0000ff00+.
|
56
61
|
#
|
57
62
|
# Also see the comments in: Rubydraw::Color#calc_num_val.
|
58
|
-
def to_i
|
59
|
-
|
63
|
+
def to_i(format)
|
64
|
+
if format == :surface or format == :display_fullscreen
|
65
|
+
return @surface_num_val
|
66
|
+
end
|
67
|
+
if format == :display
|
68
|
+
return @display_num_val
|
69
|
+
end
|
70
|
+
raise ArgumentError, "Unrecognized color format \"@{format}\""
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns the complimentary color.
|
74
|
+
def invert
|
75
|
+
Color.new(255 - @red, 255 - @green, 255 - @blue, @alpha)
|
60
76
|
end
|
61
77
|
|
78
|
+
alias complimentary invert
|
79
|
+
alias opposite invert
|
80
|
+
alias reverse invert
|
81
|
+
|
62
82
|
# Returns an Array containing each +rgba+ value.
|
63
83
|
#
|
64
84
|
# Example:
|
@@ -70,6 +90,10 @@ module Rubydraw
|
|
70
90
|
[@red, @blue, @green, @alpha]
|
71
91
|
end
|
72
92
|
|
93
|
+
def to_s
|
94
|
+
"#<#{self.class}: (@red: #{@red}, @green: #{@green}, @blue: #{@blue}, @alpha: #{@alpha})>"
|
95
|
+
end
|
96
|
+
|
73
97
|
# Create an SDL::Color equivilent to this Rubydraw::Color.
|
74
98
|
def to_sdl
|
75
99
|
SDL::Color.new(to_a)
|
data/lib/rubydraw/image.rb
CHANGED
@@ -20,7 +20,7 @@ module Rubydraw
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def load_from_path(path) #:nodoc:
|
23
|
-
# Check if this image has already been
|
23
|
+
# Check if this image has already been initialized. If it has, raise
|
24
24
|
# an error.
|
25
25
|
unless @sdl_image.nil?
|
26
26
|
raise SDLError, "Images may only be loaded once"
|
@@ -45,6 +45,8 @@ module Rubydraw
|
|
45
45
|
@sdl_image = surface
|
46
46
|
end
|
47
47
|
|
48
|
+
private :load_from_path, :load_from_surface
|
49
|
+
|
48
50
|
# Blit (copy) into +surface at +position+ (see Rubydraw::Point).
|
49
51
|
# No graphical effects are applied.
|
50
52
|
def blit(surface, position)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Rubydraw
|
2
|
+
# The basic class whose instances can blit themselves to other surfaces or the window.
|
3
|
+
# You can only manipulate the surface's pixels, but there are subclasses to do other
|
4
|
+
# things (like Rubydraw::Image or Rubydraw::Font)
|
5
|
+
class Surface
|
6
|
+
# Create a new, blank surface with the given dimensions.
|
7
|
+
def initialize(dimensions)
|
8
|
+
@dimensions = dimensions
|
9
|
+
pixel_format = SDL.GetVideoInfo.vfmt
|
10
|
+
rmsk, gmsk, bmsk, amsk = 0xff0000, 0x00ff00, 0x0000ff, 0x000000
|
11
|
+
depth = pixel_format.BitsPerPixel
|
12
|
+
@sdl_surface = SDL.CreateRGBSurface(0, dimensions.x, dimensions.y, depth, rmsk, gmsk, bmsk, amsk)
|
13
|
+
if @sdl_surface.pointer.null?
|
14
|
+
raise SDLError, "Failed to create Rubydraw surface: #{SDL.GetError}"
|
15
|
+
end
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
# Blit (copy) into +surface at +position+ (see Rubydraw::Point).
|
20
|
+
# No graphical effects are applied.
|
21
|
+
def blit(surface, position)
|
22
|
+
if surface.nil?
|
23
|
+
raise SDLError, "Surface to blit to cannot be nil"
|
24
|
+
end
|
25
|
+
if position.nil?
|
26
|
+
raise SDLError, "Position to blit at cannot be nil"
|
27
|
+
end
|
28
|
+
source_rect = Rectangle[Point[0, 0], Point[width, height]]
|
29
|
+
blit_rect = Rectangle[position, Point[surface.width, surface.height]]
|
30
|
+
SDL::BlitSurface(@sdl_surface, source_rect.to_sdl, surface.to_sdl, blit_rect.to_sdl)
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns the width of this surface.
|
35
|
+
def width
|
36
|
+
@sdl_surface.w
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the height of this surface.
|
40
|
+
def height
|
41
|
+
@sdl_surface.h
|
42
|
+
end
|
43
|
+
|
44
|
+
# Fills this surface with the given color.
|
45
|
+
def fill(color)
|
46
|
+
SDL.FillRect(@sdl_surface, nil, color.to_i(:surface))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/rubydraw/window.rb
CHANGED
@@ -9,16 +9,29 @@ module Rubydraw
|
|
9
9
|
|
10
10
|
# Create a new window.
|
11
11
|
def initialize(width, height, fullscreen=false, bkg_color=Color::Black)
|
12
|
+
if width < 0
|
13
|
+
raise SDLError, "New window width cannot be less than zero"
|
14
|
+
end
|
15
|
+
if height < 0
|
16
|
+
raise SDLError, "New window height cannot be less than zero"
|
17
|
+
end
|
18
|
+
if height == 0
|
19
|
+
# Compensate for the height of the window bar itself, the menu bar at the top
|
20
|
+
# of the screen, and a space of around 4px at the bottom of the screen. Not
|
21
|
+
# sure what the numbers would be for anything other than Mac OSX; more info
|
22
|
+
# would be appreciated.
|
23
|
+
height = Rubydraw::screen_height - 48
|
24
|
+
end
|
12
25
|
@width, @height = width, height
|
13
26
|
@fullscreen = fullscreen
|
14
27
|
@bkg_color = bkg_color
|
15
28
|
@open = false
|
16
29
|
@flags =
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
if fullscreen
|
31
|
+
SDL::FULLSCREEN
|
32
|
+
else
|
33
|
+
0
|
34
|
+
end
|
22
35
|
|
23
36
|
@event_queue = EventQueue.new
|
24
37
|
|
@@ -78,7 +91,17 @@ module Rubydraw
|
|
78
91
|
# Fill the entire window with a Rubydraw::Color. Do this by feeding SDL the numeric
|
79
92
|
# verion of the color; see Rubydraw::Color#to_i
|
80
93
|
def fill_with(color)
|
81
|
-
SDL::FillRect(@screen, nil, color
|
94
|
+
SDL::FillRect(@screen, nil, convert(color))
|
95
|
+
end
|
96
|
+
|
97
|
+
# Convert +color+ to the display format.
|
98
|
+
def convert(color)
|
99
|
+
puts @fullscreen
|
100
|
+
if @fullscreen
|
101
|
+
return color.to_i(:display_fullscreen)
|
102
|
+
else
|
103
|
+
return color.to_i(:display)
|
104
|
+
end
|
82
105
|
end
|
83
106
|
|
84
107
|
# Call this method to tell SDL to quit drawing. The loop (started in
|
@@ -114,11 +137,11 @@ module Rubydraw
|
|
114
137
|
#events.each {|event|
|
115
138
|
# block = @registered_actions[event.class]
|
116
139
|
# block.call(event) unless block.nil?}
|
117
|
-
events.each {|event|
|
140
|
+
events.each { |event|
|
118
141
|
blocks = @registered_actions[event.class]
|
119
142
|
unless blocks.nil?
|
120
|
-
blocks.each {|b| b.call(event) unless b.nil?}
|
121
|
-
end}
|
143
|
+
blocks.each { |b| b.call(event) unless b.nil? }
|
144
|
+
end }
|
122
145
|
end
|
123
146
|
|
124
147
|
# This causes the main loop to exit. Use Rubydraw::Window#close to close the
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rubydraw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.7
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- J. Wostenberg
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-12-01 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- README
|
37
37
|
- lib/rubydraw.rb
|
38
38
|
- lib/rubydraw/window.rb
|
39
|
+
- lib/rubydraw/surface.rb
|
39
40
|
- lib/rubydraw/image.rb
|
40
41
|
- lib/rubydraw/sound.rb
|
41
42
|
- lib/rubydraw/text.rb
|