From c8ab67f3408f6e939ce534513adb03cc300a865e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= jaakko.keranen@iki.fi
Date: Sat, 2 Apr 2022 17:40:08 +0300
Subject: [PATCH 1/1] ListWidget: Better visbuf clearing
src/ui/listwidget.c | 29 +++++++++++++++++------------
src/ui/listwidget.h | 1 -
src/ui/visbuf.h | 2 +-
3 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/src/ui/listwidget.c b/src/ui/listwidget.c
index 7a627188..cf333b78 100644
--- a/src/ui/listwidget.c
+++ b/src/ui/listwidget.c
@@ -71,6 +71,17 @@ static void scrollBegan_ListWidget_(iAnyObject *any, int offset, uint32_t span)
refreshWhileScrolling_ListWidget_(d);
}
+static void visBufferInvalidated_ListWidget_(iVisBuf *d, size_t index) {
+}
void init_ListWidget(iListWidget *d) {
iWidget *w = as_Widget(d);
init_Widget(w);
@@ -91,7 +102,10 @@ void init_ListWidget(iListWidget *d) {
init_Click(&d->click, d, SDL_BUTTON_LEFT);
init_IntSet(&d->invalidItems);
d->visBuf = new_VisBuf();
d->visBuf->buffers[i].user = d;
}
void deinit_ListWidget(iListWidget *d) {
@@ -104,7 +118,6 @@ void deinit_ListWidget(iListWidget *d) {
void invalidate_ListWidget(iListWidget *d) {
invalidate_VisBuf(d->visBuf);
clear_IntSet(&d->invalidItems); /* all will be drawn */
refresh_Widget(as_Widget(d));
}
@@ -555,15 +568,7 @@ static void draw_ListWidget_(const iListWidget *d) {
init_Paint(&p);
drawLayerEffects_Widget(w);
drawBackground_Widget(w);
d->needRepaint) {
iForIndices(i, d->visBuf->buffers) {
beginTarget_Paint(&p, d->visBuf->buffers[i].texture);
fillRect_Paint(&p, (iRect){ zero_I2(), d->visBuf->texSize }, w->bgColor);
endTarget_Paint(&p);
}
iConstCast(iListWidget *, d)->needRepaint = iFalse;
/* Update invalid regions/items. */ {
/* TODO: This seems to draw two items per each shift of the visible region, even though
one should be enough. Probably an off-by-one error in the calculation of the
@@ -577,7 +582,7 @@ static void draw_ListWidget_(const iListWidget *d) {
const int bottom = numItems_ListWidget(d) * d->itemHeight;
const iRangei vis = { scrollY / d->itemHeight * d->itemHeight,
((scrollY + bounds.size.y) / d->itemHeight + 1) * d->itemHeight };
const iBool visChanged = reposition_VisBuf(d->visBuf, vis);
reposition_VisBuf(d->visBuf, vis);
/* Check which parts are invalid. */
iRangei invalidRange[iElemCount(d->visBuf->buffers)];
invalidRanges_VisBuf(d->visBuf, (iRangei){ 0, bottom }, invalidRange);
diff --git a/src/ui/listwidget.h b/src/ui/listwidget.h
index d59f11ef..da215b19 100644
--- a/src/ui/listwidget.h
+++ b/src/ui/listwidget.h
@@ -73,7 +73,6 @@ struct Impl_ListWidget {
iVisBuf *visBuf;
enum iScrollMode scrollMode;
iBool noHoverWhileScrolling;
};
void init_ListWidget (iListWidget *);
diff --git a/src/ui/visbuf.h b/src/ui/visbuf.h
index 31c2c114..407112dc 100644
--- a/src/ui/visbuf.h
+++ b/src/ui/visbuf.h
@@ -33,7 +33,7 @@ struct Impl_VisBufTexture {
SDL_Texture *texture;
int origin;
iRangei validRange;
};
#define numBuffers_VisBuf ((size_t) 4)
--
2.25.1
text/plain
This content has been proxied by September (3851b).