diff options
author | rodri <rgl@antares-labs.eu> | 2024-07-14 21:49:43 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2024-07-14 21:49:43 +0000 |
commit | 5f10c82aad318fc9091c9bd612e89fda1a77009f (patch) | |
tree | 821cd9dfd0fcea21fdb720805666c77a63d2819c /fb.c | |
parent | 78bf838d0c45fbe6e282450e127446de5888fa11 (diff) | |
download | libgraphics-5f10c82aad318fc9091c9bd612e89fda1a77009f.tar.gz libgraphics-5f10c82aad318fc9091c9bd612e89fda1a77009f.tar.bz2 libgraphics-5f10c82aad318fc9091c9bd612e89fda1a77009f.zip |
initial viewport upscaling support.
Diffstat (limited to 'fb.c')
-rw-r--r-- | fb.c | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -20,6 +20,30 @@ framebufctl_draw(Framebufctl *ctl, Image *dst) } static void +framebufctl_upscaledraw(Framebufctl *ctl, Image *dst, Point scale) +{ + Framebuf *fb; + Rectangle blkr; + Point sp, dp; + ulong *blk; + int i; + + blk = emalloc(scale.x*scale.y*4); + blkr = Rect(0,0,scale.x,scale.y); + + qlock(ctl); + fb = ctl->getfb(ctl); + for(sp.y = fb->r.min.y, dp.y = dst->r.min.y; sp.y < fb->r.max.y; sp.y++, dp.y += scale.y) + for(sp.x = fb->r.min.x, dp.x = dst->r.min.x; sp.x < fb->r.max.x; sp.x++, dp.x += scale.x){ + for(i = 0; i < scale.x*scale.y; i++) + blk[i] = fb->cb[Dx(fb->r)*sp.y + sp.x]; + loadimage(dst, rectaddpt(blkr, dp), (uchar*)blk, scale.x*scale.y*4); + } + qunlock(ctl); + free(blk); +} + +static void framebufctl_memdraw(Framebufctl *ctl, Memimage *dst) { Framebuf *fb; @@ -31,6 +55,30 @@ framebufctl_memdraw(Framebufctl *ctl, Memimage *dst) } static void +framebufctl_upscalememdraw(Framebufctl *ctl, Memimage *dst, Point scale) +{ + Framebuf *fb; + Rectangle blkr; + Point sp, dp; + ulong *blk; + int i; + + blk = emalloc(scale.x*scale.y*4); + blkr = Rect(0,0,scale.x,scale.y); + + qlock(ctl); + fb = ctl->getfb(ctl); + for(sp.y = fb->r.min.y, dp.y = dst->r.min.y; sp.y < fb->r.max.y; sp.y++, dp.y += scale.y) + for(sp.x = fb->r.min.x, dp.x = dst->r.min.x; sp.x < fb->r.max.x; sp.x++, dp.x += scale.x){ + for(i = 0; i < scale.x*scale.y; i++) + blk[i] = fb->cb[Dx(fb->r)*sp.y + sp.x]; + loadmemimage(dst, rectaddpt(blkr, dp), (uchar*)blk, scale.x*scale.y*4); + } + qunlock(ctl); + free(blk); +} + +static void framebufctl_drawnormals(Framebufctl *ctl, Image *dst) { Framebuf *fb; @@ -106,7 +154,9 @@ mkfbctl(Rectangle r) fc->fb[0] = mkfb(r); fc->fb[1] = mkfb(r); fc->draw = framebufctl_draw; + fc->upscaledraw = framebufctl_upscaledraw; fc->memdraw = framebufctl_memdraw; + fc->upscalememdraw = framebufctl_upscalememdraw; fc->drawnormals = framebufctl_drawnormals; fc->swap = framebufctl_swap; fc->reset = framebufctl_reset; |