aboutsummaryrefslogtreecommitdiff
path: root/fb.c
diff options
context:
space:
mode:
Diffstat (limited to 'fb.c')
-rw-r--r--fb.c43
1 files changed, 30 insertions, 13 deletions
diff --git a/fb.c b/fb.c
index 17496ac..d7a896b 100644
--- a/fb.c
+++ b/fb.c
@@ -13,26 +13,29 @@ framebufctl_draw(Framebufctl *ctl, Image *dst)
{
Framebuf *fb;
- fb = ctl->fb[ctl->idx];
- lock(&ctl->swplk);
+ lock(ctl);
+ fb = ctl->getfb(ctl);
loadimage(dst, rectaddpt(fb->r, dst->r.min), byteaddr(fb->cb, fb->r.min), bytesperline(fb->r, fb->cb->depth)*Dy(fb->r));
- unlock(&ctl->swplk);
+ unlock(ctl);
}
static void
framebufctl_memdraw(Framebufctl *ctl, Memimage *dst)
{
- lock(&ctl->swplk);
- memimagedraw(dst, dst->r, ctl->fb[ctl->idx]->cb, ZP, nil, ZP, SoverD);
- unlock(&ctl->swplk);
+ Framebuf *fb;
+
+ lock(ctl);
+ fb = ctl->getfb(ctl);
+ memimagedraw(dst, dst->r, fb->cb, ZP, nil, ZP, SoverD);
+ unlock(ctl);
}
static void
framebufctl_swap(Framebufctl *ctl)
{
- lock(&ctl->swplk);
+ lock(ctl);
ctl->idx ^= 1;
- unlock(&ctl->swplk);
+ unlock(ctl);
}
static void
@@ -41,11 +44,23 @@ framebufctl_reset(Framebufctl *ctl)
Framebuf *fb;
/* address the back buffer—resetting the front buffer is VERBOTEN */
- fb = ctl->fb[ctl->idx^1];
- memsetd(fb->zbuf, Inf(-1), Dx(fb->r)*Dy(fb->r));
+ fb = ctl->getbb(ctl);
+ memsetd(fb->zb, Inf(-1), Dx(fb->r)*Dy(fb->r));
memfillcolor(fb->cb, DTransparent);
}
+static Framebuf *
+framebufctl_getfb(Framebufctl *ctl)
+{
+ return ctl->fb[ctl->idx]; /* front buffer */
+}
+
+static Framebuf *
+framebufctl_getbb(Framebufctl *ctl)
+{
+ return ctl->fb[ctl->idx^1]; /* back buffer */
+}
+
Framebuf *
mkfb(Rectangle r)
{
@@ -54,8 +69,8 @@ mkfb(Rectangle r)
fb = emalloc(sizeof *fb);
memset(fb, 0, sizeof *fb);
fb->cb = eallocmemimage(r, RGBA32);
- fb->zbuf = emalloc(Dx(r)*Dy(r)*sizeof(*fb->zbuf));
- memsetd(fb->zbuf, Inf(-1), Dx(r)*Dy(r));
+ fb->zb = emalloc(Dx(r)*Dy(r)*sizeof(*fb->zb));
+ memsetd(fb->zb, Inf(-1), Dx(r)*Dy(r));
fb->r = r;
return fb;
}
@@ -63,7 +78,7 @@ mkfb(Rectangle r)
void
rmfb(Framebuf *fb)
{
- free(fb->zbuf);
+ free(fb->zb);
freememimage(fb->cb);
free(fb);
}
@@ -81,6 +96,8 @@ mkfbctl(Rectangle r)
fc->memdraw = framebufctl_memdraw;
fc->swap = framebufctl_swap;
fc->reset = framebufctl_reset;
+ fc->getfb = framebufctl_getfb;
+ fc->getbb = framebufctl_getbb;
return fc;
}