xref: /inferno-os/libmemlayer/lalloc-x11.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "image.h"
3*37da2899SCharles.Forsyth #include "memimage.h"
4*37da2899SCharles.Forsyth #include "memlayer.h"
5*37da2899SCharles.Forsyth 
6*37da2899SCharles.Forsyth #include "../memimage/xmem.h"
7*37da2899SCharles.Forsyth 
8*37da2899SCharles.Forsyth 
9*37da2899SCharles.Forsyth static ulong colorword;
10*37da2899SCharles.Forsyth static Memdata colordata = {
11*37da2899SCharles.Forsyth 	nil,
12*37da2899SCharles.Forsyth 	&colorword
13*37da2899SCharles.Forsyth };
14*37da2899SCharles.Forsyth 
15*37da2899SCharles.Forsyth static Memimage paint =
16*37da2899SCharles.Forsyth {
17*37da2899SCharles.Forsyth 	{ 0, 0, 1, 1 },
18*37da2899SCharles.Forsyth 	{ -1000000, -1000000, 10000000, 1000000 },
19*37da2899SCharles.Forsyth 	0,
20*37da2899SCharles.Forsyth 	1,
21*37da2899SCharles.Forsyth 	&colordata,
22*37da2899SCharles.Forsyth 	0,
23*37da2899SCharles.Forsyth 	1,
24*37da2899SCharles.Forsyth 	0,
25*37da2899SCharles.Forsyth };
26*37da2899SCharles.Forsyth 
27*37da2899SCharles.Forsyth static Memimage *xpaint;
28*37da2899SCharles.Forsyth 
29*37da2899SCharles.Forsyth static void
setcolor(int val,int ldepth)30*37da2899SCharles.Forsyth setcolor(int val, int ldepth)
31*37da2899SCharles.Forsyth {
32*37da2899SCharles.Forsyth 	int bpp;
33*37da2899SCharles.Forsyth 
34*37da2899SCharles.Forsyth 	paint.ldepth = ldepth;
35*37da2899SCharles.Forsyth 	bpp = 1<<ldepth;
36*37da2899SCharles.Forsyth 	val &= ~(0xFF>>bpp);
37*37da2899SCharles.Forsyth 	/* color is now in low part of word; replicate through pixel */
38*37da2899SCharles.Forsyth 	for(; bpp<32; bpp<<=1)
39*37da2899SCharles.Forsyth 		val |= val<<bpp;
40*37da2899SCharles.Forsyth 	colorword = val;
41*37da2899SCharles.Forsyth }
42*37da2899SCharles.Forsyth 
43*37da2899SCharles.Forsyth ulong*
makememones(void)44*37da2899SCharles.Forsyth makememones(void)
45*37da2899SCharles.Forsyth {
46*37da2899SCharles.Forsyth 	Xmem *xm;
47*37da2899SCharles.Forsyth 	extern Memimage	screenimage;
48*37da2899SCharles.Forsyth 	extern void drawreset();
49*37da2899SCharles.Forsyth 
50*37da2899SCharles.Forsyth 	if(memones->X)
51*37da2899SCharles.Forsyth 		return;
52*37da2899SCharles.Forsyth 	drawreset();
53*37da2899SCharles.Forsyth 	/* set up screen pixmap */
54*37da2899SCharles.Forsyth 	xm = malloc(sizeof(Xmem));
55*37da2899SCharles.Forsyth 	if(xm == nil){
56*37da2899SCharles.Forsyth 		print("can't alloc for screen pixmap\n");
57*37da2899SCharles.Forsyth 		return;
58*37da2899SCharles.Forsyth 	}
59*37da2899SCharles.Forsyth 	if(screenimage.ldepth == 0)
60*37da2899SCharles.Forsyth 		xm->pmid0 = xscreenid;
61*37da2899SCharles.Forsyth 	else
62*37da2899SCharles.Forsyth 		xm->pmid0 = PMundef;
63*37da2899SCharles.Forsyth 	xm->pmid = xscreenid;
64*37da2899SCharles.Forsyth 	xm->wordp = &xm->word;
65*37da2899SCharles.Forsyth 	screenimage.X = xm;
66*37da2899SCharles.Forsyth 	screenimage.data->data = &xm->word;
67*37da2899SCharles.Forsyth 
68*37da2899SCharles.Forsyth 	memones = allocmemimage(paint.r, paint.ldepth);
69*37da2899SCharles.Forsyth 	memones->clipr = paint.clipr;
70*37da2899SCharles.Forsyth 	memones->repl = 1;
71*37da2899SCharles.Forsyth 	memfillcolor(memones, ~0);
72*37da2899SCharles.Forsyth 
73*37da2899SCharles.Forsyth 	return screenimage.data->data;
74*37da2899SCharles.Forsyth }
75*37da2899SCharles.Forsyth 
76*37da2899SCharles.Forsyth Memimage*
memlalloc(Memscreen * s,Rectangle screenr,Refreshfn refreshfn,void * refreshptr,int val)77*37da2899SCharles.Forsyth memlalloc(Memscreen *s, Rectangle screenr, Refreshfn refreshfn, void *refreshptr, int val)
78*37da2899SCharles.Forsyth {
79*37da2899SCharles.Forsyth 	Memimage *n;
80*37da2899SCharles.Forsyth 	Memlayer *l;
81*37da2899SCharles.Forsyth 	Xmem *xm, *sxm;
82*37da2899SCharles.Forsyth 
83*37da2899SCharles.Forsyth 	n = malloc(sizeof(Memimage));
84*37da2899SCharles.Forsyth 	if(n == nil)
85*37da2899SCharles.Forsyth 		return nil;
86*37da2899SCharles.Forsyth 
87*37da2899SCharles.Forsyth 	l = malloc(sizeof(Memlayer));
88*37da2899SCharles.Forsyth 	if(l == nil){
89*37da2899SCharles.Forsyth 		free(n);
90*37da2899SCharles.Forsyth 		return nil;
91*37da2899SCharles.Forsyth 	}
92*37da2899SCharles.Forsyth 
93*37da2899SCharles.Forsyth 	xm = malloc(sizeof(Xmem));
94*37da2899SCharles.Forsyth 	if(xm == nil){
95*37da2899SCharles.Forsyth 		free(l);
96*37da2899SCharles.Forsyth 		free(n);
97*37da2899SCharles.Forsyth 		return nil;
98*37da2899SCharles.Forsyth 	}
99*37da2899SCharles.Forsyth 
100*37da2899SCharles.Forsyth 	if(refreshfn) {
101*37da2899SCharles.Forsyth 		l->save = nil;
102*37da2899SCharles.Forsyth 	}
103*37da2899SCharles.Forsyth 	else{
104*37da2899SCharles.Forsyth 		l->save = allocmemimage(screenr, s->image->ldepth);
105*37da2899SCharles.Forsyth 		if(l->save == nil){
106*37da2899SCharles.Forsyth 			free(l);
107*37da2899SCharles.Forsyth 			free(n);
108*37da2899SCharles.Forsyth 			free(xm);
109*37da2899SCharles.Forsyth 			return nil;
110*37da2899SCharles.Forsyth 		}
111*37da2899SCharles.Forsyth 
112*37da2899SCharles.Forsyth 		/* allocmemimage doesn't initialize memory; this paints save area */
113*37da2899SCharles.Forsyth 		if(val >= 0)
114*37da2899SCharles.Forsyth 			memfillcolor(l->save, val);
115*37da2899SCharles.Forsyth 	}
116*37da2899SCharles.Forsyth 
117*37da2899SCharles.Forsyth 	n->r = screenr;
118*37da2899SCharles.Forsyth 	n->clipr = screenr;
119*37da2899SCharles.Forsyth 	n->ldepth = s->image->ldepth;
120*37da2899SCharles.Forsyth 	n->repl = 0;
121*37da2899SCharles.Forsyth 	n->data = s->image->data;
122*37da2899SCharles.Forsyth 	n->zero = s->image->zero;
123*37da2899SCharles.Forsyth 	n->width = s->image->width;
124*37da2899SCharles.Forsyth 	n->layer = l;
125*37da2899SCharles.Forsyth 	n->X = xm;
126*37da2899SCharles.Forsyth 
127*37da2899SCharles.Forsyth 	sxm = s->image->X;
128*37da2899SCharles.Forsyth 	xm->pmid0 = sxm->pmid0;
129*37da2899SCharles.Forsyth 	xm->pmid = sxm->pmid;
130*37da2899SCharles.Forsyth 	xm->flag = 0;
131*37da2899SCharles.Forsyth 	xm->wordp = sxm->wordp;
132*37da2899SCharles.Forsyth 
133*37da2899SCharles.Forsyth 	l->screen = s;
134*37da2899SCharles.Forsyth 	l->refreshfn = refreshfn;
135*37da2899SCharles.Forsyth 	l->screenr = screenr;
136*37da2899SCharles.Forsyth 	l->delta = Pt(0,0);
137*37da2899SCharles.Forsyth 
138*37da2899SCharles.Forsyth 	/* start with new window behind all existing ones */
139*37da2899SCharles.Forsyth 	l->front = s->rearmost;
140*37da2899SCharles.Forsyth 	l->rear = nil;
141*37da2899SCharles.Forsyth 	if(s->rearmost)
142*37da2899SCharles.Forsyth 		s->rearmost->layer->rear = n;
143*37da2899SCharles.Forsyth 	s->rearmost = n;
144*37da2899SCharles.Forsyth 	if(s->frontmost == nil)
145*37da2899SCharles.Forsyth 		s->frontmost = n;
146*37da2899SCharles.Forsyth 	l->clear = 0;
147*37da2899SCharles.Forsyth 
148*37da2899SCharles.Forsyth 	/* don't set it until we're done */
149*37da2899SCharles.Forsyth 	l->refreshptr = nil;
150*37da2899SCharles.Forsyth 
151*37da2899SCharles.Forsyth 	/* now pull new window to front */
152*37da2899SCharles.Forsyth 	memltofront(n);
153*37da2899SCharles.Forsyth 
154*37da2899SCharles.Forsyth 	/* now we're done */
155*37da2899SCharles.Forsyth 	l->refreshptr = refreshptr;
156*37da2899SCharles.Forsyth 
157*37da2899SCharles.Forsyth 	/*
158*37da2899SCharles.Forsyth 	 * paint with requested color.
159*37da2899SCharles.Forsyth 	 * previously exposed areas are already right
160*37da2899SCharles.Forsyth 	 * if this window has backing store, but just painting
161*37da2899SCharles.Forsyth 	 * the whole thing is simplest.
162*37da2899SCharles.Forsyth 	 */
163*37da2899SCharles.Forsyth 
164*37da2899SCharles.Forsyth 	if(val >= 0){
165*37da2899SCharles.Forsyth 		setcolor(val, s->image->ldepth);
166*37da2899SCharles.Forsyth 		if(xpaint == nil){
167*37da2899SCharles.Forsyth 			xpaint = allocmemimage(paint.r, paint.ldepth);
168*37da2899SCharles.Forsyth 			if(xpaint == nil) {
169*37da2899SCharles.Forsyth 				if(l->save != nil)
170*37da2899SCharles.Forsyth 					freememimage(l->save);
171*37da2899SCharles.Forsyth 				free(l);
172*37da2899SCharles.Forsyth 				free(n);
173*37da2899SCharles.Forsyth 				free(xm);
174*37da2899SCharles.Forsyth 				return nil;
175*37da2899SCharles.Forsyth 			}
176*37da2899SCharles.Forsyth 			xpaint->clipr = paint.clipr;
177*37da2899SCharles.Forsyth 			xpaint->repl = 1;
178*37da2899SCharles.Forsyth 		}
179*37da2899SCharles.Forsyth 		((Xmem*)(xpaint->X))->word = colorword;
180*37da2899SCharles.Forsyth 		((Xmem*)(xpaint->X))->flag |= XXonepixel;
181*37da2899SCharles.Forsyth 		memfillcolor(xpaint, val);
182*37da2899SCharles.Forsyth 		memdraw(n, n->r, xpaint, n->r.min, memones, n->r.min, S);
183*37da2899SCharles.Forsyth 	}
184*37da2899SCharles.Forsyth 	return n;
185*37da2899SCharles.Forsyth }
186