9fans.net/go@v0.0.5/draw/memdraw/ltorear.go (about)

     1  // #include <u.h>
     2  // #include <libc.h>
     3  // #include <draw.h>
     4  // #include <memdraw.h>
     5  // #include <memlayer.h>
     6  
     7  package memdraw
     8  
     9  import "9fans.net/go/draw"
    10  
    11  func _memltorear(i *Image, rear *Image) {
    12  	l := i.Layer
    13  	s := l.Screen
    14  	for l.rear != rear {
    15  		r := l.rear
    16  		x := l.Screenr
    17  		overlap := draw.RectClip(&x, r.Layer.Screenr)
    18  		if overlap {
    19  			memlhide(i, x)
    20  			l.clear = false
    21  		}
    22  		/* swap l and r in screen's list */
    23  		rr := r.Layer.rear
    24  		f := l.front
    25  		if rr == nil {
    26  			s.Rearmost = i
    27  		} else {
    28  			rr.Layer.front = i
    29  		}
    30  		if f == nil {
    31  			s.Frontmost = r
    32  		} else {
    33  			f.Layer.rear = r
    34  		}
    35  		l.rear = rr
    36  		l.front = r
    37  		r.Layer.rear = i
    38  		r.Layer.front = f
    39  		if overlap {
    40  			memlexpose(r, x)
    41  		}
    42  	}
    43  }
    44  
    45  func memltorear(i *Image) {
    46  	_memltorear(i, nil)
    47  	_memlsetclear(i.Layer.Screen)
    48  }
    49  
    50  func LToRearN(ip []*Image, n int) {
    51  	if n == 0 {
    52  		return
    53  	}
    54  	var rear *Image
    55  	for {
    56  		n--
    57  		if n < 0 {
    58  			break
    59  		}
    60  		i := ip[0]
    61  		ip = ip[1:]
    62  		_memltorear(i, rear)
    63  		rear = i
    64  	}
    65  	s := rear.Layer.Screen
    66  	_memlsetclear(s)
    67  }