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