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 }