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  }