diff options
Diffstat (limited to 'fb.c')
-rw-r--r-- | fb.c | 43 |
1 files changed, 30 insertions, 13 deletions
@@ -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; } |