9fans.net/go@v0.0.5/draw/memdraw/lload.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 Load(dst *Image, r draw.Rectangle, data []uint8, iscompressed bool) (int, error) {
    12  	loadfn := loadmemimage
    13  	if iscompressed {
    14  		loadfn = cloadmemimage
    15  	}
    16  
    17  Top:
    18  	dl := dst.Layer
    19  	if dl == nil {
    20  		return loadfn(dst, 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 / dst.Depth)
    32  	if dl.clear && dx == 0 {
    33  		dst = dl.Screen.Image
    34  		goto Top
    35  	}
    36  
    37  	/*
    38  	 * dst is an obscured layer or data is unaligned
    39  	 */
    40  	if dl.save != nil && dx == 0 {
    41  		n, err := loadfn(dl.save, lr, data)
    42  		if n > 0 {
    43  			memlexpose(dst, r)
    44  		}
    45  		return n, err
    46  	}
    47  	tmp, err := AllocImage(lr, dst.Pix)
    48  	if err != nil {
    49  		return 0, err
    50  	}
    51  	n, err := loadfn(tmp, lr, data)
    52  	Draw(dst, lr, tmp, lr.Min, nil, lr.Min, draw.S)
    53  	Free(tmp)
    54  	return n, err
    55  }