ruby-opengl 0.40.1 → 0.50.0

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 (154) hide show
  1. data/Rakefile +2 -2
  2. data/doc/build_install.txt +48 -28
  3. data/doc/extensions.txt +361 -0
  4. data/doc/history.txt +8 -2
  5. data/doc/requirements_and_design.txt +0 -13
  6. data/doc/roadmap.txt +11 -13
  7. data/doc/supplies/page_template.html +11 -5
  8. data/doc/thanks.txt +2 -4
  9. data/doc/tutorial.txt +1 -4
  10. data/examples/{nehe_lesson02.rb → NeHe/nehe_lesson02.rb} +0 -0
  11. data/examples/{nehe_lesson03.rb → NeHe/nehe_lesson03.rb} +0 -0
  12. data/examples/{nehe_lesson04.rb → NeHe/nehe_lesson04.rb} +0 -0
  13. data/examples/{nehe_lesson05.rb → NeHe/nehe_lesson05.rb} +0 -0
  14. data/examples/NeHe/nehe_lesson36.rb +303 -0
  15. data/examples/OrangeBook/3Dlabs-License.txt +33 -0
  16. data/examples/OrangeBook/brick.frag +36 -0
  17. data/examples/OrangeBook/brick.rb +388 -0
  18. data/examples/OrangeBook/brick.vert +41 -0
  19. data/examples/OrangeBook/particle.frag +17 -0
  20. data/examples/OrangeBook/particle.rb +424 -0
  21. data/examples/OrangeBook/particle.vert +38 -0
  22. data/examples/README +13 -83
  23. data/examples/RedBook/aaindex.rb +97 -0
  24. data/examples/RedBook/aapoly.rb +142 -0
  25. data/examples/RedBook/aargb.rb +119 -0
  26. data/examples/RedBook/accanti.rb +162 -0
  27. data/examples/RedBook/accpersp.rb +215 -0
  28. data/examples/RedBook/alpha.rb +123 -0
  29. data/examples/RedBook/alpha3D.rb +158 -0
  30. data/examples/RedBook/bezcurve.rb +105 -0
  31. data/examples/RedBook/bezmesh.rb +137 -0
  32. data/examples/RedBook/checker.rb +124 -0
  33. data/examples/RedBook/clip.rb +95 -0
  34. data/examples/RedBook/colormat.rb +135 -0
  35. data/examples/RedBook/cube.rb +69 -0
  36. data/examples/RedBook/depthcue.rb +99 -0
  37. data/examples/RedBook/dof.rb +205 -0
  38. data/examples/{legacy → RedBook}/double.rb +59 -58
  39. data/examples/{legacy → RedBook}/drawf.rb +47 -54
  40. data/examples/RedBook/feedback.rb +145 -0
  41. data/examples/RedBook/fog.rb +167 -0
  42. data/examples/RedBook/font.rb +151 -0
  43. data/examples/RedBook/hello.rb +79 -0
  44. data/examples/RedBook/image.rb +137 -0
  45. data/examples/{legacy → RedBook}/jitter.rb +60 -62
  46. data/examples/RedBook/lines.rb +128 -0
  47. data/examples/RedBook/list.rb +111 -0
  48. data/examples/RedBook/material.rb +275 -0
  49. data/examples/RedBook/mipmap.rb +156 -0
  50. data/examples/{legacy → RedBook}/model.rb +66 -72
  51. data/examples/{legacy → RedBook}/movelight.rb +67 -75
  52. data/examples/RedBook/pickdepth.rb +179 -0
  53. data/examples/{legacy → RedBook}/planet.rb +62 -66
  54. data/examples/RedBook/quadric.rb +158 -0
  55. data/examples/RedBook/robot.rb +115 -0
  56. data/examples/RedBook/select.rb +196 -0
  57. data/examples/RedBook/smooth.rb +95 -0
  58. data/examples/RedBook/stencil.rb +163 -0
  59. data/examples/RedBook/stroke.rb +167 -0
  60. data/examples/RedBook/surface.rb +166 -0
  61. data/examples/RedBook/teaambient.rb +132 -0
  62. data/examples/RedBook/teapots.rb +182 -0
  63. data/examples/RedBook/tess.rb +183 -0
  64. data/examples/RedBook/texbind.rb +147 -0
  65. data/examples/RedBook/texgen.rb +169 -0
  66. data/examples/RedBook/texturesurf.rb +128 -0
  67. data/examples/RedBook/varray.rb +159 -0
  68. data/examples/RedBook/wrap.rb +148 -0
  69. data/examples/misc/anisotropic.rb +194 -0
  70. data/examples/misc/font-glut.rb +46 -0
  71. data/examples/{plane.rb → misc/plane.rb} +0 -0
  72. data/examples/misc/readpixel.rb +65 -0
  73. data/examples/{smooth.rb → misc/smooth.rb} +0 -0
  74. data/examples/{test.rb → misc/test.rb} +0 -0
  75. data/ext/common/common.h +252 -70
  76. data/ext/common/gl-enums.h +6102 -7334
  77. data/ext/common/gl-types.h +47 -0
  78. data/ext/common/glu-enums.h +469 -0
  79. data/ext/gl/gl-1.0-1.1.c +842 -2464
  80. data/ext/gl/gl-1.2.c +217 -281
  81. data/ext/gl/gl-1.3.c +113 -133
  82. data/ext/gl/gl-1.4.c +98 -334
  83. data/ext/gl/gl-1.5.c +28 -34
  84. data/ext/gl/gl-2.0.c +26 -235
  85. data/ext/gl/gl-2.1.c +31 -124
  86. data/ext/gl/gl-enums.c +786 -631
  87. data/ext/gl/gl-ext-arb.c +66 -0
  88. data/ext/gl/gl-ext-ext.c +218 -0
  89. data/ext/gl/gl.c +138 -31
  90. data/ext/gl/mkrf_conf.rb +1 -0
  91. data/ext/glu/glu-enums.c +163 -0
  92. data/ext/glu/glu.c +1003 -1205
  93. data/ext/glu/mkrf_conf.rb +1 -0
  94. data/ext/glut/glut.c +1056 -1175
  95. data/lib/opengl.rb +90 -3
  96. data/test/tc_common.rb +26 -13
  97. data/test/tc_ext_arb.rb +73 -0
  98. data/test/tc_ext_ext.rb +74 -0
  99. data/test/tc_func_12.rb +8 -8
  100. data/test/tc_func_13.rb +17 -11
  101. data/test/tc_func_14.rb +8 -8
  102. data/test/tc_func_15.rb +190 -2
  103. data/test/tc_func_20.rb +36 -10
  104. data/test/tc_func_21.rb +445 -2
  105. data/test/tc_glu.rb +305 -0
  106. data/test/tc_misc.rb +1 -0
  107. metadata +84 -68
  108. data/doc/screenshots.txt +0 -23
  109. data/examples/legacy/COPYRIGHT +0 -8
  110. data/examples/legacy/aaindex.rb +0 -98
  111. data/examples/legacy/aapoly.rb +0 -153
  112. data/examples/legacy/aargb.rb +0 -139
  113. data/examples/legacy/accanti.rb +0 -159
  114. data/examples/legacy/accpersp.rb +0 -216
  115. data/examples/legacy/alpha.rb +0 -133
  116. data/examples/legacy/alpha3D.rb +0 -165
  117. data/examples/legacy/bezcurve.rb +0 -107
  118. data/examples/legacy/bezmesh.rb +0 -131
  119. data/examples/legacy/checker.rb +0 -121
  120. data/examples/legacy/clip.rb +0 -104
  121. data/examples/legacy/colormat.rb +0 -145
  122. data/examples/legacy/cube.rb +0 -73
  123. data/examples/legacy/depthcue.rb +0 -101
  124. data/examples/legacy/dof.rb +0 -212
  125. data/examples/legacy/feedback.rb +0 -152
  126. data/examples/legacy/fog.rb +0 -172
  127. data/examples/legacy/font-glut.rb +0 -41
  128. data/examples/legacy/font.rb +0 -158
  129. data/examples/legacy/hello.rb +0 -75
  130. data/examples/legacy/image.rb +0 -145
  131. data/examples/legacy/lines.rb +0 -135
  132. data/examples/legacy/list.rb +0 -120
  133. data/examples/legacy/material.rb +0 -290
  134. data/examples/legacy/mipmap.rb +0 -159
  135. data/examples/legacy/pickdepth.rb +0 -180
  136. data/examples/legacy/quadric.rb +0 -180
  137. data/examples/legacy/readpixel.rb +0 -59
  138. data/examples/legacy/robot.rb +0 -120
  139. data/examples/legacy/select.rb +0 -207
  140. data/examples/legacy/smooth.rb +0 -41
  141. data/examples/legacy/stencil.rb +0 -154
  142. data/examples/legacy/stroke.rb +0 -170
  143. data/examples/legacy/surface.rb +0 -170
  144. data/examples/legacy/teaambient.rb +0 -132
  145. data/examples/legacy/teapots.rb +0 -188
  146. data/examples/legacy/tess.rb +0 -222
  147. data/examples/legacy/texbind.rb +0 -157
  148. data/examples/legacy/texgen.rb +0 -171
  149. data/examples/legacy/texturesurf.rb +0 -128
  150. data/examples/legacy/varray.rb +0 -167
  151. data/examples/legacy/wrap.rb +0 -158
  152. data/lib/gl_prev.rb +0 -46
  153. data/lib/glu_prev.rb +0 -46
  154. data/lib/glut_prev.rb +0 -45
data/ext/gl/gl-1.2.c CHANGED
@@ -15,47 +15,12 @@
15
15
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
16
16
  */
17
17
 
18
- #ifdef __APPLE__
19
- #include <OpenGL/gl.h>
20
- #elif defined WIN32
21
- #include <windows.h>
22
- #include <GL/gl.h>
23
- #else
24
- #include <GL/gl.h>
25
- #endif
26
18
  #include "../common/common.h"
27
19
 
28
20
  /* OpenGL 1.2 functions */
29
21
 
30
- static void (APIENTRY * fptr_glBlendColor)(GLclampf,GLclampf,GLclampf,GLclampf);
31
- static VALUE
32
- gl_BlendColor(obj,arg1,arg2,arg3,arg4)
33
- VALUE obj,arg1,arg2,arg3,arg4;
34
- {
35
- GLclampf red;
36
- GLclampf green;
37
- GLclampf blue;
38
- GLclampf alpha;
39
- LOAD_GL_FUNC(glBlendColor)
40
- red = (GLclampf)NUM2DBL(arg1);
41
- green = (GLclampf)NUM2DBL(arg2);
42
- blue = (GLclampf)NUM2DBL(arg3);
43
- alpha = (GLclampf)NUM2DBL(arg4);
44
- fptr_glBlendColor(red,green,blue,alpha);
45
- return Qnil;
46
- }
47
-
48
- static void (APIENTRY * fptr_glBlendEquation)(GLenum);
49
- static VALUE
50
- gl_BlendEquation(obj,arg1)
51
- VALUE obj,arg1;
52
- {
53
- GLenum mode;
54
- LOAD_GL_FUNC(glBlendEquation)
55
- mode = (GLenum)NUM2INT(arg1);
56
- fptr_glBlendEquation(mode);
57
- return Qnil;
58
- }
22
+ GL_SIMPLE_FUNC_LOAD(BlendColor,4,GLclampf,NUM2DBL)
23
+ GL_SIMPLE_FUNC_LOAD(BlendEquation,1,GLenum,NUM2INT)
59
24
 
60
25
  static void (APIENTRY * fptr_glDrawRangeElements)(GLenum,GLuint,GLuint,GLsizei,GLenum,GLvoid*);
61
26
  static VALUE
@@ -73,8 +38,12 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6;
73
38
  end = (GLuint)NUM2UINT(arg3);
74
39
  count = (GLsizei)NUM2UINT(arg4);
75
40
  type = (GLenum)NUM2INT(arg5);
76
- Check_Type(arg6, T_STRING);
77
- fptr_glDrawRangeElements(mode, start, end, count, type, RSTRING(arg6)->ptr);
41
+ if (CheckBufferBinding(GL_ELEMENT_ARRAY_BUFFER_BINDING)) {
42
+ fptr_glDrawRangeElements(mode, start, end, count, type, (GLvoid *)NUM2INT(arg6));
43
+ } else {
44
+ Check_Type(arg6, T_STRING);
45
+ fptr_glDrawRangeElements(mode, start, end, count, type, RSTRING(arg6)->ptr);
46
+ }
78
47
  return Qnil;
79
48
  }
80
49
 
@@ -88,24 +57,19 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6;
88
57
  GLsizei width;
89
58
  GLenum format;
90
59
  GLenum type;
91
- GLsizei format_size;
92
- GLsizei type_size;
93
- GLsizei size;
94
60
  LOAD_GL_FUNC(glColorTable)
95
61
  target = (GLenum)NUM2INT(arg1);
96
62
  internalformat = (GLenum)NUM2INT(arg2);
97
63
  width = (GLsizei)NUM2UINT(arg3);
98
64
  format = (GLenum)NUM2INT(arg4);
99
65
  type = (GLenum)NUM2INT(arg5);
100
- Check_Type(arg6,T_STRING);
101
- format_size = glformat_size(format);
102
- type_size = gltype_size(type);
103
- if (type_size == -1 || format_size == -1)
104
- rb_raise(rb_eTypeError, "type/format mismatch");
105
- size = format_size*type_size*width;
106
- if (RSTRING(arg6)->len < size)
107
- rb_raise(rb_eArgError, "string length:%d", RSTRING(arg6)->len);
108
- fptr_glColorTable(target,internalformat,width,format,type,RSTRING(arg6)->ptr);
66
+ if (CheckBufferBinding(GL_PIXEL_UNPACK_BUFFER_BINDING)) {
67
+ fptr_glColorTable(target,internalformat,width,format,type,(GLvoid *)NUM2INT(arg6));
68
+ } else {
69
+ Check_Type(arg6,T_STRING);
70
+ CheckDataSize(type,format,width,arg6);
71
+ fptr_glColorTable(target,internalformat,width,format,type,RSTRING(arg6)->ptr);
72
+ }
109
73
  return Qnil;
110
74
  }
111
75
 
@@ -156,9 +120,9 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5;
156
120
  LOAD_GL_FUNC(glCopyColorTable)
157
121
  target = (GLenum)NUM2INT(arg1);
158
122
  internalformat = (GLenum)NUM2INT(arg2);
159
- x = (GLenum)NUM2INT(arg3);
160
- y = (GLenum)NUM2INT(arg4);
161
- width = (GLenum)NUM2INT(arg5);
123
+ x = (GLint)NUM2INT(arg3);
124
+ y = (GLint)NUM2INT(arg4);
125
+ width = (GLsizei)NUM2INT(arg5);
162
126
  fptr_glCopyColorTable(target,internalformat,x,y,width);
163
127
  return Qnil;
164
128
  }
@@ -231,9 +195,6 @@ VALUE obj,arg1,arg2,arg3;
231
195
  GLenum target;
232
196
  GLenum format;
233
197
  GLenum type;
234
- GLsizei format_size;
235
- GLsizei type_size;
236
- GLsizei size;
237
198
  GLsizei width = 0;
238
199
  VALUE data;
239
200
  LOAD_GL_FUNC(glGetColorTable)
@@ -241,16 +202,8 @@ VALUE obj,arg1,arg2,arg3;
241
202
  target = (GLenum)NUM2INT(arg1);
242
203
  format = (GLenum)NUM2INT(arg2);
243
204
  type = (GLenum)NUM2INT(arg3);
244
- format_size = glformat_size(format);
245
- type_size = gltype_size(type);
246
- if (type_size == -1 || format_size == -1)
247
- rb_raise(rb_eTypeError, "type/format mismatch");
248
205
  fptr_glGetColorTableParameteriv(target,GL_COLOR_TABLE_WIDTH,&width);
249
- if (type==GL_BITMAP)
250
- size = format_size*(width/8);
251
- else
252
- size = type_size*format_size*width;
253
- data = allocate_buffer_with_string(size);
206
+ data = allocate_buffer_with_string(GetDataSize(type,format,width));
254
207
  FORCE_PIXEL_STORE_MODE
255
208
  fptr_glGetColorTable(target,format,type,(GLvoid*)RSTRING(data)->ptr);
256
209
  RESTORE_PIXEL_STORE_MODE
@@ -267,24 +220,19 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6;
267
220
  GLsizei count;
268
221
  GLenum format;
269
222
  GLenum type;
270
- GLsizei format_size;
271
- GLsizei type_size;
272
- GLsizei size;
273
223
  LOAD_GL_FUNC(glColorSubTable)
274
224
  target = (GLenum)NUM2INT(arg1);
275
225
  start = (GLsizei)NUM2UINT(arg2);
276
226
  count = (GLsizei)NUM2UINT(arg3);
277
227
  format = (GLenum)NUM2INT(arg4);
278
228
  type = (GLenum)NUM2INT(arg5);
279
- Check_Type(arg6,T_STRING);
280
- format_size = glformat_size(format);
281
- type_size = gltype_size(type);
282
- if (type_size == -1 || format_size == -1)
283
- rb_raise(rb_eTypeError, "type/format mismatch");
284
- size = format_size*type_size*count;
285
- if (RSTRING(arg6)->len < size)
286
- rb_raise(rb_eArgError, "string length:%d", RSTRING(arg6)->len);
287
- fptr_glColorSubTable(target,start,count,format,type,RSTRING(arg6)->ptr);
229
+ if (CheckBufferBinding(GL_PIXEL_UNPACK_BUFFER_BINDING)) {
230
+ fptr_glColorSubTable(target,start,count,format,type,(GLvoid *)NUM2INT(arg6));
231
+ } else {
232
+ Check_Type(arg6,T_STRING);
233
+ CheckDataSize(type,format,count,arg6);
234
+ fptr_glColorSubTable(target,start,count,format,type,RSTRING(arg6)->ptr);
235
+ }
288
236
  return Qnil;
289
237
  }
290
238
 
@@ -318,27 +266,19 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6;
318
266
  GLsizei width;
319
267
  GLenum format;
320
268
  GLenum type;
321
- GLsizei format_size;
322
- GLsizei type_size;
323
- GLsizei size;
324
269
  LOAD_GL_FUNC(glConvolutionFilter1D)
325
270
  target = (GLenum)NUM2INT(arg1);
326
271
  internalformat = (GLenum)NUM2INT(arg2);
327
272
  width = (GLsizei)NUM2UINT(arg3);
328
273
  format = (GLenum)NUM2INT(arg4);
329
274
  type = (GLenum)NUM2INT(arg5);
330
- Check_Type(arg6,T_STRING);
331
- format_size = glformat_size(format);
332
- type_size = gltype_size(type);
333
- if (type_size == -1 || format_size == -1)
334
- rb_raise(rb_eTypeError, "type/format mismatch");
335
- if (type==GL_BITMAP)
336
- size = format_size*(width/8);
337
- else
338
- size = type_size*format_size*width;
339
- if (RSTRING(arg6)->len < size)
340
- rb_raise(rb_eArgError, "string length:%d", RSTRING(arg6)->len);
341
- fptr_glConvolutionFilter1D(target,internalformat,width,format,type,RSTRING(arg6)->ptr);
275
+ if (CheckBufferBinding(GL_PIXEL_UNPACK_BUFFER_BINDING)) {
276
+ fptr_glConvolutionFilter1D(target,internalformat,width,format,type,(GLvoid *)NUM2INT(arg6));
277
+ } else {
278
+ Check_Type(arg6,T_STRING);
279
+ CheckDataSize(type,format,width,arg6);
280
+ fptr_glConvolutionFilter1D(target,internalformat,width,format,type,RSTRING(arg6)->ptr);
281
+ }
342
282
  return Qnil;
343
283
  }
344
284
 
@@ -353,9 +293,6 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7;
353
293
  GLsizei height;
354
294
  GLenum format;
355
295
  GLenum type;
356
- GLsizei format_size;
357
- GLsizei type_size;
358
- GLsizei size;
359
296
  LOAD_GL_FUNC(glConvolutionFilter2D)
360
297
  target = (GLenum)NUM2INT(arg1);
361
298
  internalformat = (GLenum)NUM2INT(arg2);
@@ -363,18 +300,13 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7;
363
300
  height = (GLsizei)NUM2UINT(arg4);
364
301
  format = (GLenum)NUM2INT(arg5);
365
302
  type = (GLenum)NUM2INT(arg6);
366
- Check_Type(arg7,T_STRING);
367
- format_size = glformat_size(format);
368
- type_size = gltype_size(type);
369
- if (type_size == -1 || format_size == -1)
370
- rb_raise(rb_eTypeError, "type/format mismatch");
371
- if (type==GL_BITMAP)
372
- size = format_size*((width*height)/8);
373
- else
374
- size = type_size*format_size*width*height;
375
- if (RSTRING(arg7)->len < size)
376
- rb_raise(rb_eArgError, "string length:%d", RSTRING(arg7)->len);
377
- fptr_glConvolutionFilter2D(target,internalformat,width,height,format,type,RSTRING(arg7)->ptr);
303
+ if (CheckBufferBinding(GL_PIXEL_UNPACK_BUFFER_BINDING)) {
304
+ fptr_glConvolutionFilter2D(target,internalformat,width,height,format,type,(GLvoid *)NUM2INT(arg7));
305
+ } else {
306
+ Check_Type(arg7,T_STRING);
307
+ CheckDataSize(type,format,width*height,arg7);
308
+ fptr_glConvolutionFilter2D(target,internalformat,width,height,format,type,RSTRING(arg7)->ptr);
309
+ }
378
310
  return Qnil;
379
311
  }
380
312
 
@@ -550,86 +482,107 @@ VALUE obj,arg1,arg2;
550
482
 
551
483
  static void (APIENTRY * fptr_glGetConvolutionFilter)(GLenum,GLenum,GLenum,GLvoid *);
552
484
  static VALUE
553
- gl_GetConvolutionFilter(obj,arg1,arg2,arg3)
554
- VALUE obj,arg1,arg2,arg3;
485
+ gl_GetConvolutionFilter(argc,argv,obj)
486
+ int argc;
487
+ VALUE *argv;
488
+ VALUE obj;
555
489
  {
556
490
  GLenum target;
557
491
  GLenum format;
558
492
  GLenum type;
559
- GLsizei format_size;
560
- GLsizei type_size;
493
+ //GLsizei format_size;
494
+ //GLsizei type_size;
561
495
  GLint size = 0;
562
496
  VALUE data;
497
+ VALUE args[4];
498
+ int numargs;
563
499
  LOAD_GL_FUNC(glGetConvolutionFilter)
564
500
  LOAD_GL_FUNC(glGetConvolutionParameteriv)
565
- target = (GLenum)NUM2INT(arg1);
566
- format = (GLenum)NUM2INT(arg2);
567
- type = (GLenum)NUM2INT(arg3);
568
- format_size = glformat_size(format);
569
- type_size = gltype_size(type);
570
- if (type_size == -1 || format_size == -1)
571
- rb_raise(rb_eTypeError, "type/format mismatch");
572
- if (target==GL_CONVOLUTION_1D) {
573
- fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_WIDTH,&size);
574
- } else {
575
- GLint tmp = 0;
576
- fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_WIDTH,&tmp);
577
- fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_HEIGHT,&size);
578
- size *=tmp;
501
+ numargs = rb_scan_args(argc, argv, "31", &args[0], &args[1], &args[2], &args[3]);
502
+ target = (GLenum)NUM2INT(args[0]);
503
+ format = (GLenum)NUM2INT(args[1]);
504
+ type = (GLenum)NUM2INT(args[2]);
505
+
506
+ switch(numargs) {
507
+ default:
508
+ case 3:
509
+ if (CheckBufferBinding(GL_PIXEL_PACK_BUFFER_BINDING))
510
+ rb_raise(rb_eArgError, "Pixel pack buffer bound, but offset argument missing");
511
+
512
+ if (target==GL_CONVOLUTION_1D) {
513
+ fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_WIDTH,&size);
514
+ } else {
515
+ GLint tmp = 0;
516
+ fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_WIDTH,&tmp);
517
+ fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_HEIGHT,&size);
518
+ size *=tmp;
519
+ }
520
+ data = allocate_buffer_with_string(GetDataSize(type,format,size));
521
+ FORCE_PIXEL_STORE_MODE
522
+ fptr_glGetConvolutionFilter(target,format,type,(GLvoid*)RSTRING(data)->ptr);
523
+ RESTORE_PIXEL_STORE_MODE
524
+ return data;
525
+ case 4:
526
+ if (!CheckBufferBinding(GL_PIXEL_PACK_BUFFER_BINDING))
527
+ rb_raise(rb_eArgError, "Pixel pack buffer not bound");
528
+
529
+ FORCE_PIXEL_STORE_MODE
530
+ fptr_glGetConvolutionFilter(target,format,type,(GLvoid*)NUM2INT(args[3]));
531
+ RESTORE_PIXEL_STORE_MODE
532
+ return Qnil;
579
533
  }
580
- if (type==GL_BITMAP)
581
- size = (size/8)*format_size;
582
- else
583
- size = size*type_size*format_size;
584
- data = allocate_buffer_with_string(size);
585
- FORCE_PIXEL_STORE_MODE
586
- fptr_glGetConvolutionFilter(target,format,type,(GLvoid*)RSTRING(data)->ptr);
587
- RESTORE_PIXEL_STORE_MODE
588
- return data;
589
534
  }
590
535
 
591
536
  static void (APIENTRY * fptr_glGetSeparableFilter)(GLenum,GLenum,GLenum,GLvoid*,GLvoid*,GLvoid*);
592
537
  static VALUE
593
- gl_GetSeparableFilter(obj,arg1,arg2,arg3)
594
- VALUE obj,arg1,arg2,arg3;
538
+ gl_GetSeparableFilter(argc,argv,obj)
539
+ int argc;
540
+ VALUE *argv;
541
+ VALUE obj;
595
542
  {
596
543
  GLenum target;
597
544
  GLenum format;
598
545
  GLenum type;
599
- GLsizei format_size;
600
- GLsizei type_size;
601
546
  GLint size_row = 0;
602
547
  GLint size_column = 0;
603
548
  VALUE data_row;
604
549
  VALUE data_column;
605
550
  VALUE retary;
551
+ VALUE args[6];
552
+ int numargs;
606
553
  LOAD_GL_FUNC(glGetSeparableFilter)
607
554
  LOAD_GL_FUNC(glGetConvolutionParameteriv)
608
- target = (GLenum)NUM2INT(arg1);
609
- format = (GLenum)NUM2INT(arg2);
610
- type = (GLenum)NUM2INT(arg3);
611
- format_size = glformat_size(format);
612
- type_size = gltype_size(type);
613
- if (type_size == -1 || format_size == -1)
614
- rb_raise(rb_eTypeError, "type/format mismatch");
615
- fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_WIDTH,&size_row);
616
- fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_HEIGHT,&size_column);
617
- if (type==GL_BITMAP) {
618
- size_row = (size_row/8)*format_size;
619
- size_column = (size_column/8)*format_size;
620
- } else {
621
- size_row *= type_size*format_size;
622
- size_column *= type_size*format_size;
623
- }
624
- data_row = allocate_buffer_with_string(size_row);
625
- data_column = allocate_buffer_with_string(size_column);
626
- FORCE_PIXEL_STORE_MODE
627
- fptr_glGetSeparableFilter(target,format,type,(GLvoid*)RSTRING(data_row)->ptr,(GLvoid*)RSTRING(data_column)->ptr,0);
628
- RESTORE_PIXEL_STORE_MODE
629
- retary = rb_ary_new2(2);
630
- rb_ary_push(retary, data_row);
631
- rb_ary_push(retary, data_column);
632
- return retary;
555
+ numargs = rb_scan_args(argc, argv, "33", &args[0], &args[1], &args[2], &args[3], &args[4], &args[5]);
556
+ target = (GLenum)NUM2INT(args[0]);
557
+ format = (GLenum)NUM2INT(args[1]);
558
+ type = (GLenum)NUM2INT(args[2]);
559
+
560
+ switch(numargs) {
561
+ default:
562
+ case 3:
563
+ if (CheckBufferBinding(GL_PIXEL_PACK_BUFFER_BINDING))
564
+ rb_raise(rb_eArgError, "Pixel pack buffer bound, but offset arguments missing");
565
+
566
+ fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_WIDTH,&size_row);
567
+ fptr_glGetConvolutionParameteriv(target,GL_CONVOLUTION_HEIGHT,&size_column);
568
+ data_row = allocate_buffer_with_string(GetDataSize(type,format,size_row));
569
+ data_column = allocate_buffer_with_string(GetDataSize(type,format,size_column));
570
+ FORCE_PIXEL_STORE_MODE
571
+ fptr_glGetSeparableFilter(target,format,type,(GLvoid*)RSTRING(data_row)->ptr,(GLvoid*)RSTRING(data_column)->ptr,0);
572
+ RESTORE_PIXEL_STORE_MODE
573
+ retary = rb_ary_new2(2);
574
+ rb_ary_push(retary, data_row);
575
+ rb_ary_push(retary, data_column);
576
+ return retary;
577
+ break;
578
+ case 6:
579
+ if (!CheckBufferBinding(GL_PIXEL_PACK_BUFFER_BINDING))
580
+ rb_raise(rb_eArgError, "Pixel pack buffer not bound");
581
+ FORCE_PIXEL_STORE_MODE
582
+ fptr_glGetSeparableFilter(target,format,type,(GLvoid*)NUM2INT(args[3]),(GLvoid*)NUM2INT(args[4]),(GLvoid*)NUM2INT(args[5]));
583
+ RESTORE_PIXEL_STORE_MODE
584
+ return Qnil;
585
+ }
633
586
  }
634
587
 
635
588
  static void (APIENTRY * fptr_glSeparableFilter2D)(GLenum,GLenum,GLsizei,GLsizei,GLenum,GLenum,const GLvoid *,const GLvoid *);
@@ -643,10 +596,6 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8;
643
596
  GLsizei height;
644
597
  GLenum format;
645
598
  GLenum type;
646
- GLsizei format_size;
647
- GLsizei type_size;
648
- GLsizei size_row;
649
- GLsizei size_column;
650
599
  LOAD_GL_FUNC(glSeparableFilter2D)
651
600
  target = (GLenum)NUM2INT(arg1);
652
601
  internalformat = (GLenum)NUM2INT(arg2);
@@ -654,25 +603,15 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8;
654
603
  height = (GLsizei)NUM2UINT(arg4);
655
604
  format = (GLenum)NUM2INT(arg5);
656
605
  type = (GLenum)NUM2INT(arg6);
657
- Check_Type(arg7,T_STRING);
658
- Check_Type(arg8,T_STRING);
659
- format_size = glformat_size(format);
660
- type_size = gltype_size(type);
661
- if (type_size == -1 || format_size == -1)
662
- rb_raise(rb_eTypeError, "type/format mismatch");
663
- if (type==GL_BITMAP) {
664
- size_row = format_size*(width/8);
665
- size_column = format_size*(height/8);
606
+ if (CheckBufferBinding(GL_PIXEL_UNPACK_BUFFER_BINDING)) {
607
+ fptr_glSeparableFilter2D(target,internalformat,width,height,format,type,(GLvoid *)NUM2INT(arg7),(GLvoid *)NUM2INT(arg8));
666
608
  } else {
667
- size_row = type_size*format_size*width;
668
- size_column = type_size*format_size*height;
609
+ Check_Type(arg7,T_STRING);
610
+ Check_Type(arg8,T_STRING);
611
+ CheckDataSize(type,format,width,arg7);
612
+ CheckDataSize(type,format,height,arg8);
613
+ fptr_glSeparableFilter2D(target,internalformat,width,height,format,type,RSTRING(arg7)->ptr,RSTRING(arg8)->ptr);
669
614
  }
670
- if (RSTRING(arg7)->len < size_row)
671
- rb_raise(rb_eArgError, "string length:%d", RSTRING(arg7)->len);
672
- if (RSTRING(arg8)->len < size_column)
673
- rb_raise(rb_eArgError, "string length:%d", RSTRING(arg8)->len);
674
-
675
- fptr_glSeparableFilter2D(target,internalformat,width,height,format,type,RSTRING(arg7)->ptr,RSTRING(arg8)->ptr);
676
615
  return Qnil;
677
616
  }
678
617
 
@@ -714,70 +653,93 @@ VALUE obj,arg1,arg2,arg3;
714
653
 
715
654
  static void (APIENTRY * fptr_glGetHistogram)(GLenum,GLboolean,GLenum,GLenum,GLvoid*);
716
655
  static VALUE
717
- gl_GetHistogram(obj,arg1,arg2,arg3,arg4)
718
- VALUE obj,arg1,arg2,arg3,arg4;
656
+ gl_GetHistogram(argc,argv,obj)
657
+ int argc;
658
+ VALUE *argv;
659
+ VALUE obj;
719
660
  {
720
661
  GLenum target;
721
662
  GLboolean reset;
722
663
  GLenum format;
723
664
  GLenum type;
724
- GLsizei format_size;
725
- GLsizei type_size;
726
665
  GLint size = 0;
727
666
  VALUE data;
667
+ VALUE args[5];
668
+ int numargs;
728
669
  LOAD_GL_FUNC(glGetHistogram)
729
670
  LOAD_GL_FUNC(glGetHistogramParameteriv)
730
- target = (GLenum)NUM2INT(arg1);
731
- reset = (GLboolean)NUM2INT(arg2);
732
- format = (GLenum)NUM2INT(arg3);
733
- type = (GLenum)NUM2INT(arg4);
734
- format_size = glformat_size(format);
735
- type_size = gltype_size(type);
736
- if (type_size == -1 || format_size == -1)
737
- rb_raise(rb_eTypeError, "type/format mismatch");
738
- fptr_glGetHistogramParameteriv(target,GL_HISTOGRAM_WIDTH,&size);
739
- if (type==GL_BITMAP)
740
- size = (size/8)*format_size;
741
- else
742
- size = size*type_size*format_size;
743
- data = allocate_buffer_with_string(size);
744
- FORCE_PIXEL_STORE_MODE
745
- fptr_glGetHistogram(target,reset,format,type,(GLvoid*)RSTRING(data)->ptr);
746
- RESTORE_PIXEL_STORE_MODE
747
- return data;
671
+ numargs = rb_scan_args(argc, argv, "41", &args[0], &args[1], &args[2], &args[3], &args[4]);
672
+ target = (GLenum)NUM2INT(args[0]);
673
+ reset = (GLboolean)NUM2INT(args[1]);
674
+ format = (GLenum)NUM2INT(args[2]);
675
+ type = (GLenum)NUM2INT(args[3]);
676
+
677
+ switch(numargs) {
678
+ default:
679
+ case 4:
680
+ if (CheckBufferBinding(GL_PIXEL_PACK_BUFFER_BINDING))
681
+ rb_raise(rb_eArgError, "Pixel pack buffer bound, but offset argument missing");
682
+
683
+ fptr_glGetHistogramParameteriv(target,GL_HISTOGRAM_WIDTH,&size);
684
+ data = allocate_buffer_with_string(GetDataSize(type,format,size));
685
+ FORCE_PIXEL_STORE_MODE
686
+ fptr_glGetHistogram(target,reset,format,type,(GLvoid*)RSTRING(data)->ptr);
687
+ RESTORE_PIXEL_STORE_MODE
688
+ return data;
689
+ break;
690
+ case 5:
691
+ if (!CheckBufferBinding(GL_PIXEL_PACK_BUFFER_BINDING))
692
+ rb_raise(rb_eArgError, "Pixel pack buffer not bound");
693
+
694
+ FORCE_PIXEL_STORE_MODE
695
+ fptr_glGetHistogram(target,reset,format,type,(GLvoid*)NUM2INT(args[4]));
696
+ RESTORE_PIXEL_STORE_MODE
697
+ return Qnil;
698
+ }
748
699
  }
749
700
 
750
701
  static void (APIENTRY * fptr_glGetMinmax)(GLenum,GLboolean,GLenum,GLenum,GLvoid *);
751
702
  static VALUE
752
- gl_GetMinmax(obj,arg1,arg2,arg3,arg4)
753
- VALUE obj,arg1,arg2,arg3,arg4;
703
+ gl_GetMinmax(argc,argv,obj)
704
+ int argc;
705
+ VALUE *argv;
706
+ VALUE obj;
754
707
  {
755
708
  GLenum target;
756
709
  GLboolean reset;
757
710
  GLenum format;
758
711
  GLenum type;
759
- GLsizei format_size;
760
- GLsizei type_size;
761
- GLint size;
762
712
  VALUE data;
713
+ VALUE args[5];
714
+ int numargs;
763
715
  LOAD_GL_FUNC(glGetMinmax)
764
- target = (GLenum)NUM2INT(arg1);
765
- reset = (GLboolean)NUM2INT(arg2);
766
- format = (GLenum)NUM2INT(arg3);
767
- type = (GLenum)NUM2INT(arg4);
768
- format_size = glformat_size(format);
769
- type_size = gltype_size(type);
770
- if (type_size == -1 || format_size == -1)
771
- rb_raise(rb_eTypeError, "type/format mismatch");
772
- if (type==GL_BITMAP)
773
- size = format_size*(2/8);
774
- else
775
- size = type_size*format_size*2;
776
- data = allocate_buffer_with_string(size);
777
- FORCE_PIXEL_STORE_MODE
778
- fptr_glGetMinmax(target,reset,format,type,(GLvoid*)RSTRING(data)->ptr);
779
- RESTORE_PIXEL_STORE_MODE
780
- return data;
716
+ numargs = rb_scan_args(argc, argv, "41", &args[0], &args[1], &args[2], &args[3], &args[4]);
717
+ target = (GLenum)NUM2INT(args[0]);
718
+ reset = (GLboolean)NUM2INT(args[1]);
719
+ format = (GLenum)NUM2INT(args[2]);
720
+ type = (GLenum)NUM2INT(args[3]);
721
+
722
+ switch(numargs) {
723
+ default:
724
+ case 4:
725
+ if (CheckBufferBinding(GL_PIXEL_PACK_BUFFER_BINDING))
726
+ rb_raise(rb_eArgError, "Pixel pack buffer bound, but offset argument missing");
727
+
728
+ data = allocate_buffer_with_string(GetDataSize(type,format,2));
729
+ FORCE_PIXEL_STORE_MODE
730
+ fptr_glGetMinmax(target,reset,format,type,(GLvoid*)RSTRING(data)->ptr);
731
+ RESTORE_PIXEL_STORE_MODE
732
+ return data;
733
+ break;
734
+ case 5:
735
+ if (!CheckBufferBinding(GL_PIXEL_PACK_BUFFER_BINDING))
736
+ rb_raise(rb_eArgError, "Pixel pack buffer not bound");
737
+
738
+ FORCE_PIXEL_STORE_MODE
739
+ fptr_glGetMinmax(target,reset,format,type,(GLvoid*)NUM2INT(args[4]));
740
+ RESTORE_PIXEL_STORE_MODE
741
+ return Qnil;
742
+ }
781
743
  }
782
744
 
783
745
  static void (APIENTRY * fptr_glGetMinmaxParameterfv)(GLenum,GLenum,GLfloat *);
@@ -889,9 +851,6 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10;
889
851
  GLenum format;
890
852
  GLenum type;
891
853
  const char *pixels;
892
- int size;
893
- int type_size;
894
- int format_size;
895
854
  LOAD_GL_FUNC(glTexImage3D)
896
855
  target = (GLenum)NUM2INT(arg1);
897
856
  level = (GLint)NUM2INT(arg2);
@@ -902,29 +861,23 @@ VALUE obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10;
902
861
  border = (GLint)NUM2INT(arg7);
903
862
  format = (GLenum)NUM2INT(arg8);
904
863
  type = (GLenum)NUM2INT(arg9);
905
- Check_Type(arg10, T_STRING);
906
- type_size = gltype_size(type);
907
- format_size = glformat_size(format);
908
- if (type_size == -1 || format_size == -1)
864
+
865
+ if (CheckBufferBinding(GL_PIXEL_UNPACK_BUFFER_BINDING)) {
866
+ fptr_glTexImage3D( target, level, internalFormat, width, height,
867
+ depth, border, format, type,(GLvoid *)NUM2INT(arg10));
909
868
  return Qnil;
910
- if (type==GL_BITMAP)
911
- size = format_size*((height*width*depth)/8);
912
- else
913
- size = type_size*format_size*height*width*depth;
869
+ }
914
870
 
915
- if (target == GL_PROXY_TEXTURE_3D || NIL_P(arg10)) { /* proxy texture, no data read */
871
+ if (target == GL_PROXY_TEXTURE_3D ||
872
+ target == GL_PROXY_TEXTURE_1D_STACK_MESAX ||
873
+ target == GL_PROXY_TEXTURE_2D_STACK_MESAX ||
874
+ target == GL_PROXY_TEXTURE_2D_ARRAY_EXT ||
875
+ NIL_P(arg10)) { /* proxy texture, no data read */
916
876
  pixels = NULL;
917
877
  } else {
918
- if (TYPE(arg10) == T_FIXNUM || TYPE(arg10) == T_BIGNUM) { /* arg10 is offset to unpack buffer */
919
- pixels = (const char *)NUM2UINT(arg10);
920
- } else if (TYPE(arg10) == T_STRING) { /* image data */
921
- if (RSTRING(arg10)->len < size)
922
- rb_raise(rb_eArgError, "string length:%d",RSTRING(arg10)->len);
923
- pixels = RSTRING(arg10)->ptr;
924
- } else {
925
- Check_Type(arg10,T_STRING); /* force exception */
926
- return Qnil;
927
- }
878
+ Check_Type(arg10,T_STRING);
879
+ CheckDataSize(type,format,width*height*depth,arg10);
880
+ pixels = RSTRING(arg10)->ptr;
928
881
  }
929
882
  fptr_glTexImage3D( target, level, internalFormat, width, height,
930
883
  depth, border, format, type,pixels);
@@ -946,10 +899,6 @@ VALUE arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11;
946
899
  GLsizei depth;
947
900
  GLenum format;
948
901
  GLenum type;
949
- const char *pixels;
950
- int size;
951
- int type_size;
952
- int format_size;
953
902
  LOAD_GL_FUNC(glTexSubImage3D)
954
903
  target = (GLenum)NUM2INT(arg1);
955
904
  level = (GLint)NUM2INT(arg2);
@@ -961,30 +910,17 @@ VALUE arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11;
961
910
  depth = (GLsizei)NUM2UINT(arg8);
962
911
  format = (GLenum)NUM2INT(arg9);
963
912
  type = (GLenum)NUM2INT(arg10);
964
- Check_Type(arg11, T_STRING);
965
- type_size = gltype_size(type);
966
- format_size = glformat_size(format);
967
- if (type_size == -1 || format_size == -1)
968
- return Qnil;
969
- if (type==GL_BITMAP)
970
- size = format_size*((height*width*depth)/8);
971
- else
972
- size = type_size*format_size*height*width*depth;
973
-
974
- if (TYPE(arg11) == T_STRING) {
975
- if (RSTRING(arg11)->len < size)
976
- rb_raise(rb_eArgError, "string length:%d",RSTRING(arg11)->len);
977
- pixels = RSTRING(arg11)->ptr;
978
- } else if (TYPE(arg11) == T_FIXNUM || TYPE(arg11) == T_BIGNUM) { /* arg11 is offset to unpack buffer */
979
- pixels = (const char *)NUM2UINT(arg11);
913
+ if (CheckBufferBinding(GL_PIXEL_UNPACK_BUFFER_BINDING)) {
914
+ fptr_glTexSubImage3D( target, level, xoffset, yoffset, zoffset,
915
+ width, height, depth,
916
+ format, type, (GLvoid *)NUM2INT(arg11));
980
917
  } else {
981
- Check_Type(arg11,T_STRING); /* force exception */
982
- return Qnil;
983
- }
984
-
985
- fptr_glTexSubImage3D( target, level, xoffset, yoffset, zoffset,
918
+ Check_Type(arg11, T_STRING);
919
+ CheckDataSize(type,format,height*width*depth,arg11);
920
+ fptr_glTexSubImage3D( target, level, xoffset, yoffset, zoffset,
986
921
  width, height, depth,
987
- format, type, pixels);
922
+ format, type, RSTRING(arg11)->ptr);
923
+ }
988
924
  return Qnil;
989
925
  }
990
926
 
@@ -1040,15 +976,15 @@ void gl_init_functions_1_2(VALUE module)
1040
976
  rb_define_module_function(module, "glConvolutionParameteriv", gl_ConvolutionParameteriv, 3);
1041
977
  rb_define_module_function(module, "glCopyConvolutionFilter1D", gl_CopyConvolutionFilter1D, 5);
1042
978
  rb_define_module_function(module, "glCopyConvolutionFilter2D", gl_CopyConvolutionFilter2D, 6);
1043
- rb_define_module_function(module, "glGetConvolutionFilter", gl_GetConvolutionFilter, 3);
979
+ rb_define_module_function(module, "glGetConvolutionFilter", gl_GetConvolutionFilter, -1);
1044
980
  rb_define_module_function(module, "glGetConvolutionParameterfv", gl_GetConvolutionParameterfv, 2);
1045
981
  rb_define_module_function(module, "glGetConvolutionParameteriv", gl_GetConvolutionParameteriv, 2);
1046
- rb_define_module_function(module, "glGetSeparableFilter", gl_GetSeparableFilter, 3);
982
+ rb_define_module_function(module, "glGetSeparableFilter", gl_GetSeparableFilter, -1);
1047
983
  rb_define_module_function(module, "glSeparableFilter2D", gl_SeparableFilter2D, 8);
1048
- rb_define_module_function(module, "glGetHistogram", gl_GetHistogram, 4);
984
+ rb_define_module_function(module, "glGetHistogram", gl_GetHistogram, -1);
1049
985
  rb_define_module_function(module, "glGetHistogramParameterfv", gl_GetHistogramParameterfv, 2);
1050
986
  rb_define_module_function(module, "glGetHistogramParameteriv", gl_GetHistogramParameteriv, 2);
1051
- rb_define_module_function(module, "glGetMinmax", gl_GetMinmax, 4);
987
+ rb_define_module_function(module, "glGetMinmax", gl_GetMinmax, -1);
1052
988
  rb_define_module_function(module, "glGetMinmaxParameterfv", gl_GetMinmaxParameterfv, 2);
1053
989
  rb_define_module_function(module, "glGetMinmaxParameteriv", gl_GetMinmaxParameteriv, 2);
1054
990
  rb_define_module_function(module, "glHistogram", gl_Histogram, 4);