rubydraw 0.2.7.1 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -99,6 +99,21 @@ module Rubydraw
99
99
  SDL::Color.new(to_a)
100
100
  end
101
101
 
102
+ # Return a new color resulting from mixing this color and +other+ additively.
103
+ def +(other, a=255)
104
+ r = [@red + other.red, 255].min
105
+ g = [@green + other.green, 255].min
106
+ b = [@blue + other.blue, 255].min
107
+ Color.new(r, g, b, a)
108
+ end
109
+
110
+ # Return a new color that is the average of this color and +other+.
111
+ def /(other, a=255)
112
+ r = [(@red + other.red) / 2, 255].min
113
+ g = [(@green + other.green) / 2, 255].min
114
+ b = [(@blue + other.blue) / 2, 255].min
115
+ Color.new(r, g, b, a)
116
+ end
102
117
 
103
118
  White = new(255, 255, 255)
104
119
  Black = new(0, 0, 0)
@@ -107,8 +122,13 @@ module Rubydraw
107
122
  Green = new(0, 255, 0)
108
123
  Blue = new(0, 0, 255)
109
124
  # Secondary colors
110
- Yellow = new(255, 0, 255)
111
- Magenta = new(255, 255, 0)
125
+ Yellow = new(255, 255, 0)
126
+ Magenta = new(255, 0, 255)
112
127
  Cyan = new(0, 255, 255)
128
+ # Other colors
129
+ Purple = new(128, 0, 255)
130
+ Orange = new(255, 128, 0)
131
+ Pink = new(255, 0, 128)
132
+ Grey = new(128, 128, 128)
113
133
  end
114
134
  end
@@ -4,9 +4,9 @@ module Rubydraw
4
4
  # Then to actually draw the image (doesn't happen immediatley;
5
5
  # read the documentation for Image#draw), call it's #draw method
6
6
  # and pass it the +x+ and +y+ coordinates.
7
- class Image
8
- # Create a new image and load the file from a path. Or, load it using
9
- # an SDL surface.
7
+ class Image < Surface
8
+ # Create a new image and load the file from a path. Or, wrap an
9
+ # SDL::Surface.
10
10
  def initialize(arg)
11
11
  if arg.is_a?(String)
12
12
  # This must mean to load from a path.
@@ -22,14 +22,14 @@ module Rubydraw
22
22
  def load_from_path(path) #:nodoc:
23
23
  # Check if this image has already been initialized. If it has, raise
24
24
  # an error.
25
- unless @sdl_image.nil?
25
+ unless @sdl_surface.nil?
26
26
  raise SDLError, "Images may only be loaded once"
27
27
  end
28
28
  # In case program is being run from a different directory,
29
29
  # provide the _full_ path. Nothing relative here.
30
30
  full_path = File.expand_path path
31
- @sdl_image = SDL::Image.Load(full_path)
32
- if @sdl_image.pointer.null?
31
+ @sdl_surface = SDL::Image.Load(full_path)
32
+ if @sdl_surface.pointer.null?
33
33
  # SDL couln't load the image; usually happens because it doesn't
34
34
  # exist.
35
35
  raise Rubydraw::SDLError "Failed to load image: #{SDL.GetError}"
@@ -39,60 +39,12 @@ module Rubydraw
39
39
  def load_from_surface(surface) #:nodoc:
40
40
  # Check if this image has already been initialized. If it has, raise
41
41
  # an error.
42
- unless @sdl_image.nil?
42
+ unless @sdl_surface.nil?
43
43
  raise SDLError, "Images may only be loaded once"
44
44
  end
45
- @sdl_image = surface
45
+ @sdl_surface = surface
46
46
  end
47
47
 
48
48
  private :load_from_path, :load_from_surface
49
-
50
- # Blit (copy) into +surface at +position+ (see Rubydraw::Point).
51
- # No graphical effects are applied.
52
- def blit(surface, position)
53
- source_rect = Rectangle[Point[0, 0], Point[width, height]]
54
- blit_rect = Rectangle[position, Point[surface.width, surface.height]]
55
- SDL::BlitSurface(@sdl_image, source_rect.to_sdl, surface.to_sdl, blit_rect.to_sdl)
56
- self
57
- end
58
-
59
- alias draw blit
60
-
61
- # Rotates and/or expands the image. Note that this modifies the image
62
- # itself.
63
- def rotozoom!(angle, zoom, smooth=false)
64
- smooth =
65
- if smooth
66
- 1
67
- else
68
- 0
69
- end
70
-
71
- @sdl_image = SDL::Gfx.rotozoomSurface(@sdl_image, angle, zoom, smooth)
72
- raise SDLError, "Filed to perform rotozoom: #{SDL.GetError}" if @sdl_image.pointer.null?
73
- return self
74
- end
75
-
76
- # Returns a rotated and/or expanded image, without modifying the
77
- # reciever.
78
- def rotozoom(angle, zoom, smooth=false)
79
- new_image = self.class.new(@sdl_image)
80
- new_image.rotozoom!(angle, zoom, smooth)
81
- end
82
-
83
- # Returns the image width
84
- def width
85
- @sdl_image.w
86
- end
87
-
88
- # Returns the image height
89
- def height
90
- @sdl_image.h
91
- end
92
-
93
- # Returns the sdl surface.
94
- def to_sdl
95
- @sdl_image
96
- end
97
49
  end
98
50
  end
@@ -1,8 +1,18 @@
1
1
  module Rubydraw
2
2
  # The basic class whose instances can blit themselves to other surfaces or the window.
3
3
  # You can only manipulate the surface's pixels, but there are subclasses to do other
4
- # things (like Rubydraw::Image or Rubydraw::Font)
4
+ # things (like Rubydraw::Image or Rubydraw::Text)
5
5
  class Surface
6
+ # Load an image from +path+.
7
+ def self.load_img(path)
8
+ Image.new(path)
9
+ end
10
+
11
+ # Create a new Rubydraw::Font with +text+ as its contents.
12
+ def self.load_text(contents, color)
13
+ Text.new(contents, color)
14
+ end
15
+
6
16
  # Create a new, blank surface with the given dimensions.
7
17
  def initialize(dimensions)
8
18
  @dimensions = dimensions
@@ -31,6 +41,8 @@ module Rubydraw
31
41
  self
32
42
  end
33
43
 
44
+ alias draw blit
45
+
34
46
  # Returns the width of this surface.
35
47
  def width
36
48
  @sdl_surface.w
@@ -45,5 +57,32 @@ module Rubydraw
45
57
  def fill(color)
46
58
  SDL.FillRect(@sdl_surface, nil, color.to_i(:surface))
47
59
  end
60
+
61
+ # Rotates and/or expands the image. Note that this modifies the image
62
+ # itself.
63
+ def rotozoom!(angle, zoom, smooth=false)
64
+ smooth =
65
+ if smooth
66
+ 1
67
+ else
68
+ 0
69
+ end
70
+
71
+ @sdl_surface = SDL::Gfx.rotozoomSurface(@sdl_surface, angle, zoom, smooth)
72
+ raise SDLError, "Filed to perform rotozoom: #{SDL.GetError}" if @sdl_surface.pointer.null?
73
+ self
74
+ end
75
+
76
+ # Returns a rotated and/or expanded image, without modifying the
77
+ # reciever.
78
+ def rotozoom(angle, zoom, smooth=false)
79
+ new_image = self.class.new(@sdl_surface)
80
+ new_image.rotozoom!(angle, zoom, smooth)
81
+ end
82
+
83
+ # Returns the sdl surface.
84
+ def to_sdl
85
+ @sdl_surface
86
+ end
48
87
  end
49
88
  end
data/lib/rubydraw/text.rb CHANGED
@@ -2,7 +2,7 @@ module Rubydraw
2
2
  # Text objects are instantiazed with the font (can be a TTF file) and
3
3
  # with the text to display. They can be drawn at a position on the
4
4
  # screen.
5
- class Text
5
+ class Text < Surface
6
6
  attr_reader(:contents, :font, :color, :size)
7
7
 
8
8
  # Create a new drawable Text object with the given font and contents.
@@ -24,33 +24,5 @@ module Rubydraw
24
24
  sdl_color = @color.to_sdl
25
25
  @sdl_surface = SDL::TTF.RenderText_Blended(sdl_text, @contents, sdl_color)
26
26
  end
27
-
28
- # Returns the SDL surface for this object.
29
- def sdl_surface
30
- @sdl_surface
31
- end
32
-
33
- alias to_sdl sdl_surface
34
-
35
- # Blit (copy) into +surface at +position+ (see Rubydraw::Point).
36
- # No graphical effects are applied.
37
- def blit(surface, position)
38
- source_rect = Rectangle[Point[0, 0], Point[width, height]]
39
- blit_rect = Rectangle[position, Point[surface.width, surface.height]]
40
- SDL::BlitSurface(sdl_surface, source_rect.to_sdl, surface.to_sdl, blit_rect.to_sdl)
41
- self
42
- end
43
-
44
- alias draw blit
45
-
46
- # Returns the width.
47
- def width
48
- @sdl_surface.w
49
- end
50
-
51
- # Returns the height.
52
- def height
53
- @sdl_surface.h
54
- end
55
27
  end
56
28
  end
@@ -5,7 +5,8 @@ module Rubydraw
5
5
  # (which starts when Rubydraw::Window#open is called) is *not* forked! It will break
6
6
  # when Rubydraw::Window#close is called.
7
7
  class Window
8
- attr_reader(:fullscreen, :bkg_color)
8
+ attr_reader(:fullscreen)
9
+ attr_accessor(:bkg_color)
9
10
 
10
11
  # Create a new window.
11
12
  def initialize(width, height, fullscreen=false, bkg_color=Color::Black)
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rubydraw
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.7.1
5
+ version: 0.2.8
6
6
  platform: ruby
7
7
  authors:
8
8
  - J. Wostenberg