123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- #include "lib9.h"
- #include "image.h"
- #include "memimage.h"
- #include "memlayer.h"
- #include "../memimage/xmem.h"
- static ulong colorword;
- static Memdata colordata = {
- nil,
- &colorword
- };
- static Memimage paint =
- {
- { 0, 0, 1, 1 },
- { -1000000, -1000000, 10000000, 1000000 },
- 0,
- 1,
- &colordata,
- 0,
- 1,
- 0,
- };
- static Memimage *xpaint;
- static void
- setcolor(int val, int ldepth)
- {
- int bpp;
- paint.ldepth = ldepth;
- bpp = 1<<ldepth;
- val &= ~(0xFF>>bpp);
- /* color is now in low part of word; replicate through pixel */
- for(; bpp<32; bpp<<=1)
- val |= val<<bpp;
- colorword = val;
- }
- ulong*
- makememones(void)
- {
- Xmem *xm;
- extern Memimage screenimage;
- extern void drawreset();
- if(memones->X)
- return;
- drawreset();
- /* set up screen pixmap */
- xm = malloc(sizeof(Xmem));
- if(xm == nil){
- print("can't alloc for screen pixmap\n");
- return;
- }
- if(screenimage.ldepth == 0)
- xm->pmid0 = xscreenid;
- else
- xm->pmid0 = PMundef;
- xm->pmid = xscreenid;
- xm->wordp = &xm->word;
- screenimage.X = xm;
- screenimage.data->data = &xm->word;
- memones = allocmemimage(paint.r, paint.ldepth);
- memones->clipr = paint.clipr;
- memones->repl = 1;
- memfillcolor(memones, ~0);
- return screenimage.data->data;
- }
- Memimage*
- memlalloc(Memscreen *s, Rectangle screenr, Refreshfn refreshfn, void *refreshptr, int val)
- {
- Memimage *n;
- Memlayer *l;
- Xmem *xm, *sxm;
- n = malloc(sizeof(Memimage));
- if(n == nil)
- return nil;
- l = malloc(sizeof(Memlayer));
- if(l == nil){
- free(n);
- return nil;
- }
- xm = malloc(sizeof(Xmem));
- if(xm == nil){
- free(l);
- free(n);
- return nil;
- }
- if(refreshfn) {
- l->save = nil;
- }
- else{
- l->save = allocmemimage(screenr, s->image->ldepth);
- if(l->save == nil){
- free(l);
- free(n);
- free(xm);
- return nil;
- }
- /* allocmemimage doesn't initialize memory; this paints save area */
- if(val >= 0)
- memfillcolor(l->save, val);
- }
- n->r = screenr;
- n->clipr = screenr;
- n->ldepth = s->image->ldepth;
- n->repl = 0;
- n->data = s->image->data;
- n->zero = s->image->zero;
- n->width = s->image->width;
- n->layer = l;
- n->X = xm;
- sxm = s->image->X;
- xm->pmid0 = sxm->pmid0;
- xm->pmid = sxm->pmid;
- xm->flag = 0;
- xm->wordp = sxm->wordp;
- l->screen = s;
- l->refreshfn = refreshfn;
- l->screenr = screenr;
- l->delta = Pt(0,0);
- /* start with new window behind all existing ones */
- l->front = s->rearmost;
- l->rear = nil;
- if(s->rearmost)
- s->rearmost->layer->rear = n;
- s->rearmost = n;
- if(s->frontmost == nil)
- s->frontmost = n;
- l->clear = 0;
- /* don't set it until we're done */
- l->refreshptr = nil;
- /* now pull new window to front */
- memltofront(n);
- /* now we're done */
- 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 >= 0){
- setcolor(val, s->image->ldepth);
- if(xpaint == nil){
- xpaint = allocmemimage(paint.r, paint.ldepth);
- if(xpaint == nil) {
- if(l->save != nil)
- freememimage(l->save);
- free(l);
- free(n);
- free(xm);
- return nil;
- }
- xpaint->clipr = paint.clipr;
- xpaint->repl = 1;
- }
- ((Xmem*)(xpaint->X))->word = colorword;
- ((Xmem*)(xpaint->X))->flag |= XXonepixel;
- memfillcolor(xpaint, val);
- memdraw(n, n->r, xpaint, n->r.min, memones, n->r.min, S);
- }
- return n;
- }
|