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 }