rays 0.3.11 → 0.3.12

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.
@@ -60,6 +60,10 @@ namespace Rays
60
60
  static OffscreenContext*
61
61
  get_opengl_offscreen_context ()
62
62
  {
63
+ #ifdef WASM
64
+ return NULL;
65
+ #endif
66
+
63
67
  static OffscreenContext* context = NULL;
64
68
  if (!context) context = new OffscreenContext();
65
69
  return context;
@@ -96,6 +100,8 @@ namespace Rays
96
100
  activate_offscreen_context ()
97
101
  {
98
102
  const auto* c = get_opengl_offscreen_context();
103
+ if (!c) return;
104
+
99
105
  SDL_GL_MakeCurrent(c->window, c->context);
100
106
  }
101
107
 
@@ -14,15 +14,17 @@ namespace Rays
14
14
 
15
15
  #define A_POSITION (names.attribute_position_names[0])
16
16
  #define A_TEXCOORD (names.attribute_texcoord_names[0])
17
+ #define A_TEXCOORD_MIN (names.attribute_texcoord_min_names[0])
18
+ #define A_TEXCOORD_MAX (names.attribute_texcoord_max_names[0])
17
19
  #define A_COLOR (names.attribute_color_names[0])
18
20
  #define V_POSITION (names.varying_position_name)
19
21
  #define V_TEXCOORD (names.varying_texcoord_name)
22
+ #define V_TEXCOORD_MIN (names.varying_texcoord_min_name)
23
+ #define V_TEXCOORD_MAX (names.varying_texcoord_max_name)
20
24
  #define V_COLOR (names.varying_color_name)
21
25
  #define U_POSITION_MATRIX (names.uniform_position_matrix_names[0])
22
26
  #define U_TEXCOORD_MATRIX (names.uniform_texcoord_matrix_names[0])
23
- #define U_TEXCOORD_MIN (names.uniform_texcoord_min_names[0])
24
- #define U_TEXCOORD_MAX (names.uniform_texcoord_max_names[0])
25
- #define U_TEXCOORD_OFFSET (names.uniform_texcoord_offset_names[0])
27
+ #define U_TEXCOORD_PIXEL (names.uniform_texcoord_pixel_names[0])
26
28
  #define U_TEXTURE (names.uniform_texture_names[0])
27
29
 
28
30
 
@@ -34,22 +36,20 @@ namespace Rays
34
36
 
35
37
  std::unique_ptr<ShaderProgram> program;
36
38
 
37
- std::unique_ptr<ShaderEnv> env;
39
+ ShaderEnv env;
38
40
 
39
41
  Data (
40
42
  const char* fragment_shader_source,
41
43
  const char* vertex_shader_source,
42
44
  ShaderEnv* env_)
45
+ : env(env_ ? *env_ : DEFAULT_ENV)
43
46
  {
44
47
  if (!fragment_shader_source) return;
45
48
 
46
- if (env_)
47
- this->env.reset(new ShaderEnv(*env_));
48
-
49
49
  program.reset(new ShaderProgram(
50
50
  make_vertex_shader_source(vertex_shader_source),
51
51
  ShaderSource(GL_FRAGMENT_SHADER, fragment_shader_source),
52
- env_ ? ShaderEnv_get_flags(*env_) : 0));
52
+ env));
53
53
  }
54
54
 
55
55
  ShaderSource make_vertex_shader_source (const char* source)
@@ -57,10 +57,7 @@ namespace Rays
57
57
  if (source)
58
58
  return ShaderSource(GL_VERTEX_SHADER, source);
59
59
  else
60
- {
61
- return ShaderEnv_get_default_vertex_shader_source(
62
- env ? env.get() : &DEFAULT_ENV);
63
- }
60
+ return ShaderEnv_get_default_vertex_shader_source(&env);
64
61
  }
65
62
 
66
63
  };// Shader::Data
@@ -86,17 +83,17 @@ namespace Rays
86
83
  ShaderEnv_get_builtin_variable_names(DEFAULT_ENV);
87
84
  return Shader(
88
85
  "varying vec4 " + V_TEXCOORD + ";\n"
86
+ "varying vec3 " + V_TEXCOORD_MIN + ";\n"
87
+ "varying vec3 " + V_TEXCOORD_MAX + ";\n"
89
88
  "varying vec4 " + V_COLOR + ";\n"
90
- "uniform vec3 " + U_TEXCOORD_MIN + ";\n"
91
- "uniform vec3 " + U_TEXCOORD_MAX + ";\n"
92
- "uniform vec3 " + U_TEXCOORD_OFFSET + ";\n"
89
+ "uniform vec3 " + U_TEXCOORD_PIXEL + ";\n"
93
90
  "uniform sampler2D " + U_TEXTURE + ";\n"
94
91
  "void main ()\n"
95
92
  "{\n"
96
93
  " vec2 _rays_texcoord = clamp(" +
97
94
  V_TEXCOORD + ".xy, " +
98
- U_TEXCOORD_MIN + ".xy, " +
99
- U_TEXCOORD_MAX + ".xy - " + U_TEXCOORD_OFFSET + ".xy);\n"
95
+ V_TEXCOORD_MIN + ".xy, " +
96
+ V_TEXCOORD_MAX + ".xy - " + U_TEXCOORD_PIXEL + ".xy);\n"
100
97
  " vec4 _rays_color = texture2D(" + U_TEXTURE + ", _rays_texcoord);\n"
101
98
  " gl_FragColor = " + V_COLOR + " * _rays_color;\n"
102
99
  "}\n");
@@ -109,14 +106,14 @@ namespace Rays
109
106
  ShaderEnv_get_builtin_variable_names(DEFAULT_ENV);
110
107
  return Shader(
111
108
  "varying vec4 " + V_TEXCOORD + ";\n"
109
+ "varying vec3 " + V_TEXCOORD_MIN + ";\n"
110
+ "varying vec3 " + V_TEXCOORD_MAX + ";\n"
112
111
  "varying vec4 " + V_COLOR + ";\n"
113
- "uniform vec3 " + U_TEXCOORD_MIN + ";\n"
114
- "uniform vec3 " + U_TEXCOORD_MAX + ";\n"
115
112
  "uniform sampler2D " + U_TEXTURE + ";\n"
116
113
  "void main ()\n"
117
114
  "{\n"
118
- " vec2 _rays_min = " + U_TEXCOORD_MIN + ".xy;\n"
119
- " vec2 _rays_len = " + U_TEXCOORD_MAX + ".xy - _rays_min;\n"
115
+ " vec2 _rays_min = " + V_TEXCOORD_MIN + ".xy;\n"
116
+ " vec2 _rays_len = " + V_TEXCOORD_MAX + ".xy - _rays_min;\n"
120
117
  " vec2 _rays_texcoord = mod(" + V_TEXCOORD + ".xy - _rays_min, _rays_len) + _rays_min;\n"
121
118
  " vec4 _rays_color = texture2D(" + U_TEXTURE + ", _rays_texcoord);\n"
122
119
  " gl_FragColor = " + V_COLOR + " * _rays_color;\n"
@@ -135,7 +132,7 @@ namespace Rays
135
132
  "void main ()\n"
136
133
  "{\n"
137
134
  " vec4 _rays_col = texture2D(" + U_TEXTURE + ", " + V_TEXCOORD + ".xy);\n"
138
- #if defined(OSX) || defined(IOS)
135
+ #if defined(OSX) || defined(IOS) || defined(LINUX)
139
136
  // restore premultiplied rgb values
140
137
  " vec3 _rays_rgb = _rays_col.a != 0.0 ? _rays_col.rgb / _rays_col.a : _rays_col.rgb;\n"
141
138
  " gl_FragColor = " + V_COLOR + " * vec4(_rays_rgb, _rays_col.a);\n"
@@ -157,8 +154,7 @@ namespace Rays
157
154
  const ShaderBuiltinVariableNames&
158
155
  Shader_get_builtin_variable_names (const Shader& shader)
159
156
  {
160
- return ShaderEnv_get_builtin_variable_names(
161
- shader.self->env ? *shader.self->env : DEFAULT_ENV);
157
+ return ShaderEnv_get_builtin_variable_names(shader.self->env);
162
158
  }
163
159
 
164
160
  const Shader&
@@ -395,22 +391,26 @@ namespace Rays
395
391
  String make_default_vertex_shader_source_code ()
396
392
  {
397
393
  return
398
- "attribute vec3 " + A_POSITION + ";\n"
399
- "attribute vec3 " + A_TEXCOORD + ";\n"
394
+ "attribute vec4 " + A_POSITION + ";\n"
395
+ "attribute vec4 " + A_TEXCOORD + ";\n"
396
+ "attribute vec3 " + A_TEXCOORD_MIN + ";\n"
397
+ "attribute vec3 " + A_TEXCOORD_MAX + ";\n"
400
398
  "attribute vec4 " + A_COLOR + ";\n"
401
399
  "varying vec4 " + V_POSITION + ";\n"
402
400
  "varying vec4 " + V_TEXCOORD + ";\n"
401
+ "varying vec3 " + V_TEXCOORD_MIN + ";\n"
402
+ "varying vec3 " + V_TEXCOORD_MAX + ";\n"
403
403
  "varying vec4 " + V_COLOR + ";\n"
404
404
  "uniform mat4 " + U_POSITION_MATRIX + ";\n"
405
405
  "uniform mat4 " + U_TEXCOORD_MATRIX + ";\n"
406
406
  "void main ()\n"
407
407
  "{\n"
408
- " vec4 _rays_pos = vec4(" + A_POSITION + ", 1.0);\n"
409
- " vec4 _rays_texcoord = vec4(" + A_TEXCOORD + ", 1.0);\n"
410
- " " + V_POSITION + " = _rays_pos;\n"
411
- " " + V_TEXCOORD + " = " + U_TEXCOORD_MATRIX + " * _rays_texcoord;\n"
412
- " " + V_COLOR + " = " + A_COLOR + ";\n"
413
- " gl_Position = " + U_POSITION_MATRIX + " * _rays_pos;\n"
408
+ " " + V_POSITION + " = " + A_POSITION + ";\n"
409
+ " " + V_TEXCOORD + " = " + U_TEXCOORD_MATRIX + " * " + A_TEXCOORD + ";\n"
410
+ " " + V_TEXCOORD_MIN + " = " + A_TEXCOORD_MIN + ";\n"
411
+ " " + V_TEXCOORD_MAX + " = " + A_TEXCOORD_MAX + ";\n"
412
+ " " + V_COLOR + " = " + A_COLOR + ";\n"
413
+ " gl_Position = " + U_POSITION_MATRIX + " * " + A_POSITION + ";\n"
414
414
  "}\n";
415
415
  }
416
416
 
@@ -449,23 +449,34 @@ namespace Rays
449
449
  ShaderEnv::ShaderEnv (
450
450
  const NameList& a_position_names,
451
451
  const NameList& a_texcoord_names,
452
+ const NameList& a_texcoord_min_names,
453
+ const NameList& a_texcoord_max_names,
452
454
  const NameList& a_color_names,
453
455
  const char* v_position_name,
454
456
  const char* v_texcoord_name,
457
+ const char* v_texcoord_min_name,
458
+ const char* v_texcoord_max_name,
455
459
  const char* v_color_name,
456
460
  const NameList& u_position_matrix_names,
457
461
  const NameList& u_texcoord_matrix_names,
458
- const NameList& u_texcoord_min_names,
459
- const NameList& u_texcoord_max_names,
460
- const NameList& u_texcoord_offset_names,
462
+ const NameList& u_texcoord_pixel_names,
461
463
  const NameList& u_texture_names,
462
464
  uint flags)
463
465
  : self(new Data(
464
466
  ShaderBuiltinVariableNames(
465
- a_position_names, a_texcoord_names, a_color_names,
466
- v_position_name, v_texcoord_name, v_color_name,
467
- u_position_matrix_names, u_texcoord_matrix_names,
468
- u_texcoord_min_names, u_texcoord_max_names, u_texcoord_offset_names,
467
+ a_position_names,
468
+ a_texcoord_names,
469
+ a_texcoord_min_names,
470
+ a_texcoord_max_names,
471
+ a_color_names,
472
+ v_position_name,
473
+ v_texcoord_name,
474
+ v_texcoord_min_name,
475
+ v_texcoord_max_name,
476
+ v_color_name,
477
+ u_position_matrix_names,
478
+ u_texcoord_matrix_names,
479
+ u_texcoord_pixel_names,
469
480
  u_texture_names),
470
481
  flags))
471
482
  {
@@ -502,40 +513,46 @@ namespace Rays
502
513
  ShaderBuiltinVariableNames::ShaderBuiltinVariableNames (
503
514
  const ShaderEnv::NameList& a_position,
504
515
  const ShaderEnv::NameList& a_texcoord,
516
+ const ShaderEnv::NameList& a_texcoord_min,
517
+ const ShaderEnv::NameList& a_texcoord_max,
505
518
  const ShaderEnv::NameList& a_color,
506
519
  const char* v_position,
507
520
  const char* v_texcoord,
521
+ const char* v_texcoord_min,
522
+ const char* v_texcoord_max,
508
523
  const char* v_color,
509
524
  const ShaderEnv::NameList& u_position_matrix,
510
525
  const ShaderEnv::NameList& u_texcoord_matrix,
511
- const ShaderEnv::NameList& u_texcoord_min,
512
- const ShaderEnv::NameList& u_texcoord_max,
513
- const ShaderEnv::NameList& u_texcoord_offset,
526
+ const ShaderEnv::NameList& u_texcoord_pixel,
514
527
  const ShaderEnv::NameList& u_texture)
515
528
  : attribute_position_names(a_position),
516
529
  attribute_texcoord_names(a_texcoord),
530
+ attribute_texcoord_min_names(a_texcoord_min),
531
+ attribute_texcoord_max_names(a_texcoord_max),
517
532
  attribute_color_names(a_color),
518
- varying_position_name(v_position ? v_position : "v_Position"),
519
- varying_texcoord_name(v_texcoord ? v_texcoord : "v_TexCoord"),
520
- varying_color_name( v_color ? v_color : "v_Color"),
533
+ varying_position_name( v_position ? v_position : "v_Position"),
534
+ varying_texcoord_name( v_texcoord ? v_texcoord : "v_TexCoord"),
535
+ varying_texcoord_min_name(v_texcoord_min ? v_texcoord_min : "v_TexCoordMin"),
536
+ varying_texcoord_max_name(v_texcoord_max ? v_texcoord_max : "v_TexCoordMax"),
537
+ varying_color_name( v_color ? v_color : "v_Color"),
521
538
  uniform_position_matrix_names(u_position_matrix),
522
539
  uniform_texcoord_matrix_names(u_texcoord_matrix),
523
- uniform_texcoord_min_names(u_texcoord_min),
524
- uniform_texcoord_max_names(u_texcoord_max),
525
- uniform_texcoord_offset_names(u_texcoord_offset),
540
+ uniform_texcoord_pixel_names(u_texcoord_pixel),
526
541
  uniform_texture_names(u_texture)
527
542
  {
528
543
  validate_names(&attribute_position_names, "attribute_position", "a_Position");
529
544
  validate_names(&attribute_texcoord_names, "attribute_texcoord", "a_TexCoord");
545
+ validate_names(&attribute_texcoord_min_names, "attribute_texcoord_min", "a_TexCoordMin");
546
+ validate_names(&attribute_texcoord_max_names, "attribute_texcoord_max", "a_TexCoordMax");
530
547
  validate_names(&attribute_color_names, "attribute_color", "a_Color");
531
548
  validate_name(varying_position_name, "varying_position");
532
549
  validate_name(varying_texcoord_name, "varying_texcoord");
550
+ validate_name(varying_texcoord_min_name, "varying_texcoord_min");
551
+ validate_name(varying_texcoord_max_name, "varying_texcoord_max");
533
552
  validate_name(varying_color_name, "varying_color");
534
553
  validate_names(&uniform_position_matrix_names, "uniform_position_matrix", "u_PositionMatrix");
535
554
  validate_names(&uniform_texcoord_matrix_names, "uniform_texcoord_matrix", "u_TexCoordMatrix");
536
- validate_names(&uniform_texcoord_min_names, "uniform_texcoord_min", "u_TexCoordMin");
537
- validate_names(&uniform_texcoord_max_names, "uniform_texcoord_max", "u_TexCoordMax");
538
- validate_names(&uniform_texcoord_offset_names, "uniform_texcoord_offset", "u_TexCoordOffset");
555
+ validate_names(&uniform_texcoord_pixel_names, "uniform_texcoord_pixel", "u_TexCoordPixel");
539
556
  validate_names(&uniform_texture_names, "uniform_texture", "u_Texture");
540
557
  }
541
558
 
data/src/opengl/shader.h CHANGED
@@ -20,31 +20,35 @@ namespace Rays
20
20
 
21
21
  ShaderEnv::NameList attribute_position_names;
22
22
  ShaderEnv::NameList attribute_texcoord_names;
23
+ ShaderEnv::NameList attribute_texcoord_min_names;
24
+ ShaderEnv::NameList attribute_texcoord_max_names;
23
25
  ShaderEnv::NameList attribute_color_names;
24
26
 
25
27
  String varying_position_name;
26
28
  String varying_texcoord_name;
29
+ String varying_texcoord_min_name;
30
+ String varying_texcoord_max_name;
27
31
  String varying_color_name;
28
32
 
29
33
  ShaderEnv::NameList uniform_position_matrix_names;
30
34
  ShaderEnv::NameList uniform_texcoord_matrix_names;
31
- ShaderEnv::NameList uniform_texcoord_min_names;
32
- ShaderEnv::NameList uniform_texcoord_max_names;
33
- ShaderEnv::NameList uniform_texcoord_offset_names;
35
+ ShaderEnv::NameList uniform_texcoord_pixel_names;
34
36
  ShaderEnv::NameList uniform_texture_names;
35
37
 
36
38
  ShaderBuiltinVariableNames (
37
39
  const ShaderEnv::NameList& attribute_position_names,
38
40
  const ShaderEnv::NameList& attribute_texcoord_names,
41
+ const ShaderEnv::NameList& attribute_texcoord_min_names,
42
+ const ShaderEnv::NameList& attribute_texcoord_max_names,
39
43
  const ShaderEnv::NameList& attribute_color_names,
40
44
  const char* varying_position_name,
41
45
  const char* varying_texcoord_name,
46
+ const char* varying_texcoord_min_name,
47
+ const char* varying_texcoord_max_name,
42
48
  const char* varying_color_name,
43
49
  const ShaderEnv::NameList& uniform_position_matrix_names,
44
50
  const ShaderEnv::NameList& uniform_texcoord_matrix_names,
45
- const ShaderEnv::NameList& uniform_texcoord_min_names,
46
- const ShaderEnv::NameList& uniform_texcoord_max_names,
47
- const ShaderEnv::NameList& uniform_texcoord_offset_names,
51
+ const ShaderEnv::NameList& uniform_texcoord_pixel_names,
48
52
  const ShaderEnv::NameList& uniform_texture_names);
49
53
 
50
54
  };// ShaderBuiltinVariableNames
@@ -5,10 +5,10 @@
5
5
  #include <vector>
6
6
  #include <memory>
7
7
  #include <algorithm>
8
- #include "rays/shader.h"
9
8
  #include "rays/exception.h"
10
9
  #include "../painter.h"
11
10
  #include "texture.h"
11
+ #include "shader.h"
12
12
  #include "shader_source.h"
13
13
 
14
14
 
@@ -253,12 +253,12 @@ namespace Rays
253
253
  struct ShaderProgram::Data
254
254
  {
255
255
 
256
- GLuint id = 0;
257
-
258
- uint flags = 0;
256
+ GLuint id = 0;
259
257
 
260
258
  ShaderSource vertex, fragment;
261
259
 
260
+ ShaderEnv env;
261
+
262
262
  UniformList uniform_values, uniform_textures;
263
263
 
264
264
  mutable bool linked = false, applied = false;
@@ -322,6 +322,18 @@ namespace Rays
322
322
  attach_shader(vertex);
323
323
  attach_shader(fragment);
324
324
 
325
+ #ifdef OSX
326
+ // OpenGL compatibility profile historically aliases attribute
327
+ // location 0 with gl_Vertex; some drivers refuse to draw when
328
+ // location 0 is not enabled. Pin position there as a safeguard.
329
+ for (const auto& name :
330
+ ShaderEnv_get_builtin_variable_names(env).attribute_position_names)
331
+ {
332
+ glBindAttribLocation(id, 0, name.c_str());
333
+ OpenGL_check_error(__FILE__, __LINE__);
334
+ }
335
+ #endif
336
+
325
337
  glLinkProgram(id);
326
338
  OpenGL_check_error(__FILE__, __LINE__);
327
339
 
@@ -370,7 +382,8 @@ namespace Rays
370
382
  if (applied) return;
371
383
  applied = true;
372
384
 
373
- bool ignore_no_loc = flags & ShaderEnv::IGNORE_NO_UNIFORM_LOCATION_ERROR;
385
+ bool ignore_no_loc =
386
+ ShaderEnv_get_flags(env) & ShaderEnv::IGNORE_NO_UNIFORM_LOCATION_ERROR;
374
387
 
375
388
  for (size_t i = 0; i < uniform_values.size(); ++i)
376
389
  uniform_values[i].apply(i, program, ignore_no_loc);
@@ -406,11 +419,12 @@ namespace Rays
406
419
 
407
420
 
408
421
  ShaderProgram::ShaderProgram (
409
- const ShaderSource& vertex, const ShaderSource& fragment, uint flags)
422
+ const ShaderSource& vertex, const ShaderSource& fragment,
423
+ const ShaderEnv& env)
410
424
  {
411
425
  self->vertex = vertex;
412
426
  self->fragment = fragment;
413
- self->flags = flags;
427
+ self->env = env;
414
428
  }
415
429
 
416
430
  ShaderProgram::~ShaderProgram ()
@@ -7,6 +7,7 @@
7
7
  #include <xot/pimpl.h>
8
8
  #include "rays/defs.h"
9
9
  #include "rays/coord.h"
10
+ #include "rays/shader.h"
10
11
  #include "opengl.h"
11
12
 
12
13
 
@@ -28,7 +29,7 @@ namespace Rays
28
29
  ShaderProgram (
29
30
  const ShaderSource& vertex,
30
31
  const ShaderSource& fragment,
31
- uint flags);
32
+ const ShaderEnv& env);
32
33
 
33
34
  ~ShaderProgram ();
34
35
 
@@ -58,7 +58,7 @@ namespace Rays
58
58
 
59
59
  const char* add_headers (GLenum type, const char* source, String* buffer)
60
60
  {
61
- #ifdef IOS
61
+ #if defined(IOS) || defined(WASM)
62
62
  if (type == GL_FRAGMENT_SHADER)
63
63
  {
64
64
  static const std::regex PRECISION(R"(^\s*precision\s+\w+p\s+float\s*;)");
@@ -69,9 +69,7 @@ namespace Rays
69
69
  source = buffer->c_str();
70
70
  }
71
71
  }
72
- #endif
73
-
74
- #ifndef IOS
72
+ #else
75
73
  static const std::regex VERSION(R"(^\s*#\s*version\s+\d+)");
76
74
  if (!std::regex_search(source, VERSION))
77
75
  {
@@ -228,6 +228,12 @@ namespace Rays
228
228
  self->modified = true;
229
229
  }
230
230
 
231
+ GLuint
232
+ Texture_get_id (const Texture& texture)
233
+ {
234
+ return texture.self->id;
235
+ }
236
+
231
237
 
232
238
  Texture::Texture ()
233
239
  {
@@ -318,12 +324,6 @@ namespace Rays
318
324
  return self->smooth;
319
325
  }
320
326
 
321
- GLuint
322
- Texture_get_id (const Texture& texture)
323
- {
324
- return texture.self->id;
325
- }
326
-
327
327
  void
328
328
  Texture::set_modified (bool modified)
329
329
  {
@@ -351,5 +351,17 @@ namespace Rays
351
351
  return !operator bool();
352
352
  }
353
353
 
354
+ bool
355
+ operator == (const Texture& lhs, const Texture& rhs)
356
+ {
357
+ return lhs.self->id == rhs.self->id;
358
+ }
359
+
360
+ bool
361
+ operator != (const Texture& lhs, const Texture& rhs)
362
+ {
363
+ return !operator==(lhs, rhs);
364
+ }
365
+
354
366
 
355
367
  }// Rays
data/src/osx/bitmap.mm CHANGED
@@ -263,7 +263,7 @@ namespace Rays
263
263
 
264
264
  NSString* path = [NSString stringWithUTF8String: path_];
265
265
  NSBitmapImageRep* imagerep =
266
- [NSBitmapImageRep imageRepWithContentsOfFile: path];
266
+ (NSBitmapImageRep*) [NSBitmapImageRep imageRepWithContentsOfFile: path];
267
267
  if (!imagerep)
268
268
  rays_error(__FILE__, __LINE__, "[NSBitmapImageRep imageRepWithContentsOfFile] failed.");
269
269