Commit 1cfd791833cb9908fe13fac2aaa27b236aa1e92f

Authored by Georg Hopp
1 parent d8cd5ed9

display remaining sleep time for next frame in window

@@ -35,6 +35,7 @@ pub trait Canvas { @@ -35,6 +35,7 @@ pub trait Canvas {
35 35
36 fn clear(&mut self); 36 fn clear(&mut self);
37 fn draw(&mut self, c :&dyn Drawable, ofs :Coordinate, color :u32); 37 fn draw(&mut self, c :&dyn Drawable, ofs :Coordinate, color :u32);
  38 + fn put_text(&self, ofs :Coordinate, s :&str);
38 fn show(&self); 39 fn show(&self);
39 } 40 }
40 41
@@ -344,12 +344,12 @@ fn main() { @@ -344,12 +344,12 @@ fn main() {
344 // use floating point values. 344 // use floating point values.
345 // https://rechneronline.de/pi/tetrahedron.php 345 // https://rechneronline.de/pi/tetrahedron.php
346 // yi = a / 12 * √6 346 // yi = a / 12 * √6
347 - // yc = a / 4 * √6  
348 - // zi = √3 / 6 * a  
349 - // zc = √3 / 3 * a  
350 let yi = 60.0 / 12.0 * 6.0.sqrt().unwrap(); 347 let yi = 60.0 / 12.0 * 6.0.sqrt().unwrap();
  348 + // yc = a / 4 * √6
351 let yc = 60.0 / 4.0 * 6.0.sqrt().unwrap(); 349 let yc = 60.0 / 4.0 * 6.0.sqrt().unwrap();
  350 + // zi = √3 / 6 * a
352 let zi = 3.0.sqrt().unwrap() / 6.0 * 60.0; 351 let zi = 3.0.sqrt().unwrap() / 6.0 * 60.0;
  352 + // zc = √3 / 3 * a
353 let zc = 3.0.sqrt().unwrap() / 3.0 * 60.0; 353 let zc = 3.0.sqrt().unwrap() / 3.0 * 60.0;
354 354
355 let i = Vector( 0.0, yc, 0.0); 355 let i = Vector( 0.0, yc, 0.0);
@@ -471,7 +471,6 @@ fn main() { @@ -471,7 +471,6 @@ fn main() {
471 canvas.draw( &co, Coordinate(0,0), 0x0000FF); 471 canvas.draw( &co, Coordinate(0,0), 0x0000FF);
472 canvas.draw( &cl, Coordinate(0,0), 0x0000FF); 472 canvas.draw( &cl, Coordinate(0,0), 0x0000FF);
473 canvas.draw( &cr, Coordinate(0,0), 0x0000FF); 473 canvas.draw( &cr, Coordinate(0,0), 0x0000FF);
474 - canvas.show();  
475 474
476 let passed = Instant::now() - last; 475 let passed = Instant::now() - last;
477 let f = (passed.as_nanos() / step.as_nanos()) as u32; 476 let f = (passed.as_nanos() / step.as_nanos()) as u32;
@@ -481,7 +480,10 @@ fn main() { @@ -481,7 +480,10 @@ fn main() {
481 } 480 }
482 481
483 last = last + step*(f + 1); 482 last = last + step*(f + 1);
484 - println!("Sleep for: {:?}", last - Instant::now()); 483 + canvas.put_text( Coordinate(10, 15)
  484 + , &format!( "sleep: {:?}"
  485 + , last - Instant::now() ));
  486 + canvas.show();
485 thread::sleep(last - Instant::now()); 487 thread::sleep(last - Instant::now());
486 } 488 }
487 }); 489 });
@@ -74,10 +74,10 @@ impl XcbEasel { @@ -74,10 +74,10 @@ impl XcbEasel {
74 , screen.root(), 0, 0, width, width, 0 74 , screen.root(), 0, 0, width, width, 0
75 , xcb::WINDOW_CLASS_INPUT_OUTPUT as u16 75 , xcb::WINDOW_CLASS_INPUT_OUTPUT as u16
76 , screen.root_visual() 76 , screen.root_visual()
77 - , &[(xcb::CW_BACK_PIXEL, screen.white_pixel())] ); 77 + , &[(xcb::CW_BACK_PIXEL, screen.black_pixel())] );
78 78
79 xcb::create_gc( &conn, gc, screen.root() 79 xcb::create_gc( &conn, gc, screen.root()
80 - , &[ (xcb::GC_FOREGROUND, screen.black_pixel()) 80 + , &[ (xcb::GC_FOREGROUND, screen.white_pixel())
81 , (xcb::GC_GRAPHICS_EXPOSURES, 0) ] ); 81 , (xcb::GC_GRAPHICS_EXPOSURES, 0) ] );
82 82
83 let (shmid, shm) = getshm((width * height) as usize); 83 let (shmid, shm) = getshm((width * height) as usize);
@@ -120,8 +120,8 @@ fn getshm<'a>(size :usize) -> (i32, &'a mut [u32]) { @@ -120,8 +120,8 @@ fn getshm<'a>(size :usize) -> (i32, &'a mut [u32]) {
120 120
121 unsafe { 121 unsafe {
122 let id = libc::shmget( libc::IPC_PRIVATE 122 let id = libc::shmget( libc::IPC_PRIVATE
123 - , size * 4  
124 - , libc::IPC_CREAT | 0o744 ); 123 + , size * 4
  124 + , libc::IPC_CREAT | 0o744 );
125 let ptr = libc::shmat(id, ptr::null(), 0); 125 let ptr = libc::shmat(id, ptr::null(), 0);
126 (id as i32, from_raw_parts_mut(ptr as *mut u32, size)) 126 (id as i32, from_raw_parts_mut(ptr as *mut u32, size))
127 } 127 }
@@ -233,6 +233,13 @@ impl<'a> Canvas for XcbCanvas<'a> { @@ -233,6 +233,13 @@ impl<'a> Canvas for XcbCanvas<'a> {
233 } 233 }
234 } 234 }
235 235
  236 + fn put_text(&self, ofs :Coordinate, s :&str) {
  237 + let Coordinate(xofs, yofs) = ofs;
  238 + xcb::xproto::image_text_8( &self.conn, self.pixmap, self.gc
  239 + , xofs as i16, yofs as i16, s );
  240 + self.conn.flush();
  241 + }
  242 +
236 fn show(&self) { 243 fn show(&self) {
237 xcb::copy_area( &self.conn, self.pixmap, self.window, self.gc 244 xcb::copy_area( &self.conn, self.pixmap, self.window, self.gc
238 , 0, 0, 0, 0 245 , 0, 0, 0, 0
Please register or login to post a comment