@@ -40,7 +40,11 @@ const fn rgba2yuyv(pixel: i32, odd: bool) -> u16 {
4040}
4141
4242/// Ported from Weston’s clients/simple-shm.c
43- fn paint_pixels ( mut image : * mut u16 , padding : i32 , width : i32 , height : i32 , time : i32 ) {
43+ fn paint_pixels ( xfb : & mut Xfb , padding : i32 , time : i32 ) {
44+ let width = xfb. width ( ) as i32 ;
45+ let height = xfb. height ( ) as i32 ;
46+ let mut rows = xfb. iter_mut ( ) . skip ( padding as usize ) ;
47+
4448 let halfh = padding + ( height - padding * 2 ) / 2 ;
4549 let halfw = padding + ( width - padding * 2 ) / 2 ;
4650
@@ -50,30 +54,24 @@ fn paint_pixels(mut image: *mut u16, padding: i32, width: i32, height: i32, time
5054 or *= or;
5155 ir *= ir;
5256
53- image = unsafe { image. offset ( ( padding * width) as isize ) } ;
5457 for y in padding..( height - padding) {
55- let y2 = ( y - halfh ) * ( y - halfh ) ;
58+ let row = rows . next ( ) . unwrap ( ) ;
5659
57- image = unsafe { image . offset ( padding as isize ) } ;
60+ let y2 = ( y - halfh ) * ( y - halfh ) ;
5861 for x in padding..( width - padding) {
59- let v;
60-
6162 /* squared distance from center */
6263 let r2 = ( x - halfw) * ( x - halfw) + y2;
6364
64- if r2 < ir {
65- v = ( r2 / 32 + time / 4 ) * 0x0080401 ;
65+ let v = if r2 < ir {
66+ ( r2 / 32 + time / 4 ) * 0x0080401
6667 } else if r2 < or {
67- v = ( y + time / 2 ) * 0x0080401 ;
68+ ( y + time / 2 ) * 0x0080401
6869 } else {
69- v = ( x + time) * 0x0080401 ;
70- }
70+ ( x + time) * 0x0080401
71+ } ;
7172
72- unsafe { * image = rgba2yuyv ( v, ( x & 1 ) != 0 ) } ;
73- image = unsafe { image. offset ( 1 ) } ;
73+ row[ x as usize ] = rgba2yuyv ( v, ( x & 1 ) != 0 ) ;
7474 }
75-
76- image = unsafe { image. offset ( padding as isize ) } ;
7775 }
7876}
7977
@@ -83,15 +81,15 @@ fn main() {
8381 let mut vi = Vi :: setup ( xfb) ;
8482
8583 // First fill the XFB with white.
86- let xfb = vi. xfb ( ) . as_mut_ptr ( ) as * mut u16 ;
87- for i in 0 .. ( 640 * 480 ) {
88- unsafe { xfb . offset ( i ) . write ( 0xff80 ) } ;
84+ let xfb = vi. xfb ( ) ;
85+ for row in xfb . iter_mut ( ) {
86+ row . fill ( 0xff80 ) ;
8987 }
9088
9189 // Then draw to it as fast as we can.
9290 let mut i = 0 ;
9391 loop {
94- paint_pixels ( xfb, 20 , 640 , 480 , i) ;
92+ paint_pixels ( xfb, 20 , i) ;
9593 i += 1 ;
9694 }
9795}
0 commit comments