mandelbrot 0.1.2 → 0.1.4
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.
- data/ext/mandelbrot/mandelbrot.c +47 -19
- data/ext/mandelbrot/mandelbrot.h +10 -1
- data/lib/mandelbrot.rb +7 -1
- metadata +1 -1
data/ext/mandelbrot/mandelbrot.c
CHANGED
@@ -32,17 +32,40 @@ void Init_mandelbrot()
|
|
32
32
|
Float_INFINITY = rb_const_get(rb_cFloat, i_INFINITY);
|
33
33
|
|
34
34
|
Mandelbrot = rb_define_class("Mandelbrot", rb_cObject);
|
35
|
+
rb_define_alloc_func(Mandelbrot, Mandelbrot_alloc);
|
35
36
|
rb_define_method(Mandelbrot, "initialize", Mandelbrot_initialize, -1);
|
36
37
|
rb_define_method(Mandelbrot, "compute", Mandelbrot_compute, 2);
|
37
38
|
rb_define_method(Mandelbrot, "bmp", Mandelbrot_bmp, 2);
|
38
|
-
|
39
|
-
|
39
|
+
rb_define_method(Mandelbrot, "min", Mandelbrot_min, 0);
|
40
|
+
rb_define_method(Mandelbrot, "max", Mandelbrot_max, 0);
|
40
41
|
rb_define_attr(Mandelbrot, "max_iters", true, true);
|
41
42
|
}
|
42
43
|
|
44
|
+
static VALUE Mandelbrot_alloc(VALUE class)
|
45
|
+
{
|
46
|
+
mandelbrot_args_t* info;
|
47
|
+
return Data_Make_Struct(class, mandelbrot_args_t, 0, 0, info);
|
48
|
+
}
|
49
|
+
|
50
|
+
static VALUE Mandelbrot_min(VALUE self)
|
51
|
+
{
|
52
|
+
mandelbrot_args_t* info;
|
53
|
+
Data_Get_Struct(self, mandelbrot_args_t, info);
|
54
|
+
return rb_funcall(rb_mKernel, i_Complex, 2, DBL2NUM(info->min_re), DBL2NUM(info->min_im));
|
55
|
+
}
|
56
|
+
|
57
|
+
static VALUE Mandelbrot_max(VALUE self)
|
58
|
+
{
|
59
|
+
mandelbrot_args_t* info;
|
60
|
+
Data_Get_Struct(self, mandelbrot_args_t, info);
|
61
|
+
return rb_funcall(rb_mKernel, i_Complex, 2, DBL2NUM(info->max_re), DBL2NUM(info->max_im));
|
62
|
+
}
|
63
|
+
|
43
64
|
static VALUE Mandelbrot_initialize(int argc, VALUE* argv, VALUE self)
|
44
65
|
{
|
45
66
|
VALUE min, max;
|
67
|
+
mandelbrot_args_t* info;
|
68
|
+
Data_Get_Struct(self, mandelbrot_args_t, info);
|
46
69
|
rb_scan_args(argc, argv, "02", &min, &max);
|
47
70
|
|
48
71
|
if(NIL_P(min)) {
|
@@ -55,10 +78,13 @@ static VALUE Mandelbrot_initialize(int argc, VALUE* argv, VALUE self)
|
|
55
78
|
rb_check_type(min, T_COMPLEX);
|
56
79
|
rb_check_type(max, T_COMPLEX);
|
57
80
|
|
58
|
-
|
59
|
-
|
60
|
-
|
81
|
+
info->min_re = rb_complex_re(min);
|
82
|
+
info->min_im = rb_complex_im(min);
|
83
|
+
info->max_re = rb_complex_re(max);
|
84
|
+
info->max_im = rb_complex_im(max);
|
61
85
|
|
86
|
+
rb_iv_set(self, "@max_iters", INT2NUM(256));
|
87
|
+
|
62
88
|
return Qnil;
|
63
89
|
}
|
64
90
|
|
@@ -73,18 +99,18 @@ static VALUE Mandelbrot_compute(VALUE self, VALUE _width, VALUE _height)
|
|
73
99
|
VALUE ary, col, tmp;
|
74
100
|
VALUE r_min;
|
75
101
|
VALUE r_max;
|
102
|
+
mandelbrot_args_t* info;
|
103
|
+
Data_Get_Struct(self, mandelbrot_args_t, info);
|
76
104
|
|
77
105
|
rb_check_type(_width, T_FIXNUM);
|
78
106
|
rb_check_type(_height, T_FIXNUM);
|
79
107
|
width = NUM2INT(_width);
|
80
108
|
height = NUM2INT(_height);
|
81
109
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
max_re = rb_complex_re(r_max);
|
87
|
-
max_im = rb_complex_im(r_max);
|
110
|
+
min_re = info->min_re;
|
111
|
+
min_im = info->min_im;
|
112
|
+
max_re = info->max_re;
|
113
|
+
max_im = info->max_im;
|
88
114
|
|
89
115
|
max_iters = NUM2INT(rb_iv_get(self, "@max_iters"));
|
90
116
|
|
@@ -157,25 +183,25 @@ static VALUE Mandelbrot_bmp(VALUE self, VALUE _width, VALUE _height)
|
|
157
183
|
int x, y, iter;
|
158
184
|
int offset;
|
159
185
|
int* grid;
|
186
|
+
size_t tmpsz;
|
160
187
|
VALUE ary, col, tmp;
|
161
188
|
VALUE r_min;
|
162
189
|
VALUE r_max;
|
190
|
+
mandelbrot_args_t* info;
|
191
|
+
Data_Get_Struct(self, mandelbrot_args_t, info);
|
163
192
|
|
164
193
|
rb_check_type(_width, T_FIXNUM);
|
165
194
|
rb_check_type(_height, T_FIXNUM);
|
166
195
|
width = NUM2INT(_width);
|
167
196
|
height = NUM2INT(_height);
|
168
197
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
max_re = rb_complex_re(r_max);
|
174
|
-
max_im = rb_complex_im(r_max);
|
198
|
+
min_re = info->min_re;
|
199
|
+
min_im = info->min_im;
|
200
|
+
max_re = info->max_re;
|
201
|
+
max_im = info->max_im;
|
175
202
|
|
176
203
|
max_iters = NUM2INT(rb_iv_get(self, "@max_iters"));
|
177
204
|
|
178
|
-
|
179
205
|
bmp = malloc(54 + (((24 * width + 31)/32) * 4) * height);
|
180
206
|
new_bmp_header(width, height, bmp);
|
181
207
|
bmp_image_data = bmp + 54;
|
@@ -207,5 +233,7 @@ static VALUE Mandelbrot_bmp(VALUE self, VALUE _width, VALUE _height)
|
|
207
233
|
}
|
208
234
|
}
|
209
235
|
|
210
|
-
|
236
|
+
tmp = rb_str_new(bmp, 54 + (((24 * width + 31)/32) * 4) * height);
|
237
|
+
free(bmp);
|
238
|
+
return tmp;
|
211
239
|
}
|
data/ext/mandelbrot/mandelbrot.h
CHANGED
@@ -4,10 +4,19 @@
|
|
4
4
|
#include "bmp.h"
|
5
5
|
#include "ruby.h"
|
6
6
|
|
7
|
+
typedef struct mandelbrot_args {
|
8
|
+
double min_re, min_im;
|
9
|
+
double max_re, max_im;
|
10
|
+
} mandelbrot_args_t;
|
11
|
+
|
12
|
+
static VALUE Mandelbrot_alloc(VALUE class);
|
13
|
+
|
7
14
|
static VALUE Float_INFINITY = Qundef;
|
8
15
|
static VALUE Mandelbrot = Qundef;
|
9
16
|
static VALUE Mandelbrot_initialize(int argc, VALUE* argv, VALUE self);
|
10
17
|
static VALUE Mandelbrot_compute(VALUE self, VALUE _width, VALUE _height);
|
11
18
|
static VALUE Mandelbrot_bmp(VALUE self, VALUE _width, VALUE _height);
|
19
|
+
static VALUE Mandelbrot_min(VALUE self);
|
20
|
+
static VALUE Mandelbrot_max(VALUE self);
|
12
21
|
|
13
|
-
int* mandelbrot_compute(int w, int h, double min_re, double min_im, double max_re, double max_im, int max_iter);
|
22
|
+
int* mandelbrot_compute(int w, int h, double min_re, double min_im, double max_re, double max_im, int max_iter);
|
data/lib/mandelbrot.rb
CHANGED