From d13729f5a0cdd2fa0f688a5dd6d9099282f58afa Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Sun, 21 Jun 2020 18:03:04 -0700 Subject: poll_events: fix and de-macroify CLIP_EVENT_AREA I don't know why the author was so obsessed with macros where they served to only make impossible to read and maintain, bringing zero benefit. This turned out to have some bugs so I rewrote some of it while converting to a function. --- recordmydesktop/src/rmd_macro.h | 3 + recordmydesktop/src/rmd_poll_events.c | 101 +++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 45 deletions(-) diff --git a/recordmydesktop/src/rmd_macro.h b/recordmydesktop/src/rmd_macro.h index 37c032d..2f1ac88 100644 --- a/recordmydesktop/src/rmd_macro.h +++ b/recordmydesktop/src/rmd_macro.h @@ -76,5 +76,8 @@ #define Y_UNIT_WIDTH 0x0010 #define UV_UNIT_WIDTH 0x0008 +#define MAX(a, b) ((a) < (b)) ? (b) : (a) +#define MIN(a, b) ((a) > (b)) ? (b) : (a) + #endif diff --git a/recordmydesktop/src/rmd_poll_events.c b/recordmydesktop/src/rmd_poll_events.c index 9745889..12ff87e 100644 --- a/recordmydesktop/src/rmd_poll_events.c +++ b/recordmydesktop/src/rmd_poll_events.c @@ -42,43 +42,58 @@ #include -#define CLIP_EVENT_AREA(e,brwin,xrect) {\ - if (((e)->area.x<=(brwin)->rrect.x)&&((e)->area.y<=(brwin)->rrect.y)&&\ - ((e)->area.width>=(brwin)->rrect.width)&&\ - ((e)->area.height<(brwin)->rrect.height)) {\ - (xrect)->x=(brwin)->rrect.x;\ - (xrect)->y=(brwin)->rrect.y;\ - (xrect)->width=(brwin)->rrect.width;\ - (xrect)->height=(brwin)->rrect.height;\ - }\ - else{\ - (xrect)->x=((((e)->area.x+(e)->area.width>=(brwin)->rrect.x)&&\ - ((e)->area.x<=(brwin)->rrect.x+(brwin)->rrect.width))?\ - (((e)->area.x<=(brwin)->rrect.x)?(brwin)->rrect.x:(e)->area.x):-1);\ - \ - (xrect)->y=((((e)->area.y+(e)->area.height>=(brwin)->rrect.y)&&\ - ((e)->area.y<=(brwin)->rrect.y+(brwin)->rrect.height))?\ - (((e)->area.y<=(brwin)->rrect.y)?(brwin)->rrect.y:(e)->area.y):-1);\ - \ - (xrect)->width=((e)->area.x<=(brwin)->rrect.x)?\ - (e)->area.width-((brwin)->rrect.x-(e)->area.x):\ - ((e)->area.x<=(brwin)->rrect.x+(brwin)->rrect.width)?\ - (((brwin)->rrect.width-(e)->area.x+(brwin)->rrect.x<(e)->area.width)?\ - (brwin)->rrect.width-(e)->area.x+(brwin)->rrect.x:e->area.width):0;\ - \ - (xrect)->height=((e)->area.y<=(brwin)->rrect.y)?\ - (e)->area.height-((brwin)->rrect.y-(e)->area.y):\ - ((e)->area.y<=(brwin)->rrect.y+(brwin)->rrect.height)?\ - (((brwin)->rrect.height-(e)->area.y+\ - (brwin)->rrect.y<(e)->area.height)?\ - (brwin)->rrect.height-(e)->area.y+\ - (brwin)->rrect.y:(e)->area.height):0;\ - \ - if ((xrect)->width>(brwin)->rrect.width)\ - (xrect)->width=(brwin)->rrect.width;\ - if ((xrect)->height>(brwin)->rrect.height)\ - (xrect)->height=(brwin)->rrect.height;\ - }\ +static int clip_event_area(XDamageNotifyEvent *e, XRectangle *cliprect, XRectangle *res) +{ + +#if 0 + printf("got area %x,%x %x,%x\n", + e->area.x, + e->area.y, + e->area.width, + e->area.height); +#endif + + if ( e->area.x <= cliprect->x && + e->area.y <= cliprect->y && + e->area.width >= cliprect->width && + e->area.height >= cliprect->height) { + + /* area completely covers cliprect, cliprect becomes the area */ + res->x = cliprect->x; + res->y = cliprect->y; + res->width = cliprect->width; + res->height = cliprect->height; + + } else if ( e->area.x + e->area.width < cliprect->x || + e->area.x + e->area.width > cliprect->x + cliprect->width || + e->area.y + e->area.height < cliprect->y || + e->area.y + e->area.height > cliprect->y + cliprect->height) { + + /* area has at least one axis with zero overlap, so they can't overlap */ + return 0; + + } else { + + /* areas partially overlap */ + res->x = MAX(e->area.x, cliprect->x); + res->width = MIN(e->area.x + e->area.width, cliprect->x + cliprect->width) - res->x; + + res->y = MAX(e->area.y, cliprect->y); + res->height = MIN(e->area.y + e->area.height, cliprect->y + cliprect->height) - res->y; + + if (!res->width || !res->height) + return 0; + } + +#if 0 + printf("clipped to %x,%x %x,%x\n", + res->x, + res->y, + res->width, + res->height); +#endif + + return 1; } @@ -181,15 +196,11 @@ void rmdEventLoop(ProgData *pdata) { XDamageReportRawRectangles); } } else if (event.type == pdata->damage_event + XDamageNotify ) { - XDamageNotifyEvent *e =(XDamageNotifyEvent *)( &event ); - XRectangle xrect; - CLIP_EVENT_AREA(e,&(pdata->brwin),&xrect); - if ((xrect.x>=0)&&(xrect.y>=0)&& - (xrect.width>0)&&(xrect.height>0)) { + XDamageNotifyEvent *e = (XDamageNotifyEvent *)&event; + XRectangle xrect; - inserts+=rmdRectInsert(&pdata->rect_root,&xrect); - - } + if (clip_event_area(e, &pdata->brwin.rrect, &xrect)) + inserts += rmdRectInsert(&pdata->rect_root,&xrect); } } -- cgit v1.2.3