rays 0.2.1 → 0.3.1

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/rays/bitmap.cpp +99 -32
  3. data/.doc/ext/rays/bounds.cpp +16 -12
  4. data/.doc/ext/rays/camera.cpp +1 -1
  5. data/.doc/ext/rays/color.cpp +2 -2
  6. data/.doc/ext/rays/color_space.cpp +3 -3
  7. data/.doc/ext/rays/defs.cpp +4 -4
  8. data/.doc/ext/rays/font.cpp +4 -3
  9. data/.doc/ext/rays/image.cpp +32 -18
  10. data/.doc/ext/rays/matrix.cpp +6 -6
  11. data/.doc/ext/rays/painter.cpp +1 -1
  12. data/.doc/ext/rays/point.cpp +10 -6
  13. data/.doc/ext/rays/polygon.cpp +11 -9
  14. data/.doc/ext/rays/polyline.cpp +6 -4
  15. data/.doc/ext/rays/rays.cpp +25 -15
  16. data/.doc/ext/rays/shader.cpp +3 -3
  17. data/.github/workflows/release-gem.yml +1 -1
  18. data/.github/workflows/test.yml +3 -0
  19. data/ChangeLog.md +11 -0
  20. data/Gemfile.lock +1 -1
  21. data/LICENSE +1 -1
  22. data/Rakefile +17 -3
  23. data/VERSION +1 -1
  24. data/ext/rays/bitmap.cpp +99 -32
  25. data/ext/rays/bounds.cpp +16 -12
  26. data/ext/rays/camera.cpp +1 -1
  27. data/ext/rays/color.cpp +2 -2
  28. data/ext/rays/color_space.cpp +3 -3
  29. data/ext/rays/defs.cpp +4 -4
  30. data/ext/rays/defs.h +2 -0
  31. data/ext/rays/extconf.rb +4 -2
  32. data/ext/rays/font.cpp +4 -3
  33. data/ext/rays/image.cpp +34 -18
  34. data/ext/rays/matrix.cpp +6 -6
  35. data/ext/rays/painter.cpp +1 -1
  36. data/ext/rays/point.cpp +10 -6
  37. data/ext/rays/polygon.cpp +11 -9
  38. data/ext/rays/polyline.cpp +6 -4
  39. data/ext/rays/rays.cpp +25 -15
  40. data/ext/rays/shader.cpp +3 -3
  41. data/include/rays/defs.h +7 -0
  42. data/include/rays/image.h +8 -2
  43. data/include/rays/ruby/bitmap.h +2 -2
  44. data/include/rays/ruby/bounds.h +2 -2
  45. data/include/rays/ruby/camera.h +2 -2
  46. data/include/rays/ruby/color.h +2 -2
  47. data/include/rays/ruby/color_space.h +2 -2
  48. data/include/rays/ruby/exception.h +3 -3
  49. data/include/rays/ruby/font.h +2 -2
  50. data/include/rays/ruby/image.h +2 -2
  51. data/include/rays/ruby/matrix.h +2 -2
  52. data/include/rays/ruby/painter.h +2 -2
  53. data/include/rays/ruby/point.h +2 -2
  54. data/include/rays/ruby/polygon.h +2 -2
  55. data/include/rays/ruby/polyline.h +2 -2
  56. data/include/rays/ruby/rays.h +6 -6
  57. data/include/rays/ruby/shader.h +2 -2
  58. data/lib/rays/bitmap.rb +7 -0
  59. data/lib/rays/extension.rb +4 -0
  60. data/lib/rays/image.rb +4 -0
  61. data/rays.gemspec +2 -2
  62. data/src/bounds.cpp +6 -2
  63. data/src/color.cpp +12 -4
  64. data/src/coord.h +2 -2
  65. data/src/font.cpp +1 -0
  66. data/src/image.cpp +32 -4
  67. data/src/ios/bitmap.mm +40 -33
  68. data/src/ios/font.mm +6 -1
  69. data/src/ios/rays.mm +2 -2
  70. data/src/matrix.h +1 -1
  71. data/src/opengl.h +1 -2
  72. data/src/osx/bitmap.mm +40 -33
  73. data/src/osx/font.mm +6 -1
  74. data/src/osx/rays.mm +2 -2
  75. data/src/painter.cpp +4 -1
  76. data/src/point.cpp +15 -3
  77. data/src/polygon.cpp +3 -5
  78. data/src/render_buffer.cpp +11 -3
  79. data/src/shader.cpp +3 -0
  80. data/src/shader_program.cpp +19 -9
  81. data/src/shader_source.cpp +5 -1
  82. data/src/texture.cpp +33 -11
  83. data/src/texture.h +6 -2
  84. data/src/win32/bitmap.cpp +178 -66
  85. data/src/win32/camera.cpp +119 -0
  86. data/src/win32/font.cpp +181 -40
  87. data/src/win32/gdi.h +1 -1
  88. data/src/win32/opengl.cpp +127 -0
  89. data/src/win32/rays.cpp +16 -9
  90. data/test/helper.rb +2 -0
  91. data/test/test_bitmap.rb +3 -1
  92. data/test/test_image.rb +8 -14
  93. data/test/test_painter.rb +4 -4
  94. data/test/test_painter_shape.rb +6 -5
  95. metadata +8 -7
  96. data/src/win32/font.h +0 -24
data/src/osx/bitmap.mm CHANGED
@@ -2,7 +2,6 @@
2
2
  #import "bitmap.h"
3
3
 
4
4
 
5
- #include <assert.h>
6
5
  #import <Cocoa/Cocoa.h>
7
6
  #include "rays/exception.h"
8
7
  #include "../color_space.h"
@@ -60,7 +59,7 @@ namespace Rays
60
59
 
61
60
  ColorSpace color_space;
62
61
 
63
- void* pixels = NULL;
62
+ void* pixels = NULL;
64
63
 
65
64
  CGContextRef context = NULL;
66
65
 
@@ -122,37 +121,44 @@ namespace Rays
122
121
 
123
122
  static void
124
123
  setup_bitmap (
125
- Bitmap* this_,
124
+ Bitmap* bitmap,
126
125
  int w, int h, const ColorSpace& cs,
127
- const void* pixels_ = NULL, bool clear_pixels = true)
126
+ const void* pixels = NULL, bool clear_pixels = true)
128
127
  {
129
- if (!this_ || w <= 0 || h <= 0 || !cs)
128
+ if (w <= 0)
130
129
  argument_error(__FILE__, __LINE__);
130
+ if (h <= 0)
131
+ argument_error(__FILE__, __LINE__);
132
+ if (!cs)
133
+ argument_error(__FILE__, __LINE__);
134
+
135
+ Bitmap::Data* self = bitmap->self.get();
131
136
 
132
- this_->self->clear();
137
+ self->clear();
133
138
 
134
- this_->self->width = w;
135
- this_->self->height = h;
136
- this_->self->color_space = cs;
137
- this_->self->modified = true;
139
+ self->width = w;
140
+ self->height = h;
141
+ self->color_space = cs;
142
+ self->modified = true;
138
143
 
139
144
  size_t size = w * h * cs.Bpp();
140
- this_->self->pixels = new uchar[size];
145
+ self->pixels = new uchar[size];
141
146
 
142
- if (pixels_)
143
- memcpy(this_->self->pixels, pixels_, size);
147
+ if (pixels)
148
+ memcpy(self->pixels, pixels, size);
144
149
  else if (clear_pixels)
145
- memset(this_->self->pixels, 0, size);
150
+ memset(self->pixels, 0, size);
146
151
  }
147
152
 
148
- static void
149
- setup_bitmap (Bitmap* this_, const Texture& tex)
153
+ Bitmap
154
+ Bitmap_from (const Texture& tex)
150
155
  {
151
- if (!this_ || !tex)
156
+ if (!tex)
152
157
  argument_error(__FILE__, __LINE__);
153
158
 
159
+ Bitmap bmp;
154
160
  setup_bitmap(
155
- this_, tex.width(), tex.height(), tex.color_space(), NULL, false);
161
+ &bmp, tex.width(), tex.height(), tex.color_space(), NULL, false);
156
162
 
157
163
  GLenum format, type;
158
164
  ColorSpace_get_gl_format_and_type(&format, &type, tex.color_space());
@@ -160,18 +166,12 @@ namespace Rays
160
166
  FrameBuffer fb(tex);
161
167
  FrameBufferBinder binder(fb.id());
162
168
 
163
- for (int y = 0; y < this_->height(); ++y)
169
+ for (int y = 0; y < bmp.height(); ++y)
164
170
  {
165
- GLvoid* ptr = (GLvoid*) this_->at<uchar>(0, y);
166
- glReadPixels(0, y, this_->width(), 1, format, type, ptr);
171
+ GLvoid* ptr = (GLvoid*) bmp.at<uchar>(0, y);
172
+ glReadPixels(0, y, bmp.width(), 1, format, type, ptr);
167
173
  }
168
- }
169
174
 
170
- Bitmap
171
- Bitmap_from (const Texture& texture)
172
- {
173
- Bitmap bmp;
174
- setup_bitmap(&bmp, texture);
175
175
  return bmp;
176
176
  }
177
177
 
@@ -182,7 +182,9 @@ namespace Rays
182
182
  {
183
183
  if (width == 0 || height == 0) return;
184
184
 
185
- if (!bitmap || !image)
185
+ if (!bitmap)
186
+ argument_error(__FILE__, __LINE__);
187
+ if (!image)
186
188
  argument_error(__FILE__, __LINE__);
187
189
 
188
190
  CGContextRef context = bitmap->self->get_context();
@@ -200,21 +202,24 @@ namespace Rays
200
202
  Bitmap_draw_string (
201
203
  Bitmap* bitmap, const RawFont& font, const char* str, coord x, coord y)
202
204
  {
203
- if (!bitmap || !*bitmap || !font || !str)
205
+ if (!bitmap)
206
+ argument_error(__FILE__, __LINE__);
207
+ if (!*bitmap)
208
+ argument_error(__FILE__, __LINE__);
209
+ if (!font)
210
+ argument_error(__FILE__, __LINE__);
211
+ if (!str)
204
212
  argument_error(__FILE__, __LINE__);
205
213
 
206
214
  if (*str == '\0') return;
207
215
 
208
216
  font.draw_string(bitmap->self->get_context(), bitmap->height(), str, x, y);
209
-
210
217
  Bitmap_set_modified(bitmap);
211
218
  }
212
219
 
213
220
  void
214
221
  Bitmap_set_modified (Bitmap* bitmap, bool modified)
215
222
  {
216
- assert(bitmap);
217
-
218
223
  bitmap->self->modified = modified;
219
224
  }
220
225
 
@@ -267,7 +272,9 @@ namespace Rays
267
272
  Bitmap
268
273
  Bitmap_load (const char* path_)
269
274
  {
270
- if (!path_ || path_[0] == '\0')
275
+ if (!path_)
276
+ argument_error(__FILE__, __LINE__);
277
+ if (path_[0] == '\0')
271
278
  argument_error(__FILE__, __LINE__);
272
279
 
273
280
  NSString* path = [NSString stringWithUTF8String: path_];
data/src/osx/font.mm CHANGED
@@ -154,11 +154,16 @@ namespace Rays
154
154
  {
155
155
  CGContextRef context = (CGContextRef) context_;
156
156
 
157
- if (!*this || !context || !str)
157
+ if (!context)
158
+ argument_error(__FILE__, __LINE__);
159
+ if (!str)
158
160
  argument_error(__FILE__, __LINE__);
159
161
 
160
162
  if (*str == '\0') return;
161
163
 
164
+ if (!*this)
165
+ invalid_state_error(__FILE__, __LINE__);
166
+
162
167
  CTLinePtr line = make_line(self->font, str);
163
168
  if (!line)
164
169
  rays_error(__FILE__, __LINE__, "creating CTLineRef failed.");
data/src/osx/rays.mm CHANGED
@@ -25,7 +25,7 @@ namespace Rays
25
25
  init ()
26
26
  {
27
27
  if (global::pool)
28
- rays_error(__FILE__, __LINE__, "Rays::init(): already initialized.");
28
+ rays_error(__FILE__, __LINE__, "already initialized.");
29
29
 
30
30
  global::pool = [[NSAutoreleasePool alloc] init];
31
31
 
@@ -36,7 +36,7 @@ namespace Rays
36
36
  fin ()
37
37
  {
38
38
  if (!global::pool)
39
- rays_error(__FILE__, __LINE__, "Rays::fin(): not initialized.");
39
+ rays_error(__FILE__, __LINE__, "not initialized.");
40
40
 
41
41
  OpenGL_fin();
42
42
 
data/src/painter.cpp CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
 
4
4
  #include <math.h>
5
+ #include <string.h>
5
6
  #include <assert.h>
6
7
  #include <memory>
7
8
  #include <vector>
@@ -331,7 +332,9 @@ namespace Rays
331
332
  const TextureInfo* texinfo = NULL,
332
333
  const Shader* shader = NULL)
333
334
  {
334
- if (!points || npoints <= 0)
335
+ if (!points)
336
+ argument_error(__FILE__, __LINE__);
337
+ if (npoints <= 0)
335
338
  argument_error(__FILE__, __LINE__);
336
339
 
337
340
  if (!painting)
data/src/point.cpp CHANGED
@@ -159,7 +159,11 @@ namespace Rays
159
159
  Point&
160
160
  Point::operator /= (const This& rhs)
161
161
  {
162
- if (rhs.x == 0 || rhs.y == 0 || rhs.z == 0)
162
+ if (rhs.x == 0)
163
+ argument_error(__FILE__, __LINE__);
164
+ if (rhs.y == 0)
165
+ argument_error(__FILE__, __LINE__);
166
+ if (rhs.z == 0)
163
167
  argument_error(__FILE__, __LINE__);
164
168
 
165
169
  to_glm(*this) /= to_glm(rhs);
@@ -235,7 +239,11 @@ namespace Rays
235
239
  Point
236
240
  operator / (coord lhs, const Point& rhs)
237
241
  {
238
- if (rhs.x == 0 || rhs.y == 0 || rhs.z == 0)
242
+ if (rhs.x == 0)
243
+ argument_error(__FILE__, __LINE__);
244
+ if (rhs.y == 0)
245
+ argument_error(__FILE__, __LINE__);
246
+ if (rhs.z == 0)
239
247
  argument_error(__FILE__, __LINE__);
240
248
 
241
249
  return to_rays<Point>(lhs / to_glm(rhs));
@@ -253,7 +261,11 @@ namespace Rays
253
261
  Point
254
262
  operator / (const Point& lhs, const Point& rhs)
255
263
  {
256
- if (rhs.x == 0 || rhs.y == 0 || rhs.z == 0)
264
+ if (rhs.x == 0)
265
+ argument_error(__FILE__, __LINE__);
266
+ if (rhs.y == 0)
267
+ argument_error(__FILE__, __LINE__);
268
+ if (rhs.z == 0)
257
269
  argument_error(__FILE__, __LINE__);
258
270
 
259
271
  return to_rays<Point>(to_glm(lhs) / to_glm(rhs));
data/src/polygon.cpp CHANGED
@@ -70,12 +70,10 @@ namespace Rays
70
70
  if (!points_)
71
71
  argument_error(__FILE__, __LINE__);
72
72
 
73
- if (
74
- !points.empty() &&
75
- (!colors_ != !pcolors || !texcoords_ != !ptexcoords))
76
- {
73
+ if (!points.empty() && !colors_ != !pcolors)
74
+ argument_error(__FILE__, __LINE__);
75
+ if (!points.empty() && !texcoords_ != !ptexcoords)
77
76
  argument_error(__FILE__, __LINE__);
78
- }
79
77
 
80
78
  segments.emplace_back(points.size(), 0, polyline.hole());
81
79
  points.insert(points.end(), points_, points_ + polyline.size());
@@ -25,16 +25,24 @@ namespace Rays
25
25
 
26
26
  void create (int width_, int height_)
27
27
  {
28
- if (width_ <= 0 || height_ <= 0)
28
+ if (width_ <= 0)
29
+ argument_error(__FILE__, __LINE__);
30
+ if (height_ <= 0)
29
31
  argument_error(__FILE__, __LINE__);
30
32
 
31
33
  if (is_valid())
32
34
  {
33
- if (width != width_ || height == height_)
35
+ if (width != width_)
36
+ {
37
+ argument_error(__FILE__, __LINE__,
38
+ "RenderBuffer is already created and "
39
+ "width parameters is not same as current width.");
40
+ }
41
+ if (height != height_)
34
42
  {
35
43
  argument_error(__FILE__, __LINE__,
36
44
  "RenderBuffer is already created and "
37
- "width/height parameters is not same as current width/height.");
45
+ "height parameters is not same as current height.");
38
46
  }
39
47
  return;
40
48
  }
data/src/shader.cpp CHANGED
@@ -156,6 +156,9 @@ namespace Rays
156
156
  // restore premultiplied rgb values
157
157
  " vec3 rgb__ = col__.a != 0.0 ? col__.rgb / col__.a : col__.rgb;\n"
158
158
  " gl_FragColor = " + V_COLOR + " * vec4(rgb__, col__.a);\n"
159
+ #elif defined(WIN32)
160
+ " float a__ = (col__.r + col__.g + col__.b) / 3.0;\n"
161
+ " gl_FragColor = " + V_COLOR + " * vec4(1.0, 1.0, 1.0, a__);\n"
159
162
  #else
160
163
  " gl_FragColor = " + V_COLOR + " * col__;\n"
161
164
  #endif
@@ -99,42 +99,50 @@ namespace Rays
99
99
  };// UniformValueT
100
100
 
101
101
 
102
- template <> void UniformValueT<int, 1>::apply_value (GLint location) const
102
+ template <> void
103
+ UniformValueT<int, 1>::apply_value (GLint location) const
103
104
  {
104
105
  glUniform1iv(location, 1, array);
105
106
  }
106
107
 
107
- template <> void UniformValueT<int, 2>::apply_value (GLint location) const
108
+ template <> void
109
+ UniformValueT<int, 2>::apply_value (GLint location) const
108
110
  {
109
111
  glUniform2iv(location, 1, array);
110
112
  }
111
113
 
112
- template <> void UniformValueT<int, 3>::apply_value (GLint location) const
114
+ template <> void
115
+ UniformValueT<int, 3>::apply_value (GLint location) const
113
116
  {
114
117
  glUniform3iv(location, 1, array);
115
118
  }
116
119
 
117
- template <> void UniformValueT<int, 4>::apply_value (GLint location) const
120
+ template <> void
121
+ UniformValueT<int, 4>::apply_value (GLint location) const
118
122
  {
119
123
  glUniform4iv(location, 1, array);
120
124
  }
121
125
 
122
- template <> void UniformValueT<float, 1>::apply_value (GLint location) const
126
+ template <> void
127
+ UniformValueT<float, 1>::apply_value (GLint location) const
123
128
  {
124
129
  glUniform1fv(location, 1, array);
125
130
  }
126
131
 
127
- template <> void UniformValueT<float, 2>::apply_value (GLint location) const
132
+ template <> void
133
+ UniformValueT<float, 2>::apply_value (GLint location) const
128
134
  {
129
135
  glUniform2fv(location, 1, array);
130
136
  }
131
137
 
132
- template <> void UniformValueT<float, 3>::apply_value (GLint location) const
138
+ template <> void
139
+ UniformValueT<float, 3>::apply_value (GLint location) const
133
140
  {
134
141
  glUniform3fv(location, 1, array);
135
142
  }
136
143
 
137
- template <> void UniformValueT<float, 4>::apply_value (GLint location) const
144
+ template <> void
145
+ UniformValueT<float, 4>::apply_value (GLint location) const
138
146
  {
139
147
  glUniform4fv(location, 1, array);
140
148
  }
@@ -191,7 +199,9 @@ namespace Rays
191
199
 
192
200
  Uniform (const char* name, const UniformValue* value)
193
201
  {
194
- if (!name || name[0] == '\0')
202
+ if (!name)
203
+ argument_error(__FILE__, __LINE__);
204
+ if (name[0] == '\0')
195
205
  argument_error(__FILE__, __LINE__);
196
206
 
197
207
  reset(value);
@@ -29,7 +29,11 @@ namespace Rays
29
29
 
30
30
  void compile (GLenum type_, const char* source_)
31
31
  {
32
- if (!is_valid_type(type_) || !source_ || !*source_)
32
+ if (!is_valid_type(type_))
33
+ argument_error(__FILE__, __LINE__);
34
+ if (!source_)
35
+ argument_error(__FILE__, __LINE__);
36
+ if (!*source_)
33
37
  argument_error(__FILE__, __LINE__);
34
38
 
35
39
  if (is_valid())
data/src/texture.cpp CHANGED
@@ -23,7 +23,7 @@ namespace Rays
23
23
 
24
24
  ColorSpace color_space;
25
25
 
26
- bool modified;
26
+ bool smooth, modified;
27
27
 
28
28
  Data ()
29
29
  {
@@ -44,6 +44,7 @@ namespace Rays
44
44
  width_pow2 =
45
45
  height_pow2 = 0;
46
46
  color_space = COLORSPACE_UNKNOWN;
47
+ smooth = false;
47
48
  modified = false;
48
49
  }
49
50
 
@@ -110,7 +111,13 @@ namespace Rays
110
111
  size_t width,
111
112
  uchar* dest, size_t dest_stride, const uchar* src, size_t src_stride)
112
113
  {
113
- if (!dest || !src || dest_stride <= 0 || src_stride <= 0)
114
+ if (!dest)
115
+ argument_error(__FILE__, __LINE__);
116
+ if (!src)
117
+ argument_error(__FILE__, __LINE__);
118
+ if (dest_stride <= 0)
119
+ argument_error(__FILE__, __LINE__);
120
+ if ( src_stride <= 0)
114
121
  argument_error(__FILE__, __LINE__);
115
122
 
116
123
  while (width--)
@@ -171,7 +178,8 @@ namespace Rays
171
178
 
172
179
  static void
173
180
  setup_texture (
174
- Texture::Data* self, int width, int height, const ColorSpace& cs,
181
+ Texture::Data* self,
182
+ int width, int height, const ColorSpace& cs, bool smooth = false,
175
183
  const Bitmap* bitmap = NULL, bool npot = false)
176
184
  {
177
185
  assert(self && !self->has_id());
@@ -184,7 +192,8 @@ namespace Rays
184
192
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
185
193
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
186
194
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
187
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);//GL_LINEAR);
195
+ glTexParameteri(
196
+ GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, smooth ? GL_LINEAR : GL_NEAREST);
188
197
 
189
198
  GLenum format, type;
190
199
  ColorSpace_get_gl_format_and_type(&format, &type, cs);
@@ -216,6 +225,7 @@ namespace Rays
216
225
  self->width = width;
217
226
  self->height = height;
218
227
  self->color_space = cs;
228
+ self->smooth = smooth;
219
229
  self->modified = true;
220
230
  }
221
231
 
@@ -224,21 +234,25 @@ namespace Rays
224
234
  {
225
235
  }
226
236
 
227
- Texture::Texture (int width, int height, const ColorSpace& cs)
237
+ Texture::Texture (int width, int height, const ColorSpace& cs, bool smooth)
228
238
  {
229
- if (width <= 0 || height <= 0 || !cs)
239
+ if (width <= 0)
240
+ argument_error(__FILE__, __LINE__);
241
+ if (height <= 0)
242
+ argument_error(__FILE__, __LINE__);
243
+ if (!cs)
230
244
  argument_error(__FILE__, __LINE__);
231
245
 
232
- setup_texture(self.get(), width, height, cs);
246
+ setup_texture(self.get(), width, height, cs, smooth);
233
247
  }
234
248
 
235
- Texture::Texture (const Bitmap& bitmap)
249
+ Texture::Texture (const Bitmap& bitmap, bool smooth)
236
250
  {
237
251
  if (!bitmap)
238
252
  argument_error(__FILE__, __LINE__);
239
253
 
240
254
  setup_texture(
241
- self.get(), bitmap.width(), bitmap.height(), bitmap.color_space(),
255
+ self.get(), bitmap.width(), bitmap.height(), bitmap.color_space(), smooth,
242
256
  &bitmap);
243
257
  }
244
258
 
@@ -249,8 +263,10 @@ namespace Rays
249
263
  argument_error(__FILE__, __LINE__);
250
264
 
251
265
  int w = bitmap.width(), h = bitmap.height();
252
- if (w != width() || h != height())
253
- argument_error(__FILE__, __LINE__, "the size of bitmap does not match");
266
+ if (w != width())
267
+ argument_error(__FILE__, __LINE__, "the width of bitmap does not match");
268
+ if (h != height())
269
+ argument_error(__FILE__, __LINE__, "the height of bitmap does not match");
254
270
 
255
271
  GLenum format, type;
256
272
  ColorSpace_get_gl_format_and_type(&format, &type, bitmap.color_space());
@@ -297,6 +313,12 @@ namespace Rays
297
313
  return self->color_space;
298
314
  }
299
315
 
316
+ bool
317
+ Texture::smooth () const
318
+ {
319
+ return self->smooth;
320
+ }
321
+
300
322
  GLuint
301
323
  Texture::id () const
302
324
  {
data/src/texture.h CHANGED
@@ -24,9 +24,11 @@ namespace Rays
24
24
 
25
25
  Texture ();
26
26
 
27
- Texture (int width, int height, const ColorSpace& cs = RGBA);
27
+ Texture (
28
+ int width, int height, const ColorSpace& cs = RGBA,
29
+ bool smooth = false);
28
30
 
29
- Texture (const Bitmap& bitmap);
31
+ Texture (const Bitmap& bitmap, bool smooth = false);
30
32
 
31
33
  Texture& operator = (const Bitmap& bitmap);
32
34
 
@@ -42,6 +44,8 @@ namespace Rays
42
44
 
43
45
  const ColorSpace& color_space () const;
44
46
 
47
+ bool smooth () const;
48
+
45
49
  GLuint id () const;
46
50
 
47
51
  void set_modified (bool modified = true);