mirror of
https://github.com/servo/servo.git
synced 2025-08-07 22:45:34 +01:00
Use GLUT and layers
This commit is contained in:
parent
cad0cc6730
commit
844f540963
5 changed files with 53 additions and 60 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit b9ab8a42f662e25958c45b811a5b554b047af991
|
Subproject commit c5aeb41905dc7071bac98a3fca40e5c511d5f61d
|
|
@ -1 +1 @@
|
||||||
Subproject commit 906208ecfa62669824128aeb5f809fd7441d970d
|
Subproject commit 03251b1fb42438e118909c6081bfcf61b8c22816
|
|
@ -1 +1 @@
|
||||||
Subproject commit 5b8d44cf81c079c0a6c30e952f336165a14c301b
|
Subproject commit e9f7c1a5944608dd55d5dfb517c86c408e23a0ff
|
|
@ -8,6 +8,9 @@ import azure::cairo::bindgen::*;
|
||||||
import comm::*;
|
import comm::*;
|
||||||
import azure::cairo::cairo_surface_t;
|
import azure::cairo::cairo_surface_t;
|
||||||
import gfx::renderer::{Sink};
|
import gfx::renderer::{Sink};
|
||||||
|
import layers::ImageLayer;
|
||||||
|
import geom::size::Size2D;
|
||||||
|
import std::cmp::fuzzy_eq;
|
||||||
|
|
||||||
type OSMain = chan<Msg>;
|
type OSMain = chan<Msg>;
|
||||||
|
|
||||||
|
@ -19,40 +22,43 @@ enum Msg {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn OSMain() -> OSMain {
|
fn OSMain() -> OSMain {
|
||||||
on_osmain::<Msg>(|po| {
|
do on_osmain::<Msg> |po| {
|
||||||
platform::runmain(|| {
|
do platform::runmain {
|
||||||
#debug("preparing to enter main loop");
|
#debug("preparing to enter main loop");
|
||||||
mainloop(po);
|
mainloop(po);
|
||||||
})
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mainloop(po: port<Msg>) {
|
fn mainloop(po: port<Msg>) {
|
||||||
|
|
||||||
let mut key_handlers: [chan<()>] = [];
|
let mut key_handlers: [chan<()>] = [];
|
||||||
|
|
||||||
sdl::init([
|
glut::init();
|
||||||
sdl::init_video
|
glut::init_display_mode(glut::DOUBLE);
|
||||||
]);
|
|
||||||
|
|
||||||
let screen = sdl::video::set_video_mode(
|
|
||||||
800, 600, 32,
|
|
||||||
[sdl::video::swsurface],
|
|
||||||
[sdl::video::doublebuf]);
|
|
||||||
assert !ptr::is_null(screen);
|
|
||||||
|
|
||||||
let surfaces = surface_set();
|
let surfaces = surface_set();
|
||||||
|
|
||||||
loop {
|
let window = glut::create_window("Servo");
|
||||||
sdl::event::poll_event(|event| {
|
glut::reshape_window(window, 800, 600);
|
||||||
|
|
||||||
alt event {
|
let context = layers::rendergl::init_render_context();
|
||||||
sdl::event::keydown_event(_) {
|
|
||||||
key_handlers.iter(|key_ch| key_ch.send(()))
|
let image = @layers::layers::Image(0, 0, layers::layers::RGB24Format, ~[]);
|
||||||
|
let image_layer = @layers::layers::ImageLayer(image);
|
||||||
|
image_layer.common.set_transform
|
||||||
|
(image_layer.common.transform.scale(800.0f32, 600.0f32, 1.0f32));
|
||||||
|
|
||||||
|
let scene = @mut layers::scene::Scene(layers::layers::ImageLayerKind(image_layer),
|
||||||
|
Size2D(800.0f32, 600.0f32));
|
||||||
|
|
||||||
|
loop {
|
||||||
|
do glut::display_func() {
|
||||||
|
#debug("osmain: drawing to screen");
|
||||||
|
|
||||||
|
layers::rendergl::render_scene(context, *scene);
|
||||||
|
glut::swap_buffers();
|
||||||
|
glut::post_redisplay();
|
||||||
}
|
}
|
||||||
_ { }
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Handle messages
|
// Handle messages
|
||||||
if po.peek() {
|
if po.peek() {
|
||||||
|
@ -66,25 +72,29 @@ fn mainloop(po: port<Msg>) {
|
||||||
Draw(sender, dt) {
|
Draw(sender, dt) {
|
||||||
return_surface(surfaces, dt);
|
return_surface(surfaces, dt);
|
||||||
lend_surface(surfaces, sender);
|
lend_surface(surfaces, sender);
|
||||||
|
//assert surfaces.s1.surf.az_target == dt;
|
||||||
|
|
||||||
#debug("osmain: drawing to screen");
|
let mut image_data;
|
||||||
assert surfaces.s1.surf.az_target == dt;
|
unsafe {
|
||||||
let sdl_surf = surfaces.s1.surf.sdl_surf;
|
let buffer = cairo_image_surface_get_data(surfaces.s1.surf.cairo_surf);
|
||||||
|
image_data = vec::unsafe::from_buf(buffer, 800 * 600 * 4);
|
||||||
|
}
|
||||||
|
|
||||||
cairo_surface_flush(surfaces.s1.surf.cairo_surf);
|
let image =
|
||||||
sdl::video::unlock_surface(sdl_surf);
|
@layers::layers::Image(800, 600, layers::layers::RGB24Format,
|
||||||
sdl::video::blit_surface(sdl_surf, ptr::null(),
|
layers::util::convert_rgb32_to_rgb24(image_data));
|
||||||
screen, ptr::null());
|
image_layer.set_image(image);
|
||||||
sdl::video::lock_surface(sdl_surf);
|
|
||||||
sdl::video::flip(screen);
|
glut::post_redisplay();
|
||||||
}
|
}
|
||||||
exit { break; }
|
exit { break; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glut::check_loop();
|
||||||
}
|
}
|
||||||
destroy_surface(surfaces.s1.surf);
|
destroy_surface(surfaces.s1.surf);
|
||||||
destroy_surface(surfaces.s2.surf);
|
destroy_surface(surfaces.s2.surf);
|
||||||
sdl::quit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc = "
|
#[doc = "
|
||||||
|
@ -156,38 +166,18 @@ fn surface_set() -> surface_set {
|
||||||
}
|
}
|
||||||
|
|
||||||
type surface = {
|
type surface = {
|
||||||
sdl_surf: *sdl::video::surface,
|
|
||||||
cairo_surf: *cairo_surface_t,
|
cairo_surf: *cairo_surface_t,
|
||||||
az_target: AzDrawTargetRef
|
az_target: AzDrawTargetRef
|
||||||
};
|
};
|
||||||
|
|
||||||
fn mk_surface() -> surface {
|
fn mk_surface() -> surface {
|
||||||
let sdl_surf = sdl::video::create_rgb_surface(
|
let cairo_surf = cairo_image_surface_create(cairo::CAIRO_FORMAT_RGB24, 800, 600);
|
||||||
[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);
|
assert !ptr::is_null(cairo_surf);
|
||||||
|
|
||||||
let azure_target = AzCreateDrawTargetForCairoSurface(cairo_surf);
|
let azure_target = AzCreateDrawTargetForCairoSurface(cairo_surf);
|
||||||
assert !ptr::is_null(azure_target);
|
assert !ptr::is_null(azure_target);
|
||||||
|
|
||||||
{
|
{
|
||||||
sdl_surf: sdl_surf,
|
|
||||||
cairo_surf: cairo_surf,
|
cairo_surf: cairo_surf,
|
||||||
az_target: azure_target
|
az_target: azure_target
|
||||||
}
|
}
|
||||||
|
@ -196,8 +186,6 @@ fn mk_surface() -> surface {
|
||||||
fn destroy_surface(surface: surface) {
|
fn destroy_surface(surface: surface) {
|
||||||
AzReleaseDrawTarget(surface.az_target);
|
AzReleaseDrawTarget(surface.az_target);
|
||||||
cairo_surface_destroy(surface.cairo_surf);
|
cairo_surface_destroy(surface.cairo_surf);
|
||||||
sdl::video::unlock_surface(surface.sdl_surf);
|
|
||||||
sdl::video::free_surface(surface.sdl_surf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc = "A function for spawning into the platform's main thread"]
|
#[doc = "A function for spawning into the platform's main thread"]
|
||||||
|
@ -214,13 +202,14 @@ fn on_osmain<T: send>(+f: fn~(comm::port<T>)) -> comm::chan<T> {
|
||||||
ret task::run_listener(builder, f);
|
ret task::run_listener(builder, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
// #[cfg(target_os = "linux")]
|
||||||
mod platform {
|
mod platform {
|
||||||
fn runmain(f: fn()) {
|
fn runmain(f: fn()) {
|
||||||
f()
|
f()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
mod platform {
|
mod platform {
|
||||||
use cocoa;
|
use cocoa;
|
||||||
|
@ -350,3 +339,5 @@ mod platform {
|
||||||
NSAutoreleasePool::release(pool);
|
NSAutoreleasePool::release(pool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ use azure;
|
||||||
use js;
|
use js;
|
||||||
use stb_image;
|
use stb_image;
|
||||||
use geom;
|
use geom;
|
||||||
|
use glut;
|
||||||
|
use layers;
|
||||||
|
|
||||||
mod dom {
|
mod dom {
|
||||||
mod base;
|
mod base;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue