texplay 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/src/actions.c CHANGED
@@ -23,7 +23,6 @@ static void draw_epilogue(action_struct * cur, texture_info * tex, bool primary)
23
23
 
24
24
  static void prepare_fill_texture(action_struct * cur);
25
25
  static void prepare_color_control(action_struct * cur);
26
- static rgba exec_color_control_proc(action_struct * cur, texture_info * tex, int x, int y);
27
26
  static void set_pixel_color_with_style(action_struct * payload, texture_info * tex,
28
27
  int x, int y);
29
28
  /* end helpers */
@@ -225,12 +224,13 @@ ngon_do_action(int x, int y, int r, int num_sides, texture_info * tex, VALUE has
225
224
  int x1, y1, x2, y2, x0, y0;
226
225
  int n;
227
226
  int thickness;
227
+ float angle = 0;
228
228
 
229
229
  draw_prologue(&cur, tex, x - r, y - r,
230
230
  x + r, y + r, &hash_arg, sync_mode, primary, &payload);
231
231
 
232
232
 
233
- if(is_a_hash(hash_arg))
233
+ if(is_a_hash(hash_arg)) {
234
234
  if(RTEST(get_from_hash(hash_arg, "thickness"))) {
235
235
  thickness = NUM2INT(get_from_hash(hash_arg, "thickness"));
236
236
 
@@ -241,13 +241,18 @@ ngon_do_action(int x, int y, int r, int num_sides, texture_info * tex, VALUE has
241
241
  cur.ymax = y + r + thickness / 2;
242
242
  }
243
243
 
244
+ if(RTEST(get_from_hash(hash_arg, "start_angle"))) {
245
+ angle = NUM2INT(get_from_hash(hash_arg, "start_angle")) / 360.0 * 2 * PI;
246
+ }
247
+ }
248
+
244
249
  /* calculate first point */
245
- x0 = x1 = x + r;
246
- y0 = y1 = y;
250
+ x0 = x1 = x + r * cos(angle);
251
+ y0 = y1 = y + r * sin(angle);
247
252
 
248
253
  for(n = 0; n < num_sides; n++) {
249
- x2 = x + r * cos((2 * PI / num_sides) * n);
250
- y2 = y + r * sin((2 * PI / num_sides) * n);
254
+ x2 = x + r * cos((2 * PI / num_sides) * n + angle);
255
+ y2 = y + r * sin((2 * PI / num_sides) * n + angle);
251
256
 
252
257
  line_do_action(x1, y1, x2, y2, tex, hash_arg, no_sync, false, payload);
253
258
 
@@ -919,10 +924,11 @@ splice_do_action(int x0, int y0, int cx1, int cy1, int cx2, int cy2, texture_inf
919
924
  payload->color = get_pixel_color_from_chunk(image_buf, xbound, ybound, x, y);
920
925
 
921
926
  if(has_chroma) {
922
- bool cmp = cmp_color(payload->color, chromakey);
923
- if(!cmp && !inverse_chroma)
924
- set_pixel_color_with_style(payload, tex, x0 + x, y0 + y);
925
- else if(cmp && inverse_chroma)
927
+ bool chroma_match = cmp_color(payload->color, chromakey);
928
+
929
+ /* look at released 0.2.0 code to see how USED to do this.
930
+ this is now a simplified boolean expression */
931
+ if(chroma_match == inverse_chroma)
926
932
  set_pixel_color_with_style(payload, tex, x0 + x, y0 + y);
927
933
  }
928
934
  else
@@ -1175,18 +1181,23 @@ prepare_color_control(action_struct * cur)
1175
1181
  }
1176
1182
 
1177
1183
  static rgba
1178
- exec_color_control_proc(action_struct * cur, texture_info * tex, int x, int y)
1184
+ exec_color_control_proc(action_struct * cur, texture_info * tex, int x, int y, rgba blended_pixel)
1179
1185
  {
1180
1186
  int arity = cur->pen.color_control_arity;
1181
1187
  VALUE proc = cur->pen.color_control_proc;
1182
1188
  rgba old_color = get_pixel_color(tex, x, y);
1183
- rgba current_color = cur->color;
1189
+ rgba current_color = blended_pixel;
1184
1190
  rgba new_color;
1185
1191
 
1186
1192
  if(!cur->pen.has_color_control_proc)
1187
1193
  rb_raise(rb_eRuntimeError, "needs a proc");
1188
1194
 
1189
1195
  switch(arity) {
1196
+ case -1:
1197
+ case 0:
1198
+ new_color = convert_rb_color_to_rgba(rb_funcall(proc, rb_intern("call"), 0));
1199
+ break;
1200
+
1190
1201
  case 1:
1191
1202
  new_color = convert_rb_color_to_rgba(rb_funcall(proc, rb_intern("call"), arity,
1192
1203
  convert_rgba_to_rb_color(&old_color)));
@@ -1231,20 +1242,57 @@ prepare_fill_texture(action_struct * payload)
1231
1242
  }
1232
1243
  }
1233
1244
 
1234
- static void
1245
+
1246
+ /* TODO: reimplement using SSE2 */
1247
+ static rgba
1235
1248
  apply_color_control_transform(action_struct * payload, texture_info * tex, int x, int y)
1249
+
1236
1250
  {
1237
- payload->color = get_pixel_color(tex, x, y);
1251
+ rgba transformed_color;
1252
+
1253
+ transformed_color = get_pixel_color(tex, x, y);
1238
1254
 
1239
- payload->color.red += payload->pen.color_add.red;
1240
- payload->color.green += payload->pen.color_add.green;
1241
- payload->color.blue += payload->pen.color_add.blue;
1242
- payload->color.alpha += payload->pen.color_add.alpha;
1243
-
1244
- payload->color.red *= payload->pen.color_mult.red;
1245
- payload->color.green *= payload->pen.color_mult.green;
1246
- payload->color.blue *= payload->pen.color_mult.blue;
1247
- payload->color.alpha *= payload->pen.color_mult.alpha;
1255
+ transformed_color.red += payload->pen.color_add.red;
1256
+ transformed_color.green += payload->pen.color_add.green;
1257
+ transformed_color.blue += payload->pen.color_add.blue;
1258
+ transformed_color.alpha += payload->pen.color_add.alpha;
1259
+
1260
+ transformed_color.red *= payload->pen.color_mult.red;
1261
+ transformed_color.green *= payload->pen.color_mult.green;
1262
+ transformed_color.blue *= payload->pen.color_mult.blue;
1263
+ transformed_color.alpha *= payload->pen.color_mult.alpha;
1264
+
1265
+ return transformed_color;
1266
+ }
1267
+
1268
+ static rgba
1269
+ apply_alpha_blend(action_struct * payload, texture_info * tex, int x, int y, rgba blended_pixel)
1270
+ {
1271
+ rgba dest_pixel = get_pixel_color(tex, x, y);
1272
+ rgba finished_pixel;
1273
+
1274
+
1275
+ if(not_a_color(blended_pixel))
1276
+ return blended_pixel;
1277
+
1278
+ /* alpha blending is nothing more than a weighted average of src and dest pixels
1279
+ based on source alpha value */
1280
+ /* NB: destination alpha value is ignored */
1281
+
1282
+ /** TO DO: rewrite this using sse2 instructions **/
1283
+ finished_pixel.red = blended_pixel.alpha * blended_pixel.red + (1 - blended_pixel.alpha)
1284
+ * dest_pixel.red;
1285
+
1286
+ finished_pixel.green = blended_pixel.alpha * blended_pixel.green + (1 - blended_pixel.alpha)
1287
+ * dest_pixel.green;
1288
+
1289
+ finished_pixel.blue = blended_pixel.alpha * blended_pixel.blue + (1 - blended_pixel.alpha)
1290
+ * dest_pixel.blue;
1291
+
1292
+ finished_pixel.alpha = blended_pixel.alpha;
1293
+
1294
+
1295
+ return finished_pixel;
1248
1296
  }
1249
1297
 
1250
1298
  static void
@@ -1253,53 +1301,30 @@ set_pixel_color_with_style(action_struct * payload, texture_info * tex, int x, i
1253
1301
 
1254
1302
  rgba blended_pixel;
1255
1303
 
1304
+ blended_pixel = payload->color;
1305
+
1256
1306
  /* for color_control transform */
1257
1307
  if(payload->pen.has_color_control_transform)
1258
- apply_color_control_transform(payload, tex, x, y);
1308
+ blended_pixel = apply_color_control_transform(payload, tex, x, y);
1259
1309
 
1260
1310
  /* for texture fill */
1261
1311
  if(payload->pen.has_source_texture)
1262
- payload->color = get_pixel_color(&payload->pen.source_tex,
1312
+ blended_pixel = get_pixel_color(&payload->pen.source_tex,
1263
1313
  x % payload->pen.source_tex.width,
1264
1314
  y % payload->pen.source_tex.height);
1265
1315
 
1266
1316
  /* for color_control block */
1267
1317
  if(payload->pen.has_color_control_proc)
1268
- payload->color = exec_color_control_proc(payload, tex, x, y);
1318
+ blended_pixel = exec_color_control_proc(payload, tex, x, y, blended_pixel);
1269
1319
 
1270
1320
 
1271
1321
  /* TO DO: do bitwise pixel combinations here */
1272
1322
 
1273
- /* if i do not use blended_pixel and instead use payload->color in the
1274
- code below i get an interesting blurring effect in images (with alpha_blend => true)
1275
- */
1276
- blended_pixel = payload->color;
1277
-
1278
-
1279
- /* alpha blending
1280
- TO DO: refactor into its own helper function
1323
+ /* TO DO: refactor into its own helper function
1281
1324
  & rewrite using sse2 */
1282
- if(payload->pen.alpha_blend) {
1283
- rgba dest_pixel = get_pixel_color(tex, x, y);
1284
-
1285
- /* alpha blending is nothing more than a weighted average of src and dest pixels
1286
- based on source alpha value */
1287
- /* NB: destination alpha value is ignored */
1288
- if(is_a_color(payload->color) && is_a_color(dest_pixel)) {
1289
-
1290
- /** TO DO: rewrite this using sse2 instructions **/
1291
- blended_pixel.red = payload->color.alpha * payload->color.red + (1 - payload->color.alpha)
1292
- * dest_pixel.red;
1293
-
1294
- blended_pixel.green = payload->color.alpha * payload->color.green + (1 - payload->color.alpha)
1295
- * dest_pixel.green;
1296
-
1297
- blended_pixel.blue = payload->color.alpha * payload->color.blue + (1 - payload->color.alpha)
1298
- * dest_pixel.blue;
1299
-
1300
- blended_pixel.alpha = payload->color.alpha;
1301
- }
1302
- }
1325
+ if(payload->pen.alpha_blend)
1326
+ blended_pixel = apply_alpha_blend(payload, tex, x, y, blended_pixel);
1327
+
1303
1328
 
1304
1329
  set_pixel_color(&blended_pixel, tex, x, y);
1305
1330
  }
data/src/bindings.c CHANGED
@@ -369,7 +369,7 @@ m_circle(int argc, VALUE * argv, VALUE self)
369
369
 
370
370
  ADJUST_SELF(self);
371
371
 
372
- if(argc < 1) rb_raise(rb_eArgError, "circle action needs at least 1 parameter");
372
+ if(argc < 2) rb_raise(rb_eArgError, "circle action needs at least 2 parameter");
373
373
 
374
374
  process_x_y_pairs(self, 1, argv, &x1, &y1);
375
375
 
@@ -398,7 +398,7 @@ m_ngon(int argc, VALUE * argv, VALUE self)
398
398
 
399
399
  ADJUST_SELF(self);
400
400
 
401
- if(argc < 4) rb_raise(rb_eArgError, "ngon requires at least 4 parameters (x, y, radius, num_sides)");
401
+ if(argc < 3) rb_raise(rb_eArgError, "ngon requires at least 3 parameters (x, y, radius, num_sides)");
402
402
 
403
403
  process_x_y_pairs(self, 1, argv, &x1, &y1);
404
404
 
data/src/texplay.c CHANGED
@@ -68,7 +68,7 @@ Init_ctexplay() {
68
68
  rb_define_method(jm_Module, "refresh_cache", m_cache_refresh, 0);
69
69
 
70
70
  /* a constant containing the sidelength of largest allowable quad */
71
- rb_define_const(jm_Module, "TP_MAX_QUAD_SIZE", INT2FIX(max_quad_size()));
71
+ rb_define_const(jm_Module, "TP_MAX_QUAD_SIZE", INT2FIX(max_quad_size() - 2));
72
72
 
73
73
  /* singleton method for creating & removing macros */
74
74
  rb_define_singleton_method(jm_Module, "create_macro", M_create_macro, 1);
data/src/utils.c CHANGED
@@ -585,9 +585,9 @@ ComputeOutCode (int x, int y, int xmin, int ymin, int xmax, int ymax)
585
585
  return code;
586
586
  }
587
587
 
588
- //Cohen-Sutherland clipping algorithm clips a line from
589
- //P0 = (x0, y0) to P1 = (x1, y1) against a rectangle with
590
- //diagonal from (xmin, ymin) to (xmax, ymax).
588
+ /** Cohen-Sutherland clipping algorithm clips a line from
589
+ P0 = (x0, y0) to P1 = (x1, y1) against a rectangle with
590
+ diagonal from (xmin, ymin) to (xmax, ymax). **/
591
591
  void
592
592
  cohen_sutherland_clip (int * x0, int * y0,int * x1, int * y1, int xmin, int ymin,
593
593
  int xmax, int ymax)
@@ -762,7 +762,7 @@ check_for_texture_info(VALUE image)
762
762
  rb_raise(rb_eException, "Error: gl_tex_info returns nil for %s (%i x %i). Could be caused by "
763
763
  "very large image or Gosu bug. Try updating Gosu or use a smaller image. Note: TexPlay should"
764
764
  " be able to work with %i x %i images.",
765
- StringValuePtr(image_name), width, height, max_quad_size(), max_quad_size());
765
+ StringValuePtr(image_name), width, height, max_quad_size() - 2, max_quad_size() - 2);
766
766
  }
767
767
 
768
768
  return info;
@@ -897,7 +897,8 @@ bool
897
897
  is_a_point(VALUE try_point)
898
898
  {
899
899
  /* if it responds to 'x' it's near enough (technically must respond to x AND y) */
900
- if(rb_respond_to(try_point, rb_intern("x")))
900
+ /* added the is_a_num() check due to WEIRD bug where FIXNUMS were responding to the 'x' method (wtf?) but returning nil when invoked */
901
+ if(rb_respond_to(try_point, rb_intern("x")) && !is_a_num(try_point))
901
902
  return true;
902
903
 
903
904
  return false;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: texplay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mair (banisterfiend)
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-02 00:00:00 +12:00
12
+ date: 2009-09-09 00:00:00 +12:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,7 +32,7 @@ extra_rdoc_files: []
32
32
 
33
33
  files:
34
34
  - Rakefile
35
- - README
35
+ - README.markdown
36
36
  - CHANGELOG
37
37
  - README1st
38
38
  - lib/texplay.rb
@@ -64,22 +64,16 @@ files:
64
64
  - examples/example_hash_arguments.rb
65
65
  - examples/example_gen_eval.rb
66
66
  - examples/example_polyline.rb
67
- - examples/basic.rb
68
- - examples/test.rb
69
67
  - examples/example_fill.rb
70
68
  - examples/example_bezier.rb
71
69
  - examples/example_simple.rb
72
70
  - examples/example_fill_old.rb
73
71
  - examples/example_each.rb
74
- - examples/benchmark.rb
75
72
  - examples/example_fluent.rb
76
73
  - examples/example_sync.rb
77
74
  - examples/example_splice.rb
78
75
  - examples/example_alpha_blend.rb
79
- - examples/basic2.rb
80
76
  - examples/example_melt.rb
81
- - examples/test2.rb
82
- - examples/specs.rb
83
77
  - examples/media/sand1.png
84
78
  - examples/media/rose.bmp
85
79
  - examples/media/maria.png
data/README DELETED
@@ -1,21 +0,0 @@
1
- INSTRUCTIONS
2
-
3
- TexPlay version 0.2.1
4
-
5
- To compile TexPlay, ensure you are in the directory with the Rakefile and type:
6
- => rake
7
- OR
8
- => rake19 (assuming this is the name of your 1.9.1 version of rake)
9
-
10
- !!NB!! be sure to run the version of rake that corresponds to the ruby version you wish to use! on my system I use rake19 for ruby 1.9.1!!
11
-
12
- If all goes well, run the example programs:
13
- => cd examples
14
- => ruby example_melt.rb
15
- => ruby example_simple.rb
16
- => ..etc
17
-
18
- *like any gosu application, gosu.so must be in the current directory (or the gosu gem installed) when running the examples.
19
-
20
- Enjoy!
21
- (note that TexPlay has only been tested on 32 bit linux systems and WindowsXP using VS 6.0)
data/examples/basic.rb DELETED
@@ -1,48 +0,0 @@
1
-
2
- require 'rubygems'
3
- require 'common'
4
-
5
- require 'gosu'
6
- require 'texplay'
7
-
8
- class W < Gosu::Window
9
- def initialize
10
- super(1024, 769, false, 20)
11
- @img = Gosu::Image.new(self, "#{Common::MEDIA}/sunset.png")
12
- @img.rect 0,0, @img.width - 1, @img.height - 1
13
-
14
- @img.instance_variable_set(:@horse, :love)
15
- class << @img
16
- def little
17
- :little
18
- end
19
- end
20
- @bunk = @img.clone
21
- puts @bunk.instance_variable_get(:@horse)
22
- puts @bunk.little
23
- end
24
-
25
- def draw
26
- x = @img.width * rand
27
- y = @img.height * rand
28
-
29
- @img.
30
- line(0, 0, 1024, 1024).
31
- circle(20, 20, 50).
32
- rect 30, 30, 100, 100
33
-
34
- @img.draw 100, 50,1
35
- @bunk.draw 500, 300,1
36
- @bunk.line 0, 0, 1024, 1024, :color => :red
37
-
38
-
39
-
40
- @bunk.pixel x, y, :color => :none
41
- end
42
-
43
- end
44
-
45
-
46
- w = W.new
47
- w.show
48
-
data/examples/basic2.rb DELETED
@@ -1,37 +0,0 @@
1
- require 'rubygems'
2
- require 'common'
3
- require 'gosu'
4
- require 'texplay'
5
-
6
- class Proc
7
- def __context__
8
- eval('self', self.binding)
9
- end
10
- end
11
-
12
- class W < Gosu::Window
13
- def initialize
14
- super(1024, 769, false, 20)
15
- @img = Gosu::Image.new(self, "#{Common::MEDIA}/texplay.png")
16
- end
17
-
18
- def trick
19
- @img.dup_eval { self }
20
- end
21
-
22
- def draw
23
- @img.paint {
24
- circle -5100, -9700, 20
25
- circle(@img.width * rand * 2 - @img.width, @img.height * rand * 2 - @img.height, 40)
26
- }
27
- @img.draw(100,100,1)
28
- end
29
-
30
- def img
31
- @img
32
- end
33
- end
34
-
35
- w = W.new
36
- w.show
37
-