ref: abdece9ac66470acc5bccf1d075e74b9a559086c
dir: /drw.c/
#include <u.h>
#include <libc.h>
#include <draw.h>
#include "dat.h"
#include "fns.h"
QLock drwlock;
static char *fontname = "/lib/font/bit/fixed/unicode.6x10.font";
static Rectangle fbr;
static Image *fb;
static Image *
eallocimage(Rectangle r, ulong chan, int repl, ulong col)
{
Image *i;
if((i = allocimage(display, r, chan, repl, col)) == nil)
sysfatal("allocimage: %r");
return i;
}
void
drawtile(Tile *m)
{
char *s;
Point p;
p.x = (m - map) % mapwidth * 16 * font->width;
p.y = (m - map) / mapwidth * 2 * font->height;
s = m->b != nil ? m->b->name : m->t->name;
string(fb, p, display->white, ZP, font, s);
}
void
updatedraw(void)
{
int bail;
Tile *m;
bail = 1;
qlock(&drwlock);
for(m=map; m<map+mapwidth*mapheight; m++)
if(m->stale){
bail = 0;
drawtile(m);
m->stale = 0;
}
qunlock(&drwlock);
if(bail)
return;
draw(screen, screen->r, fb, nil, ZP);
flushimage(display, 1);
}
void
redraw(void)
{
Tile *m;
draw(fb, fb->r, display->black, nil, ZP);
for(m=map; m<map+mapwidth*mapheight; m++)
m->stale = 1;
updatedraw();
}
void
resetdraw(void)
{
freeimage(fb);
fbr = rectsubpt(screen->r, screen->r.min);
fb = eallocimage(fbr, screen->chan, 0, DNofill);
redraw();
}
void
initdrw(void)
{
if(initdraw(nil, fontname, "city") < 0)
sysfatal("initdraw: %r");
resetdraw();
}