texplay 0.2.800 → 0.2.900

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 (51) hide show
  1. data/CHANGELOG +138 -119
  2. data/README.markdown +43 -41
  3. data/Rakefile +68 -68
  4. data/examples/common.rb +8 -8
  5. data/examples/example_alpha_blend.rb +31 -31
  6. data/examples/example_bezier.rb +42 -42
  7. data/examples/example_color_control.rb +69 -69
  8. data/examples/example_color_transform.rb +64 -67
  9. data/examples/example_color_transform_circle.rb +65 -0
  10. data/examples/example_dup.rb +75 -75
  11. data/examples/example_each.rb +42 -42
  12. data/examples/example_effect.rb +35 -35
  13. data/examples/example_fill.rb +44 -44
  14. data/examples/example_fill_old.rb +49 -49
  15. data/examples/example_fluent.rb +31 -31
  16. data/examples/example_gen_eval.rb +34 -34
  17. data/examples/example_hash_arguments.rb +47 -47
  18. data/examples/example_light.rb +77 -0
  19. data/examples/example_lsystem.rb +61 -61
  20. data/examples/example_melt.rb +27 -27
  21. data/examples/example_meyet.rb +64 -0
  22. data/examples/example_polyline.rb +43 -43
  23. data/examples/example_scale.rb +29 -29
  24. data/examples/example_simple.rb +48 -38
  25. data/examples/example_sync.rb +60 -60
  26. data/examples/example_trace.rb +1 -1
  27. data/examples/example_turtle.rb +40 -40
  28. data/examples/example_weird.rb +3 -1
  29. data/examples/media/Thumbs.db +0 -0
  30. data/ext/texplay/actions.c +999 -1001
  31. data/ext/texplay/actions.h +60 -60
  32. data/ext/texplay/bindings.c +1162 -1149
  33. data/ext/texplay/bindings.h +46 -46
  34. data/ext/texplay/cache.c +118 -118
  35. data/ext/texplay/cache.h +24 -24
  36. data/ext/texplay/compat.h +27 -27
  37. data/ext/texplay/extconf.rb +28 -28
  38. data/ext/texplay/gen_eval.c +211 -211
  39. data/ext/texplay/gen_eval.h +20 -20
  40. data/ext/texplay/graphics_utils.c +188 -63
  41. data/ext/texplay/graphics_utils.h +0 -1
  42. data/ext/texplay/object2module.c +171 -171
  43. data/ext/texplay/object2module.h +11 -11
  44. data/ext/texplay/texplay.c +169 -169
  45. data/ext/texplay/texplay.h +147 -130
  46. data/ext/texplay/utils.c +816 -752
  47. data/ext/texplay/utils.h +151 -145
  48. data/lib/texplay-contrib.rb +171 -171
  49. data/lib/texplay.rb +162 -137
  50. data/lib/texplay/version.rb +1 -1
  51. metadata +9 -5
@@ -16,6 +16,7 @@ static void process_common_hash_args(action_struct * cur, VALUE * hash_arg, sync
16
16
  static void prepare_drawing_mode(action_struct * cur);
17
17
  static void prepare_fill_texture(action_struct * cur);
18
18
  static void prepare_color_control(action_struct * cur);
19
+ static void prepare_color_select(action_struct * cur);
19
20
  static rgba apply_lerp(action_struct * payload, texture_info * tex, int x, int y);
20
21
  static rgba apply_alpha_blend(action_struct * payload, texture_info * tex, int x, int y, rgba blended_pixel);
21
22
  static rgba apply_drawing_mode(action_struct * payload, texture_info * tex, int x, int y);
@@ -30,22 +31,23 @@ update_lazy_bounds(action_struct * cur, texture_info * tex)
30
31
  {
31
32
 
32
33
  /* only update global bounds if we're doing a lazy_sync */
33
- if(cur->sync_mode == lazy_sync) {
34
- int xmin, ymin, xmax, ymax;
35
- VALUE lazy_bounds;
36
-
37
- lazy_bounds = get_image_local(tex->image, LAZY_BOUNDS);
38
-
39
- xmin = INT2FIX(MIN(cur->xmin, FIX2INT(get_from_array(lazy_bounds, 0))));
40
- ymin = INT2FIX(MIN(cur->ymin, FIX2INT(get_from_array(lazy_bounds, 1))));
41
- xmax = INT2FIX(MAX(cur->xmax, FIX2INT(get_from_array(lazy_bounds, 2))));
42
- ymax = INT2FIX(MAX(cur->ymax, FIX2INT(get_from_array(lazy_bounds, 3))));
34
+ if (cur->sync_mode != lazy_sync)
35
+ return;
36
+
37
+ VALUE lazy_bounds;
38
+ int xmin, ymin, xmax, ymax;
43
39
 
44
- set_array_value(lazy_bounds, 0, xmin);
45
- set_array_value(lazy_bounds, 1, ymin);
46
- set_array_value(lazy_bounds, 2, xmax);
47
- set_array_value(lazy_bounds, 3, ymax);
48
- }
40
+ lazy_bounds = get_image_local(tex->image, LAZY_BOUNDS);
41
+
42
+ xmin = INT2FIX(MIN(cur->xmin, FIX2INT(get_from_array(lazy_bounds, 0))));
43
+ ymin = INT2FIX(MIN(cur->ymin, FIX2INT(get_from_array(lazy_bounds, 1))));
44
+ xmax = INT2FIX(MAX(cur->xmax, FIX2INT(get_from_array(lazy_bounds, 2))));
45
+ ymax = INT2FIX(MAX(cur->ymax, FIX2INT(get_from_array(lazy_bounds, 3))));
46
+
47
+ set_array_value(lazy_bounds, 0, xmin);
48
+ set_array_value(lazy_bounds, 1, ymin);
49
+ set_array_value(lazy_bounds, 2, xmax);
50
+ set_array_value(lazy_bounds, 3, ymax);
49
51
  }
50
52
 
51
53
  void
@@ -63,11 +65,11 @@ update_bounds(action_struct * cur, int xmin, int ymin, int xmax, int ymax)
63
65
  void
64
66
  set_local_bounds(action_struct * cur, int xmin, int ymin, int xmax, int ymax, texture_info * tex)
65
67
  {
66
- if(cur->sync_mode == no_sync)
67
- return;
68
68
 
69
69
  /* local bounds used by both eager_sync and lazy_sync: */
70
-
70
+ if(cur->sync_mode == no_sync)
71
+ return;
72
+
71
73
  /* eager sync: to demarcate precise area to sync to opengl */
72
74
  /* lazy sync: to update global bounds */
73
75
  cur->xmin = xmin;
@@ -145,6 +147,55 @@ set_pixel_color(rgba * pixel_color, texture_info * tex, int x, int y)
145
147
  tex_data[alpha] = pixel_color->alpha;
146
148
  }
147
149
 
150
+ static bool
151
+ skip_pixel(rgba source_color, action_struct * payload, texture_info * tex, int x, int y)
152
+ {
153
+
154
+ if (!payload->pen.has_color_select) return false;
155
+
156
+ rgba dest_color = get_pixel_color(tex, x, y);
157
+ bool color_match = false;
158
+
159
+ if (payload->pen.source_select.size > 0) {
160
+ for (int i = 0; i < payload->pen.source_select.size; i++) {
161
+ if (cmp_color(source_color, payload->pen.source_select.colors[i])) {
162
+ color_match = true;
163
+ break;
164
+ }
165
+ }
166
+ if (!color_match) return true;
167
+ }
168
+
169
+
170
+ if (payload->pen.source_ignore.size > 0) {
171
+ for (int i = 0; i < payload->pen.source_ignore.size; i++) {
172
+ if (cmp_color(source_color, payload->pen.source_ignore.colors[i]))
173
+ return true;
174
+ }
175
+ }
176
+
177
+ color_match = false;
178
+ if (payload->pen.dest_select.size > 0) {
179
+ for (int i = 0; i < payload->pen.dest_select.size; i++) {
180
+ if (cmp_color(dest_color, payload->pen.dest_select.colors[i])) {
181
+ color_match = true;
182
+ break;
183
+ }
184
+ }
185
+ if (!color_match) return true;
186
+ }
187
+
188
+ if (payload->pen.dest_ignore.size > 0) {
189
+ for (int i = 0; i < payload->pen.dest_ignore.size; i++) {
190
+ if (cmp_color(dest_color, payload->pen.dest_ignore.colors[i]))
191
+ return true;
192
+ }
193
+ }
194
+
195
+ return false;
196
+ }
197
+
198
+
148
199
  void
149
200
  set_pixel_color_with_style(action_struct * payload, texture_info * tex, int x, int y)
150
201
  {
@@ -153,6 +204,7 @@ set_pixel_color_with_style(action_struct * payload, texture_info * tex, int x, i
153
204
 
154
205
  blended_pixel = payload->color;
155
206
 
207
+
156
208
  /* for linear interpolation */
157
209
  if(payload->pen.has_lerp) {
158
210
  blended_pixel = apply_lerp(payload, tex, x, y);
@@ -168,12 +220,15 @@ set_pixel_color_with_style(action_struct * payload, texture_info * tex, int x, i
168
220
  x % payload->pen.source_tex.width,
169
221
  y % payload->pen.source_tex.height);
170
222
 
171
- /* for color_control block */
223
+ /* for color_control proc */
172
224
  if(payload->pen.has_color_control_proc)
173
225
  blended_pixel = exec_color_control_proc(payload, tex, x, y, blended_pixel);
174
-
175
226
 
176
- /* TO DO: do bitwise pixel combinations here */
227
+ /* should skip this pixel? */
228
+ if (skip_pixel(blended_pixel, payload, tex, x, y))
229
+ return;
230
+
231
+ /* drawing modes */
177
232
  if(payload->pen.has_drawing_mode) {
178
233
  blended_pixel = apply_drawing_mode(payload, tex, x, y);
179
234
  }
@@ -245,12 +300,16 @@ get_pixel_data(texture_info * tex, int x, int y)
245
300
  VALUE
246
301
  create_image(VALUE window, int width, int height)
247
302
  {
248
- VALUE gosu = rb_const_get(rb_cObject, rb_intern("Gosu"));
249
- VALUE image = rb_const_get(gosu, rb_intern("Image"));
303
+ static VALUE empty_image_stub = 0;
304
+ static VALUE image = 0;
305
+
306
+ if (empty_image_stub == 0) {
307
+ VALUE gosu = rb_const_get(rb_cObject, rb_intern("Gosu"));
308
+ VALUE tp = rb_const_get(rb_cObject, rb_intern("TexPlay"));
309
+ empty_image_stub = rb_const_get(tp, rb_intern("EmptyImageStub"));
310
+ image = rb_const_get(gosu, rb_intern("Image"));
311
+ }
250
312
 
251
- VALUE tp = rb_const_get(rb_cObject, rb_intern("TexPlay"));
252
- VALUE empty_image_stub = rb_const_get(tp, rb_intern("EmptyImageStub"));
253
-
254
313
  VALUE rmagick_img;
255
314
  VALUE new_image;
256
315
 
@@ -293,6 +352,13 @@ initialize_action_struct(action_struct * cur, VALUE hash_arg, sync sync_mode)
293
352
 
294
353
  /* drawing mode is off by deafult */
295
354
  cur->pen.has_drawing_mode = false;
355
+
356
+ /* color selection */
357
+ cur->pen.has_color_select = false;
358
+ cur->pen.source_select.size = 0;
359
+ cur->pen.source_ignore.size = 0;
360
+ cur->pen.dest_select.size = 0;
361
+ cur->pen.dest_ignore.size = 0;
296
362
  }
297
363
 
298
364
  /* TODO: fix this function below, it's too ugly and bulky and weird **/
@@ -365,6 +431,9 @@ process_common_hash_args(action_struct * cur, VALUE * hash_arg, sync sync_mode,
365
431
 
366
432
  }
367
433
 
434
+ /* prepare color selection */
435
+ prepare_color_select(cur);
436
+
368
437
  /* process drawing mode */
369
438
  prepare_drawing_mode(cur);
370
439
 
@@ -450,14 +519,14 @@ prepare_drawing_mode(action_struct * cur)
450
519
  cur->pen.drawing_mode = darken;
451
520
  else if(draw_mode == string2sym("lighten"))
452
521
  cur->pen.drawing_mode = lighten;
453
- else if(draw_mode == string2sym("colordodge"))
454
- cur->pen.drawing_mode = colordodge;
455
- else if(draw_mode == string2sym("colorburn"))
456
- cur->pen.drawing_mode = colorburn;
457
- else if(draw_mode == string2sym("hardlight"))
458
- cur->pen.drawing_mode = hardlight;
459
- else if(draw_mode == string2sym("softlight"))
460
- cur->pen.drawing_mode = softlight;
522
+ else if(draw_mode == string2sym("color_dodge"))
523
+ cur->pen.drawing_mode = color_dodge;
524
+ else if(draw_mode == string2sym("color_burn"))
525
+ cur->pen.drawing_mode = color_burn;
526
+ else if(draw_mode == string2sym("hard_light"))
527
+ cur->pen.drawing_mode = hard_light;
528
+ else if(draw_mode == string2sym("soft_light"))
529
+ cur->pen.drawing_mode = soft_light;
461
530
  else if(draw_mode == string2sym("difference"))
462
531
  cur->pen.drawing_mode = difference;
463
532
  else if(draw_mode == string2sym("exclusion"))
@@ -488,24 +557,23 @@ prepare_color_control(action_struct * cur)
488
557
  VALUE try_mult = get_from_hash(try_val, "mult");
489
558
 
490
559
  if(is_an_array(try_add)) {
491
- if(RARRAY_LEN(try_add) < 4)
492
- rb_raise(rb_eArgError, ":color_control transform :add needs 4 parameters");
493
560
 
494
- cur->pen.color_add.red = NUM2DBL(get_from_array(try_add, 0));
495
- cur->pen.color_add.green = NUM2DBL(get_from_array(try_add, 1));
496
- cur->pen.color_add.blue = NUM2DBL(get_from_array(try_add, 2));
497
- cur->pen.color_add.alpha = NUM2DBL(get_from_array(try_add, 3));
561
+ cur->pen.color_add = convert_rb_color_to_rgba(try_add);
562
+ /* cur->pen.color_add.red = NUM2DBL(get_from_array(try_add, 0)); */
563
+ /* cur->pen.color_add.green = NUM2DBL(get_from_array(try_add, 1)); */
564
+ /* cur->pen.color_add.blue = NUM2DBL(get_from_array(try_add, 2)); */
565
+ /* cur->pen.color_add.alpha = NUM2DBL(get_from_array(try_add, 3)); */
498
566
 
499
567
  cur->pen.has_color_control_transform = true;
500
568
  }
501
569
  if(is_an_array(try_mult)) {
502
- if(RARRAY_LEN(try_mult) < 4)
503
- rb_raise(rb_eArgError, ":color_control transform :mult needs 4 parameters");
504
570
 
505
- cur->pen.color_mult.red = NUM2DBL(get_from_array(try_mult, 0));
506
- cur->pen.color_mult.green = NUM2DBL(get_from_array(try_mult, 1));
507
- cur->pen.color_mult.blue = NUM2DBL(get_from_array(try_mult, 2));
508
- cur->pen.color_mult.alpha = NUM2DBL(get_from_array(try_mult, 3));
571
+ cur->pen.color_mult = convert_rb_color_to_rgba(try_mult);
572
+
573
+ /* cur->pen.color_mult.red = NUM2DBL(get_from_array(try_mult, 0)); */
574
+ /* cur->pen.color_mult.green = NUM2DBL(get_from_array(try_mult, 1)); */
575
+ /* cur->pen.color_mult.blue = NUM2DBL(get_from_array(try_mult, 2)); */
576
+ /* cur->pen.color_mult.alpha = NUM2DBL(get_from_array(try_mult, 3)); */
509
577
 
510
578
  cur->pen.has_color_control_transform = true;
511
579
  }
@@ -576,6 +644,65 @@ prepare_fill_texture(action_struct * payload)
576
644
  }
577
645
  }
578
646
 
647
+ static void
648
+ process_select_color_list(rgba_list * clist, VALUE try_color)
649
+ {
650
+ /* is a general array of colors? i.e [:red, Gosu::Color::RED, [1,1,1,1] ] */
651
+ if (TYPE(try_color) == T_ARRAY && not_rb_raw_color(try_color)) {
652
+ int num_colors = RARRAY_LEN(try_color);
653
+
654
+ if (num_colors > RGBA_LIST_SIZE)
655
+ rb_raise(rb_eArgError, "Too many colors given in array. Maximum is %d\n. Got %d\n",
656
+ RGBA_LIST_SIZE, num_colors);
657
+
658
+ for (int i = 0; i < RARRAY_LEN(try_color); ++i) {
659
+ clist->colors[i] = convert_rb_color_to_rgba(get_from_array(try_color, i));
660
+ }
661
+
662
+ clist->size = num_colors;
663
+ }
664
+
665
+ /* is a single color value? i.e :red, [1,1,1,1], Gosu::Color::GREEN */
666
+ else {
667
+ clist->colors[0] = convert_rb_color_to_rgba(try_color);
668
+ clist->size = 1;
669
+ }
670
+ }
671
+
672
+
673
+ static void
674
+ prepare_color_select(action_struct * payload)
675
+ {
676
+ VALUE try_color = get_from_hash(payload->hash_arg,
677
+ "source_select");
678
+ if (!NIL_P(try_color)) {
679
+ process_select_color_list(&payload->pen.source_select, try_color);
680
+ payload->pen.has_color_select = true;
681
+ }
682
+
683
+ try_color = get_from_hash(payload->hash_arg,
684
+ "source_ignore");
685
+ if (!NIL_P(try_color)) {
686
+ process_select_color_list(&payload->pen.source_ignore, try_color);
687
+ payload->pen.has_color_select = true;
688
+ }
689
+
690
+ try_color = get_from_hash(payload->hash_arg,
691
+ "dest_select");
692
+ if (!NIL_P(try_color)) {
693
+ process_select_color_list(&payload->pen.dest_select, try_color);
694
+ payload->pen.has_color_select = true;
695
+ }
696
+
697
+ try_color = get_from_hash(payload->hash_arg,
698
+ "dest_ignore");
699
+ if (!NIL_P(try_color)) {
700
+ process_select_color_list(&payload->pen.dest_ignore, try_color);
701
+ payload->pen.has_color_select = true;
702
+ }
703
+
704
+ }
705
+
579
706
  /***********************************/
580
707
  /**** drawing mode related code ****/
581
708
  /***********************************/
@@ -720,32 +847,32 @@ apply_drawing_mode(action_struct * payload, texture_info * tex, int x, int y)
720
847
  finished_pixel = color_int_vals_to_float_format(~source_pixel_char.red,
721
848
  ~source_pixel_char.green,
722
849
  ~source_pixel_char.blue,
723
- ~source_pixel_char.alpha);
850
+ source_pixel_char.alpha);
724
851
  break;
725
852
  case invert:
726
853
  finished_pixel = color_int_vals_to_float_format(~dest_pixel_char.red,
727
854
  ~dest_pixel_char.green,
728
855
  ~dest_pixel_char.blue,
729
- ~dest_pixel_char.alpha);
856
+ dest_pixel_char.alpha);
730
857
 
731
858
  break;
732
859
  case and_reverse:
733
860
  finished_pixel = color_int_vals_to_float_format(source_pixel_char.red | ~dest_pixel_char.red,
734
861
  source_pixel_char.green | ~dest_pixel_char.green,
735
862
  source_pixel_char.blue | ~dest_pixel_char.blue,
736
- source_pixel_char.alpha | ~dest_pixel_char.alpha);
863
+ source_pixel_char.alpha);
737
864
  break;
738
865
  case and:
739
866
  finished_pixel = color_int_vals_to_float_format(source_pixel_char.red & dest_pixel_char.red,
740
867
  source_pixel_char.green & dest_pixel_char.green,
741
868
  source_pixel_char.blue & dest_pixel_char.blue,
742
- source_pixel_char.alpha & dest_pixel_char.alpha);
869
+ source_pixel_char.alpha);
743
870
  break;
744
871
  case or:
745
872
  finished_pixel = color_int_vals_to_float_format(source_pixel_char.red | dest_pixel_char.red,
746
873
  source_pixel_char.green | dest_pixel_char.green,
747
874
  source_pixel_char.blue | dest_pixel_char.blue,
748
- source_pixel_char.alpha | dest_pixel_char.alpha);
875
+ source_pixel_char.alpha);
749
876
 
750
877
  break;
751
878
  case nand:
@@ -759,34 +886,34 @@ apply_drawing_mode(action_struct * payload, texture_info * tex, int x, int y)
759
886
  finished_pixel = color_int_vals_to_float_format(~(source_pixel_char.red | dest_pixel_char.red),
760
887
  ~(source_pixel_char.green | dest_pixel_char.green),
761
888
  ~(source_pixel_char.blue | dest_pixel_char.blue),
762
- ~(source_pixel_char.alpha | dest_pixel_char.alpha));
889
+ source_pixel_char.alpha);
763
890
 
764
891
  break;
765
892
  case xor:
766
893
  finished_pixel = color_int_vals_to_float_format(source_pixel_char.red ^ dest_pixel_char.red,
767
894
  source_pixel_char.green ^ dest_pixel_char.green,
768
895
  source_pixel_char.blue ^ dest_pixel_char.blue,
769
- source_pixel_char.alpha ^ dest_pixel_char.alpha);
896
+ source_pixel_char.alpha);
770
897
 
771
898
  break;
772
899
  case equiv:
773
900
  finished_pixel = color_int_vals_to_float_format(~(source_pixel_char.red ^ dest_pixel_char.red),
774
901
  ~(source_pixel_char.green ^ dest_pixel_char.green),
775
902
  ~(source_pixel_char.blue ^ dest_pixel_char.blue),
776
- ~(source_pixel_char.alpha ^ dest_pixel_char.alpha));
903
+ source_pixel_char.alpha);
777
904
 
778
905
  break;
779
906
  case and_inverted:
780
907
  finished_pixel = color_int_vals_to_float_format(~source_pixel_char.red & dest_pixel_char.red,
781
908
  ~source_pixel_char.green & dest_pixel_char.green,
782
909
  ~source_pixel_char.blue & dest_pixel_char.blue,
783
- ~source_pixel_char.alpha & dest_pixel_char.alpha);
910
+ source_pixel_char.alpha);
784
911
  break;
785
912
  case or_inverted:
786
913
  finished_pixel = color_int_vals_to_float_format(~source_pixel_char.red | dest_pixel_char.red,
787
914
  ~source_pixel_char.green | dest_pixel_char.green,
788
915
  ~source_pixel_char.blue | dest_pixel_char.blue,
789
- ~source_pixel_char.alpha | dest_pixel_char.alpha);
916
+ source_pixel_char.alpha);
790
917
 
791
918
  break;
792
919
 
@@ -809,7 +936,6 @@ apply_drawing_mode(action_struct * payload, texture_info * tex, int x, int y)
809
936
  finished_pixel = mode_hardlight(source_pixel, dest_pixel);
810
937
 
811
938
  break;
812
-
813
939
  case darken:
814
940
  finished_pixel = (rgba) { MIN(source_pixel.red, dest_pixel.red),
815
941
  MIN(source_pixel.green, dest_pixel.green),
@@ -822,24 +948,24 @@ apply_drawing_mode(action_struct * payload, texture_info * tex, int x, int y)
822
948
  MAX(source_pixel.blue, dest_pixel.blue),
823
949
  MAX(source_pixel.alpha, dest_pixel.alpha) };
824
950
  break;
825
- case colordodge:
951
+ case color_dodge:
826
952
  finished_pixel = (rgba) { mode_colordodge_channel(dest_pixel.red, source_pixel.red),
827
953
  mode_colordodge_channel(dest_pixel.green, source_pixel.green),
828
954
  mode_colordodge_channel(dest_pixel.blue, source_pixel.blue),
829
955
  mode_colordodge_channel(dest_pixel.alpha, source_pixel.alpha) };
830
956
 
831
957
  break;
832
- case colorburn:
958
+ case color_burn:
833
959
  finished_pixel = (rgba) { mode_colorburn_channel(dest_pixel.red, source_pixel.red),
834
960
  mode_colorburn_channel(dest_pixel.green, source_pixel.green),
835
961
  mode_colorburn_channel(dest_pixel.blue, source_pixel.blue),
836
962
  mode_colorburn_channel(dest_pixel.alpha, source_pixel.alpha) };
837
963
  break;
838
- case hardlight:
964
+ case hard_light:
839
965
  finished_pixel = mode_hardlight(dest_pixel, source_pixel);
840
966
 
841
967
  break;
842
- case softlight:
968
+ case soft_light:
843
969
  finished_pixel = mode_softlight(dest_pixel, source_pixel);
844
970
 
845
971
  break;
@@ -915,7 +1041,7 @@ apply_alpha_blend(action_struct * payload, texture_info * tex, int x, int y, rgb
915
1041
  rgba finished_pixel;
916
1042
 
917
1043
 
918
- if(not_a_color(blended_pixel))
1044
+ if (not_a_color(blended_pixel))
919
1045
  return blended_pixel;
920
1046
 
921
1047
  /* alpha blending is nothing more than a weighted average of src and dest pixels
@@ -948,7 +1074,6 @@ allocate_texture(int width, int height)
948
1074
  int mval;
949
1075
 
950
1076
  mval = 4 * width * height * sizeof(float);
951
- // assert(mval > 0);
952
1077
 
953
1078
  new_texture = malloc(mval);
954
1079
 
@@ -19,5 +19,4 @@ float* get_pixel_data(texture_info * tex, int x, int y);
19
19
  /* create a blank gosu image of width and height */
20
20
  VALUE create_image(VALUE window, int width, int height);
21
21
 
22
-
23
22
  #endif
@@ -1,171 +1,171 @@
1
- /* object2module.c */
2
- /* (C) John Mair 2009
3
- * This program is distributed under the terms of the MIT License
4
- * */
5
-
6
- #include <ruby.h>
7
- #include "compat.h"
8
-
9
- #ifdef RUBY_19
10
- # include <ruby/st.h>
11
- #else
12
- # include <st.h>
13
- #endif
14
-
15
- /* class creation. from class.c in 1.9.1 */
16
- #ifdef RUBY_19
17
- static VALUE
18
- class_alloc(VALUE flags, VALUE klass)
19
- {
20
- rb_classext_t *ext = ALLOC(rb_classext_t);
21
- NEWOBJ(obj, struct RClass);
22
- OBJSETUP(obj, klass, flags);
23
- obj->ptr = ext;
24
- RCLASS_IV_TBL(obj) = 0;
25
- RCLASS_M_TBL(obj) = 0;
26
- RCLASS_SUPER(obj) = 0;
27
- RCLASS_IV_INDEX_TBL(obj) = 0;
28
- return (VALUE)obj;
29
- }
30
- #endif
31
-
32
- /* a modified version of include_class_new from class.c */
33
- static VALUE
34
- j_class_new(VALUE module, VALUE sup)
35
- {
36
-
37
- #ifdef RUBY_19
38
- VALUE klass = class_alloc(T_ICLASS, rb_cClass);
39
- #else
40
- NEWOBJ(klass, struct RClass);
41
- OBJSETUP(klass, rb_cClass, T_ICLASS);
42
- #endif
43
-
44
- if (BUILTIN_TYPE(module) == T_ICLASS) {
45
- module = KLASS_OF(module);
46
- }
47
-
48
- if (!RCLASS_IV_TBL(module)) {
49
-
50
- RCLASS_IV_TBL(module) = (struct st_table *)st_init_numtable();
51
- }
52
-
53
- /* assign iv_tbl, m_tbl and super */
54
- RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
55
- RCLASS_SUPER(klass) = sup;
56
- if(TYPE(module) != T_OBJECT) {
57
-
58
- RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
59
- }
60
- else {
61
- RCLASS_M_TBL(klass) = RCLASS_M_TBL(CLASS_OF(module));
62
- }
63
-
64
- /* */
65
-
66
- if (TYPE(module) == T_ICLASS) {
67
- KLASS_OF(klass) = KLASS_OF(module);
68
- }
69
- else {
70
- KLASS_OF(klass) = module;
71
- }
72
-
73
- if(TYPE(module) != T_OBJECT) {
74
- OBJ_INFECT(klass, module);
75
- OBJ_INFECT(klass, sup);
76
- }
77
- return (VALUE)klass;
78
- }
79
-
80
- VALUE
81
- rb_to_module(VALUE self)
82
- {
83
- VALUE rclass, chain_start, jcur, klass;
84
-
85
- switch(BUILTIN_TYPE(self)) {
86
- case T_MODULE:
87
- return self;
88
- case T_CLASS:
89
- klass = self;
90
- break;
91
- case T_OBJECT:
92
- default:
93
- klass = rb_singleton_class(self);
94
- }
95
-
96
- chain_start = j_class_new(klass, rb_cObject);
97
-
98
- KLASS_OF(chain_start) = rb_cModule;
99
- RBASIC(chain_start)->flags = T_MODULE;
100
-
101
- jcur = chain_start;
102
- for(rclass = RCLASS_SUPER(klass); rclass != rb_cObject;
103
- rclass = RCLASS_SUPER(rclass)) {
104
-
105
- RCLASS_SUPER(jcur) = j_class_new(rclass, rb_cObject);
106
- jcur = RCLASS_SUPER(jcur);
107
- }
108
-
109
- RCLASS_SUPER(jcur) = (VALUE)NULL;
110
-
111
- return chain_start;
112
- }
113
-
114
- VALUE
115
- rb_reset_tbls(VALUE self)
116
- {
117
- RCLASS_IV_TBL(self) = (struct st_table *) 0;
118
- RCLASS_M_TBL(self) = (struct st_table *) st_init_numtable();
119
- return Qnil;
120
- }
121
-
122
- /* cannot simply forward to gen_include as need to invoke 'extended' hook */
123
- VALUE
124
- rb_gen_extend(int argc, VALUE * argv, VALUE self)
125
- {
126
- int i;
127
-
128
- if (argc == 0) rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
129
-
130
- rb_singleton_class(self);
131
-
132
- for(i = 0; i < argc; i++) {
133
- VALUE mod = rb_to_module(argv[i]);
134
- rb_funcall(mod, rb_intern("extend_object"), 1, self);
135
- rb_funcall(mod, rb_intern("extended"), 1, self);
136
-
137
- /* only redirect if argv[i] is not a module */
138
- if(argv[i] != mod) rb_reset_tbls(mod);
139
- }
140
-
141
- return self;
142
- }
143
-
144
- VALUE
145
- rb_gen_include(int argc, VALUE * argv, VALUE self)
146
- {
147
- int i;
148
-
149
- if (argc == 0) rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
150
-
151
- for(i = 0; i < argc; i++) {
152
- VALUE mod = rb_to_module(argv[i]);
153
- rb_funcall(mod, rb_intern("append_features"), 1, self);
154
- rb_funcall(mod, rb_intern("included"), 1, self);
155
-
156
- if(argv[i] != mod) rb_reset_tbls(mod);
157
- }
158
-
159
- return self;
160
- }
161
-
162
-
163
- void Init_object2module()
164
- {
165
-
166
- rb_define_method(rb_cObject, "to_module", rb_to_module , 0);
167
- rb_define_method(rb_cObject, "gen_extend", rb_gen_extend, -1);
168
- rb_define_method(rb_cModule, "gen_include", rb_gen_include, -1);
169
- rb_define_method(rb_cModule, "reset_tbls", rb_reset_tbls, 0);
170
- }
171
-
1
+ /* object2module.c */
2
+ /* (C) John Mair 2009
3
+ * This program is distributed under the terms of the MIT License
4
+ * */
5
+
6
+ #include <ruby.h>
7
+ #include "compat.h"
8
+
9
+ #ifdef RUBY_19
10
+ # include <ruby/st.h>
11
+ #else
12
+ # include <st.h>
13
+ #endif
14
+
15
+ /* class creation. from class.c in 1.9.1 */
16
+ #ifdef RUBY_19
17
+ static VALUE
18
+ class_alloc(VALUE flags, VALUE klass)
19
+ {
20
+ rb_classext_t *ext = ALLOC(rb_classext_t);
21
+ NEWOBJ(obj, struct RClass);
22
+ OBJSETUP(obj, klass, flags);
23
+ obj->ptr = ext;
24
+ RCLASS_IV_TBL(obj) = 0;
25
+ RCLASS_M_TBL(obj) = 0;
26
+ RCLASS_SUPER(obj) = 0;
27
+ RCLASS_IV_INDEX_TBL(obj) = 0;
28
+ return (VALUE)obj;
29
+ }
30
+ #endif
31
+
32
+ /* a modified version of include_class_new from class.c */
33
+ static VALUE
34
+ j_class_new(VALUE module, VALUE sup)
35
+ {
36
+
37
+ #ifdef RUBY_19
38
+ VALUE klass = class_alloc(T_ICLASS, rb_cClass);
39
+ #else
40
+ NEWOBJ(klass, struct RClass);
41
+ OBJSETUP(klass, rb_cClass, T_ICLASS);
42
+ #endif
43
+
44
+ if (BUILTIN_TYPE(module) == T_ICLASS) {
45
+ module = KLASS_OF(module);
46
+ }
47
+
48
+ if (!RCLASS_IV_TBL(module)) {
49
+
50
+ RCLASS_IV_TBL(module) = (struct st_table *)st_init_numtable();
51
+ }
52
+
53
+ /* assign iv_tbl, m_tbl and super */
54
+ RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
55
+ RCLASS_SUPER(klass) = sup;
56
+ if(TYPE(module) != T_OBJECT) {
57
+
58
+ RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
59
+ }
60
+ else {
61
+ RCLASS_M_TBL(klass) = RCLASS_M_TBL(CLASS_OF(module));
62
+ }
63
+
64
+ /* */
65
+
66
+ if (TYPE(module) == T_ICLASS) {
67
+ KLASS_OF(klass) = KLASS_OF(module);
68
+ }
69
+ else {
70
+ KLASS_OF(klass) = module;
71
+ }
72
+
73
+ if(TYPE(module) != T_OBJECT) {
74
+ OBJ_INFECT(klass, module);
75
+ OBJ_INFECT(klass, sup);
76
+ }
77
+ return (VALUE)klass;
78
+ }
79
+
80
+ VALUE
81
+ rb_to_module(VALUE self)
82
+ {
83
+ VALUE rclass, chain_start, jcur, klass;
84
+
85
+ switch(BUILTIN_TYPE(self)) {
86
+ case T_MODULE:
87
+ return self;
88
+ case T_CLASS:
89
+ klass = self;
90
+ break;
91
+ case T_OBJECT:
92
+ default:
93
+ klass = rb_singleton_class(self);
94
+ }
95
+
96
+ chain_start = j_class_new(klass, rb_cObject);
97
+
98
+ KLASS_OF(chain_start) = rb_cModule;
99
+ RBASIC(chain_start)->flags = T_MODULE;
100
+
101
+ jcur = chain_start;
102
+ for(rclass = RCLASS_SUPER(klass); rclass != rb_cObject;
103
+ rclass = RCLASS_SUPER(rclass)) {
104
+
105
+ RCLASS_SUPER(jcur) = j_class_new(rclass, rb_cObject);
106
+ jcur = RCLASS_SUPER(jcur);
107
+ }
108
+
109
+ RCLASS_SUPER(jcur) = (VALUE)NULL;
110
+
111
+ return chain_start;
112
+ }
113
+
114
+ VALUE
115
+ rb_reset_tbls(VALUE self)
116
+ {
117
+ RCLASS_IV_TBL(self) = (struct st_table *) 0;
118
+ RCLASS_M_TBL(self) = (struct st_table *) st_init_numtable();
119
+ return Qnil;
120
+ }
121
+
122
+ /* cannot simply forward to gen_include as need to invoke 'extended' hook */
123
+ VALUE
124
+ rb_gen_extend(int argc, VALUE * argv, VALUE self)
125
+ {
126
+ int i;
127
+
128
+ if (argc == 0) rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
129
+
130
+ rb_singleton_class(self);
131
+
132
+ for(i = 0; i < argc; i++) {
133
+ VALUE mod = rb_to_module(argv[i]);
134
+ rb_funcall(mod, rb_intern("extend_object"), 1, self);
135
+ rb_funcall(mod, rb_intern("extended"), 1, self);
136
+
137
+ /* only redirect if argv[i] is not a module */
138
+ if(argv[i] != mod) rb_reset_tbls(mod);
139
+ }
140
+
141
+ return self;
142
+ }
143
+
144
+ VALUE
145
+ rb_gen_include(int argc, VALUE * argv, VALUE self)
146
+ {
147
+ int i;
148
+
149
+ if (argc == 0) rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)");
150
+
151
+ for(i = 0; i < argc; i++) {
152
+ VALUE mod = rb_to_module(argv[i]);
153
+ rb_funcall(mod, rb_intern("append_features"), 1, self);
154
+ rb_funcall(mod, rb_intern("included"), 1, self);
155
+
156
+ if(argv[i] != mod) rb_reset_tbls(mod);
157
+ }
158
+
159
+ return self;
160
+ }
161
+
162
+
163
+ void Init_object2module()
164
+ {
165
+
166
+ rb_define_method(rb_cObject, "to_module", rb_to_module , 0);
167
+ rb_define_method(rb_cObject, "gen_extend", rb_gen_extend, -1);
168
+ rb_define_method(rb_cModule, "gen_include", rb_gen_include, -1);
169
+ rb_define_method(rb_cModule, "reset_tbls", rb_reset_tbls, 0);
170
+ }
171
+