LiteRGSS 0.1.3
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.
- checksums.yaml +7 -0
- data/ext/LiteRGSS/Bitmap.cpp +316 -0
- data/ext/LiteRGSS/Bitmap.h +24 -0
- data/ext/LiteRGSS/BlendMode.cpp +202 -0
- data/ext/LiteRGSS/BlendMode.h +20 -0
- data/ext/LiteRGSS/CBitmap_Element.cpp +50 -0
- data/ext/LiteRGSS/CBitmap_Element.h +17 -0
- data/ext/LiteRGSS/CDrawable_Element.cpp +38 -0
- data/ext/LiteRGSS/CDrawable_Element.h +30 -0
- data/ext/LiteRGSS/CRect_Element.h +15 -0
- data/ext/LiteRGSS/CShaderSprite_Element.cpp +17 -0
- data/ext/LiteRGSS/CShaderSprite_Element.h +17 -0
- data/ext/LiteRGSS/CSprite_Element.cpp +15 -0
- data/ext/LiteRGSS/CSprite_Element.h +36 -0
- data/ext/LiteRGSS/CText_Element.cpp +12 -0
- data/ext/LiteRGSS/CText_Element.h +29 -0
- data/ext/LiteRGSS/CTone_Element.h +17 -0
- data/ext/LiteRGSS/CViewport_Element.cpp +224 -0
- data/ext/LiteRGSS/CViewport_Element.h +57 -0
- data/ext/LiteRGSS/Color.cpp +200 -0
- data/ext/LiteRGSS/Color.h +22 -0
- data/ext/LiteRGSS/Fonts.cpp +126 -0
- data/ext/LiteRGSS/Fonts.h +20 -0
- data/ext/LiteRGSS/Graphics.cpp +314 -0
- data/ext/LiteRGSS/Graphics.h +31 -0
- data/ext/LiteRGSS/Graphics.local.cpp +365 -0
- data/ext/LiteRGSS/Graphics.local.h +37 -0
- data/ext/LiteRGSS/Image.cpp +460 -0
- data/ext/LiteRGSS/Image.h +32 -0
- data/ext/LiteRGSS/Input.cpp +664 -0
- data/ext/LiteRGSS/Input.h +38 -0
- data/ext/LiteRGSS/LiteRGSS.cpp +34 -0
- data/ext/LiteRGSS/LiteRGSS.h +113 -0
- data/ext/LiteRGSS/Rect.cpp +324 -0
- data/ext/LiteRGSS/Rect.h +24 -0
- data/ext/LiteRGSS/Shader.cpp +279 -0
- data/ext/LiteRGSS/Shader.h +13 -0
- data/ext/LiteRGSS/ShaderSprite.cpp +78 -0
- data/ext/LiteRGSS/ShaderSprite.h +8 -0
- data/ext/LiteRGSS/Sprite.cpp +495 -0
- data/ext/LiteRGSS/Sprite.h +43 -0
- data/ext/LiteRGSS/Table.cpp +228 -0
- data/ext/LiteRGSS/Table.h +29 -0
- data/ext/LiteRGSS/Table32.cpp +228 -0
- data/ext/LiteRGSS/Table32.h +29 -0
- data/ext/LiteRGSS/Text.cpp +574 -0
- data/ext/LiteRGSS/Text.h +52 -0
- data/ext/LiteRGSS/Texture.hpp +735 -0
- data/ext/LiteRGSS/Tone.cpp +228 -0
- data/ext/LiteRGSS/Tone.h +22 -0
- data/ext/LiteRGSS/Viewport.cpp +491 -0
- data/ext/LiteRGSS/Viewport.h +33 -0
- data/ext/LiteRGSS/Yuki.cpp +29 -0
- data/ext/LiteRGSS/Yuki.h +8 -0
- data/ext/LiteRGSS/Yuki_Gif.cpp +218 -0
- data/ext/LiteRGSS/Yuki_Gif.h +25 -0
- data/ext/LiteRGSS/extconf.rb +8 -0
- data/ext/LiteRGSS/libnsgif.c +1169 -0
- data/ext/LiteRGSS/libnsgif.h +183 -0
- data/ext/LiteRGSS/libnsgif.hpp +184 -0
- data/ext/LiteRGSS/lodepng.cpp +6245 -0
- data/ext/LiteRGSS/lodepng.h +1769 -0
- data/ext/LiteRGSS/lzw.c +377 -0
- data/ext/LiteRGSS/lzw.h +105 -0
- data/ext/LiteRGSS/sf_Text2.cpp +690 -0
- data/ext/LiteRGSS/sf_Text2.hpp +549 -0
- data/ext/LiteRGSS/utils/log.h +21 -0
- metadata +112 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
#ifndef L_SPRITE_HEADER
|
2
|
+
#define L_SPRITE_HEADER
|
3
|
+
#include "Graphics.h"
|
4
|
+
|
5
|
+
VALUE rb_Sprite_Initialize(int argc, VALUE* argv, VALUE self);
|
6
|
+
VALUE rb_Sprite_Copy(VALUE self);
|
7
|
+
VALUE rb_Sprite_Dispose(VALUE self);
|
8
|
+
VALUE rb_Sprite_Disposed(VALUE self);
|
9
|
+
VALUE rb_Sprite_setBitmap(VALUE self, VALUE bitmap);
|
10
|
+
VALUE rb_Sprite_getBitmap(VALUE self);
|
11
|
+
VALUE rb_Sprite_setX(VALUE self, VALUE val);
|
12
|
+
VALUE rb_Sprite_getX(VALUE self);
|
13
|
+
VALUE rb_Sprite_setY(VALUE self, VALUE val);
|
14
|
+
VALUE rb_Sprite_getY(VALUE self);
|
15
|
+
VALUE rb_Sprite_setZ(VALUE self, VALUE val);
|
16
|
+
VALUE rb_Sprite_getZ(VALUE self);
|
17
|
+
VALUE rb_Sprite_setOX(VALUE self, VALUE val);
|
18
|
+
VALUE rb_Sprite_getOX(VALUE self);
|
19
|
+
VALUE rb_Sprite_setOY(VALUE self, VALUE val);
|
20
|
+
VALUE rb_Sprite_getOY(VALUE self);
|
21
|
+
VALUE rb_Sprite_setVisible(VALUE self, VALUE val);
|
22
|
+
VALUE rb_Sprite_getVisible(VALUE self);
|
23
|
+
VALUE rb_Sprite_setAngle(VALUE self, VALUE val);
|
24
|
+
VALUE rb_Sprite_getAngle(VALUE self);
|
25
|
+
VALUE rb_Sprite_setZoomX(VALUE self, VALUE val);
|
26
|
+
VALUE rb_Sprite_getZoomX(VALUE self);
|
27
|
+
VALUE rb_Sprite_setZoomY(VALUE self, VALUE val);
|
28
|
+
VALUE rb_Sprite_getZoomY(VALUE self);
|
29
|
+
VALUE rb_Sprite_setPosition(VALUE self, VALUE x, VALUE y);
|
30
|
+
VALUE rb_Sprite_setOrigin(VALUE self, VALUE x, VALUE y);
|
31
|
+
VALUE rb_Sprite_setZoom(VALUE self, VALUE zoom);
|
32
|
+
VALUE rb_Sprite_setOpacity(VALUE self, VALUE val);
|
33
|
+
VALUE rb_Sprite_getOpacity(VALUE self);
|
34
|
+
VALUE rb_Sprite_getRect(VALUE self);
|
35
|
+
VALUE rb_Sprite_setRect(VALUE self, VALUE val);
|
36
|
+
VALUE rb_Sprite_DisposeFromViewport(VALUE self);
|
37
|
+
VALUE rb_Sprite_Viewport(VALUE self);
|
38
|
+
VALUE rb_Sprite_Index(VALUE self);
|
39
|
+
VALUE rb_Sprite_getMirror(VALUE self);
|
40
|
+
VALUE rb_Sprite_setMirror(VALUE self, VALUE val);
|
41
|
+
VALUE rb_Sprite_width(VALUE self);
|
42
|
+
VALUE rb_Sprite_height(VALUE self);
|
43
|
+
#endif
|
@@ -0,0 +1,228 @@
|
|
1
|
+
#include "LiteRGSS.h"
|
2
|
+
|
3
|
+
VALUE rb_cTable = Qnil;
|
4
|
+
|
5
|
+
#define GET_TABLE rb_Table_Struct* table; \
|
6
|
+
Data_Get_Struct(self, rb_Table_Struct, table); \
|
7
|
+
if(table == nullptr) \
|
8
|
+
return Qnil;
|
9
|
+
|
10
|
+
void rb_Table_Free(void* data)
|
11
|
+
{
|
12
|
+
rb_Table_Struct* table = reinterpret_cast<rb_Table_Struct*>(data);
|
13
|
+
if(table != nullptr)
|
14
|
+
{
|
15
|
+
//std::cout << "TH : " << table->heap << std::endl;
|
16
|
+
if(table->heap != nullptr)
|
17
|
+
delete[] table->heap;
|
18
|
+
table->heap = nullptr;
|
19
|
+
delete table;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
VALUE rb_Table_Alloc(VALUE klass)
|
24
|
+
{
|
25
|
+
rb_Table_Struct* table = new rb_Table_Struct();
|
26
|
+
table->heap = nullptr;
|
27
|
+
table->header.dim = 0;
|
28
|
+
table->header.data_size = 0;
|
29
|
+
return Data_Wrap_Struct(klass, NULL, rb_Table_Free, table);
|
30
|
+
}
|
31
|
+
|
32
|
+
void Init_Table()
|
33
|
+
{
|
34
|
+
rb_cTable = rb_define_class("Table", rb_cObject);
|
35
|
+
rb_define_alloc_func(rb_cTable, rb_Table_Alloc);
|
36
|
+
rb_define_method(rb_cTable, "initialize", _rbf rb_Table_initialize, -1);
|
37
|
+
rb_define_method(rb_cTable, "[]", _rbf rb_Table_get, -1);
|
38
|
+
rb_define_method(rb_cTable, "[]=", _rbf rb_Table_set, -1);
|
39
|
+
rb_define_method(rb_cTable, "xsize", _rbf rb_Table_xSize, 0);
|
40
|
+
rb_define_method(rb_cTable, "ysize", _rbf rb_Table_ySize, 0);
|
41
|
+
rb_define_method(rb_cTable, "zsize", _rbf rb_Table_zSize, 0);
|
42
|
+
rb_define_method(rb_cTable, "dim", _rbf rb_Table_dim, 0);
|
43
|
+
rb_define_method(rb_cTable, "resize", _rbf rb_Table_resize, -1);
|
44
|
+
rb_define_method(rb_cTable, "fill", _rbf rb_Table_Fill, 1);
|
45
|
+
|
46
|
+
rb_define_method(rb_cTable, "_dump", _rbf rb_Table_Save, 1);
|
47
|
+
rb_define_singleton_method(rb_cTable, "_load", _rbf rb_Table_Load, 1);
|
48
|
+
}
|
49
|
+
|
50
|
+
|
51
|
+
VALUE rb_Table_initialize(int argc, VALUE* argv, VALUE self)
|
52
|
+
{
|
53
|
+
GET_TABLE
|
54
|
+
switch(argc)
|
55
|
+
{
|
56
|
+
case 1:
|
57
|
+
table->header.xsize = rb_num2ulong(argv[0]);
|
58
|
+
table->header.ysize = 1;
|
59
|
+
table->header.zsize = 1;
|
60
|
+
break;
|
61
|
+
case 2:
|
62
|
+
table->header.xsize = rb_num2ulong(argv[0]);
|
63
|
+
table->header.ysize = rb_num2ulong(argv[1]);
|
64
|
+
table->header.zsize = 1;
|
65
|
+
break;
|
66
|
+
case 3:
|
67
|
+
table->header.xsize = rb_num2ulong(argv[0]);
|
68
|
+
table->header.ysize = rb_num2ulong(argv[1]);
|
69
|
+
table->header.zsize = rb_num2ulong(argv[2]);
|
70
|
+
break;
|
71
|
+
default:
|
72
|
+
rb_raise(rb_eRGSSError, "Table can be 1D, 2D or 3D but nothing else, requested dimension : %dD", argc);
|
73
|
+
return Qnil;
|
74
|
+
}
|
75
|
+
if(table->header.xsize == 0)
|
76
|
+
table->header.xsize = 1;
|
77
|
+
if(table->header.ysize == 0)
|
78
|
+
table->header.ysize = 1;
|
79
|
+
if(table->header.zsize == 0)
|
80
|
+
table->header.zsize = 1;
|
81
|
+
table->header.dim = argc;
|
82
|
+
table->header.data_size = table->header.xsize * table->header.ysize * table->header.zsize;
|
83
|
+
table->heap = new short[table->header.data_size];
|
84
|
+
return self;
|
85
|
+
}
|
86
|
+
|
87
|
+
VALUE rb_Table_get(int argc, VALUE* argv, VALUE self)
|
88
|
+
{
|
89
|
+
GET_TABLE
|
90
|
+
VALUE rx, ry, rz;
|
91
|
+
unsigned long x, y, z;
|
92
|
+
rb_scan_args(argc, argv, "12", &rx, &ry, &rz);
|
93
|
+
x = rb_num2ulong(rx);
|
94
|
+
y = NIL_P(ry) ? 0 : rb_num2ulong(ry);
|
95
|
+
z = NIL_P(rz) ? 0 : rb_num2ulong(rz);
|
96
|
+
if(x >= table->header.xsize || y >= table->header.ysize || z >= table->header.zsize)
|
97
|
+
return Qnil;
|
98
|
+
return rb_int2inum(table->heap[x + (y * table->header.xsize) + (z * table->header.xsize * table->header.ysize)]);
|
99
|
+
}
|
100
|
+
|
101
|
+
VALUE rb_Table_set(int argc, VALUE* argv, VALUE self)
|
102
|
+
{
|
103
|
+
GET_TABLE
|
104
|
+
VALUE rx, ry, rz, rv;
|
105
|
+
unsigned long x, y, z;
|
106
|
+
short v;
|
107
|
+
rb_scan_args(argc, argv, "22", &rx, &ry, &rz, &rv);
|
108
|
+
x = rb_num2ulong(rx);
|
109
|
+
if(NIL_P(rz))
|
110
|
+
{
|
111
|
+
v = RB_NUM2SHORT(ry);
|
112
|
+
z = y = 0;
|
113
|
+
}
|
114
|
+
else if(NIL_P(rv))
|
115
|
+
{
|
116
|
+
v = RB_NUM2SHORT(rz);
|
117
|
+
y = rb_num2ulong(ry);
|
118
|
+
z = 0;
|
119
|
+
}
|
120
|
+
else
|
121
|
+
{
|
122
|
+
y = rb_num2ulong(ry);
|
123
|
+
z = rb_num2ulong(rz);
|
124
|
+
v = RB_NUM2SHORT(rv);
|
125
|
+
}
|
126
|
+
if(x >= table->header.xsize || y >= table->header.ysize || z >= table->header.zsize)
|
127
|
+
return Qnil;
|
128
|
+
table->heap[x + (y * table->header.xsize) + (z * table->header.xsize * table->header.ysize)] = v;
|
129
|
+
return self;
|
130
|
+
}
|
131
|
+
|
132
|
+
VALUE rb_Table_xSize(VALUE self)
|
133
|
+
{
|
134
|
+
GET_TABLE
|
135
|
+
return rb_uint2inum(table->header.xsize);
|
136
|
+
}
|
137
|
+
|
138
|
+
VALUE rb_Table_ySize(VALUE self)
|
139
|
+
{
|
140
|
+
GET_TABLE
|
141
|
+
return rb_uint2inum(table->header.ysize);
|
142
|
+
}
|
143
|
+
|
144
|
+
VALUE rb_Table_zSize(VALUE self)
|
145
|
+
{
|
146
|
+
GET_TABLE
|
147
|
+
return rb_uint2inum(table->header.zsize);
|
148
|
+
}
|
149
|
+
|
150
|
+
VALUE rb_Table_dim(VALUE self)
|
151
|
+
{
|
152
|
+
GET_TABLE
|
153
|
+
return rb_uint2inum(table->header.dim);
|
154
|
+
}
|
155
|
+
|
156
|
+
void table_copy(short* dheap, short* sheap, unsigned long dxsize, unsigned long dysize,
|
157
|
+
unsigned long dzsize, unsigned long sxsize, unsigned long sysize, unsigned long szsize)
|
158
|
+
{
|
159
|
+
unsigned long xsize, ysize, zsize, soy, soz, doy, doz, x, y, z;
|
160
|
+
xsize = dxsize < sxsize ? dxsize : sxsize;
|
161
|
+
ysize = dysize < sysize ? dysize : sysize;
|
162
|
+
zsize = dzsize < szsize ? dzsize : szsize;
|
163
|
+
for(z = 0; z < zsize; z++)
|
164
|
+
{
|
165
|
+
doz = z * dxsize * dysize;
|
166
|
+
soz = z * sxsize * sysize; // optimisable => del soz, repl soz par soy
|
167
|
+
for(y = 0; y < ysize; y++)
|
168
|
+
{
|
169
|
+
doy = doz + (y * dxsize);
|
170
|
+
soy = soz + (y * sxsize); // optimisable => add after for{} soy += sxsize;
|
171
|
+
for(x = 0; x < xsize; x++)
|
172
|
+
{
|
173
|
+
dheap[doy++] = sheap[soy++];
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
}
|
178
|
+
|
179
|
+
VALUE rb_Table_resize(int argc, VALUE* argv, VALUE self)
|
180
|
+
{
|
181
|
+
GET_TABLE
|
182
|
+
auto table2 = *table;
|
183
|
+
rb_Table_initialize(argc, argv, self);
|
184
|
+
// Copying data
|
185
|
+
table_copy(table->heap, table2.heap,
|
186
|
+
table->header.xsize, table->header.ysize, table->header.zsize,
|
187
|
+
table2.header.xsize, table2.header.ysize, table2.header.zsize);
|
188
|
+
// Freeing heap
|
189
|
+
delete[] table2.heap;
|
190
|
+
return self;
|
191
|
+
}
|
192
|
+
|
193
|
+
|
194
|
+
VALUE rb_Table_Load(VALUE self, VALUE str)
|
195
|
+
{
|
196
|
+
rb_check_type(str, T_STRING);
|
197
|
+
rb_Table_Struct* table = reinterpret_cast<rb_Table_Struct*>(RSTRING_PTR(str));
|
198
|
+
VALUE arr[3];
|
199
|
+
arr[0] = RB_UINT2NUM(table->header.xsize);
|
200
|
+
arr[1] = RB_UINT2NUM(table->header.ysize);
|
201
|
+
arr[2] = RB_UINT2NUM(table->header.zsize);
|
202
|
+
table->header.dim = normalize_long(table->header.dim, 1, 3);
|
203
|
+
VALUE rtable = rb_class_new_instance(table->header.dim, arr, self);
|
204
|
+
Data_Get_Struct(rtable, rb_Table_Struct, table);
|
205
|
+
memcpy(table->heap, RSTRING_PTR(str) + sizeof(rb_Table_Struct_Header), table->header.data_size * sizeof(short));
|
206
|
+
return rtable;
|
207
|
+
}
|
208
|
+
|
209
|
+
VALUE rb_Table_Save(VALUE self, VALUE limit)
|
210
|
+
{
|
211
|
+
GET_TABLE
|
212
|
+
VALUE str1 = rb_str_new(reinterpret_cast<char*>(&table->header), sizeof(rb_Table_Struct_Header));
|
213
|
+
VALUE str2 = rb_str_new(reinterpret_cast<char*>(table->heap), table->header.data_size * sizeof(short));
|
214
|
+
return rb_str_concat(str1, str2);
|
215
|
+
}
|
216
|
+
|
217
|
+
VALUE rb_Table_Fill(VALUE self, VALUE val)
|
218
|
+
{
|
219
|
+
GET_TABLE
|
220
|
+
short v = RB_NUM2SHORT(val);
|
221
|
+
unsigned long sz = table->header.data_size;
|
222
|
+
short* data = table->heap;
|
223
|
+
for(unsigned long i = 0;i < sz;i++)
|
224
|
+
{
|
225
|
+
data[i] = v;
|
226
|
+
}
|
227
|
+
return self;
|
228
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#ifndef L_TABLE_HEADER
|
2
|
+
#define L_TABLE_HEADER
|
3
|
+
|
4
|
+
struct rb_Table_Struct_Header {
|
5
|
+
unsigned int dim;
|
6
|
+
unsigned int xsize;
|
7
|
+
unsigned int ysize;
|
8
|
+
unsigned int zsize;
|
9
|
+
unsigned int data_size;
|
10
|
+
};
|
11
|
+
|
12
|
+
struct rb_Table_Struct {
|
13
|
+
rb_Table_Struct_Header header;
|
14
|
+
short* heap;
|
15
|
+
};
|
16
|
+
|
17
|
+
VALUE rb_Table_initialize(int argc, VALUE* argv, VALUE self);
|
18
|
+
VALUE rb_Table_get(int argc, VALUE* argv, VALUE self);
|
19
|
+
VALUE rb_Table_set(int argc, VALUE* argv, VALUE self);
|
20
|
+
VALUE rb_Table_xSize(VALUE self);
|
21
|
+
VALUE rb_Table_ySize(VALUE self);
|
22
|
+
VALUE rb_Table_zSize(VALUE self);
|
23
|
+
VALUE rb_Table_dim(VALUE self);
|
24
|
+
VALUE rb_Table_resize(int argc, VALUE* argv, VALUE self);
|
25
|
+
VALUE rb_Table_Load(VALUE self, VALUE str);
|
26
|
+
VALUE rb_Table_Save(VALUE self, VALUE limit);
|
27
|
+
VALUE rb_Table_Fill(VALUE self, VALUE val);
|
28
|
+
|
29
|
+
#endif
|
@@ -0,0 +1,228 @@
|
|
1
|
+
#include "LiteRGSS.h"
|
2
|
+
|
3
|
+
VALUE rb_cTable32 = Qnil;
|
4
|
+
|
5
|
+
#define GET_TABLE rb_Table32_Struct* table; \
|
6
|
+
Data_Get_Struct(self, rb_Table32_Struct, table); \
|
7
|
+
if(table == nullptr) \
|
8
|
+
return Qnil;
|
9
|
+
|
10
|
+
void rb_Table32_Free(void* data)
|
11
|
+
{
|
12
|
+
rb_Table32_Struct* table = reinterpret_cast<rb_Table32_Struct*>(data);
|
13
|
+
if(table != nullptr)
|
14
|
+
{
|
15
|
+
//std::cout << "TH : " << table->heap << std::endl;
|
16
|
+
if(table->heap != nullptr)
|
17
|
+
delete[] table->heap;
|
18
|
+
table->heap = nullptr;
|
19
|
+
delete table;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
VALUE rb_Table32_Alloc(VALUE klass)
|
24
|
+
{
|
25
|
+
rb_Table32_Struct* table = new rb_Table32_Struct();
|
26
|
+
table->heap = nullptr;
|
27
|
+
table->header.dim = 0;
|
28
|
+
table->header.data_size = 0;
|
29
|
+
return Data_Wrap_Struct(klass, NULL, rb_Table32_Free, table);
|
30
|
+
}
|
31
|
+
|
32
|
+
void Init_Table32()
|
33
|
+
{
|
34
|
+
rb_cTable32 = rb_define_class("Table32", rb_cObject);
|
35
|
+
rb_define_alloc_func(rb_cTable32, rb_Table32_Alloc);
|
36
|
+
rb_define_method(rb_cTable32, "initialize", _rbf rb_Table32_initialize, -1);
|
37
|
+
rb_define_method(rb_cTable32, "[]", _rbf rb_Table32_get, -1);
|
38
|
+
rb_define_method(rb_cTable32, "[]=", _rbf rb_Table32_set, -1);
|
39
|
+
rb_define_method(rb_cTable32, "xsize", _rbf rb_Table32_xSize, 0);
|
40
|
+
rb_define_method(rb_cTable32, "ysize", _rbf rb_Table32_ySize, 0);
|
41
|
+
rb_define_method(rb_cTable32, "zsize", _rbf rb_Table32_zSize, 0);
|
42
|
+
rb_define_method(rb_cTable32, "dim", _rbf rb_Table32_dim, 0);
|
43
|
+
rb_define_method(rb_cTable32, "resize", _rbf rb_Table32_resize, -1);
|
44
|
+
rb_define_method(rb_cTable32, "fill", _rbf rb_Table32_Fill, 1);
|
45
|
+
|
46
|
+
rb_define_method(rb_cTable32, "_dump", _rbf rb_Table32_Save, 1);
|
47
|
+
rb_define_singleton_method(rb_cTable32, "_load", _rbf rb_Table32_Load, 1);
|
48
|
+
}
|
49
|
+
|
50
|
+
|
51
|
+
VALUE rb_Table32_initialize(int argc, VALUE* argv, VALUE self)
|
52
|
+
{
|
53
|
+
GET_TABLE
|
54
|
+
switch(argc)
|
55
|
+
{
|
56
|
+
case 1:
|
57
|
+
table->header.xsize = rb_num2ulong(argv[0]);
|
58
|
+
table->header.ysize = 1;
|
59
|
+
table->header.zsize = 1;
|
60
|
+
break;
|
61
|
+
case 2:
|
62
|
+
table->header.xsize = rb_num2ulong(argv[0]);
|
63
|
+
table->header.ysize = rb_num2ulong(argv[1]);
|
64
|
+
table->header.zsize = 1;
|
65
|
+
break;
|
66
|
+
case 3:
|
67
|
+
table->header.xsize = rb_num2ulong(argv[0]);
|
68
|
+
table->header.ysize = rb_num2ulong(argv[1]);
|
69
|
+
table->header.zsize = rb_num2ulong(argv[2]);
|
70
|
+
break;
|
71
|
+
default:
|
72
|
+
rb_raise(rb_eRGSSError, "Table32 can be 1D, 2D or 3D but nothing else, requested dimension : %dD", argc);
|
73
|
+
return Qnil;
|
74
|
+
}
|
75
|
+
if(table->header.xsize == 0)
|
76
|
+
table->header.xsize = 1;
|
77
|
+
if(table->header.ysize == 0)
|
78
|
+
table->header.ysize = 1;
|
79
|
+
if(table->header.zsize == 0)
|
80
|
+
table->header.zsize = 1;
|
81
|
+
table->header.dim = argc;
|
82
|
+
table->header.data_size = table->header.xsize * table->header.ysize * table->header.zsize;
|
83
|
+
table->heap = new long[table->header.data_size];
|
84
|
+
return self;
|
85
|
+
}
|
86
|
+
|
87
|
+
VALUE rb_Table32_get(int argc, VALUE* argv, VALUE self)
|
88
|
+
{
|
89
|
+
GET_TABLE
|
90
|
+
VALUE rx, ry, rz;
|
91
|
+
unsigned long x, y, z;
|
92
|
+
rb_scan_args(argc, argv, "12", &rx, &ry, &rz);
|
93
|
+
x = rb_num2ulong(rx);
|
94
|
+
y = NIL_P(ry) ? 0 : rb_num2ulong(ry);
|
95
|
+
z = NIL_P(rz) ? 0 : rb_num2ulong(rz);
|
96
|
+
if(x >= table->header.xsize || y >= table->header.ysize || z >= table->header.zsize)
|
97
|
+
return Qnil;
|
98
|
+
return rb_int2inum(table->heap[x + (y * table->header.xsize) + (z * table->header.xsize * table->header.ysize)]);
|
99
|
+
}
|
100
|
+
|
101
|
+
VALUE rb_Table32_set(int argc, VALUE* argv, VALUE self)
|
102
|
+
{
|
103
|
+
GET_TABLE
|
104
|
+
VALUE rx, ry, rz, rv;
|
105
|
+
unsigned long x, y, z;
|
106
|
+
long v;
|
107
|
+
rb_scan_args(argc, argv, "22", &rx, &ry, &rz, &rv);
|
108
|
+
x = rb_num2ulong(rx);
|
109
|
+
if(NIL_P(rz))
|
110
|
+
{
|
111
|
+
v = RB_NUM2LONG(ry);
|
112
|
+
z = y = 0;
|
113
|
+
}
|
114
|
+
else if(NIL_P(rv))
|
115
|
+
{
|
116
|
+
v = RB_NUM2LONG(rz);
|
117
|
+
y = rb_num2ulong(ry);
|
118
|
+
z = 0;
|
119
|
+
}
|
120
|
+
else
|
121
|
+
{
|
122
|
+
y = rb_num2ulong(ry);
|
123
|
+
z = rb_num2ulong(rz);
|
124
|
+
v = RB_NUM2LONG(rv);
|
125
|
+
}
|
126
|
+
if(x >= table->header.xsize || y >= table->header.ysize || z >= table->header.zsize)
|
127
|
+
return Qnil;
|
128
|
+
table->heap[x + (y * table->header.xsize) + (z * table->header.xsize * table->header.ysize)] = v;
|
129
|
+
return self;
|
130
|
+
}
|
131
|
+
|
132
|
+
VALUE rb_Table32_xSize(VALUE self)
|
133
|
+
{
|
134
|
+
GET_TABLE
|
135
|
+
return rb_uint2inum(table->header.xsize);
|
136
|
+
}
|
137
|
+
|
138
|
+
VALUE rb_Table32_ySize(VALUE self)
|
139
|
+
{
|
140
|
+
GET_TABLE
|
141
|
+
return rb_uint2inum(table->header.ysize);
|
142
|
+
}
|
143
|
+
|
144
|
+
VALUE rb_Table32_zSize(VALUE self)
|
145
|
+
{
|
146
|
+
GET_TABLE
|
147
|
+
return rb_uint2inum(table->header.zsize);
|
148
|
+
}
|
149
|
+
|
150
|
+
VALUE rb_Table32_dim(VALUE self)
|
151
|
+
{
|
152
|
+
GET_TABLE
|
153
|
+
return rb_uint2inum(table->header.dim);
|
154
|
+
}
|
155
|
+
|
156
|
+
void table_copy(long* dheap, long* sheap, unsigned long dxsize, unsigned long dysize,
|
157
|
+
unsigned long dzsize, unsigned long sxsize, unsigned long sysize, unsigned long szsize)
|
158
|
+
{
|
159
|
+
unsigned long xsize, ysize, zsize, soy, soz, doy, doz, x, y, z;
|
160
|
+
xsize = dxsize < sxsize ? dxsize : sxsize;
|
161
|
+
ysize = dysize < sysize ? dysize : sysize;
|
162
|
+
zsize = dzsize < szsize ? dzsize : szsize;
|
163
|
+
for(z = 0; z < zsize; z++)
|
164
|
+
{
|
165
|
+
doz = z * dxsize * dysize;
|
166
|
+
soz = z * sxsize * sysize; // optimisable => del soz, repl soz par soy
|
167
|
+
for(y = 0; y < ysize; y++)
|
168
|
+
{
|
169
|
+
doy = doz + (y * dxsize);
|
170
|
+
soy = soz + (y * sxsize); // optimisable => add after for{} soy += sxsize;
|
171
|
+
for(x = 0; x < xsize; x++)
|
172
|
+
{
|
173
|
+
dheap[doy++] = sheap[soy++];
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
}
|
178
|
+
|
179
|
+
VALUE rb_Table32_resize(int argc, VALUE* argv, VALUE self)
|
180
|
+
{
|
181
|
+
GET_TABLE
|
182
|
+
auto table2 = *table;
|
183
|
+
rb_Table32_initialize(argc, argv, self);
|
184
|
+
// Copying data
|
185
|
+
table_copy(table->heap, table2.heap,
|
186
|
+
table->header.xsize, table->header.ysize, table->header.zsize,
|
187
|
+
table2.header.xsize, table2.header.ysize, table2.header.zsize);
|
188
|
+
// Freeing heap
|
189
|
+
delete[] table2.heap;
|
190
|
+
return self;
|
191
|
+
}
|
192
|
+
|
193
|
+
|
194
|
+
VALUE rb_Table32_Load(VALUE self, VALUE str)
|
195
|
+
{
|
196
|
+
rb_check_type(str, T_STRING);
|
197
|
+
rb_Table32_Struct* table = reinterpret_cast<rb_Table32_Struct*>(RSTRING_PTR(str));
|
198
|
+
VALUE arr[3];
|
199
|
+
arr[0] = RB_UINT2NUM(table->header.xsize);
|
200
|
+
arr[1] = RB_UINT2NUM(table->header.ysize);
|
201
|
+
arr[2] = RB_UINT2NUM(table->header.zsize);
|
202
|
+
table->header.dim = normalize_long(table->header.dim, 1, 3);
|
203
|
+
VALUE rtable = rb_class_new_instance(table->header.dim, arr, self);
|
204
|
+
Data_Get_Struct(rtable, rb_Table32_Struct, table);
|
205
|
+
memcpy(table->heap, RSTRING_PTR(str) + sizeof(rb_Table32_Struct_Header), table->header.data_size * sizeof(long));
|
206
|
+
return rtable;
|
207
|
+
}
|
208
|
+
|
209
|
+
VALUE rb_Table32_Save(VALUE self, VALUE limit)
|
210
|
+
{
|
211
|
+
GET_TABLE
|
212
|
+
VALUE str1 = rb_str_new(reinterpret_cast<char*>(&table->header), sizeof(rb_Table32_Struct_Header));
|
213
|
+
VALUE str2 = rb_str_new(reinterpret_cast<char*>(table->heap), table->header.data_size * sizeof(long));
|
214
|
+
return rb_str_concat(str1, str2);
|
215
|
+
}
|
216
|
+
|
217
|
+
VALUE rb_Table32_Fill(VALUE self, VALUE val)
|
218
|
+
{
|
219
|
+
GET_TABLE
|
220
|
+
long v = RB_NUM2LONG(val);
|
221
|
+
unsigned long sz = table->header.data_size;
|
222
|
+
long* data = table->heap;
|
223
|
+
for(unsigned long i = 0;i < sz;i++)
|
224
|
+
{
|
225
|
+
data[i] = v;
|
226
|
+
}
|
227
|
+
return self;
|
228
|
+
}
|