mirror of
https://github.com/servo/servo.git
synced 2025-07-25 16:20:36 +01:00
Factor out some code in osmain
This commit is contained in:
parent
9103d928e6
commit
63f64a85ab
1 changed files with 55 additions and 29 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
import azure::cairo::cairo_surface_t;
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
mod platform {
|
mod platform {
|
||||||
fn runmain(f: fn()) {
|
fn runmain(f: fn()) {
|
||||||
|
@ -196,33 +198,14 @@ fn mainloop(po: comm::port<msg>) {
|
||||||
sdl::init([
|
sdl::init([
|
||||||
sdl::init_video
|
sdl::init_video
|
||||||
]);
|
]);
|
||||||
|
|
||||||
let screen = sdl::video::set_video_mode(
|
let screen = sdl::video::set_video_mode(
|
||||||
800, 600, 32,
|
800, 600, 32,
|
||||||
[sdl::video::swsurface],
|
[sdl::video::swsurface],
|
||||||
[sdl::video::doublebuf]);
|
[sdl::video::doublebuf]);
|
||||||
assert !ptr::is_null(screen);
|
assert !ptr::is_null(screen);
|
||||||
let sdl_surf = sdl::video::create_rgb_surface(
|
|
||||||
[sdl::video::swsurface],
|
let surface = mk_surface();
|
||||||
800, 600, 32,
|
|
||||||
0x00FF0000u32,
|
|
||||||
0x0000FF00u32,
|
|
||||||
0x000000FFu32,
|
|
||||||
0x00000000u32
|
|
||||||
);
|
|
||||||
assert !ptr::is_null(sdl_surf);
|
|
||||||
sdl::video::lock_surface(sdl_surf);
|
|
||||||
let cairo_surf = unsafe {
|
|
||||||
cairo_image_surface_create_for_data(
|
|
||||||
unsafe::reinterpret_cast((*sdl_surf).pixels),
|
|
||||||
cairo::CAIRO_FORMAT_RGB24,
|
|
||||||
(*sdl_surf).w,
|
|
||||||
(*sdl_surf).h,
|
|
||||||
(*sdl_surf).pitch as libc::c_int
|
|
||||||
)
|
|
||||||
};
|
|
||||||
assert !ptr::is_null(cairo_surf);
|
|
||||||
let azure_target = AzCreateDrawTargetForCairoSurface(cairo_surf);
|
|
||||||
assert !ptr::is_null(azure_target);
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
sdl::event::poll_event {|event|
|
sdl::event::poll_event {|event|
|
||||||
|
@ -243,13 +226,13 @@ fn mainloop(po: comm::port<msg>) {
|
||||||
key_handlers += [key_ch];
|
key_handlers += [key_ch];
|
||||||
}
|
}
|
||||||
get_draw_target(response_ch) {
|
get_draw_target(response_ch) {
|
||||||
comm::send(response_ch, azure_target);
|
comm::send(response_ch, copy(surface.az_target));
|
||||||
}
|
}
|
||||||
draw(response_ch) {
|
draw(response_ch) {
|
||||||
sdl::video::unlock_surface(sdl_surf);
|
sdl::video::unlock_surface(surface.sdl_surf);
|
||||||
sdl::video::blit_surface(sdl_surf, ptr::null(),
|
sdl::video::blit_surface(surface.sdl_surf, ptr::null(),
|
||||||
screen, ptr::null());
|
screen, ptr::null());
|
||||||
sdl::video::lock_surface(sdl_surf);
|
sdl::video::lock_surface(surface.sdl_surf);
|
||||||
sdl::video::flip(screen);
|
sdl::video::flip(screen);
|
||||||
comm::send(response_ch, ());
|
comm::send(response_ch, ());
|
||||||
}
|
}
|
||||||
|
@ -257,8 +240,51 @@ fn mainloop(po: comm::port<msg>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AzReleaseDrawTarget(azure_target);
|
destroy_surface(surface);
|
||||||
cairo_surface_destroy(cairo_surf);
|
|
||||||
sdl::video::unlock_surface(sdl_surf);
|
|
||||||
sdl::quit();
|
sdl::quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type surface = {
|
||||||
|
sdl_surf: *sdl::video::surface,
|
||||||
|
cairo_surf: *cairo_surface_t,
|
||||||
|
az_target: AzDrawTargetRef
|
||||||
|
};
|
||||||
|
|
||||||
|
fn mk_surface() -> surface {
|
||||||
|
let sdl_surf = sdl::video::create_rgb_surface(
|
||||||
|
[sdl::video::swsurface],
|
||||||
|
800, 600, 32,
|
||||||
|
0x00FF0000u32,
|
||||||
|
0x0000FF00u32,
|
||||||
|
0x000000FFu32,
|
||||||
|
0x00000000u32
|
||||||
|
);
|
||||||
|
assert !ptr::is_null(sdl_surf);
|
||||||
|
sdl::video::lock_surface(sdl_surf);
|
||||||
|
let cairo_surf = unsafe {
|
||||||
|
cairo_image_surface_create_for_data(
|
||||||
|
unsafe::reinterpret_cast((*sdl_surf).pixels),
|
||||||
|
cairo::CAIRO_FORMAT_RGB24,
|
||||||
|
(*sdl_surf).w,
|
||||||
|
(*sdl_surf).h,
|
||||||
|
(*sdl_surf).pitch as libc::c_int
|
||||||
|
)
|
||||||
|
};
|
||||||
|
assert !ptr::is_null(cairo_surf);
|
||||||
|
|
||||||
|
let azure_target = AzCreateDrawTargetForCairoSurface(cairo_surf);
|
||||||
|
assert !ptr::is_null(azure_target);
|
||||||
|
|
||||||
|
{
|
||||||
|
sdl_surf: sdl_surf,
|
||||||
|
cairo_surf: cairo_surf,
|
||||||
|
az_target: azure_target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn destroy_surface(surface: surface) {
|
||||||
|
AzReleaseDrawTarget(surface.az_target);
|
||||||
|
cairo_surface_destroy(surface.cairo_surf);
|
||||||
|
sdl::video::unlock_surface(surface.sdl_surf);
|
||||||
|
sdl::video::free_surface(surface.sdl_surf);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue