程式語言 - Rust - SDL v1.2 - Hello, world!



參考資訊:
https://www.rust-lang.org/learn/get-started
https://users.rust-lang.org/t/calling-c-function-with-string/41448/10
http://bzz.wallizard.com:8081/share/books/RUST/Programming%20Rust%202nd%20Edition.pdf

main.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
extern crate libc;
 
use libc::types::os::arch::c95::c_schar;
use libc::{c_void, c_uint, c_int, c_float, c_uchar, uint8_t, uint16_t, uint32_t, int16_t, int8_t, int32_t};
 
pub const SDL_INIT_VIDEO : uint32_t = 0x00000020;
pub const SDL_SWSURFACE  : uint32_t = 0x00000000;
pub const SDL_HWSURFACE  : uint32_t = 0x00000001;
 
pub struct SDL_Rect {
    pub x: i16,
    pub y: i16,
    pub w: u16,
    pub h: u16
}
 
pub struct SDL_Color {
    pub r: uint8_t,
    pub g: uint8_t,
    pub b: uint8_t,
    pub unused: uint8_t
}
 
pub struct SDL_Palette {
    pub ncolors: c_int,
    pub colors: *mut SDL_Color,
}
 
pub struct SDL_PixelFormat {
    pub palette: *mut SDL_Palette,
    pub BitsPerPixel: uint8_t,
    pub BytesPerPixel: uint8_t,
    pub Rloss: uint8_t,
    pub Gloss: uint8_t,
    pub Bloss: uint8_t,
    pub Aloss: uint8_t,
    pub Rshift: uint8_t,
    pub Gshift: uint8_t,
    pub Bshift: uint8_t,
    pub Ashift: uint8_t,
    pub Rmask: uint32_t,
    pub Gmask: uint32_t,
    pub Bmask: uint32_t,
    pub Amask: uint32_t,
    pub colorkey: uint32_t,
    pub alpha: uint8_t,
}
 
pub struct SDL_Surface {
    pub flags: uint32_t,
    pub format: *mut SDL_PixelFormat,
    pub w: c_int,
    pub h: c_int,
    pub pitch: uint16_t,
    pub pixels: *mut c_void,
    pub offset: c_int,
    pub hwdata: *mut c_void,
    pub clip_rect: SDL_Rect,
    pub unused1: uint32_t,
    pub locked: uint32_t,
    pub map: *mut c_void,
    pub format_version: c_uint,
    pub refcount: c_int
}
     
#[link(name="SDL")]
#[link(name="SDL_gfx")]
extern {
    fn SDL_Quit();
    fn SDL_Delay(flags: uint32_t);
    fn SDL_Init(flags: uint32_t) -> c_int;
    fn SDL_Flip(screen: *mut SDL_Surface) -> c_int;
    fn SDL_InitSubSystem(flags: uint32_t) -> c_int;
    fn SDL_FillRect(dst: *mut SDL_Surface, dstrect: *mut SDL_Rect, color: uint32_t) -> c_int;
    fn SDL_SetVideoMode(width: c_int, height: c_int, bpp: c_int, flags: uint32_t) -> *mut SDL_Surface;
    fn stringRGBA(dst: *mut SDL_Surface, x: int16_t, y: int16_t, s: *const c_uchar, r: uint8_t, g: uint8_t, b: uint8_t, a: uint8_t) -> c_int;
}
 
fn main() {
    let mut screen;
 
    unsafe {
        SDL_Init(SDL_INIT_VIDEO);
        screen = SDL_SetVideoMode(320, 240, 32, SDL_HWSURFACE);
        stringRGBA(screen, 100, 100, "hello, world!".as_ptr(), 0xff, 0xff, 0xff, 0xff);
        SDL_Flip(screen);
        SDL_Delay(3000);
        SDL_Quit();
    }
}

Cargo.toml

[package]
name = "main"
version = "0.0.1"
authors = ["Steward-Fu <steward.fu@gmail.com>"]

[[bin]]
name = "main"
path = "main.rs"

[dependencies]
libc = "0.1"

編譯、執行

$ cargo build
$ cargo run