From 63f64a85abbf892da5da6b3b8d04f446ff869e49 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 3 May 2012 18:15:39 -0700 Subject: [PATCH] Factor out some code in osmain --- src/servo/osmain.rs | 84 +++++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/src/servo/osmain.rs b/src/servo/osmain.rs index f1627b42b9f..fac6520da25 100644 --- a/src/servo/osmain.rs +++ b/src/servo/osmain.rs @@ -1,3 +1,5 @@ +import azure::cairo::cairo_surface_t; + #[cfg(target_os = "linux")] mod platform { fn runmain(f: fn()) { @@ -196,33 +198,14 @@ fn mainloop(po: comm::port) { sdl::init([ sdl::init_video ]); + let screen = sdl::video::set_video_mode( 800, 600, 32, [sdl::video::swsurface], [sdl::video::doublebuf]); assert !ptr::is_null(screen); - 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); + + let surface = mk_surface(); loop { sdl::event::poll_event {|event| @@ -243,13 +226,13 @@ fn mainloop(po: comm::port) { key_handlers += [key_ch]; } get_draw_target(response_ch) { - comm::send(response_ch, azure_target); + comm::send(response_ch, copy(surface.az_target)); } draw(response_ch) { - sdl::video::unlock_surface(sdl_surf); - sdl::video::blit_surface(sdl_surf, ptr::null(), + sdl::video::unlock_surface(surface.sdl_surf); + sdl::video::blit_surface(surface.sdl_surf, ptr::null(), screen, ptr::null()); - sdl::video::lock_surface(sdl_surf); + sdl::video::lock_surface(surface.sdl_surf); sdl::video::flip(screen); comm::send(response_ch, ()); } @@ -257,8 +240,51 @@ fn mainloop(po: comm::port) { } } } - AzReleaseDrawTarget(azure_target); - cairo_surface_destroy(cairo_surf); - sdl::video::unlock_surface(sdl_surf); + destroy_surface(surface); 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); } \ No newline at end of file