texplay 0.2.800 → 0.2.900

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,11 +1,11 @@
1
- /* object2module.h */
2
-
3
- #ifndef GUARD_OBJECT2MODULE_H
4
- #define GUARD_OBJECT2MODULE_H
5
-
6
- VALUE rb_gen_include(int argc, VALUE * argv, VALUE self);
7
- VALUE rb_gen_extend(int argc, VALUE * argv, VALUE self);
8
- VALUE rb_to_module(VALUE self);
9
- VALUE rb_reset_tbls(VALUE self);
10
-
11
- #endif
1
+ /* object2module.h */
2
+
3
+ #ifndef GUARD_OBJECT2MODULE_H
4
+ #define GUARD_OBJECT2MODULE_H
5
+
6
+ VALUE rb_gen_include(int argc, VALUE * argv, VALUE self);
7
+ VALUE rb_gen_extend(int argc, VALUE * argv, VALUE self);
8
+ VALUE rb_to_module(VALUE self);
9
+ VALUE rb_reset_tbls(VALUE self);
10
+
11
+ #endif
@@ -1,169 +1,169 @@
1
- /* texplay.c, light-weight alternative to rmagick for ruby */
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 <stdio.h>
8
- #include <time.h>
9
- #include "texplay.h"
10
- #include "actions.h"
11
- #include "utils.h"
12
- #include "bindings.h"
13
- #include "object2module.h"
14
- #include "gen_eval.h"
15
- #ifdef __APPLE__
16
- # include <glut.h>
17
- #else
18
- # include <GL/glut.h>
19
- #endif
20
-
21
-
22
- /* setup ruby bindings */
23
-
24
- /** constructor for TPPoint class **/
25
- static VALUE m_init_TPPoint(int argc, VALUE * argv, VALUE self);
26
- static void monkey_patch_gosu(void);
27
-
28
- void
29
- Init_texplay() {
30
-
31
- VALUE jm_Module = rb_define_module("TexPlay");
32
- VALUE TPPoint = rb_define_class_under(jm_Module, "TPPoint", rb_cObject);
33
-
34
- /** define basic point class TPPoint **/
35
- rb_attr(TPPoint, rb_intern("x"), 1, 1, Qtrue);
36
- rb_attr(TPPoint, rb_intern("y"), 1, 1, Qtrue);
37
- rb_define_method(TPPoint, "initialize", m_init_TPPoint, -1);
38
- /** end of TPPoint definition **/
39
-
40
- /* TexPlay methods */
41
- rb_define_method(jm_Module, "paint", m_paint, -1);
42
- rb_define_method(jm_Module, "get_pixel", m_getpixel, -1);
43
- rb_define_method(jm_Module, "circle", m_circle, -1);
44
- rb_define_method(jm_Module, "line", m_line, -1);
45
- rb_define_method(jm_Module, "rect", m_rect, -1);
46
- rb_define_method(jm_Module, "clear", m_clear, -1);
47
- rb_define_method(jm_Module, "pixel", m_pixel, -1);
48
- rb_define_method(jm_Module, "fill", m_flood_fill, -1);
49
- rb_define_method(jm_Module, "bezier", m_bezier, -1);
50
- rb_define_method(jm_Module, "polyline", m_polyline, -1);
51
- rb_define_method(jm_Module, "ngon", m_ngon, -1);
52
-
53
- rb_define_method(jm_Module, "splice", m_splice, -1);
54
-
55
- rb_define_method(jm_Module, "color", m_color, -1);
56
- rb_define_method(jm_Module, "offset", m_offset, -1);
57
- rb_define_method(jm_Module, "method_missing", m_missing, -1);
58
- rb_define_method(jm_Module, "quad_cached?", m_quad_cached, 0);
59
-
60
- rb_define_method(jm_Module, "each", m_each, -1);
61
-
62
- /* needs to be updated, not yet done **/
63
- /* rb_define_method(jm_Module, "bitmask", m_bitmask, -1); */
64
- /* rb_define_method(jm_Module, "leftshift", m_lshift, -1); */
65
- /* rb_define_method(jm_Module, "rightshift", m_rshift, -1); */
66
- /* rb_define_method(jm_Module, "[]=", m_special_pixel, -1); */
67
-
68
- rb_define_method(jm_Module, "dup", m_dup_image, 0);
69
- rb_define_method(jm_Module, "clone", m_clone_image, 0);
70
- rb_define_method(jm_Module, "to_blob", m_to_blob, 0);
71
- rb_define_method(jm_Module, "force_sync", m_force_sync, 1);
72
- rb_define_method(jm_Module, "set_options", m_user_set_options, 1);
73
- rb_define_method(jm_Module, "get_options", m_get_options, 0);
74
- rb_define_method(jm_Module, "delete_options", m_user_delete_options, 0);
75
-
76
- rb_define_method(jm_Module, "refresh_cache", m_cache_refresh, 0);
77
-
78
- /* a constant containing the sidelength of largest allowable quad */
79
- rb_define_const(jm_Module, "TP_MAX_QUAD_SIZE", INT2FIX(max_quad_size() - 2));
80
-
81
- /* singleton method for creating & removing macros */
82
- rb_define_singleton_method(jm_Module, "create_macro", M_create_macro, 1);
83
- rb_define_singleton_method(jm_Module, "remove_macro", M_remove_macro, 1);
84
- rb_define_singleton_method(jm_Module, "refresh_cache_all", M_refresh_cache_all, 0);
85
- rb_define_singleton_method(jm_Module, "create_blank_image", M_create_blank, 3);
86
-
87
- /** aliases; must be made on singleton class because we're using class methods **/
88
- rb_define_method(jm_Module, "box", m_rect, -1);
89
- rb_define_method(jm_Module, "colour", m_color, -1);
90
- rb_define_method(jm_Module, "composite", m_splice, -1);
91
- rb_define_method(jm_Module, "set_pixel", m_pixel, -1);
92
- rb_define_method(jm_Module, "[]", m_getpixel, 2);
93
- /** end of aliases **/
94
-
95
- /** associated with gen_eval **/
96
- rb_define_method(rb_cObject, "gen_eval", rb_gen_eval, -1);
97
- rb_define_method(rb_cObject, "capture", rb_capture, 0);
98
-
99
- rb_define_method(rb_cObject, "to_module", rb_to_module , 0);
100
- rb_define_method(rb_cObject, "reset_tbls", rb_reset_tbls , 0);
101
- rb_define_method(rb_cObject, "gen_extend", rb_gen_extend, -1);
102
- rb_define_method(rb_cModule, "gen_include", rb_gen_include, -1);
103
-
104
- rb_define_alias(rb_cObject, "gen_eval_with", "gen_eval");
105
- /** end of gen_eval defs **/
106
-
107
-
108
- /** basic setup **/
109
-
110
- /* seed the random number generator */
111
- srand(time(NULL));
112
-
113
- monkey_patch_gosu();
114
- /** end basic setup **/
115
- }
116
-
117
- /** constructor for TPPoint class **/
118
- static VALUE
119
- m_init_TPPoint(int argc, VALUE * argv, VALUE self)
120
- {
121
- if(argc == 0) {
122
- rb_iv_set(self, "@x", INT2FIX(0));
123
- rb_iv_set(self, "@y", INT2FIX(0));
124
- }
125
- else if(argc == 2){
126
- if(is_a_num(argv[0]) && is_a_num(argv[1])) {
127
- rb_iv_set(self, "@x", argv[0]);
128
- rb_iv_set(self, "@y", argv[1]);
129
- }
130
- else
131
- rb_raise(rb_eArgError, "must provide two numbers");
132
- }
133
- else
134
- rb_raise(rb_eArgError, "please provide x and y args only");
135
-
136
- return Qnil;
137
-
138
- }
139
- /** end constructor for TPPoint **/
140
-
141
-
142
- static VALUE
143
- gosu_window_to_blob(VALUE self)
144
- {
145
- int width, height;
146
- VALUE blob;
147
-
148
- width = rb_funcall(self, rb_intern("width"), 0);
149
- height = rb_funcall(self, rb_intern("height"), 0);
150
-
151
- blob = rb_str_new(NULL, 4 * width * height);
152
-
153
- glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, RSTRING_PTR(blob));
154
-
155
- return blob;
156
- }
157
-
158
- static void
159
- monkey_patch_gosu(void)
160
- {
161
- VALUE Gosu = rb_const_get(rb_cObject, rb_intern("Gosu"));
162
- VALUE GosuWindow = rb_const_get(Gosu, rb_intern("Window"));
163
-
164
- rb_define_method(GosuWindow, "to_blob", gosu_window_to_blob, 0);
165
- }
166
-
167
-
168
-
169
-
1
+ /* texplay.c, light-weight alternative to rmagick for ruby */
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 <stdio.h>
8
+ #include <time.h>
9
+ #include "texplay.h"
10
+ #include "actions.h"
11
+ #include "utils.h"
12
+ #include "bindings.h"
13
+ #include "object2module.h"
14
+ #include "gen_eval.h"
15
+ #ifdef __APPLE__
16
+ # include <glut.h>
17
+ #else
18
+ # include <GL/glut.h>
19
+ #endif
20
+
21
+
22
+ /* setup ruby bindings */
23
+
24
+ /** constructor for TPPoint class **/
25
+ static VALUE m_init_TPPoint(int argc, VALUE * argv, VALUE self);
26
+ static void monkey_patch_gosu(void);
27
+
28
+ void
29
+ Init_texplay() {
30
+
31
+ VALUE jm_Module = rb_define_module("TexPlay");
32
+ VALUE TPPoint = rb_define_class_under(jm_Module, "TPPoint", rb_cObject);
33
+
34
+ /** define basic point class TPPoint **/
35
+ rb_attr(TPPoint, rb_intern("x"), 1, 1, Qtrue);
36
+ rb_attr(TPPoint, rb_intern("y"), 1, 1, Qtrue);
37
+ rb_define_method(TPPoint, "initialize", m_init_TPPoint, -1);
38
+ /** end of TPPoint definition **/
39
+
40
+ /* TexPlay methods */
41
+ rb_define_method(jm_Module, "paint", m_paint, -1);
42
+ rb_define_method(jm_Module, "get_pixel", m_getpixel, -1);
43
+ rb_define_method(jm_Module, "circle", m_circle, -1);
44
+ rb_define_method(jm_Module, "line", m_line, -1);
45
+ rb_define_method(jm_Module, "rect", m_rect, -1);
46
+ rb_define_method(jm_Module, "clear", m_clear, -1);
47
+ rb_define_method(jm_Module, "pixel", m_pixel, -1);
48
+ rb_define_method(jm_Module, "fill", m_flood_fill, -1);
49
+ rb_define_method(jm_Module, "bezier", m_bezier, -1);
50
+ rb_define_method(jm_Module, "polyline", m_polyline, -1);
51
+ rb_define_method(jm_Module, "ngon", m_ngon, -1);
52
+
53
+ rb_define_method(jm_Module, "splice", m_splice, -1);
54
+
55
+ rb_define_method(jm_Module, "color", m_color, -1);
56
+ rb_define_method(jm_Module, "offset", m_offset, -1);
57
+ rb_define_method(jm_Module, "method_missing", m_missing, -1);
58
+ rb_define_method(jm_Module, "quad_cached?", m_quad_cached, 0);
59
+
60
+ rb_define_method(jm_Module, "each", m_each, -1);
61
+
62
+ /* needs to be updated, not yet done **/
63
+ /* rb_define_method(jm_Module, "bitmask", m_bitmask, -1); */
64
+ /* rb_define_method(jm_Module, "leftshift", m_lshift, -1); */
65
+ /* rb_define_method(jm_Module, "rightshift", m_rshift, -1); */
66
+ /* rb_define_method(jm_Module, "[]=", m_special_pixel, -1); */
67
+
68
+ rb_define_method(jm_Module, "dup", m_dup_image, 0);
69
+ rb_define_method(jm_Module, "clone", m_clone_image, 0);
70
+ rb_define_method(jm_Module, "to_blob", m_to_blob, 0);
71
+ rb_define_method(jm_Module, "force_sync", m_force_sync, 1);
72
+ rb_define_method(jm_Module, "set_options", m_user_set_options, 1);
73
+ rb_define_method(jm_Module, "get_options", m_get_options, 0);
74
+ rb_define_method(jm_Module, "delete_options", m_user_delete_options, 0);
75
+
76
+ rb_define_method(jm_Module, "refresh_cache", m_cache_refresh, 0);
77
+
78
+ /* a constant containing the sidelength of largest allowable quad */
79
+ rb_define_const(jm_Module, "TP_MAX_QUAD_SIZE", INT2FIX(max_quad_size() - 2));
80
+
81
+ /* singleton method for creating & removing macros */
82
+ rb_define_singleton_method(jm_Module, "create_macro", M_create_macro, 1);
83
+ rb_define_singleton_method(jm_Module, "remove_macro", M_remove_macro, 1);
84
+ rb_define_singleton_method(jm_Module, "refresh_cache_all", M_refresh_cache_all, 0);
85
+ /* rb_define_singleton_method(jm_Module, "create_blank_image", M_create_blank, 3); */
86
+
87
+ /** aliases; must be made on singleton class because we're using class methods **/
88
+ rb_define_method(jm_Module, "box", m_rect, -1);
89
+ rb_define_method(jm_Module, "colour", m_color, -1);
90
+ rb_define_method(jm_Module, "composite", m_splice, -1);
91
+ rb_define_method(jm_Module, "set_pixel", m_pixel, -1);
92
+ rb_define_method(jm_Module, "[]", m_getpixel, 2);
93
+ /** end of aliases **/
94
+
95
+ /** associated with gen_eval **/
96
+ rb_define_method(rb_cObject, "gen_eval", rb_gen_eval, -1);
97
+ rb_define_method(rb_cObject, "capture", rb_capture, 0);
98
+
99
+ rb_define_method(rb_cObject, "to_module", rb_to_module , 0);
100
+ rb_define_method(rb_cObject, "reset_tbls", rb_reset_tbls , 0);
101
+ rb_define_method(rb_cObject, "gen_extend", rb_gen_extend, -1);
102
+ rb_define_method(rb_cModule, "gen_include", rb_gen_include, -1);
103
+
104
+ rb_define_alias(rb_cObject, "gen_eval_with", "gen_eval");
105
+ /** end of gen_eval defs **/
106
+
107
+
108
+ /** basic setup **/
109
+
110
+ /* seed the random number generator */
111
+ srand(time(NULL));
112
+
113
+ monkey_patch_gosu();
114
+ /** end basic setup **/
115
+ }
116
+
117
+ /** constructor for TPPoint class **/
118
+ static VALUE
119
+ m_init_TPPoint(int argc, VALUE * argv, VALUE self)
120
+ {
121
+ if(argc == 0) {
122
+ rb_iv_set(self, "@x", INT2FIX(0));
123
+ rb_iv_set(self, "@y", INT2FIX(0));
124
+ }
125
+ else if(argc == 2){
126
+ if(is_a_num(argv[0]) && is_a_num(argv[1])) {
127
+ rb_iv_set(self, "@x", argv[0]);
128
+ rb_iv_set(self, "@y", argv[1]);
129
+ }
130
+ else
131
+ rb_raise(rb_eArgError, "must provide two numbers");
132
+ }
133
+ else
134
+ rb_raise(rb_eArgError, "please provide x and y args only");
135
+
136
+ return Qnil;
137
+
138
+ }
139
+ /** end constructor for TPPoint **/
140
+
141
+
142
+ static VALUE
143
+ gosu_window_to_blob(VALUE self)
144
+ {
145
+ int width, height;
146
+ VALUE blob;
147
+
148
+ width = rb_funcall(self, rb_intern("width"), 0);
149
+ height = rb_funcall(self, rb_intern("height"), 0);
150
+
151
+ blob = rb_str_new(NULL, 4 * width * height);
152
+
153
+ glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, RSTRING_PTR(blob));
154
+
155
+ return blob;
156
+ }
157
+
158
+ static void
159
+ monkey_patch_gosu(void)
160
+ {
161
+ VALUE Gosu = rb_const_get(rb_cObject, rb_intern("Gosu"));
162
+ VALUE GosuWindow = rb_const_get(Gosu, rb_intern("Window"));
163
+
164
+ rb_define_method(GosuWindow, "to_blob", gosu_window_to_blob, 0);
165
+ }
166
+
167
+
168
+
169
+
@@ -1,130 +1,147 @@
1
- /* texplay.h (C) John Mair 2008
2
- * This program is distributed under the terms of the MIT License
3
- *
4
- *
5
- * */
6
-
7
- #ifndef GUARD_TEXPLAY_H
8
- #define GUARD_TEXPLAY_H
9
-
10
- #include <ruby.h>
11
-
12
- /* #defines */
13
- #define OOB_VAL 9999
14
- #define XMAX_OOB OOB_VAL
15
- #define YMAX_OOB OOB_VAL
16
- #define XMIN_OOB -OOB_VAL
17
- #define YMIN_OOB -OOB_VAL
18
-
19
- #define PI 3.14159265358979
20
-
21
- /* macros */
22
- #define SWAP(X, Y) {(X) ^= (Y); (Y) ^= (X); (X) ^= (Y);}
23
- #define ROUND(X) (int)((X) + 0.5)
24
- #define ARY_SIZE(X) sizeof(X) / sizeof(*X)
25
- #define SGN(X) ((X) >= 0 ? 1 : -1)
26
- #define MAX(X, Y) ((X) > (Y)) ? (X) :(Y)
27
- #define MIN(X, Y) ((X) < (Y)) ? (X) : (Y)
28
- #define ABS(X) ((X) >= 0 ? (X) : -(X))
29
-
30
- /* enums */
31
- typedef enum e_bool {
32
- false, true
33
- } bool;
34
-
35
- typedef enum e_color {
36
- red, green, blue, alpha
37
- } color_t;
38
-
39
- typedef enum e_sync_mode {
40
- lazy_sync, eager_sync, no_sync
41
- } sync;
42
-
43
- typedef enum {
44
- clear, copy, noop,
45
- set, copy_inverted,
46
- invert, and_reverse, and,
47
- or, nand, nor, xor,
48
- equiv, and_inverted,
49
- or_inverted, additive,
50
- multiply, screen, overlay,
51
- darken, lighten, colordodge,
52
- colorburn, hardlight, softlight,
53
- difference, exclusion
54
- } draw_mode;
55
-
56
- /* structs */
57
- typedef struct s_rgba {
58
- float red, green, blue, alpha;
59
- } rgba;
60
-
61
- /* stores image data */
62
- typedef struct {
63
- int width, height;
64
- float top, left;
65
- int tname;
66
- float * td_array;
67
- int yincr, firstpixel;
68
- int x_offset, y_offset;
69
- VALUE image;
70
- } texture_info;
71
-
72
-
73
- /* convenience macro */
74
- #define IMAGE_BOUNDS(X) ((image_bounds *) (X))
75
- typedef struct {
76
- int xmin;
77
- int ymin;
78
- int xmax;
79
- int ymax;
80
- } image_bounds;
81
-
82
-
83
- typedef struct action_struct {
84
- int xmin, ymin, xmax, ymax;
85
- sync sync_mode;
86
-
87
- /* pointer to associated texture */
88
- /* a bit of a kludge having this here
89
- since it's only being used by convert_image_local_color_to_rgba */
90
- texture_info * tex;
91
-
92
- VALUE hash_arg;
93
-
94
- /* action color */
95
- rgba color;
96
-
97
- /* pen data */
98
- struct {
99
-
100
- /* color control, dynamic */
101
- bool has_color_control_proc;
102
- VALUE color_control_proc;
103
- int color_control_arity;
104
-
105
- /* color control, static */
106
- bool has_color_control_transform;
107
- rgba color_mult;
108
- rgba color_add;
109
-
110
- /* texture fill */
111
- bool has_source_texture;
112
- texture_info source_tex;
113
-
114
- /* lerp */
115
- bool has_lerp;
116
- float lerp;
117
-
118
- /* alpha blend */
119
- bool alpha_blend;
120
-
121
- /* drawing mode */
122
- bool has_drawing_mode;
123
- draw_mode drawing_mode;
124
-
125
- } pen;
126
-
127
- } action_struct;
128
-
129
-
130
- #endif
1
+ /* texplay.h (C) John Mair 2008
2
+ * This program is distributed under the terms of the MIT License
3
+ *
4
+ *
5
+ * */
6
+
7
+ #ifndef GUARD_TEXPLAY_H
8
+ #define GUARD_TEXPLAY_H
9
+
10
+ #include <ruby.h>
11
+
12
+ /* #defines */
13
+ #define OOB_VAL 9999
14
+ #define XMAX_OOB OOB_VAL
15
+ #define YMAX_OOB OOB_VAL
16
+ #define XMIN_OOB -OOB_VAL
17
+ #define YMIN_OOB -OOB_VAL
18
+ #define RGBA_LIST_SIZE 100
19
+ #define PI 3.14159265358979
20
+
21
+ /* macros */
22
+ #define SWAP(X, Y) {(X) ^= (Y); (Y) ^= (X); (X) ^= (Y);}
23
+ #define ROUND(X) (int)((X) + 0.5)
24
+ #define ARY_SIZE(X) sizeof(X) / sizeof(*X)
25
+ #define SGN(X) ((X) >= 0 ? 1 : -1)
26
+ #define MAX(X, Y) ((X) > (Y)) ? (X) :(Y)
27
+ #define MIN(X, Y) ((X) < (Y)) ? (X) : (Y)
28
+ #define ABS(X) ((X) >= 0 ? (X) : -(X))
29
+
30
+ /* enums */
31
+ typedef enum e_bool {
32
+ false, true
33
+ } bool;
34
+
35
+ typedef enum e_color {
36
+ red, green, blue, alpha
37
+ } color_t;
38
+
39
+ typedef enum e_sync_mode {
40
+ lazy_sync, eager_sync, no_sync
41
+ } sync;
42
+
43
+
44
+ typedef enum {
45
+ clear, copy, noop,
46
+ set, copy_inverted,
47
+ invert, and_reverse, and,
48
+ or, nand, nor, xor,
49
+ equiv, and_inverted,
50
+ or_inverted, additive,
51
+ multiply, screen, overlay,
52
+ darken, lighten, color_dodge,
53
+ color_burn, hard_light, soft_light,
54
+ difference, exclusion
55
+ } draw_mode;
56
+
57
+ /* structs */
58
+ typedef struct s_rgba {
59
+ float red, green, blue, alpha;
60
+ } rgba;
61
+
62
+ typedef struct {
63
+ rgba colors[RGBA_LIST_SIZE];
64
+ int size;
65
+ } rgba_list;
66
+
67
+
68
+ /* stores image data */
69
+ typedef struct {
70
+ int width, height;
71
+ float top, left;
72
+ int tname;
73
+ float * td_array;
74
+ int yincr, firstpixel;
75
+ int x_offset, y_offset;
76
+ VALUE image;
77
+ } texture_info;
78
+
79
+
80
+ /* convenience macro */
81
+ #define IMAGE_BOUNDS(X) ((image_bounds *) (X))
82
+ typedef struct {
83
+ int xmin;
84
+ int ymin;
85
+ int xmax;
86
+ int ymax;
87
+ } image_bounds;
88
+
89
+
90
+ typedef struct action_struct {
91
+ int xmin, ymin, xmax, ymax;
92
+ sync sync_mode;
93
+
94
+ /* pointer to associated texture */
95
+ /* a bit of a kludge having this here
96
+ since it's only being used by convert_image_local_color_to_rgba */
97
+ texture_info * tex;
98
+
99
+ VALUE hash_arg;
100
+
101
+ /* action color */
102
+ rgba color;
103
+
104
+ /* pen data */
105
+ struct {
106
+
107
+ /* color control, dynamic */
108
+ bool has_color_control_proc;
109
+ VALUE color_control_proc;
110
+ int color_control_arity;
111
+
112
+ /* color control, static */
113
+ bool has_color_control_transform;
114
+ rgba color_mult;
115
+ rgba color_add;
116
+
117
+ /* texture fill */
118
+ bool has_source_texture;
119
+ texture_info source_tex;
120
+
121
+ /* lerp */
122
+ bool has_lerp;
123
+ float lerp;
124
+
125
+ /* alpha blend */
126
+ bool alpha_blend;
127
+
128
+ /* drawing mode */
129
+ bool has_drawing_mode;
130
+ draw_mode drawing_mode;
131
+
132
+
133
+
134
+ /* color selection */
135
+
136
+ bool has_color_select;
137
+ rgba_list source_select;
138
+ rgba_list source_ignore;
139
+ rgba_list dest_select;
140
+ rgba_list dest_ignore;
141
+
142
+ } pen;
143
+
144
+ } action_struct;
145
+
146
+
147
+ #endif