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