From 56e8e3de24e7fea36f165b653a8efc8c38145d4c Mon Sep 17 00:00:00 2001 From: rodri Date: Sat, 17 Aug 2024 12:17:46 +0000 Subject: unify drawing routines and add clipped fb drawing support. now changing the viewport offset will correctly show the portion of the framebuffer that's visible, including support for upscaled views. --- viewport.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) (limited to 'viewport.c') diff --git a/viewport.c b/viewport.c index 9e41e53..5214e53 100644 --- a/viewport.c +++ b/viewport.c @@ -15,13 +15,10 @@ viewport_draw(Viewport *v, Image *dst) off = Pt(v->p.x, v->p.y); /* no downsampling support yet */ - scale.x = max(min(v->bx.x, Dx(dst->r)/Dx(v->r)), 1); - scale.y = max(min(v->by.y, Dy(dst->r)/Dy(v->r)), 1); + scale.x = max(v->bx.x, 1); + scale.y = max(v->by.y, 1); - if(scale.x > 1 || scale.y > 1) - v->fbctl->upscaledraw(v->fbctl, dst, off, scale); - else - v->fbctl->draw(v->fbctl, dst, off); + v->fbctl->draw(v->fbctl, dst, off, scale); } static void @@ -31,13 +28,10 @@ viewport_memdraw(Viewport *v, Memimage *dst) off = Pt(v->p.x, v->p.y); /* no downsampling support yet */ - scale.x = max(min(v->bx.x, Dx(dst->r)/Dx(v->r)), 1); - scale.y = max(min(v->by.y, Dy(dst->r)/Dy(v->r)), 1); + scale.x = max(v->bx.x, 1); + scale.y = max(v->by.y, 1); - if(scale.x > 1 || scale.y > 1) - v->fbctl->upscalememdraw(v->fbctl, dst, off, scale); - else - v->fbctl->memdraw(v->fbctl, dst, off); + v->fbctl->memdraw(v->fbctl, dst, off, scale); } static void @@ -78,6 +72,11 @@ mkviewport(Rectangle r) { Viewport *v; + if(badrect(r)){ + werrstr("bad viewport rectangle"); + return nil; + } + v = emalloc(sizeof *v); v->p = Pt2(0,0,1); v->bx = Vec2(1,0); -- cgit v1.2.3