red_bird 0.1.1
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/.gitignore +13 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +23 -0
- data/LICENSE.txt +21 -0
- data/README.md +47 -0
- data/Rakefile +10 -0
- data/bin/setup +8 -0
- data/ext/red_bird/bird.c +15 -0
- data/ext/red_bird/bird.h +10 -0
- data/ext/red_bird/color.c +95 -0
- data/ext/red_bird/color.h +27 -0
- data/ext/red_bird/dynamic_sprite.c +163 -0
- data/ext/red_bird/dynamic_sprite.h +30 -0
- data/ext/red_bird/engine.c +354 -0
- data/ext/red_bird/engine.h +40 -0
- data/ext/red_bird/extconf.rb +9 -0
- data/ext/red_bird/font.c +94 -0
- data/ext/red_bird/font.h +26 -0
- data/ext/red_bird/input_device.c +100 -0
- data/ext/red_bird/input_device.h +15 -0
- data/ext/red_bird/keycode.c +42 -0
- data/ext/red_bird/keycode.h +12 -0
- data/ext/red_bird/loader.c +154 -0
- data/ext/red_bird/loader.h +54 -0
- data/ext/red_bird/main.c +38 -0
- data/ext/red_bird/main.h +12 -0
- data/ext/red_bird/palette.c +132 -0
- data/ext/red_bird/palette.h +23 -0
- data/ext/red_bird/rect.c +257 -0
- data/ext/red_bird/rect.h +20 -0
- data/ext/red_bird/render.c +130 -0
- data/ext/red_bird/render.h +25 -0
- data/ext/red_bird/sprite.c +130 -0
- data/ext/red_bird/sprite.h +27 -0
- data/ext/red_bird/text.c +212 -0
- data/ext/red_bird/text.h +31 -0
- data/ext/red_bird/texture.c +157 -0
- data/ext/red_bird/texture.h +33 -0
- data/ext/red_bird/texture_imp.cpp +49 -0
- data/ext/red_bird/texture_imp.hpp +29 -0
- data/ext/red_bird/timer.c +134 -0
- data/ext/red_bird/timer.h +25 -0
- data/lib/red_bird.rb +15 -0
- data/lib/red_bird/animation.rb +133 -0
- data/lib/red_bird/camera.rb +61 -0
- data/lib/red_bird/controller.rb +44 -0
- data/lib/red_bird/dynamic_sprite.rb +38 -0
- data/lib/red_bird/engine.rb +81 -0
- data/lib/red_bird/entity.rb +74 -0
- data/lib/red_bird/entity_collision.rb +31 -0
- data/lib/red_bird/input_device.rb +86 -0
- data/lib/red_bird/palette.rb +23 -0
- data/lib/red_bird/relative_entity.rb +95 -0
- data/lib/red_bird/sprite.rb +40 -0
- data/lib/red_bird/stage.rb +60 -0
- data/lib/red_bird/tile_map.rb +118 -0
- data/lib/red_bird/tile_set.rb +56 -0
- data/lib/red_bird/uibox.rb +143 -0
- data/lib/red_bird/version.rb +3 -0
- data/lib/red_bird/vertical_menu.rb +110 -0
- data/red_bird.gemspec +37 -0
- metadata +149 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#ifndef RED_BIRD_RENDER_H
|
3
|
+
#define RED_BIRD_RENDER_H 1
|
4
|
+
|
5
|
+
#include "main.h"
|
6
|
+
|
7
|
+
extern VALUE bird_mRender;
|
8
|
+
|
9
|
+
VALUE
|
10
|
+
bird_mRender_set_color(VALUE self, VALUE color);
|
11
|
+
|
12
|
+
VALUE
|
13
|
+
bird_mRender_fill_rect(VALUE self, VALUE x, VALUE y,
|
14
|
+
VALUE width, VALUE height);
|
15
|
+
|
16
|
+
VALUE
|
17
|
+
bird_mRender_clear_screen(VALUE self);
|
18
|
+
|
19
|
+
VALUE
|
20
|
+
bird_mRender_update_screen(VALUE self);
|
21
|
+
|
22
|
+
void
|
23
|
+
Init_red_bird_render(void);
|
24
|
+
|
25
|
+
#endif /* RED_BIRD_RENDER_H */
|
@@ -0,0 +1,130 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#include "sprite.h"
|
3
|
+
|
4
|
+
#include "engine.h"
|
5
|
+
#include "texture.h"
|
6
|
+
|
7
|
+
VALUE bird_cSprite;
|
8
|
+
|
9
|
+
static ID id_at_texture;
|
10
|
+
|
11
|
+
/*
|
12
|
+
Basic functions that all Ruby classes need.
|
13
|
+
*/
|
14
|
+
|
15
|
+
void
|
16
|
+
bird_free_sprite(void* obj)
|
17
|
+
{
|
18
|
+
struct bird_sprite_data *ptr = obj;
|
19
|
+
|
20
|
+
free(ptr);
|
21
|
+
}
|
22
|
+
|
23
|
+
size_t
|
24
|
+
bird_memsize_sprite(const void* obj)
|
25
|
+
{
|
26
|
+
// TODO
|
27
|
+
return 0;
|
28
|
+
}
|
29
|
+
|
30
|
+
static const rb_data_type_t
|
31
|
+
bird_sprite_type = {
|
32
|
+
"red_bird_sprite",
|
33
|
+
{0, bird_free_sprite, bird_memsize_sprite,},
|
34
|
+
0, 0,
|
35
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
36
|
+
};
|
37
|
+
|
38
|
+
VALUE
|
39
|
+
bird_alloc_sprite(VALUE klass)
|
40
|
+
{
|
41
|
+
VALUE obj;
|
42
|
+
struct bird_sprite_data *ptr;
|
43
|
+
|
44
|
+
obj = TypedData_Make_Struct(klass, struct bird_sprite_data,
|
45
|
+
&bird_sprite_type, ptr);
|
46
|
+
|
47
|
+
return obj;
|
48
|
+
}
|
49
|
+
|
50
|
+
/*
|
51
|
+
@param texture [RedBird::Texture] image to use as source for this sprite.
|
52
|
+
@param x [Integer] vertical position in the texture.
|
53
|
+
@param y [Integer] horizontal position in the texture.
|
54
|
+
@param width [Integer] width of the sprite.
|
55
|
+
@param height [Integer] height of the sprite.
|
56
|
+
@return [RedBird::Sprite] self
|
57
|
+
@author Frederico Linhares
|
58
|
+
*/
|
59
|
+
VALUE
|
60
|
+
bird_cSprite_initialize(VALUE self, VALUE texture, VALUE x, VALUE y,
|
61
|
+
VALUE width, VALUE height)
|
62
|
+
{
|
63
|
+
struct bird_sprite_data *ptr;
|
64
|
+
|
65
|
+
if(!rb_obj_is_kind_of(texture, bird_cTexture))
|
66
|
+
rb_raise(rb_eTypeError, "%s",
|
67
|
+
"texture must be an instance of RedBird::Texture");
|
68
|
+
RB_INTEGER_TYPE_P(x);
|
69
|
+
RB_INTEGER_TYPE_P(y);
|
70
|
+
RB_INTEGER_TYPE_P(width);
|
71
|
+
RB_INTEGER_TYPE_P(height);
|
72
|
+
|
73
|
+
TypedData_Get_Struct(self, struct bird_sprite_data, &bird_sprite_type, ptr);
|
74
|
+
|
75
|
+
rb_ivar_set(self, id_at_texture, texture);
|
76
|
+
ptr->rect.x = NUM2INT(x);
|
77
|
+
ptr->rect.y = NUM2INT(y);
|
78
|
+
ptr->rect.w = NUM2INT(width);
|
79
|
+
ptr->rect.h = NUM2INT(height);
|
80
|
+
|
81
|
+
return self;
|
82
|
+
}
|
83
|
+
|
84
|
+
/*
|
85
|
+
Render this sprite to the screen.
|
86
|
+
|
87
|
+
@param x [Integer] screen horizontal position.
|
88
|
+
@param y [Integer] screen vertical position.
|
89
|
+
@return [RedBird::Sprite] self
|
90
|
+
@author Frederico Linhares
|
91
|
+
*/
|
92
|
+
VALUE
|
93
|
+
bird_cSprite_render_to_screen(VALUE self, VALUE x, VALUE y)
|
94
|
+
{
|
95
|
+
SDL_Rect dst_rect;
|
96
|
+
|
97
|
+
struct bird_sprite_data *ptr;
|
98
|
+
struct bird_texture_data *texture_ptr;
|
99
|
+
|
100
|
+
VALUE texture;
|
101
|
+
|
102
|
+
RB_INTEGER_TYPE_P(x);
|
103
|
+
RB_INTEGER_TYPE_P(y);
|
104
|
+
|
105
|
+
texture = rb_ivar_get(self, id_at_texture);
|
106
|
+
|
107
|
+
TypedData_Get_Struct(self, struct bird_sprite_data, &bird_sprite_type, ptr);
|
108
|
+
texture_ptr = bird_cTexture_get_data(texture);
|
109
|
+
|
110
|
+
dst_rect.x = NUM2INT(x);
|
111
|
+
dst_rect.y = NUM2INT(y);
|
112
|
+
dst_rect.w = ptr->rect.w;
|
113
|
+
dst_rect.h = ptr->rect.h;
|
114
|
+
|
115
|
+
SDL_RenderCopy(bird_core.renderer, texture_ptr->data, &ptr->rect,
|
116
|
+
&dst_rect);
|
117
|
+
|
118
|
+
return self;
|
119
|
+
}
|
120
|
+
|
121
|
+
void
|
122
|
+
Init_red_bird_sprite(void)
|
123
|
+
{
|
124
|
+
id_at_texture = rb_intern("@texture");
|
125
|
+
bird_cSprite = rb_define_class_under(bird_m, "Sprite", rb_cData);
|
126
|
+
rb_define_alloc_func(bird_cSprite, bird_alloc_sprite);
|
127
|
+
rb_define_method(bird_cSprite, "initialize", bird_cSprite_initialize, 5);
|
128
|
+
rb_define_method(bird_cSprite, "render_to_screen",
|
129
|
+
bird_cSprite_render_to_screen, 2);
|
130
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#ifndef RED_BIRD_SPRITE_H
|
3
|
+
#define RED_BIRD_SPRITE_H 1
|
4
|
+
|
5
|
+
#include "main.h"
|
6
|
+
|
7
|
+
extern VALUE bird_cSprite;
|
8
|
+
|
9
|
+
struct bird_sprite_data
|
10
|
+
{
|
11
|
+
SDL_Rect rect;
|
12
|
+
};
|
13
|
+
|
14
|
+
VALUE
|
15
|
+
bird_alloc_sprite(VALUE klass);
|
16
|
+
|
17
|
+
VALUE
|
18
|
+
bird_cSprite_initialize(VALUE self, VALUE texture, VALUE x, VALUE y,
|
19
|
+
VALUE width, VALUE height);
|
20
|
+
|
21
|
+
VALUE
|
22
|
+
bird_cSprite_render_to_screen(VALUE self, VALUE x, VALUE y);
|
23
|
+
|
24
|
+
void
|
25
|
+
Init_red_bird_sprite(void);
|
26
|
+
|
27
|
+
#endif // RED_BIRD_SPRITE_H
|
data/ext/red_bird/text.c
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#include "text.h"
|
3
|
+
|
4
|
+
#include "color.h"
|
5
|
+
#include "engine.h"
|
6
|
+
#include "font.h"
|
7
|
+
|
8
|
+
/*
|
9
|
+
Document-class: RedBird::Text
|
10
|
+
|
11
|
+
A text to be printed on the screen. This class renders the text received
|
12
|
+
during the initialization as an image and store the image internally for
|
13
|
+
rendering.
|
14
|
+
|
15
|
+
@author Frederico Linhares
|
16
|
+
*/
|
17
|
+
VALUE bird_cText;
|
18
|
+
|
19
|
+
/*
|
20
|
+
Basic functions all Ruby classes need.
|
21
|
+
*/
|
22
|
+
|
23
|
+
static void
|
24
|
+
bird_free_text(void* obj)
|
25
|
+
{
|
26
|
+
struct bird_text_data *ptr = obj;
|
27
|
+
|
28
|
+
SDL_DestroyTexture(ptr->data);
|
29
|
+
free(ptr);
|
30
|
+
}
|
31
|
+
|
32
|
+
static size_t
|
33
|
+
bird_memsize_text(const void* obj)
|
34
|
+
{
|
35
|
+
// TODO
|
36
|
+
return 0;
|
37
|
+
}
|
38
|
+
|
39
|
+
static const rb_data_type_t
|
40
|
+
bird_text_type = {
|
41
|
+
"red_bird_text",
|
42
|
+
{0, bird_free_text, bird_memsize_text,},
|
43
|
+
0, 0,
|
44
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
45
|
+
};
|
46
|
+
|
47
|
+
static VALUE
|
48
|
+
bird_alloc_text(VALUE klass)
|
49
|
+
{
|
50
|
+
VALUE obj;
|
51
|
+
struct bird_text_data *ptr;
|
52
|
+
|
53
|
+
obj = TypedData_Make_Struct(klass, struct bird_text_data, &bird_text_type,
|
54
|
+
ptr);
|
55
|
+
|
56
|
+
return obj;
|
57
|
+
}
|
58
|
+
|
59
|
+
/*
|
60
|
+
@param text [String] text to rendered.
|
61
|
+
@param font [RedBird::Font] font to be used for rendering the text.
|
62
|
+
@param tx_color [RedBird::Color] text color.
|
63
|
+
@param bg_color [RedBird::Color, nil] if the attribute is a color, this color
|
64
|
+
will be used as background; if the attribute is nil, there will be no
|
65
|
+
background.
|
66
|
+
@author Frederico Linhares
|
67
|
+
*/
|
68
|
+
VALUE
|
69
|
+
bird_cText_initialize(VALUE self, VALUE text, VALUE font, VALUE tx_color,
|
70
|
+
VALUE bg_color)
|
71
|
+
{
|
72
|
+
SDL_Surface *surface = NULL;
|
73
|
+
|
74
|
+
struct bird_text_data *ptr;
|
75
|
+
struct bird_font_data *font_ptr;
|
76
|
+
struct bird_color_data *tx_color_ptr;
|
77
|
+
struct bird_color_data *bg_color_ptr;
|
78
|
+
|
79
|
+
if(!engine_initialized)
|
80
|
+
rb_raise(rb_eRuntimeError, "%s",
|
81
|
+
"can not create a RedBird::Text instance before RedBird::Engine "
|
82
|
+
"is started");
|
83
|
+
|
84
|
+
SafeStringValue(text);
|
85
|
+
|
86
|
+
if(!rb_obj_is_kind_of(font, bird_cFont))
|
87
|
+
{
|
88
|
+
rb_raise(rb_eTypeError, "%s", "font must be an instance of RedBird::Font");
|
89
|
+
return self;
|
90
|
+
}
|
91
|
+
|
92
|
+
if(!rb_obj_is_kind_of(tx_color, bird_cColor))
|
93
|
+
{
|
94
|
+
rb_raise(rb_eTypeError, "%s",
|
95
|
+
"tx_color must be an instance of RedBird::Color");
|
96
|
+
return self;
|
97
|
+
}
|
98
|
+
|
99
|
+
font_ptr = bird_cFont_get_data(font);
|
100
|
+
tx_color_ptr = bird_cColor_get_data(tx_color);
|
101
|
+
if(TYPE(bg_color) == T_NIL)
|
102
|
+
{
|
103
|
+
surface = TTF_RenderUTF8_Solid(font_ptr->data, StringValueCStr(text),
|
104
|
+
tx_color_ptr->data);
|
105
|
+
}
|
106
|
+
else if(rb_obj_is_kind_of(bg_color, bird_cColor))
|
107
|
+
{
|
108
|
+
bg_color_ptr = bird_cColor_get_data(bg_color);
|
109
|
+
surface = TTF_RenderUTF8_Shaded(font_ptr->data, StringValueCStr(text),
|
110
|
+
tx_color_ptr->data, bg_color_ptr->data);
|
111
|
+
}
|
112
|
+
else
|
113
|
+
{
|
114
|
+
rb_raise(rb_eTypeError, "%s",
|
115
|
+
"bg_color must be an instance of RedBird::Color or nil");
|
116
|
+
return self;
|
117
|
+
}
|
118
|
+
|
119
|
+
if(surface == NULL)
|
120
|
+
{
|
121
|
+
rb_raise(rb_eRuntimeError, "failed to render text: %s", TTF_GetError());
|
122
|
+
return self;
|
123
|
+
}
|
124
|
+
|
125
|
+
TypedData_Get_Struct(self, struct bird_text_data, &bird_text_type, ptr);
|
126
|
+
|
127
|
+
ptr->data = NULL;
|
128
|
+
ptr->data = SDL_CreateTextureFromSurface(bird_core.renderer, surface);
|
129
|
+
SDL_FreeSurface(surface);
|
130
|
+
if(ptr->data == NULL)
|
131
|
+
{
|
132
|
+
rb_raise(rb_eRuntimeError, "failed to convert text: %s", SDL_GetError());
|
133
|
+
return self;
|
134
|
+
}
|
135
|
+
|
136
|
+
SDL_QueryTexture(ptr->data, NULL, NULL, &ptr->width, &ptr->height);
|
137
|
+
return self;
|
138
|
+
}
|
139
|
+
|
140
|
+
/*
|
141
|
+
Returns the width of the image.
|
142
|
+
|
143
|
+
@return [Integer] text width.
|
144
|
+
@author Frederico Linhares
|
145
|
+
*/
|
146
|
+
VALUE
|
147
|
+
bird_cText_width(VALUE self)
|
148
|
+
{
|
149
|
+
struct bird_text_data *ptr;
|
150
|
+
|
151
|
+
TypedData_Get_Struct(self, struct bird_text_data, &bird_text_type, ptr);
|
152
|
+
|
153
|
+
return INT2FIX(ptr->width);
|
154
|
+
}
|
155
|
+
|
156
|
+
/*
|
157
|
+
Returns the height of the image.
|
158
|
+
|
159
|
+
@return [Integer] text height.
|
160
|
+
@author Frederico Linhares
|
161
|
+
*/
|
162
|
+
VALUE
|
163
|
+
bird_cText_height(VALUE self)
|
164
|
+
{
|
165
|
+
struct bird_text_data *ptr;
|
166
|
+
|
167
|
+
TypedData_Get_Struct(self, struct bird_text_data, &bird_text_type, ptr);
|
168
|
+
|
169
|
+
return INT2FIX(ptr->height);
|
170
|
+
}
|
171
|
+
|
172
|
+
/*
|
173
|
+
Render this text to the screen.
|
174
|
+
|
175
|
+
@param x [Integer] screen horizontal position.
|
176
|
+
@param y [Integer] screen vertical position.
|
177
|
+
@return [RedBird::Sprite] self
|
178
|
+
@author Frederico Linhares
|
179
|
+
*/
|
180
|
+
VALUE
|
181
|
+
bird_cText_render_to_screen(VALUE self, VALUE x, VALUE y)
|
182
|
+
{
|
183
|
+
SDL_Rect dst_rect;
|
184
|
+
|
185
|
+
struct bird_text_data *ptr;
|
186
|
+
|
187
|
+
RB_INTEGER_TYPE_P(x);
|
188
|
+
RB_INTEGER_TYPE_P(y);
|
189
|
+
|
190
|
+
TypedData_Get_Struct(self, struct bird_text_data, &bird_text_type, ptr);
|
191
|
+
|
192
|
+
dst_rect.x = NUM2INT(x);
|
193
|
+
dst_rect.y = NUM2INT(y);
|
194
|
+
dst_rect.w = ptr->width;
|
195
|
+
dst_rect.h = ptr->height;
|
196
|
+
|
197
|
+
SDL_RenderCopy(bird_core.renderer, ptr->data, NULL, &dst_rect);
|
198
|
+
|
199
|
+
return self;
|
200
|
+
}
|
201
|
+
|
202
|
+
void
|
203
|
+
Init_red_bird_text(void)
|
204
|
+
{
|
205
|
+
bird_cText = rb_define_class_under(bird_m, "Text", rb_cData);
|
206
|
+
rb_define_alloc_func(bird_cText, bird_alloc_text);
|
207
|
+
rb_define_method(bird_cText, "initialize", bird_cText_initialize, 4);
|
208
|
+
rb_define_method(bird_cText, "width", bird_cText_width, 0);
|
209
|
+
rb_define_method(bird_cText, "height", bird_cText_height, 0);
|
210
|
+
rb_define_method(bird_cText, "render_to_screen",
|
211
|
+
bird_cText_render_to_screen, 2);
|
212
|
+
}
|
data/ext/red_bird/text.h
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#ifndef RED_BIRD_TEXT_H
|
3
|
+
#define RED_BIRD_TEXT_H 1
|
4
|
+
|
5
|
+
#include "main.h"
|
6
|
+
|
7
|
+
extern VALUE bird_cText;
|
8
|
+
|
9
|
+
struct bird_text_data
|
10
|
+
{
|
11
|
+
SDL_Texture* data;
|
12
|
+
int width, height;
|
13
|
+
};
|
14
|
+
|
15
|
+
VALUE
|
16
|
+
bird_cText_initialize(VALUE self, VALUE text, VALUE font, VALUE tx_color,
|
17
|
+
VALUE bg_color);
|
18
|
+
|
19
|
+
VALUE
|
20
|
+
bird_cText_width(VALUE self);
|
21
|
+
|
22
|
+
VALUE
|
23
|
+
bird_cText_height(VALUE self);
|
24
|
+
|
25
|
+
VALUE
|
26
|
+
bird_cText_render_to_screen(VALUE self, VALUE x, VALUE y);
|
27
|
+
|
28
|
+
void
|
29
|
+
Init_red_bird_text(void);
|
30
|
+
|
31
|
+
#endif /* RED_BIRD_TEXT_H */
|
@@ -0,0 +1,157 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#include "texture.h"
|
3
|
+
#include "texture_imp.hpp"
|
4
|
+
|
5
|
+
#include "engine.h"
|
6
|
+
#include "palette.h"
|
7
|
+
|
8
|
+
/*
|
9
|
+
Document-class: RedBird::Texture
|
10
|
+
|
11
|
+
An image optimized for rendering on the screen.
|
12
|
+
|
13
|
+
@author Frederico Linhares
|
14
|
+
*/
|
15
|
+
VALUE bird_cTexture;
|
16
|
+
|
17
|
+
/*
|
18
|
+
Basic functions all Ruby classes need.
|
19
|
+
*/
|
20
|
+
|
21
|
+
void
|
22
|
+
bird_free_texture(void* obj)
|
23
|
+
{
|
24
|
+
struct bird_texture_data *ptr = obj;
|
25
|
+
|
26
|
+
SDL_DestroyTexture(ptr->data);
|
27
|
+
free(ptr);
|
28
|
+
}
|
29
|
+
|
30
|
+
size_t
|
31
|
+
bird_memsize_texture(const void* obj)
|
32
|
+
{
|
33
|
+
// TODO
|
34
|
+
return 0;
|
35
|
+
}
|
36
|
+
|
37
|
+
static const rb_data_type_t
|
38
|
+
bird_texture_type = {
|
39
|
+
"red_bird_texture",
|
40
|
+
{0, bird_free_texture, bird_memsize_texture,},
|
41
|
+
0, 0,
|
42
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
43
|
+
};
|
44
|
+
|
45
|
+
VALUE
|
46
|
+
bird_alloc_texture(VALUE klass)
|
47
|
+
{
|
48
|
+
VALUE obj;
|
49
|
+
struct bird_texture_data *ptr;
|
50
|
+
|
51
|
+
obj = TypedData_Make_Struct(klass, struct bird_texture_data,
|
52
|
+
&bird_texture_type, ptr);
|
53
|
+
|
54
|
+
return obj;
|
55
|
+
}
|
56
|
+
|
57
|
+
/*
|
58
|
+
@param file_path [String] path to an image to be loaded into a texture.
|
59
|
+
@author Frederico Linhares
|
60
|
+
*/
|
61
|
+
VALUE
|
62
|
+
bird_cTexture_initialize(VALUE self, VALUE file_path, VALUE palette)
|
63
|
+
{
|
64
|
+
struct bird_texture_data *ptr;
|
65
|
+
struct bird_palette_data *palette_data;
|
66
|
+
struct bird_cTexture_PGM pgm_img;
|
67
|
+
SDL_Surface *surface = NULL;
|
68
|
+
|
69
|
+
if(!engine_initialized)
|
70
|
+
rb_raise(rb_eRuntimeError, "%s",
|
71
|
+
"can not create a RedBird::Texture instance before "
|
72
|
+
"RedBird::Engine is started");
|
73
|
+
|
74
|
+
if(!rb_obj_is_kind_of(palette, bird_cPalette))
|
75
|
+
rb_raise(
|
76
|
+
rb_eArgError, "%s",
|
77
|
+
"palette must be and instance of RedBird::Palette");
|
78
|
+
|
79
|
+
SafeStringValue(file_path);
|
80
|
+
if(!bird_cTexture_PGM_load(&pgm_img, StringValueCStr(file_path)))
|
81
|
+
rb_raise(
|
82
|
+
rb_eArgError, "%s",
|
83
|
+
"failed to load image: it does not exists or is in an invalid format");
|
84
|
+
|
85
|
+
// Depth = 8 bits image.
|
86
|
+
// Pitch = 1 byte (8 bits) * image width.
|
87
|
+
surface = SDL_CreateRGBSurfaceWithFormatFrom(
|
88
|
+
pgm_img.data, pgm_img.width, pgm_img.height, 8, pgm_img.width,
|
89
|
+
SDL_PIXELFORMAT_INDEX8);
|
90
|
+
bird_cTexture_PGM_unload(&pgm_img);
|
91
|
+
if(surface == NULL)
|
92
|
+
rb_raise(rb_eArgError, "failed to create surface: %s\n", SDL_GetError());
|
93
|
+
|
94
|
+
TypedData_Get_Struct(self, struct bird_texture_data, &bird_texture_type,
|
95
|
+
ptr);
|
96
|
+
palette_data = bird_cPalette_get_data(palette);
|
97
|
+
SDL_SetPaletteColors(surface->format->palette, palette_data->colors, 0, 256);
|
98
|
+
|
99
|
+
ptr->data = SDL_CreateTextureFromSurface(bird_core.renderer, surface);
|
100
|
+
SDL_FreeSurface(surface);
|
101
|
+
if(ptr->data == NULL)
|
102
|
+
rb_raise(rb_eArgError, "failed to convert image: %s\n", SDL_GetError());
|
103
|
+
|
104
|
+
SDL_QueryTexture(ptr->data, NULL, NULL, &ptr->width, &ptr->height);
|
105
|
+
return self;
|
106
|
+
}
|
107
|
+
|
108
|
+
/*
|
109
|
+
@return [Integer]
|
110
|
+
@author Frederico Linhares
|
111
|
+
*/
|
112
|
+
VALUE
|
113
|
+
bird_cTexture_width(VALUE self)
|
114
|
+
{
|
115
|
+
struct bird_texture_data *ptr;
|
116
|
+
|
117
|
+
TypedData_Get_Struct(self, struct bird_texture_data, &bird_texture_type,
|
118
|
+
ptr);
|
119
|
+
|
120
|
+
return INT2FIX(ptr->width);
|
121
|
+
}
|
122
|
+
|
123
|
+
/*
|
124
|
+
@return [Integer]
|
125
|
+
@author Frederico Linhares
|
126
|
+
*/
|
127
|
+
VALUE
|
128
|
+
bird_cTexture_height(VALUE self)
|
129
|
+
{
|
130
|
+
struct bird_texture_data *ptr;
|
131
|
+
|
132
|
+
TypedData_Get_Struct(self, struct bird_texture_data, &bird_texture_type,
|
133
|
+
ptr);
|
134
|
+
|
135
|
+
return INT2FIX(ptr->height);
|
136
|
+
}
|
137
|
+
|
138
|
+
struct bird_texture_data*
|
139
|
+
bird_cTexture_get_data(VALUE self)
|
140
|
+
{
|
141
|
+
struct bird_texture_data *ptr;
|
142
|
+
|
143
|
+
TypedData_Get_Struct(self, struct bird_texture_data, &bird_texture_type,
|
144
|
+
ptr);
|
145
|
+
|
146
|
+
return ptr;
|
147
|
+
}
|
148
|
+
|
149
|
+
void
|
150
|
+
Init_red_bird_texture(void)
|
151
|
+
{
|
152
|
+
bird_cTexture = rb_define_class_under(bird_m, "Texture", rb_cData);
|
153
|
+
rb_define_alloc_func(bird_cTexture, bird_alloc_texture);
|
154
|
+
rb_define_method(bird_cTexture, "initialize", bird_cTexture_initialize, 2);
|
155
|
+
rb_define_method(bird_cTexture, "width", bird_cTexture_width, 0);
|
156
|
+
rb_define_method(bird_cTexture, "height", bird_cTexture_height, 0);
|
157
|
+
}
|