9fans.net/go@v0.0.5/draw/memdraw/lunload.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 (
    10  	"fmt"
    11  
    12  	"9fans.net/go/draw"
    13  )
    14  
    15  func Unload(src *Image, r draw.Rectangle, data []uint8) (int, error) {
    16  
    17  Top:
    18  	dl := src.Layer
    19  	if dl == nil {
    20  		return unloadmemimage(src, r, data)
    21  	}
    22  
    23  	/*
    24  	 * Convert to screen coordinates.
    25  	 */
    26  	lr := r
    27  	r.Min.X += dl.Delta.X
    28  	r.Min.Y += dl.Delta.Y
    29  	r.Max.X += dl.Delta.X
    30  	r.Max.Y += dl.Delta.Y
    31  	dx := dl.Delta.X & (7 / src.Depth)
    32  	if dl.clear && dx == 0 {
    33  		src = dl.Screen.Image
    34  		goto Top
    35  	}
    36  
    37  	/*
    38  	 * src is an obscured layer or data is unaligned
    39  	 */
    40  	if dl.save != nil && dx == 0 {
    41  		if dl.Refreshfn != nil {
    42  			return 0, fmt.Errorf("window not Refbackup") /* can't unload window if it's not Refbackup */
    43  		}
    44  		if len(data) > 0 {
    45  			memlhide(src, r)
    46  		}
    47  		return unloadmemimage(dl.save, lr, data)
    48  	}
    49  	tmp, err := AllocImage(lr, src.Pix)
    50  	if err != nil {
    51  		return 0, err
    52  	}
    53  	Draw(tmp, lr, src, lr.Min, nil, lr.Min, draw.S)
    54  	n, err := unloadmemimage(tmp, lr, data)
    55  	Free(tmp)
    56  	return n, err
    57  }