rays 0.1.11 → 0.1.16

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 (168) hide show
  1. checksums.yaml +5 -5
  2. data/.doc/ext/rays/bitmap.cpp +22 -76
  3. data/.doc/ext/rays/bounds.cpp +95 -125
  4. data/.doc/ext/rays/camera.cpp +88 -0
  5. data/.doc/ext/rays/color.cpp +223 -45
  6. data/.doc/ext/rays/color_space.cpp +146 -46
  7. data/.doc/ext/rays/defs.cpp +183 -0
  8. data/.doc/ext/rays/font.cpp +69 -21
  9. data/.doc/ext/rays/image.cpp +26 -37
  10. data/.doc/ext/rays/matrix.cpp +186 -29
  11. data/.doc/ext/rays/native.cpp +14 -8
  12. data/.doc/ext/rays/noise.cpp +53 -0
  13. data/.doc/ext/rays/painter.cpp +187 -292
  14. data/.doc/ext/rays/point.cpp +96 -77
  15. data/.doc/ext/rays/polygon.cpp +313 -0
  16. data/.doc/ext/rays/polygon_line.cpp +96 -0
  17. data/.doc/ext/rays/polyline.cpp +167 -0
  18. data/.doc/ext/rays/rays.cpp +103 -12
  19. data/.doc/ext/rays/shader.cpp +83 -9
  20. data/LICENSE +21 -0
  21. data/README.md +1 -1
  22. data/Rakefile +24 -9
  23. data/VERSION +1 -1
  24. data/ext/rays/bitmap.cpp +22 -80
  25. data/ext/rays/bounds.cpp +100 -128
  26. data/ext/rays/camera.cpp +94 -0
  27. data/ext/rays/color.cpp +231 -51
  28. data/ext/rays/color_space.cpp +149 -47
  29. data/ext/rays/defs.cpp +183 -0
  30. data/ext/rays/defs.h +26 -2
  31. data/ext/rays/extconf.rb +2 -3
  32. data/ext/rays/font.cpp +74 -24
  33. data/ext/rays/image.cpp +28 -40
  34. data/ext/rays/matrix.cpp +198 -30
  35. data/ext/rays/native.cpp +14 -8
  36. data/ext/rays/noise.cpp +55 -0
  37. data/ext/rays/painter.cpp +203 -298
  38. data/ext/rays/point.cpp +105 -81
  39. data/ext/rays/polygon.cpp +329 -0
  40. data/ext/rays/polygon_line.cpp +99 -0
  41. data/ext/rays/polyline.cpp +176 -0
  42. data/ext/rays/rays.cpp +103 -13
  43. data/ext/rays/shader.cpp +84 -9
  44. data/include/rays.h +10 -2
  45. data/include/rays/bitmap.h +14 -26
  46. data/include/rays/bounds.h +21 -4
  47. data/include/rays/camera.h +49 -0
  48. data/include/rays/color.h +25 -14
  49. data/include/rays/color_space.h +15 -10
  50. data/include/rays/coord.h +114 -0
  51. data/include/rays/debug.h +22 -0
  52. data/include/rays/defs.h +36 -0
  53. data/include/rays/exception.h +6 -2
  54. data/include/rays/font.h +4 -4
  55. data/include/rays/image.h +12 -18
  56. data/include/rays/matrix.h +50 -24
  57. data/include/rays/noise.h +42 -0
  58. data/include/rays/opengl.h +2 -50
  59. data/include/rays/painter.h +89 -93
  60. data/include/rays/point.h +44 -51
  61. data/include/rays/polygon.h +198 -0
  62. data/include/rays/polyline.h +71 -0
  63. data/include/rays/rays.h +3 -0
  64. data/include/rays/ruby.h +7 -1
  65. data/include/rays/ruby/bounds.h +1 -1
  66. data/include/rays/ruby/camera.h +41 -0
  67. data/include/rays/ruby/color.h +1 -1
  68. data/include/rays/ruby/color_space.h +1 -1
  69. data/include/rays/ruby/font.h +1 -1
  70. data/include/rays/ruby/matrix.h +1 -1
  71. data/include/rays/ruby/point.h +1 -1
  72. data/include/rays/ruby/polygon.h +52 -0
  73. data/include/rays/ruby/polyline.h +41 -0
  74. data/include/rays/ruby/rays.h +8 -0
  75. data/include/rays/ruby/shader.h +1 -1
  76. data/include/rays/shader.h +36 -8
  77. data/lib/rays.rb +7 -2
  78. data/lib/rays/bitmap.rb +0 -15
  79. data/lib/rays/bounds.rb +17 -23
  80. data/lib/rays/camera.rb +21 -0
  81. data/lib/rays/color.rb +20 -47
  82. data/lib/rays/color_space.rb +13 -13
  83. data/lib/rays/image.rb +3 -7
  84. data/lib/rays/matrix.rb +28 -0
  85. data/lib/rays/module.rb +4 -19
  86. data/lib/rays/painter.rb +78 -93
  87. data/lib/rays/point.rb +13 -21
  88. data/lib/rays/polygon.rb +58 -0
  89. data/lib/rays/polygon_line.rb +36 -0
  90. data/lib/rays/polyline.rb +32 -0
  91. data/lib/rays/shader.rb +20 -1
  92. data/rays.gemspec +5 -7
  93. data/src/bitmap.h +36 -0
  94. data/src/bounds.cpp +74 -11
  95. data/src/color.cpp +58 -23
  96. data/src/color_space.cpp +52 -34
  97. data/src/color_space.h +22 -0
  98. data/src/coord.cpp +170 -0
  99. data/src/coord.h +35 -0
  100. data/src/font.cpp +118 -0
  101. data/src/font.h +64 -0
  102. data/src/frame_buffer.cpp +37 -71
  103. data/src/frame_buffer.h +4 -4
  104. data/src/image.cpp +172 -98
  105. data/src/image.h +25 -0
  106. data/src/ios/bitmap.h +21 -0
  107. data/src/ios/bitmap.mm +129 -110
  108. data/src/ios/camera.mm +236 -0
  109. data/src/ios/font.mm +50 -62
  110. data/src/ios/helper.h +2 -2
  111. data/src/ios/opengl.mm +19 -4
  112. data/src/ios/rays.mm +3 -0
  113. data/src/matrix.cpp +111 -26
  114. data/src/matrix.h +30 -0
  115. data/src/noise.cpp +74 -0
  116. data/src/opengl.cpp +9 -27
  117. data/src/opengl.h +37 -0
  118. data/src/osx/bitmap.h +21 -0
  119. data/src/osx/bitmap.mm +129 -110
  120. data/src/osx/camera.mm +236 -0
  121. data/src/osx/font.mm +49 -62
  122. data/src/osx/helper.h +2 -2
  123. data/src/osx/opengl.mm +19 -83
  124. data/src/osx/rays.mm +3 -0
  125. data/src/painter.cpp +845 -671
  126. data/src/painter.h +24 -0
  127. data/src/point.cpp +140 -119
  128. data/src/polygon.cpp +1266 -0
  129. data/src/polygon.h +32 -0
  130. data/src/polyline.cpp +160 -0
  131. data/src/polyline.h +69 -0
  132. data/src/render_buffer.cpp +11 -4
  133. data/src/render_buffer.h +2 -2
  134. data/src/shader.cpp +163 -106
  135. data/src/shader.h +38 -0
  136. data/src/shader_program.cpp +533 -0
  137. data/src/{program.h → shader_program.h} +28 -16
  138. data/src/shader_source.cpp +140 -0
  139. data/src/shader_source.h +52 -0
  140. data/src/texture.cpp +136 -160
  141. data/src/texture.h +65 -0
  142. data/src/win32/bitmap.cpp +62 -52
  143. data/src/win32/font.cpp +11 -13
  144. data/src/win32/font.h +24 -0
  145. data/src/win32/gdi.h +6 -6
  146. data/test/helper.rb +0 -3
  147. data/test/test_bitmap.rb +31 -7
  148. data/test/test_bounds.rb +36 -0
  149. data/test/test_color.rb +59 -19
  150. data/test/test_color_space.rb +95 -0
  151. data/test/test_font.rb +5 -0
  152. data/test/test_image.rb +24 -20
  153. data/test/test_matrix.rb +106 -0
  154. data/test/test_painter.rb +157 -51
  155. data/test/test_painter_shape.rb +102 -0
  156. data/test/test_point.rb +29 -0
  157. data/test/test_polygon.rb +234 -0
  158. data/test/test_polygon_line.rb +167 -0
  159. data/test/test_polyline.rb +171 -0
  160. data/test/test_shader.rb +9 -9
  161. metadata +102 -70
  162. data/.doc/ext/rays/texture.cpp +0 -138
  163. data/ext/rays/texture.cpp +0 -149
  164. data/include/rays/ruby/texture.h +0 -41
  165. data/include/rays/texture.h +0 -71
  166. data/lib/rays/texture.rb +0 -24
  167. data/src/program.cpp +0 -648
  168. data/test/test_texture.rb +0 -27
@@ -10,12 +10,12 @@ class TestColor < Test::Unit::TestCase
10
10
  Rays::Color.new *args
11
11
  end
12
12
 
13
- def color8 (r, g, b, a, div = 255)
13
+ def color8 (r, g, b, a = 255, div = 255)
14
14
  color *[r, g, b, a].map {|n| n / div.to_f}
15
15
  end
16
16
 
17
- def to_color (*args)
18
- Rays::Color.color *args
17
+ def hsv (*args)
18
+ Rays::Color.hsv *args
19
19
  end
20
20
 
21
21
  def test_initialize ()
@@ -28,22 +28,34 @@ class TestColor < Test::Unit::TestCase
28
28
  assert_raise(ArgumentError) {color(1, 2, 3, 4, 5)}
29
29
  end
30
30
 
31
- def test_color ()
32
- assert_equal color(0, 0, 0, 1), to_color('#000')
33
- assert_equal color(0, 0, 0, 1), to_color('#000000')
34
- assert_equal color(0, 0, 0, 0), to_color('#0000')
35
- assert_equal color(0, 0, 0, 0), to_color('#00000000')
36
- assert_equal color8(0x01, 0x23, 0x45, 0x67), to_color('#01234567')
37
- assert_equal color8(0x89, 0xab, 0xcd, 0xef), to_color('#89abcdef')
38
- assert_equal color8(0x0, 0x2, 0x4, 0x6, 15), to_color('#0246')
39
- assert_equal color8(0x9, 0xb, 0xd, 0xf, 15), to_color('#9bdf')
40
- assert_equal color(0, 0, 0, 1), to_color(' #000 ')
41
- assert_raise(ArgumentError) {to_color '#'}
42
- assert_raise(ArgumentError) {to_color '000'}
43
- assert_raise(ArgumentError) {to_color '#0'}
44
- assert_raise(ArgumentError) {to_color '#00'}
45
- assert_raise(ArgumentError) {to_color '#00000'}
46
- assert_raise(ArgumentError) {to_color '#0000000'}
31
+ def test_initialize_with_string ()
32
+ assert_equal color(0, 0, 0, 1), color('#000')
33
+ assert_equal color(0, 0, 0, 1), color('#000000')
34
+ assert_equal color(0, 0, 0, 0), color('#0000')
35
+ assert_equal color(0, 0, 0, 0), color('#00000000')
36
+ assert_equal color8(0x01, 0x23, 0x45, 0x67), color('#01234567')
37
+ assert_equal color8(0x89, 0xab, 0xcd, 0xef), color('#89abcdef')
38
+ assert_equal color8(0x0, 0x2, 0x4, 0x6, 15), color('#0246')
39
+ assert_equal color8(0x9, 0xb, 0xd, 0xf, 15), color('#9bdf')
40
+ assert_equal color(0, 0, 0, 1), color(' #000 ')
41
+ assert_raise(ArgumentError) {color '#'}
42
+ assert_raise(ArgumentError) {color '000'}
43
+ assert_raise(ArgumentError) {color '#0'}
44
+ assert_raise(ArgumentError) {color '#00'}
45
+ assert_raise(ArgumentError) {color '#00000'}
46
+ assert_raise(ArgumentError) {color '#0000000'}
47
+ end
48
+
49
+ def test_dup ()
50
+ o = color
51
+ assert_equal color(0, 0, 0), o
52
+ o.red = 1
53
+ assert_equal color(1, 0, 0), o
54
+ x = o.dup
55
+ assert_equal color(1, 0, 0), x
56
+ x.red = 2
57
+ assert_equal color(2, 0, 0), x
58
+ assert_equal color(1, 0, 0), o
47
59
  end
48
60
 
49
61
  def test_get_rgb ()
@@ -112,4 +124,32 @@ class TestColor < Test::Unit::TestCase
112
124
  assert o > color(1, 2, 3, 3)
113
125
  end
114
126
 
127
+ def test_hsv_hue ()
128
+ assert_equal color(0.5, 0, 1), hsv(-0.25, 1, 1)
129
+ assert_equal color(1, 0, 0), hsv( 0, 1, 1)
130
+ assert_equal color(0.5, 1, 0), hsv( 0.25, 1, 1)
131
+ assert_equal color(0, 1, 1), hsv( 0.5, 1, 1)
132
+ assert_equal color(0.5, 0, 1), hsv( 0.75, 1, 1)
133
+ assert_equal color(1, 0, 0), hsv( 1, 1, 1)
134
+ assert_equal color(0.5, 1, 0), hsv( 1.25, 1, 1)
135
+ end
136
+
137
+ def test_hsv_saturation ()
138
+ assert_equal color(1, 1, 1), hsv(1, 0, 1)
139
+ assert_equal color(1, 0.5, 0.5), hsv(1, 0.5, 1)
140
+ assert_equal color(1, 0, 0), hsv(1, 1, 1)
141
+ end
142
+
143
+ def test_hsv_value ()
144
+ assert_equal color(0, 0, 0), hsv(1, 1, 0)
145
+ assert_equal color(0.5, 0, 0), hsv(1, 1, 0.5)
146
+ assert_equal color(1, 0, 0), hsv(1, 1, 1)
147
+ end
148
+
149
+ def test_hsv_alpha ()
150
+ assert_equal color(1, 0, 0, 0), hsv(1, 1, 1, 0)
151
+ assert_equal color(1, 0, 0, 0.5), hsv(1, 1, 1, 0.5)
152
+ assert_equal color(1, 0, 0, 1), hsv(1, 1, 1, 1)
153
+ end
154
+
115
155
  end# TestColor
@@ -0,0 +1,95 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+
4
+ require_relative 'helper'
5
+
6
+
7
+ class TestColorSpace < Test::Unit::TestCase
8
+
9
+ def cs (*args)
10
+ Rays::ColorSpace.new *args
11
+ end
12
+
13
+ TYPES = %w[
14
+ gray alpha
15
+ rgb bgr
16
+ rgba bgra
17
+ rgbx bgrx
18
+ argb abgr
19
+ xrgb xbgr
20
+ rgb_float bgr_float
21
+ rgba_float bgra_float
22
+ argb_float abgr_float
23
+ ]
24
+
25
+ TYPES.each do |type|
26
+ define_method type do
27
+ cs type
28
+ end
29
+ end
30
+
31
+ alias rgb_f rgb_float
32
+ alias rgba_f rgba_float
33
+ alias argb_f argb_float
34
+ alias bgr_f bgr_float
35
+ alias bgra_f bgra_float
36
+ alias abgr_f abgr_float
37
+
38
+ def all ()
39
+ [
40
+ gray, alpha,
41
+ rgb, bgr, rgba, bgra, rgbx, bgrx, argb, abgr, xrgb, xbgr,
42
+ rgb_f, bgr_f, rgba_f, bgra_f, argb_f, abgr_f
43
+ ]
44
+ end
45
+
46
+ def test_gray? ()
47
+ grays = [gray]
48
+ others = all - grays
49
+ grays .each {|t| assert_equal true, t.gray?}
50
+ others.each {|t| assert_equal false, t.gray?}
51
+ end
52
+
53
+ def test_alpha? ()
54
+ alphas = [alpha]
55
+ others = all - alphas
56
+ alphas.each {|t| assert_equal true, t.alpha?}
57
+ others.each {|t| assert_equal false, t.alpha?}
58
+ end
59
+
60
+ def test_rgb? ()
61
+ rgbs = [rgb, rgba, rgbx, argb, xrgb, rgb_f, rgba_f, argb_f]
62
+ others = all - rgbs
63
+ rgbs .each {|t| assert_equal true, t.rgb?}
64
+ others.each {|t| assert_equal false, t.rgb?}
65
+ end
66
+
67
+ def test_bgr? ()
68
+ bgrs = [bgr, bgra, bgrx, abgr, xbgr, bgr_f, bgra_f, abgr_f]
69
+ others = all - bgrs
70
+ bgrs .each {|t| assert_equal true, t.bgr?}
71
+ others.each {|t| assert_equal false, t.bgr?}
72
+ end
73
+
74
+ def test_float? ()
75
+ floats = [rgb_f, rgba_f, argb_f, bgr_f, bgra_f, abgr_f]
76
+ others = all - floats
77
+ floats.each {|t| assert_equal true, t.float?}
78
+ others.each {|t| assert_equal false, t.float?}
79
+ end
80
+
81
+ def test_has_alpha? ()
82
+ alphas = [alpha, rgba, argb, bgra, abgr, rgba_f, argb_f, bgra_f, abgr_f]
83
+ others = all - alphas
84
+ alphas.each {|t| assert_equal true, t.has_alpha?}
85
+ others.each {|t| assert_equal false, t.has_alpha?}
86
+ end
87
+
88
+ def test_has_skip? ()
89
+ skips = [rgbx, xrgb, bgrx, xbgr]
90
+ others = all - skips
91
+ skips.each {|t| assert_equal true, t.has_skip?}
92
+ others.each {|t| assert_equal false, t.has_skip?}
93
+ end
94
+
95
+ end# TestColorSpace
@@ -25,4 +25,9 @@ class TestFont < Test::Unit::TestCase
25
25
  assert_equal w * 2, font.width('XX')
26
26
  end
27
27
 
28
+ def test_height ()
29
+ f = font
30
+ assert_equal f.height, f.ascent + f.descent + f.leading
31
+ end
32
+
28
33
  end# TestFont
@@ -9,11 +9,11 @@ class TestImage < Test::Unit::TestCase
9
9
  W = 10
10
10
  H = 10
11
11
 
12
- def img (w = W, h = H, *args)
12
+ def image (w = W, h = H, *args)
13
13
  Rays::Image.new w, h, *args
14
14
  end
15
15
 
16
- def rgb (r = 0, g = 0, b = 0, a = 0)
16
+ def color (r = 0, g = 0, b = 0, a = 0)
17
17
  Rays::Color.new r, g, b, a
18
18
  end
19
19
 
@@ -22,25 +22,32 @@ class TestImage < Test::Unit::TestCase
22
22
  end
23
23
 
24
24
  def test_initialize ()
25
- assert_equal W, img.width
26
- assert_equal H, img.height
25
+ assert_equal W, image.width
26
+ assert_equal H, image.height
27
27
  end
28
28
 
29
- def test_bitmap ()
30
- assert_equal W, img.bitmap.width
31
- assert_equal H, img.bitmap.height
29
+ def test_dup ()
30
+ o = image
31
+ assert_equal color(0, 0, 0, 0), o[0, 0]
32
+ o[0, 0] = color(1, 0, 0, 0)
33
+ assert_equal color(1, 0, 0, 0), o[0, 0]
34
+ x = o.dup
35
+ assert_equal color(1, 0, 0, 0), x[0, 0]
36
+ x[0, 0] = color(0, 1, 0, 0)
37
+ assert_equal color(0, 1, 0, 0), x[0, 0]
38
+ assert_equal color(1, 0, 0, 0), o[0, 0]
32
39
  end
33
40
 
34
- def test_texture ()
35
- assert_equal W, img.texture.width
36
- assert_equal H, img.texture.height
41
+ def test_bitmap ()
42
+ assert_equal W, image.bitmap.width
43
+ assert_equal H, image.bitmap.height
37
44
  end
38
45
 
39
46
  def test_painter ()
40
- pa = img.painter
41
- assert_equal rgb(0, 0, 0, 0), pa.background
42
- assert_equal rgb(1, 1, 1, 1), pa.fill
43
- assert_equal rgb(1, 1, 1, 0), pa.stroke
47
+ pa = image.painter
48
+ assert_equal color(0, 0, 0, 0), pa.background
49
+ assert_equal color(1, 1, 1, 1), pa.fill
50
+ assert_equal color(1, 1, 1, 0), pa.stroke
44
51
  assert_equal bounds(0, 0, -1, -1), pa.clip
45
52
  assert_equal Rays::Font.new, pa.font
46
53
  end
@@ -59,14 +66,11 @@ class TestImage < Test::Unit::TestCase
59
66
  fill(&block).bitmap.to_a.reject {|o| o.transparent?}.uniq.size > 0
60
67
  end
61
68
 
62
- assert_equal rgb(0, 0, 0, 0), fill {|p| p.rect 1, 1, 8, 8}[0, 0]
63
- assert_equal rgb(1, 0, 0, 1), fill {|p| p.rect 1, 1, 8, 8}[1, 1]
64
- assert_equal rgb(1, 0, 0, 1), stroke {|p| p.line 0, 0, 1, 1}[0, 0]
69
+ assert_equal color(0, 0, 0, 0), fill {|p| p.rect 1, 1, 8, 8}[0, 0]
70
+ assert_equal color(1, 0, 0, 1), fill {|p| p.rect 1, 1, 8, 8}[1, 1]
71
+ assert_equal color(1, 0, 0, 1), stroke {|p| p.line 0, 0, 1, 1}[0, 0]
65
72
 
66
73
  assert drawn {|p| p.text "a"}
67
74
  end
68
75
 
69
- def test_dirty ()
70
- end
71
-
72
76
  end# TestImage
@@ -0,0 +1,106 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+
4
+ require_relative 'helper'
5
+
6
+
7
+ class TestMatrix < Test::Unit::TestCase
8
+
9
+ def matrix (*args)
10
+ Rays::Matrix.new *args
11
+ end
12
+
13
+ def mat_str (str)
14
+ matrix *str.split(/\s*/).map(&:to_f)
15
+ end
16
+
17
+ def translate (*args)
18
+ Rays::Matrix.translate *args
19
+ end
20
+
21
+ def scale (*args)
22
+ Rays::Matrix.scale *args
23
+ end
24
+
25
+ def rotate (*args)
26
+ Rays::Matrix.rotate *args
27
+ end
28
+
29
+ def point (*args)
30
+ Rays::Point.new *args
31
+ end
32
+
33
+ def test_initialize ()
34
+ assert_equal mat_str('1000 0100 0010 0001'), matrix
35
+ assert_equal mat_str('0000 0000 0000 0000'), matrix(0)
36
+ assert_equal mat_str('2000 0200 0020 0002'), matrix(2)
37
+ assert_equal mat_str('1234 5678 9876 5432'), matrix(1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2)
38
+ (2..15).each do |n|
39
+ assert_raise(ArgumentError) {matrix *[0] * n}
40
+ end
41
+ end
42
+
43
+ def test_dup ()
44
+ o = matrix
45
+ assert_equal mat_str('1000 0100 0010 0001'), o
46
+ o[0, 0] = 9
47
+ assert_equal mat_str('9000 0100 0010 0001'), o
48
+ x = o.dup
49
+ assert_equal mat_str('9000 0100 0010 0001'), x
50
+ x[0, 0] = 5
51
+ assert_equal mat_str('5000 0100 0010 0001'), x
52
+ assert_equal mat_str('9000 0100 0010 0001'), o
53
+ end
54
+
55
+ def test_mult ()
56
+ assert_equal point(2, 3), scale(2, 3) * point(1, 1)
57
+
58
+ assert_kind_of Rays::Point, matrix * point
59
+ assert_kind_of Rays::Point, matrix * [1]
60
+ assert_kind_of Rays::Point, matrix * [1, 2]
61
+ assert_kind_of Rays::Point, matrix * [1, 2, 3]
62
+
63
+ assert_kind_of Rays::Matrix, matrix * matrix
64
+ assert_kind_of Rays::Matrix, matrix * ([0] * 16)
65
+
66
+ (4..15).each do |narg|
67
+ assert_raise(ArgumentError) {matrix * ([0] * narg)}
68
+ end
69
+ end
70
+
71
+ def test_get_at ()
72
+ o = mat_str '1234 5678 9876 5432'
73
+ assert_equal 1, o[0, 0]
74
+ assert_equal 2, o[0, 1]
75
+ end
76
+
77
+ def test_set_at ()
78
+ o = mat_str '1234 5678 9876 5432'
79
+ assert_equal 1, o[0, 0]
80
+ o[0, 0] = 10
81
+ assert_equal 10, o[0, 0]
82
+ end
83
+
84
+ def test_compare ()
85
+ o = matrix 1
86
+ assert o == mat_str('1000 0100 0010 0001')
87
+ assert_not o != mat_str('1000 0100 0010 0001')
88
+
89
+ assert o < matrix(2)
90
+ assert o > matrix(0)
91
+ end
92
+
93
+ def test_transform ()
94
+ assert_equal mat_str('1001 0102 0013 0001'), translate(1, 2, 3)
95
+ assert_equal mat_str('2000 0300 0040 0001'), scale(2, 3, 4)
96
+
97
+ assert_equal point(2, 3, 3), translate(1, 2, 3) * point(1, 1)
98
+ assert_equal point(2, 2, 0), scale(2, 2) * point(1, 1)
99
+
100
+ assert (rotate(90) * point(1, 0, 0)).y > 0.99
101
+ assert (rotate(90, 0, 0, 1) * point(1, 0, 0)).y > 0.99
102
+ assert (rotate(90, 0, 1, 0) * point(0, 0, 1)).x > 0.99
103
+ assert (rotate(90, 1, 0, 0) * point(0, 1, 0)).z > 0.99
104
+ end
105
+
106
+ end# TestMatrix
@@ -14,50 +14,114 @@ class TestPainter < Test::Unit::TestCase
14
14
  Rays::Font.new name, size
15
15
  end
16
16
 
17
- def rgb (*args)
17
+ def color (*args)
18
18
  Rays::Color.new *args
19
19
  end
20
20
 
21
+ def setup ()
22
+ Rays::Color.set_palette_color :rgb001, color(0, 0, 1)
23
+ end
24
+
21
25
  def test_background_accessor ()
22
26
  pa = painter
23
27
  pa.background = 1
24
- assert_equal rgb(1, 1, 1, 1), pa.background
28
+ assert_equal color(1, 1, 1, 1), pa.background
25
29
  pa.background = 0
26
- assert_equal rgb(0, 0, 0, 1), pa.background
27
- pa.background 1
28
- assert_equal rgb(1, 1, 1, 1), pa.background
29
- assert_equal rgb(1, 1, 1, 1), pa.background(0) {|_|
30
- assert_equal rgb(0, 0, 0, 1), pa.background
31
- }
32
- assert_equal rgb(1, 1, 1, 1), pa.background
30
+ assert_equal color(0, 0, 0, 1), pa.background
31
+ pa.background 1
32
+ assert_equal color(1, 1, 1, 1), pa.background
33
+ pa.push background: 0 do |_|
34
+ assert_equal color(0, 0, 0, 1), pa.background
35
+ end
36
+ assert_equal color(1, 1, 1, 1), pa.background
33
37
  end
34
38
 
35
39
  def test_fill_accessor ()
36
40
  pa = painter
37
41
  pa.fill = 1
38
- assert_equal rgb(1, 1, 1, 1), pa.fill
42
+ assert_equal color(1, 1, 1, 1), pa.fill
39
43
  pa.fill = 0
40
- assert_equal rgb(0, 0, 0, 1), pa.fill
41
- pa.fill 1
42
- assert_equal rgb(1, 1, 1, 1), pa.fill
43
- assert_equal rgb(1, 1, 1, 1), pa.fill(0) {|_|
44
- assert_equal rgb(0, 0, 0, 1), pa.fill
45
- }
46
- assert_equal rgb(1, 1, 1, 1), pa.fill
44
+ assert_equal color(0, 0, 0, 1), pa.fill
45
+ pa.fill 1
46
+ assert_equal color(1, 1, 1, 1), pa.fill
47
+ pa.push fill: 0 do |_|
48
+ assert_equal color(0, 0, 0, 1), pa.fill
49
+ end
50
+ assert_equal color(1, 1, 1, 1), pa.fill
47
51
  end
48
52
 
49
53
  def test_stroke_accessor ()
50
54
  pa = painter
51
55
  pa.stroke = 1
52
- assert_equal rgb(1, 1, 1, 1), pa.stroke
56
+ assert_equal color(1, 1, 1, 1), pa.stroke
53
57
  pa.stroke = 0
54
- assert_equal rgb(0, 0, 0, 1), pa.stroke
55
- pa.stroke 1
56
- assert_equal rgb(1, 1, 1, 1), pa.stroke
57
- assert_equal rgb(1, 1, 1, 1), pa.stroke(0) {|_|
58
- assert_equal rgb(0, 0, 0, 1), pa.stroke
59
- }
60
- assert_equal rgb(1, 1, 1, 1), pa.stroke
58
+ assert_equal color(0, 0, 0, 1), pa.stroke
59
+ pa.stroke 1
60
+ assert_equal color(1, 1, 1, 1), pa.stroke
61
+ pa.push stroke: 0 do |_|
62
+ assert_equal color(0, 0, 0, 1), pa.stroke
63
+ end
64
+ assert_equal color(1, 1, 1, 1), pa.stroke
65
+ end
66
+
67
+ def test_stroke_width_accessor ()
68
+ pa = painter
69
+ assert_equal 0, pa.stroke_width
70
+ pa.stroke_width = 1
71
+ assert_equal 1, pa.stroke_width
72
+ pa.stroke_width = 0
73
+ assert_equal 0, pa.stroke_width
74
+ pa.stroke_width 2
75
+ assert_equal 2, pa.stroke_width
76
+ pa.push stroke_width: 3 do |_|
77
+ assert_equal 3, pa.stroke_width
78
+ end
79
+ assert_equal 2, pa.stroke_width
80
+ end
81
+
82
+ def test_stroke_cap_accessor ()
83
+ pa = painter
84
+ assert_equal :butt, pa.stroke_cap
85
+ pa.stroke_cap = :round
86
+ assert_equal :round, pa.stroke_cap
87
+ pa.stroke_cap :square
88
+ assert_equal :square, pa.stroke_cap
89
+ pa.push stroke_cap: :butt do |_|
90
+ assert_equal :butt, pa.stroke_cap
91
+ end
92
+ assert_equal :square, pa.stroke_cap
93
+ assert_raise(ArgumentError) {pa.stroke_cap :foo}
94
+ assert_raise(ArgumentError) {pa.stroke_cap :BUTT}
95
+ assert_raise(ArgumentError) {pa.stroke_cap Rays::CAP_BUTT}# ToDo: accept this
96
+ end
97
+
98
+ def test_stroke_join_accessor ()
99
+ pa = painter
100
+ assert_equal :miter, pa.stroke_join
101
+ pa.stroke_join = :round
102
+ assert_equal :round, pa.stroke_join
103
+ pa.stroke_join :square
104
+ assert_equal :square, pa.stroke_join
105
+ pa.push stroke_join: :miter do |_|
106
+ assert_equal :miter, pa.stroke_join
107
+ end
108
+ assert_equal :square, pa.stroke_join
109
+ assert_raise(ArgumentError) {pa.stroke_join :foo}
110
+ assert_raise(ArgumentError) {pa.stroke_join :MITER}
111
+ assert_raise(ArgumentError) {pa.stroke_join Rays::JOIN_MITER}# ToDo: accept this
112
+ end
113
+
114
+ def test_miter_limit_accessor ()
115
+ pa = painter
116
+ assert_equal 2, pa.miter_limit
117
+ pa.miter_limit = 3
118
+ assert_equal 3, pa.miter_limit
119
+ pa.miter_limit 4
120
+ assert_equal 4, pa.miter_limit
121
+ pa.push miter_limit: 9 do |_|
122
+ assert_equal 9, pa.miter_limit
123
+ end
124
+ assert_equal 4, pa.miter_limit
61
125
  end
62
126
 
63
127
  def test_clip_accessor ()
@@ -66,11 +130,11 @@ class TestPainter < Test::Unit::TestCase
66
130
  assert_equal [1, 2, 3, 4], pa.clip.to_a
67
131
  pa.clip = [5, 6, 7, 8]
68
132
  assert_equal [5, 6, 7, 8], pa.clip.to_a
69
- pa.clip 1, 2, 3, 4
133
+ pa.clip 1, 2, 3, 4
70
134
  assert_equal [1, 2, 3, 4], pa.clip.to_a
71
- assert_equal [1, 2, 3, 4], pa.clip(5, 6, 7, 8) {|_|
135
+ pa.push clip: [5, 6, 7, 8] do |_|
72
136
  assert_equal [5, 6, 7, 8], pa.clip.to_a
73
- }.to_a
137
+ end
74
138
  assert_equal [1, 2, 3, 4], pa.clip.to_a
75
139
  end
76
140
 
@@ -81,11 +145,11 @@ class TestPainter < Test::Unit::TestCase
81
145
  assert_equal f10, pa.font
82
146
  pa.font = f20
83
147
  assert_equal f20, pa.font
84
- pa.font f10
148
+ pa.font f10
85
149
  assert_equal f10, pa.font
86
- assert_equal f10, pa.font(f20) {|_|
150
+ pa.push font: f20 do |_|
87
151
  assert_equal f20, pa.font
88
- }
152
+ end
89
153
  assert_equal f10, pa.font
90
154
  end
91
155
 
@@ -100,30 +164,72 @@ class TestPainter < Test::Unit::TestCase
100
164
  assert_equal 20, pa.font.size
101
165
  end
102
166
 
103
- def test_color_accessor ()
167
+ def test_color_by_name ()
104
168
  pa = painter
105
- f1, f2, s1, s2 = rgb(1, 0, 0), rgb(0, 1, 0), rgb(1, 0, 1), rgb(0, 1, 1)
106
- pa.color f1, s1
107
- assert_equal f1, pa.fill
108
- assert_equal s1, pa.stroke
109
- assert_equal [f1, s1], pa.color(f2, s2) {|_|
110
- assert_equal f2, pa.fill
111
- assert_equal s2, pa.stroke
112
- }
113
- assert_equal f1, pa.fill
114
- assert_equal s1, pa.stroke
169
+ pa.fill = :rgb001
170
+ assert_equal color(0, 0, 1), pa.fill
171
+ pa.fill = [1, 0, 0]
172
+ assert_equal color(1, 0, 0), pa.fill
173
+ pa.fill 0, 1, 0
174
+ assert_equal color(0, 1, 0), pa.fill
175
+ pa.fill = '#f00'
176
+ assert_equal color(1, 0, 0), pa.fill
177
+ pa.fill '#0f0'
178
+ assert_equal color(0, 1, 0), pa.fill
179
+ pa.fill = '#ff0000'
180
+ assert_equal color(1, 0, 0), pa.fill
181
+ pa.fill '#00ff00'
182
+ assert_equal color(0, 1, 0), pa.fill
115
183
  end
116
184
 
117
- def test_color_by_name ()
185
+ def test_push ()
118
186
  pa = painter
119
- pa.fill = [1, 0, 0]
120
- assert_equal rgb(1, 0, 0), pa.fill
121
- pa.fill = :red
122
- assert_equal rgb(1, 0, 0), pa.fill
123
- pa.fill = '#f00'
124
- assert_equal rgb(1, 0, 0), pa.fill
125
- pa.fill = '#ff0000'
126
- assert_equal rgb(1, 0, 0), pa.fill
187
+ pa.fill = [1, 0, 0]
188
+ assert_equal color(1, 0, 0), pa.fill
189
+
190
+ pa.push :all do |_|
191
+ assert_equal color(1, 0, 0), pa.fill
192
+ pa.fill = [0, 1, 0]
193
+ assert_equal color(0, 1, 0), pa.fill
194
+ end
195
+ assert_equal color(1, 0, 0), pa.fill
196
+
197
+ pa.push :state do |_|
198
+ assert_equal color(1, 0, 0), pa.fill
199
+ pa.fill = [0, 1, 0]
200
+ assert_equal color(0, 1, 0), pa.fill
201
+ end
202
+ assert_equal color(1, 0, 0), pa.fill
203
+
204
+ pa.push :matrix do |_|
205
+ assert_equal color(1, 0, 0), pa.fill
206
+ pa.fill = [0, 1, 0]
207
+ assert_equal color(0, 1, 0), pa.fill
208
+ end
209
+ assert_equal color(0, 1, 0), pa.fill
210
+
211
+ pa.push fill: [0, 0, 1] do |_|
212
+ assert_equal color(0, 0, 1), pa.fill
213
+ pa.fill = [1, 0, 0]
214
+ assert_equal color(1, 0, 0), pa.fill
215
+ end
216
+ assert_equal color(0, 1, 0), pa.fill
217
+
218
+ pa.push stroke: [0, 0, 1] do |_|
219
+ assert_equal color(0, 1, 0), pa.fill
220
+ pa.fill = [1, 0, 0]
221
+ assert_equal color(1, 0, 0), pa.fill
222
+ end
223
+ assert_equal color(0, 1, 0), pa.fill
224
+ end
225
+
226
+ def test_shader ()
227
+ img = Rays::Image.new(10, 10).paint {
228
+ shader "void main() {gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);}"
229
+ fill 1, 0, 0
230
+ rect bounds
231
+ }
232
+ assert_equal [0.0, 0.0, 1.0, 1.0], img[0, 0].to_a
127
233
  end
128
234
 
129
235
  end# TestPainter