9fans.net/go@v0.0.5/draw/memdraw/lalloc.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 "9fans.net/go/draw" 11 ) 12 13 var memlalloc_paint *Image 14 15 func LAlloc(s *Screen, screenr draw.Rectangle, refreshfn Refreshfn, refreshptr interface{}, val draw.Color) (*Image, error) { 16 if memlalloc_paint == nil { 17 var err error 18 memlalloc_paint, err = AllocImage(draw.Rect(0, 0, 1, 1), draw.RGBA32) 19 if err != nil { 20 return nil, err 21 } 22 memlalloc_paint.Flags |= Frepl 23 memlalloc_paint.Clipr = draw.Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF) 24 } 25 26 n, err := allocmemimaged(screenr, s.Image.Pix, s.Image.Data, nil) 27 if err != nil { 28 return nil, err 29 } 30 31 l := new(Layer) 32 l.Screen = s 33 if refreshfn != nil { 34 l.save = nil 35 } else { 36 var err error 37 l.save, err = AllocImage(screenr, s.Image.Pix) 38 if err != nil { 39 return nil, err 40 } 41 /* allocmemimage doesn't initialize memory; this paints save area */ 42 if val != draw.NoFill { 43 FillColor(l.save, val) 44 } 45 } 46 l.Refreshfn = refreshfn 47 l.Refreshptr = nil /* don't set it until we're done */ 48 l.Screenr = screenr 49 l.Delta = draw.Pt(0, 0) 50 51 n.Data.ref++ 52 n.zero = s.Image.zero 53 n.Width = s.Image.Width 54 n.Layer = l 55 56 /* start with new window behind all existing ones */ 57 l.front = s.Rearmost 58 l.rear = nil 59 if s.Rearmost != nil { 60 s.Rearmost.Layer.rear = n 61 } 62 s.Rearmost = n 63 if s.Frontmost == nil { 64 s.Frontmost = n 65 } 66 l.clear = false 67 68 /* now pull new window to front */ 69 _memltofrontfill(n, val != draw.NoFill) 70 l.Refreshptr = refreshptr 71 72 /* 73 * paint with requested color; previously exposed areas are already right 74 * if this window has backing store, but just painting the whole thing is simplest. 75 */ 76 if val != draw.NoFill { 77 memsetchan(memlalloc_paint, n.Pix) 78 FillColor(memlalloc_paint, val) 79 Draw(n, n.R, memlalloc_paint, n.R.Min, nil, n.R.Min, draw.S) 80 } 81 return n, nil 82 }