allegro4r 0.0.1-x86-mswin32-60
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/History.txt +4 -0
- data/Manifest.txt +59 -0
- data/README.txt +94 -0
- data/examples/exdbuf.rb +58 -0
- data/examples/exfixed.rb +46 -0
- data/examples/exflame.rb +200 -0
- data/examples/exflip.rb +87 -0
- data/examples/exfont.rb +70 -0
- data/examples/exhello.rb +46 -0
- data/examples/exjoy.rb +206 -0
- data/examples/exkeys.rb +216 -0
- data/examples/exmem.rb +50 -0
- data/examples/exmidi.rb +97 -0
- data/examples/exmouse.rb +149 -0
- data/examples/expal.rb +70 -0
- data/examples/expat.rb +62 -0
- data/examples/exsample.rb +89 -0
- data/examples/extimer.rb +84 -0
- data/examples/unifont.dat +0 -0
- data/ext/a4r_API_BITMAP.c +27 -0
- data/ext/a4r_API_DIGI_DRIVER.c +14 -0
- data/ext/a4r_API_GFX_DRIVER.c +14 -0
- data/ext/a4r_API_JOYSTICK_AXIS_INFO.c +53 -0
- data/ext/a4r_API_JOYSTICK_BUTTON_INFO.c +27 -0
- data/ext/a4r_API_JOYSTICK_DRIVER.c +14 -0
- data/ext/a4r_API_JOYSTICK_INFO.c +84 -0
- data/ext/a4r_API_JOYSTICK_STICK_INFO.c +62 -0
- data/ext/a4r_API_KEYBOARD_DRIVER.c +14 -0
- data/ext/a4r_API_MIDI_DRIVER.c +14 -0
- data/ext/a4r_API_MOUSE_DRIVER.c +14 -0
- data/ext/a4r_API_PALETTE.c +63 -0
- data/ext/a4r_API_RGB.c +118 -0
- data/ext/a4r_API_TIMER_DRIVER.c +14 -0
- data/ext/a4r_API_bitmap_objects.c +310 -0
- data/ext/a4r_API_blitting_and_sprites.c +86 -0
- data/ext/a4r_API_digital_sample_routines.c +83 -0
- data/ext/a4r_API_direct_access_to_video_memory.c +102 -0
- data/ext/a4r_API_drawing_primitives.c +114 -0
- data/ext/a4r_API_file_and_compression_routines.c +27 -0
- data/ext/a4r_API_fixed_point_math_routines.c +98 -0
- data/ext/a4r_API_fonts.c +147 -0
- data/ext/a4r_API_graphics_modes.c +155 -0
- data/ext/a4r_API_joystick_routines.c +213 -0
- data/ext/a4r_API_keyboard_routines.c +420 -0
- data/ext/a4r_API_misc.c +133 -0
- data/ext/a4r_API_mouse_routines.c +220 -0
- data/ext/a4r_API_music_routines_midi.c +147 -0
- data/ext/a4r_API_palette_routines.c +112 -0
- data/ext/a4r_API_sound_init_routines.c +29 -0
- data/ext/a4r_API_text_output.c +178 -0
- data/ext/a4r_API_timer_routines.c +250 -0
- data/ext/a4r_API_transparency_and_patterned_drawing.c +87 -0
- data/ext/a4r_API_truecolor_pixel_formats.c +44 -0
- data/ext/a4r_API_unicode_routines.c +53 -0
- data/ext/a4r_API_using_allegro.c +98 -0
- data/ext/allegro4r.c +866 -0
- data/ext/allegro4r.h +311 -0
- data/ext/allegro4r.so +0 -0
- data/ext/extconf.rb +11 -0
- metadata +113 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* jsi.flags -> int
|
6
|
+
*
|
7
|
+
* Status flags for this input
|
8
|
+
*/
|
9
|
+
VALUE a4r_API_JOYSTICK_STICK_INFO_flags(VALUE self)
|
10
|
+
{
|
11
|
+
JOYSTICK_STICK_INFO *jsi;
|
12
|
+
Data_Get_Struct(self, JOYSTICK_STICK_INFO, jsi);
|
13
|
+
return INT2NUM(jsi->flags);
|
14
|
+
}
|
15
|
+
|
16
|
+
/*
|
17
|
+
* call-seq:
|
18
|
+
* jsi.num_axis -> int
|
19
|
+
*
|
20
|
+
* How many axes do we have? (note the misspelling)
|
21
|
+
*/
|
22
|
+
VALUE a4r_API_JOYSTICK_STICK_INFO_num_axis(VALUE self)
|
23
|
+
{
|
24
|
+
JOYSTICK_STICK_INFO *jsi;
|
25
|
+
Data_Get_Struct(self, JOYSTICK_STICK_INFO, jsi);
|
26
|
+
return INT2FIX(jsi->num_axis);
|
27
|
+
}
|
28
|
+
|
29
|
+
/*
|
30
|
+
* call-seq:
|
31
|
+
* jsi.axis -> ary
|
32
|
+
*
|
33
|
+
* Axis state information
|
34
|
+
*/
|
35
|
+
VALUE a4r_API_JOYSTICK_STICK_INFO_axis(VALUE self)
|
36
|
+
{
|
37
|
+
JOYSTICK_STICK_INFO *jsi;
|
38
|
+
Data_Get_Struct(self, JOYSTICK_STICK_INFO, jsi);
|
39
|
+
|
40
|
+
VALUE ret = rb_ary_new2(jsi->num_axis);
|
41
|
+
long x;
|
42
|
+
for (x = 0; x < jsi->num_axis; x++)
|
43
|
+
{
|
44
|
+
VALUE obj = Data_Wrap_Struct(cAPI_JOYSTICK_AXIS_INFO, 0, 0, &(jsi->axis[x]));
|
45
|
+
rb_ary_store(ret, x, obj);
|
46
|
+
}
|
47
|
+
|
48
|
+
return ret;
|
49
|
+
}
|
50
|
+
|
51
|
+
/*
|
52
|
+
* call-seq:
|
53
|
+
* jsi.name -> str
|
54
|
+
*
|
55
|
+
* Description of this input
|
56
|
+
*/
|
57
|
+
VALUE a4r_API_JOYSTICK_STICK_INFO_name(VALUE self)
|
58
|
+
{
|
59
|
+
JOYSTICK_STICK_INFO *jsi;
|
60
|
+
Data_Get_Struct(self, JOYSTICK_STICK_INFO, jsi);
|
61
|
+
return rb_str_new2(jsi->name);
|
62
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* driver.name -> str
|
6
|
+
*
|
7
|
+
* Returns the name of the keyboard driver.
|
8
|
+
*/
|
9
|
+
VALUE a4r_API_KEYBOARD_DRIVER_name_get(VALUE self)
|
10
|
+
{
|
11
|
+
KEYBOARD_DRIVER *driver;
|
12
|
+
Data_Get_Struct(self, KEYBOARD_DRIVER, driver);
|
13
|
+
return rb_str_new2(driver->name);
|
14
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* driver.name -> str
|
6
|
+
*
|
7
|
+
* Driver name
|
8
|
+
*/
|
9
|
+
VALUE a4r_API_MIDI_DRIVER_name_get(VALUE self)
|
10
|
+
{
|
11
|
+
MIDI_DRIVER *driver;
|
12
|
+
Data_Get_Struct(self, MIDI_DRIVER, driver);
|
13
|
+
return rb_str_new2(driver->name);
|
14
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* driver.name -> str
|
6
|
+
*
|
7
|
+
* Returns the name of the mouse driver.
|
8
|
+
*/
|
9
|
+
VALUE a4r_API_MOUSE_DRIVER_name_get(VALUE self)
|
10
|
+
{
|
11
|
+
MOUSE_DRIVER *driver;
|
12
|
+
Data_Get_Struct(self, MOUSE_DRIVER, driver);
|
13
|
+
return rb_str_new2(driver->name);
|
14
|
+
}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
void a4r_API_PALETTE_free(void *palette)
|
4
|
+
{
|
5
|
+
free((PALETTE*)palette);
|
6
|
+
}
|
7
|
+
|
8
|
+
/* :nodoc: */
|
9
|
+
VALUE a4r_API_PALETTE_alloc(VALUE klass)
|
10
|
+
{
|
11
|
+
PALETTE *palette;
|
12
|
+
VALUE obj = Data_Make_Struct(klass, PALETTE, 0, a4r_API_PALETTE_free, palette);
|
13
|
+
return obj;
|
14
|
+
}
|
15
|
+
|
16
|
+
/* :nodoc: */
|
17
|
+
VALUE a4r_API_PALETTE_initialize_copy(VALUE copy, VALUE orig)
|
18
|
+
{
|
19
|
+
if (copy == orig)
|
20
|
+
return copy;
|
21
|
+
|
22
|
+
if (TYPE(orig) != T_DATA || RDATA(orig)->dfree != (RUBY_DATA_FUNC)a4r_API_PALETTE_free)
|
23
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
24
|
+
|
25
|
+
PALETTE *orig_pal, *copy_pal;
|
26
|
+
Data_Get_Struct(orig, PALETTE, orig_pal);
|
27
|
+
Data_Get_Struct(copy, PALETTE, copy_pal);
|
28
|
+
MEMCPY(copy_pal, orig_pal, PALETTE, 1);
|
29
|
+
return copy;
|
30
|
+
}
|
31
|
+
|
32
|
+
/*
|
33
|
+
* call-seq:
|
34
|
+
* palette[index] -> an_rgb
|
35
|
+
*
|
36
|
+
* Returns the RGB element at the specified index.
|
37
|
+
*/
|
38
|
+
VALUE a4r_API_PALETTE_getter(VALUE self, VALUE index)
|
39
|
+
{
|
40
|
+
// TODO: Index validation && converting to "array" of RGBs
|
41
|
+
PALETTE *palette;
|
42
|
+
Data_Get_Struct(self, PALETTE, palette);
|
43
|
+
RGB *rgb = &((*palette)[FIX2INT(index)]);
|
44
|
+
VALUE obj = Data_Wrap_Struct(cAPI_RGB, 0, 0, rgb);
|
45
|
+
return obj;
|
46
|
+
}
|
47
|
+
|
48
|
+
/*
|
49
|
+
* call-seq:
|
50
|
+
* palette[index] = an_rgb -> an_rgb
|
51
|
+
*
|
52
|
+
* Sets the element at index to the specified RGB element.
|
53
|
+
*/
|
54
|
+
VALUE a4r_API_PALETTE_setter(VALUE self, VALUE index, VALUE val)
|
55
|
+
{
|
56
|
+
// TODO: Index validation, val validation && converting to "array" of RGBs
|
57
|
+
PALETTE *palette;
|
58
|
+
Data_Get_Struct(self, PALETTE, palette);
|
59
|
+
RGB *rgb;
|
60
|
+
Data_Get_Struct(val, RGB, rgb);
|
61
|
+
(*palette)[FIX2INT(index)] = *rgb;
|
62
|
+
return val;
|
63
|
+
}
|
data/ext/a4r_API_RGB.c
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
void a4r_API_RGB_free(void *rgb)
|
4
|
+
{
|
5
|
+
free((RGB*)rgb);
|
6
|
+
}
|
7
|
+
|
8
|
+
/* :nodoc: */
|
9
|
+
VALUE a4r_API_RGB_alloc(VALUE klass)
|
10
|
+
{
|
11
|
+
RGB *rgb;
|
12
|
+
VALUE obj = Data_Make_Struct(klass, RGB, 0, a4r_API_RGB_free, rgb);
|
13
|
+
return obj;
|
14
|
+
}
|
15
|
+
|
16
|
+
/* :nodoc: */
|
17
|
+
VALUE a4r_API_RGB_initialize_copy(VALUE copy, VALUE orig)
|
18
|
+
{
|
19
|
+
if (copy == orig)
|
20
|
+
return copy;
|
21
|
+
|
22
|
+
// TODO: Bring back this check. We do Data_Wrap_Structs in other places,
|
23
|
+
// which is causing this to have two structs with different free methods
|
24
|
+
/*
|
25
|
+
if (TYPE(orig) != T_DATA || RDATA(orig)->dfree != (RUBY_DATA_FUNC)a4r_API_RGB_free)
|
26
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
27
|
+
*/
|
28
|
+
|
29
|
+
RGB *orig_rgb, *copy_rgb;
|
30
|
+
Data_Get_Struct(orig, RGB, orig_rgb);
|
31
|
+
Data_Get_Struct(copy, RGB, copy_rgb);
|
32
|
+
MEMCPY(copy_rgb, orig_rgb, RGB, 1);
|
33
|
+
return copy;
|
34
|
+
}
|
35
|
+
|
36
|
+
/*
|
37
|
+
* call-seq:
|
38
|
+
* rgb.r -> int
|
39
|
+
*
|
40
|
+
* Returns the red value of the RGB.
|
41
|
+
*/
|
42
|
+
VALUE a4r_API_RGB_r_get(VALUE self)
|
43
|
+
{
|
44
|
+
RGB *rgb;
|
45
|
+
Data_Get_Struct(self, RGB, rgb);
|
46
|
+
return CHR2FIX(rgb->r);
|
47
|
+
}
|
48
|
+
|
49
|
+
/*
|
50
|
+
* call-seq:
|
51
|
+
* rgb.r = int -> int
|
52
|
+
*
|
53
|
+
* Sets the red value of the RGB. The value must be in the range 0-255.
|
54
|
+
*/
|
55
|
+
VALUE a4r_API_RGB_r_set(VALUE self, VALUE val)
|
56
|
+
{
|
57
|
+
// TODO: val validation
|
58
|
+
RGB *rgb;
|
59
|
+
Data_Get_Struct(self, RGB, rgb);
|
60
|
+
rgb->r = NUM2CHR(val);
|
61
|
+
return val;
|
62
|
+
}
|
63
|
+
|
64
|
+
/*
|
65
|
+
* call-seq:
|
66
|
+
* rgb.g -> int
|
67
|
+
*
|
68
|
+
* Returns the green value of the RGB.
|
69
|
+
*/
|
70
|
+
VALUE a4r_API_RGB_g_get(VALUE self)
|
71
|
+
{
|
72
|
+
RGB *rgb;
|
73
|
+
Data_Get_Struct(self, RGB, rgb);
|
74
|
+
return CHR2FIX(rgb->g);
|
75
|
+
}
|
76
|
+
|
77
|
+
/*
|
78
|
+
* call-seq:
|
79
|
+
* rgb.g = int -> int
|
80
|
+
*
|
81
|
+
* Sets the green value of the RGB. The value must be in the range 0-255.
|
82
|
+
*/
|
83
|
+
VALUE a4r_API_RGB_g_set(VALUE self, VALUE val)
|
84
|
+
{
|
85
|
+
// TODO: val validation
|
86
|
+
RGB *rgb;
|
87
|
+
Data_Get_Struct(self, RGB, rgb);
|
88
|
+
rgb->g = NUM2CHR(val);
|
89
|
+
return val;
|
90
|
+
}
|
91
|
+
|
92
|
+
/*
|
93
|
+
* call-seq:
|
94
|
+
* rgb.b -> int
|
95
|
+
*
|
96
|
+
* Returns the blue value of the RGB.
|
97
|
+
*/
|
98
|
+
VALUE a4r_API_RGB_b_get(VALUE self)
|
99
|
+
{
|
100
|
+
RGB *rgb;
|
101
|
+
Data_Get_Struct(self, RGB, rgb);
|
102
|
+
return CHR2FIX(rgb->b);
|
103
|
+
}
|
104
|
+
|
105
|
+
/*
|
106
|
+
* call-seq:
|
107
|
+
* rgb.b = int -> int
|
108
|
+
*
|
109
|
+
* Sets the blue value of the RGB. The value must be in the range 0-255.
|
110
|
+
*/
|
111
|
+
VALUE a4r_API_RGB_b_set(VALUE self, VALUE val)
|
112
|
+
{
|
113
|
+
// TODO: val validation
|
114
|
+
RGB *rgb;
|
115
|
+
Data_Get_Struct(self, RGB, rgb);
|
116
|
+
rgb->b = NUM2CHR(val);
|
117
|
+
return val;
|
118
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* driver.name -> str
|
6
|
+
*
|
7
|
+
* Returns the name of the timer driver.
|
8
|
+
*/
|
9
|
+
VALUE a4r_API_TIMER_DRIVER_name_get(VALUE self)
|
10
|
+
{
|
11
|
+
TIMER_DRIVER *driver;
|
12
|
+
Data_Get_Struct(self, TIMER_DRIVER, driver);
|
13
|
+
return rb_str_new2(driver->name);
|
14
|
+
}
|
@@ -0,0 +1,310 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* screen -> a_bmp
|
6
|
+
*
|
7
|
+
* Global reference to a bitmap, sized VIRTUAL_W x VIRTUAL_H. This is created by
|
8
|
+
* set_gfx_mode, and represents the hardware video memory. Only a part of this
|
9
|
+
* bitmap will actually be visible, sized SCREEN_W x SCREEN_H. Normally this is
|
10
|
+
* the top left corner of the larger virtual screen, so you can ignore the extra
|
11
|
+
* invisible virtual size of the bitmap if you aren't interested in hardware
|
12
|
+
* scrolling or page flipping. To move the visible window to other parts of the
|
13
|
+
* screen bitmap, call scroll_screen. Initially the clipping rectangle will be
|
14
|
+
* limited to the physical screen size, so if you want to draw onto a larger
|
15
|
+
* virtual screen space outside this rectangle, you will need to adjust the
|
16
|
+
* clipping.
|
17
|
+
*
|
18
|
+
* For example, to draw a pixel onto the screen you would write:
|
19
|
+
* putpixel(screen, x, y, color)
|
20
|
+
*
|
21
|
+
* Or to implement a double-buffered system:
|
22
|
+
* # Make a bitmap in RAM.
|
23
|
+
* bmp = create_bitmap(320, 200)
|
24
|
+
* # Clean the memory bitmap.
|
25
|
+
* clear_bitmap(bmp)
|
26
|
+
* # Draw onto the memory bitmap.
|
27
|
+
* putpixel(bmp, x, y, color)
|
28
|
+
* # Copy it to the screen.
|
29
|
+
* blit(bmp, screen, 0, 0, 0, 0, 320, 200)
|
30
|
+
*
|
31
|
+
* Warning: be very careful when using this reference at the same time as any
|
32
|
+
* bitmaps created by the create_video_bitmap function (see the description of
|
33
|
+
* this function for more detailed information). And never try to destroy it
|
34
|
+
* with destroy_bitmap.
|
35
|
+
*/
|
36
|
+
VALUE a4r_API_screen(VALUE self)
|
37
|
+
{
|
38
|
+
// TODO: Convert to data struct or cached or hooked variable?
|
39
|
+
BITMAP *bmp = screen;
|
40
|
+
VALUE obj = Data_Wrap_Struct(cAPI_BITMAP, 0, 0, bmp);
|
41
|
+
return obj;
|
42
|
+
}
|
43
|
+
|
44
|
+
/*
|
45
|
+
* call-seq:
|
46
|
+
* SCREEN_W -> int
|
47
|
+
*
|
48
|
+
* Global defines that return the width and height of the screen, or zero if the
|
49
|
+
* screen has not been initialised yet. Example:
|
50
|
+
* buf = "\0" * 100
|
51
|
+
* uszprintf(buf, buf.length, "The screen size is %d x %d pixels" %
|
52
|
+
* [SCREEN_W, SCREEN_H])
|
53
|
+
*/
|
54
|
+
VALUE a4r_API_SCREEN_W(VALUE self)
|
55
|
+
{
|
56
|
+
// TODO: Convert to hooked or virtual variable?
|
57
|
+
return INT2FIX(SCREEN_W);
|
58
|
+
}
|
59
|
+
|
60
|
+
/*
|
61
|
+
* call-seq:
|
62
|
+
* SCREEN_H -> int
|
63
|
+
*
|
64
|
+
* See SCREEN_W.
|
65
|
+
*/
|
66
|
+
VALUE a4r_API_SCREEN_H(VALUE self)
|
67
|
+
{
|
68
|
+
// TODO: Convert to hooked or virtual variable?
|
69
|
+
return INT2FIX(SCREEN_H);
|
70
|
+
}
|
71
|
+
|
72
|
+
/*
|
73
|
+
* call-seq:
|
74
|
+
* create_bitmap(width, height) -> a_bmp or nil
|
75
|
+
*
|
76
|
+
* Creates a memory bitmap sized width by height. The bitmap will have clipping
|
77
|
+
* turned on, and the clipping rectangle set to the full size of the bitmap. The
|
78
|
+
* image memory will not be cleared, so it will probably contain garbage: you
|
79
|
+
* should clear the bitmap before using it. This routine always uses the global
|
80
|
+
* pixel format, as specified by calling set_color_depth. The minimum height of
|
81
|
+
* the BITMAP must be 1 and width can't be negative. Example:
|
82
|
+
* # Create a 10 pixel tall bitmap, as wide as the screen.
|
83
|
+
* bmp = create_bitmap(SCREEN_W, 10)
|
84
|
+
* abort_on_error("Couldn't create bitmap!") if bmp.nil?
|
85
|
+
* # Use the bitmap.
|
86
|
+
* ...
|
87
|
+
* # Destroy it when we don't need it any more.
|
88
|
+
* destroy_bitmap(bmp)
|
89
|
+
*
|
90
|
+
* Return value: Returns a reference to the created bitmap, or nil if the bitmap
|
91
|
+
* could not be created. Remember to free this bitmap later to avoid memory
|
92
|
+
* leaks.
|
93
|
+
*/
|
94
|
+
VALUE a4r_API_create_bitmap(VALUE self, VALUE width, VALUE height)
|
95
|
+
{
|
96
|
+
// TODO: Change to call destroy_bitmap on free?
|
97
|
+
BITMAP *bmp = create_bitmap(FIX2INT(width), FIX2INT(height));
|
98
|
+
if (bmp == NULL)
|
99
|
+
return Qnil;
|
100
|
+
VALUE obj = Data_Wrap_Struct(cAPI_BITMAP, 0, 0, bmp);
|
101
|
+
return obj;
|
102
|
+
}
|
103
|
+
|
104
|
+
/*
|
105
|
+
* call-seq:
|
106
|
+
* create_sub_bitmap(parent, x, y, width, height) -> a_bmp or nil
|
107
|
+
*
|
108
|
+
* Creates a sub-bitmap, ie. a bitmap sharing drawing memory with a pre-existing
|
109
|
+
* bitmap, but possibly with a different size and clipping settings. When
|
110
|
+
* creating a sub-bitmap of the mode-X screen, the x position must be a multiple
|
111
|
+
* of four. The sub-bitmap width and height can extend beyond the right and
|
112
|
+
* bottom edges of the parent (they will be clipped), but the origin point must
|
113
|
+
* lie within the parent region.
|
114
|
+
*
|
115
|
+
* Return value: Returns a reference to the created sub bitmap, or nil if the
|
116
|
+
* sub bitmap could not be created. Remember to free the sub bitmap before
|
117
|
+
* freeing the parent bitmap to avoid memory leaks and potential crashes
|
118
|
+
* accessing memory which has been freed.
|
119
|
+
*/
|
120
|
+
VALUE a4r_API_create_sub_bitmap(VALUE self, VALUE parent, VALUE x, VALUE y, VALUE width, VALUE height)
|
121
|
+
{
|
122
|
+
BITMAP *bmp;
|
123
|
+
Data_Get_Struct(parent, BITMAP, bmp);
|
124
|
+
BITMAP *ret = create_sub_bitmap(bmp, FIX2INT(x), FIX2INT(y), FIX2INT(width), FIX2INT(height));
|
125
|
+
if (ret == NULL)
|
126
|
+
return Qnil;
|
127
|
+
VALUE obj = Data_Wrap_Struct(cAPI_BITMAP, 0, 0, ret);
|
128
|
+
return obj;
|
129
|
+
}
|
130
|
+
|
131
|
+
/*
|
132
|
+
* call-seq:
|
133
|
+
* create_video_bitmap(width, height) -> a_bmp or nil
|
134
|
+
*
|
135
|
+
* Allocates a video memory bitmap of the specified size. This can be used to
|
136
|
+
* allocate offscreen video memory for storing source graphics ready for a
|
137
|
+
* hardware accelerated blitting operation, or to create multiple video memory
|
138
|
+
* pages which can then be displayed by calling show_video_bitmap. Read the
|
139
|
+
* introduction of this chapter for a comparison with other types of bitmaps and
|
140
|
+
* other specific details.
|
141
|
+
*
|
142
|
+
* Warning: video memory bitmaps are usually allocated from the same space as
|
143
|
+
* the screen bitmap, so they may overlap with it; it is therefore not a good
|
144
|
+
* idea to use the global screen at the same time as any surfaces returned by
|
145
|
+
* this function.
|
146
|
+
*
|
147
|
+
* Return value: Returns a reference to the bitmap on success, or nil if you
|
148
|
+
* have run out of video ram. Remember to destroy this bitmap before any
|
149
|
+
* subsequent call to set_gfx_mode.
|
150
|
+
*/
|
151
|
+
VALUE a4r_API_create_video_bitmap(VALUE self, VALUE width, VALUE height)
|
152
|
+
{
|
153
|
+
// TODO: Change to call destroy_bitmap on free?
|
154
|
+
BITMAP *bmp = create_video_bitmap(FIX2INT(width), FIX2INT(height));
|
155
|
+
if (bmp == NULL)
|
156
|
+
return Qnil;
|
157
|
+
VALUE obj = Data_Wrap_Struct(cAPI_BITMAP, 0, 0, bmp);
|
158
|
+
return obj;
|
159
|
+
}
|
160
|
+
|
161
|
+
/*
|
162
|
+
* call-seq:
|
163
|
+
* destroy_bitmap(bitmap) -> nil
|
164
|
+
*
|
165
|
+
* Destroys a memory bitmap, sub-bitmap, video memory bitmap, or system bitmap
|
166
|
+
* when you are finished with it. If you pass a nil this function won't do
|
167
|
+
* anything. See above for the restrictions as to when you are allowed to
|
168
|
+
* destroy the various types of bitmaps.
|
169
|
+
*
|
170
|
+
* The bitmap must not have a mouse cursor shown on it at the time it is
|
171
|
+
* destroyed.
|
172
|
+
*/
|
173
|
+
VALUE a4r_API_destroy_bitmap(VALUE self, VALUE bitmap)
|
174
|
+
{
|
175
|
+
BITMAP *bmp;
|
176
|
+
if (bitmap == Qnil)
|
177
|
+
bmp = NULL;
|
178
|
+
else
|
179
|
+
Data_Get_Struct(bitmap, BITMAP, bmp);
|
180
|
+
destroy_bitmap(bmp);
|
181
|
+
return Qnil;
|
182
|
+
}
|
183
|
+
|
184
|
+
/*
|
185
|
+
* call-seq:
|
186
|
+
* bitmap_mask_color(bmp) -> int
|
187
|
+
*
|
188
|
+
* Returns the mask color for the specified bitmap (the value which is skipped
|
189
|
+
* when drawing sprites). For 256-color bitmaps this is zero, and for truecolor
|
190
|
+
* bitmaps it is bright pink (maximum red and blue, zero green). A frequent use
|
191
|
+
* of this function is to clear a bitmap with the mask color so you can later
|
192
|
+
* use this bitmap with masked_blit or draw_sprite after drawing other stuff on
|
193
|
+
* it. Example:
|
194
|
+
* # Replace mask color with another color.
|
195
|
+
* (0...bmp.h).each do |y|
|
196
|
+
* (0...bmp.w).each do |x|
|
197
|
+
* if (getpixel(bmp, x, y) == bitmap_mask_color(bmp))
|
198
|
+
* putpixel(bmp, x, y, another_color)
|
199
|
+
* end
|
200
|
+
* end
|
201
|
+
* end
|
202
|
+
*/
|
203
|
+
VALUE a4r_API_bitmap_mask_color(VALUE self, VALUE bmp)
|
204
|
+
{
|
205
|
+
BITMAP *bitmap;
|
206
|
+
Data_Get_Struct(bmp, BITMAP, bitmap);
|
207
|
+
return INT2FIX(bitmap_mask_color(bitmap));
|
208
|
+
}
|
209
|
+
|
210
|
+
/*
|
211
|
+
* call-seq:
|
212
|
+
* acquire_bitmap(bmp) -> nil
|
213
|
+
*
|
214
|
+
* Acquires the specified video bitmap prior to drawing onto it. You never need
|
215
|
+
* to call the function explicitly as it is low level, and will only give you a
|
216
|
+
* speed up if you know what you are doing. Using it wrongly may cause slowdown,
|
217
|
+
* or even lock up your program.
|
218
|
+
*
|
219
|
+
* Note: You do never need to use acquire_bitmap on a memory bitmap, i.e. a
|
220
|
+
* normal bitmap created with create_bitmap. It will simply do nothing in that
|
221
|
+
* case.
|
222
|
+
*
|
223
|
+
* It still can be useful, because e.g. under the current DirectDraw driver of
|
224
|
+
* Allegro, most drawing functions need to lock a video bitmap before drawing to
|
225
|
+
* it. But doing this is very slow, so you will get much better performance if
|
226
|
+
* you acquire the screen just once at the start of your main redraw function,
|
227
|
+
* then call multiple drawing operations which need the bitmap locked, and only
|
228
|
+
* release it when done.
|
229
|
+
*
|
230
|
+
* Multiple acquire calls may be nested, but you must make sure to match up the
|
231
|
+
* acquire_bitmap and release_bitmap calls. Be warned that DirectX and X11
|
232
|
+
* programs activate a mutex lock whenever a surface is locked, which prevents
|
233
|
+
* them from getting any input messages, so you must be sure to release all your
|
234
|
+
* bitmaps before using any timer, keyboard, or other non-graphics routines!
|
235
|
+
*
|
236
|
+
* Note that if you are using hardware accelerated VRAM->VRAM functions, you
|
237
|
+
* should not call acquire_bitmap. Such functions need an unlocked target bitmap
|
238
|
+
* under DirectX, so there is now just the opposite case from before - if the
|
239
|
+
* bitmap is already locked with acquire_bitmap, the drawing operation has to
|
240
|
+
* unlock it.
|
241
|
+
*
|
242
|
+
* Note: For backwards compatibility, the unlocking behavior of such functions
|
243
|
+
* is permanent. That is, if you call acquire_bitmap first, then call e.g. an
|
244
|
+
* accelerated blit, the DirectX bitmap will be unlocked internally (it won't
|
245
|
+
* affect the nesting counter of acquire/release calls).
|
246
|
+
*
|
247
|
+
* There is no clear cross-platform way in this Allegro version to know which
|
248
|
+
* drawing operations need a locked/unlocked state. For example a normal
|
249
|
+
* rectfill most probably is accelerated under DirectX, and therefore needs the
|
250
|
+
* screen unlocked, but an XOR rectfill, or one with blending activated, most
|
251
|
+
* probably is not, and therefore locks the screen. And while the DirectX driver
|
252
|
+
* will do automatic unlocking, there is no such thing under X11, where the
|
253
|
+
* function is used to synchronize X11 calls from different threads. Your best
|
254
|
+
* bet is to never use acquire_bitmap - changes are you are doing something in
|
255
|
+
* the wrong way if you think you need it.
|
256
|
+
*
|
257
|
+
* Warning: This function can be very dangerous to use, since the whole program
|
258
|
+
* may get locked while the bitmap is locked. So the lock should only be held
|
259
|
+
* for a short time, and you should not call anything but drawing operations
|
260
|
+
* onto the locked video bitmap while a lock is in place. Especially don't call
|
261
|
+
* things like show_mouse (or scare_mouse which calls that) or readkey, since it
|
262
|
+
* will most likely deadlock your entire program.
|
263
|
+
*/
|
264
|
+
VALUE a4r_API_acquire_bitmap(VALUE self, VALUE bmp)
|
265
|
+
{
|
266
|
+
BITMAP *bitmap;
|
267
|
+
Data_Get_Struct(bmp, BITMAP, bitmap);
|
268
|
+
acquire_bitmap(bitmap);
|
269
|
+
return Qnil;
|
270
|
+
}
|
271
|
+
|
272
|
+
/*
|
273
|
+
* call-seq:
|
274
|
+
* release_bitmap(bmp) -> nil
|
275
|
+
*
|
276
|
+
* Releases a bitmap that was previously locked by calling acquire_bitmap. If
|
277
|
+
* the bitmap was locked multiple times, you must release it the same number of
|
278
|
+
* times before it will truly be unlocked.
|
279
|
+
*/
|
280
|
+
VALUE a4r_API_release_bitmap(VALUE self, VALUE bmp)
|
281
|
+
{
|
282
|
+
BITMAP *bitmap;
|
283
|
+
Data_Get_Struct(bmp, BITMAP, bitmap);
|
284
|
+
release_bitmap(bitmap);
|
285
|
+
return Qnil;
|
286
|
+
}
|
287
|
+
|
288
|
+
/*
|
289
|
+
* call-seq:
|
290
|
+
* acquire_screen -> nil
|
291
|
+
*
|
292
|
+
* Shortcut version of acquire_bitmap(screen)
|
293
|
+
*/
|
294
|
+
VALUE a4r_API_acquire_screen(VALUE self)
|
295
|
+
{
|
296
|
+
acquire_screen();
|
297
|
+
return Qnil;
|
298
|
+
}
|
299
|
+
|
300
|
+
/*
|
301
|
+
* call-seq:
|
302
|
+
* release_screen -> nil
|
303
|
+
*
|
304
|
+
* Shortcut version of release_bitmap(screen)
|
305
|
+
*/
|
306
|
+
VALUE a4r_API_release_screen(VALUE self)
|
307
|
+
{
|
308
|
+
release_screen();
|
309
|
+
return Qnil;
|
310
|
+
}
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#include "allegro4r.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
* call-seq:
|
5
|
+
* blit(source, dest, source_x, source_y, dest_x, dest_y, width, height) -> nil
|
6
|
+
*
|
7
|
+
* Copies a rectangular area of the source bitmap to the destination bitmap. The
|
8
|
+
* source_x and source_y parameters are the top left corner of the area to copy
|
9
|
+
* from the source bitmap, and dest_x and dest_y are the corresponding position
|
10
|
+
* in the destination bitmap. This routine respects the destination clipping
|
11
|
+
* rectangle, and it will also clip if you try to blit from areas outside the
|
12
|
+
* source bitmap. Example:
|
13
|
+
* # Blit src on the screen.
|
14
|
+
* blit(bmp, screen, 0, 0, 0, 0, bmp.w, bmp.h)
|
15
|
+
*
|
16
|
+
* # Now copy a chunk to a corner, slightly outside.
|
17
|
+
* blit(screen, screen, 100, 100, -10, -10, 25, 30)
|
18
|
+
*
|
19
|
+
* You can blit between any parts of any two bitmaps, even if the two memory
|
20
|
+
* areas overlap (ie. source and dest are the same, or one is sub-bitmap of the
|
21
|
+
* other). You should be aware, however, that a lot of SVGA cards don't provide
|
22
|
+
* separate read and write banks, which means that blitting from one part of the
|
23
|
+
* screen to another requires the use of a temporary bitmap in memory, and is
|
24
|
+
* therefore extremely slow. As a general rule you should avoid blitting from
|
25
|
+
* the screen onto itself in SVGA modes.
|
26
|
+
*
|
27
|
+
* In mode-X, on the other hand, blitting from one part of the screen to another
|
28
|
+
* can be significantly faster than blitting from memory onto the screen, as
|
29
|
+
* long as the source and destination are correctly aligned with each other.
|
30
|
+
* Copying between overlapping screen rectangles is slow, but if the areas
|
31
|
+
* don't overlap, and if they have the same plane alignment (ie. (source_x%4) ==
|
32
|
+
* (dest_x%4)), the VGA latch registers can be used for a very fast data
|
33
|
+
* transfer. To take advantage of this, in mode-X it is often worth storing
|
34
|
+
* tile graphics in a hidden area of video memory (using a large virtual
|
35
|
+
* screen), and blitting them from there onto the visible part of the screen.
|
36
|
+
*
|
37
|
+
* If the GFX_HW_VRAM_BLIT bit in the gfx_capabilities flag is set, the current
|
38
|
+
* driver supports hardware accelerated blits from one part of the screen onto
|
39
|
+
* another. This is extremely fast, so when this flag is set it may be worth
|
40
|
+
* storing some of your more frequently used graphics in an offscreen portion of
|
41
|
+
* the video memory.
|
42
|
+
*
|
43
|
+
* Unlike most of the graphics routines, blit allows the source and destination
|
44
|
+
* bitmaps to be of different color depths, so it can be used to convert images
|
45
|
+
* from one pixel format to another. In this case, the behavior is affected by
|
46
|
+
* the COLORCONV_KEEP_TRANS and COLORCONV_DITHER* flags of the current color
|
47
|
+
* conversion mode: see set_color_conversion for more information.
|
48
|
+
*/
|
49
|
+
VALUE a4r_API_blit(VALUE self, VALUE source, VALUE dest, VALUE source_x, VALUE source_y, VALUE dest_x, VALUE dest_y, VALUE width, VALUE height)
|
50
|
+
{
|
51
|
+
BITMAP *bmp_source, *bmp_dest;
|
52
|
+
Data_Get_Struct(source, BITMAP, bmp_source);
|
53
|
+
Data_Get_Struct(dest, BITMAP, bmp_dest);
|
54
|
+
blit(bmp_source, bmp_dest, FIX2INT(source_x), FIX2INT(source_y), FIX2INT(dest_x), FIX2INT(dest_y), FIX2INT(width), FIX2INT(height));
|
55
|
+
return Qnil;
|
56
|
+
}
|
57
|
+
|
58
|
+
/*
|
59
|
+
* call-seq:
|
60
|
+
* masked_blit(source, dest, source_x, source_y, dest_x, dest_y, width, height) -> nil
|
61
|
+
*
|
62
|
+
* Like blit, but skips transparent pixels, which are marked by a zero in
|
63
|
+
* 256-color modes or bright pink for truecolor data (maximum red and blue, zero
|
64
|
+
* green), and requires the source and destination bitmaps to be of the same
|
65
|
+
* color depth. The source and destination regions must not overlap. Example:
|
66
|
+
* # Paint hud overlay on the screen.
|
67
|
+
* masked_blit(hud_overlay, screen, 0, 0, 0, 0, hud_overlay.w, hud_overlay.h)
|
68
|
+
*
|
69
|
+
* If the GFX_HW_VRAM_BLIT_MASKED bit in the gfx_capabilities flag is set, the
|
70
|
+
* current driver supports hardware accelerated masked blits from one part of
|
71
|
+
* the screen onto another. This is extremely fast, so when this flag is set it
|
72
|
+
* may be worth storing some of your more frequently used sprites in an
|
73
|
+
* offscreen portion of the video memory.
|
74
|
+
*
|
75
|
+
* Warning: if the hardware acceleration flag is not set, masked_blit will not
|
76
|
+
* work correctly when used with a source image in system or video memory so the
|
77
|
+
* latter must be a memory bitmap.
|
78
|
+
*/
|
79
|
+
VALUE a4r_API_masked_blit(VALUE self, VALUE source, VALUE dest, VALUE source_x, VALUE source_y, VALUE dest_x, VALUE dest_y, VALUE width, VALUE height)
|
80
|
+
{
|
81
|
+
BITMAP *bmp_source, *bmp_dest;
|
82
|
+
Data_Get_Struct(source, BITMAP, bmp_source);
|
83
|
+
Data_Get_Struct(dest, BITMAP, bmp_dest);
|
84
|
+
masked_blit(bmp_source, bmp_dest, FIX2INT(source_x), FIX2INT(source_y), FIX2INT(dest_x), FIX2INT(dest_y), FIX2INT(width), FIX2INT(height));
|
85
|
+
return Qnil;
|
86
|
+
}
|