From a43bae5fe45b7441fbe0e272dfc7d3727d280e53 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Sun, 7 Jun 2020 15:13:58 +0200 Subject: notebook: skip drawing tabs where the whole thing would be clipped anyway --- alf/alfnotebook.cpp | 55 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp index f6ae937..96e188f 100644 --- a/alf/alfnotebook.cpp +++ b/alf/alfnotebook.cpp @@ -354,11 +354,16 @@ ALF_Notebook_AppendPage(ALFNotebookPriv *priv, const TCHAR *title) return page; } +static BOOL +ALF_Notebook_DoRectsIntersect(const RECT *rc1, const RECT *rc2) +{ + return rc1->left < rc2->right && rc2->left < rc1->right + && rc1->top < rc2->bottom && rc2->top < rc1->bottom; +} + static void ALF_Notebook_SwitcherPaint(ALFNotebookPriv *priv, HDC dc, RECT *rcDraw) { - (void)rcDraw; // TODO: restrict some of our drawing to the invalidation rect - ALF_Notebook_ValidateTabRects(priv); HFONT oldfont = SelectFont(dc, priv->font); @@ -373,23 +378,29 @@ ALF_Notebook_SwitcherPaint(ALFNotebookPriv *priv, HDC dc, RECT *rcDraw) COLORREF clrBtnText = GetSysColor(COLOR_BTNTEXT); if (!priv->selectedPage || priv->pages.next != &priv->selectedPage->list) { - RECT rcLeftTop = { 0, - ALF_Notebook_SwitcherHeight(priv) - 1, - 2, - ALF_Notebook_SwitcherHeight(priv) }; - DrawEdge(dc, &rcLeftTop, EDGE_RAISED, BF_SOFT|BF_TOPLEFT); - - RECT rcLeftSpace = { 0, - 0, - rcLeftTop.right, - rcLeftTop.top }; - FillRect(dc, &rcLeftSpace, hbrBtnFace); + RECT rcLeftTopClip = { 0, 0, 2, rcClient.bottom - rcClient.top }; + if (ALF_Notebook_DoRectsIntersect(&rcLeftTopClip, rcDraw)) { + RECT rcLeftTop = { 0, + rcClient.bottom - rcClient.top - 1, + 2, + rcClient.bottom - rcClient.top }; + DrawEdge(dc, &rcLeftTop, EDGE_RAISED, BF_SOFT|BF_TOPLEFT); + + RECT rcLeftSpace = { 0, + 0, + rcLeftTop.right, + rcLeftTop.top }; + FillRect(dc, &rcLeftSpace, hbrBtnFace); + } } ALF_FOR_LIST(ALFNotebookPage, list, &priv->pages, p) { RECT r = p->calculatedTabRect; if (p != priv->selectedPage) { + if (!ALF_Notebook_DoRectsIntersect(&r, rcDraw)) + continue; // FIXME! correct clip rect calculation when next to active tab + RECT rBottom = { r.left + 2, r.bottom - 1, r.right - 2, @@ -444,6 +455,9 @@ ALF_Notebook_SwitcherPaint(ALFNotebookPriv *priv, HDC dc, RECT *rcDraw) } else { InflateRect(&r, 2, 0); + if (!ALF_Notebook_DoRectsIntersect(&r, rcDraw)) + continue; + RECT rLeft = { r.left, r.top + 2, r.left + 2, @@ -505,19 +519,22 @@ ALF_Notebook_SwitcherPaint(ALFNotebookPriv *priv, HDC dc, RECT *rcDraw) } } - RECT rcRightTop = { priv->totalSwitcherWidth, ALF_Notebook_SwitcherHeight(priv) - 1, - rcClient.right-rcClient.left, ALF_Notebook_SwitcherHeight(priv) }; + RECT rcRightTop = { priv->totalSwitcherWidth, rcClient.bottom - rcClient.top - 1, + rcClient.right-rcClient.left, rcClient.bottom - rcClient.top }; if (!priv->selectedPage || priv->pages.prev != &priv->selectedPage->list) { rcRightTop.left -= 2; } if (rcRightTop.left < rcRightTop.right) { - DrawEdge(dc, &rcRightTop, EDGE_RAISED, BF_SOFT|BF_TOPRIGHT); + RECT rcRightTopClip = { rcRightTop.left, 0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top }; + if (ALF_Notebook_DoRectsIntersect(&rcRightTopClip, rcDraw)) { + DrawEdge(dc, &rcRightTop, EDGE_RAISED, BF_SOFT|BF_TOPRIGHT); - RECT rcRightSpace = { rcRightTop.left, 0, - rcRightTop.right, rcRightTop.top }; - FillRect(dc, &rcRightSpace, GetSysColorBrush(COLOR_BTNFACE)); + RECT rcRightSpace = { rcRightTop.left, 0, + rcRightTop.right, rcRightTop.top }; + FillRect(dc, &rcRightSpace, GetSysColorBrush(COLOR_BTNFACE)); + } } SelectFont(dc, oldfont); -- cgit v1.2.3