From 09ff7edfbe4c7fbd7140d245aac978d122eb78aa Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Fri, 12 Oct 2018 22:46:20 +0200 Subject: [PATCH] Redraw only wxPGProperties within update region Currently all properties within client area are processed for drawing whether they lie inside the update region or not. Processing for drawing is an expensive operation so doing this only for properties being actually repainted should improve performance. --- src/propgrid/propgrid.cpp | 43 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index 0d1ff356e6..3b1acf5eff 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -1861,8 +1861,8 @@ void wxPropertyGrid::OnPaint( wxPaintEvent& WXUNUSED(event) ) } // Find out where the window is scrolled to - int vx,vy; // Top left corner of client - GetViewStart(&vx,&vy); + int vy; // Top of the client + GetViewStart(NULL, &vy); vy *= wxPG_PIXELS_PER_UNIT; // Update everything inside the box @@ -1875,11 +1875,8 @@ void wxPropertyGrid::OnPaint( wxPaintEvent& WXUNUSED(event) ) r.x = 0; r.width = GetClientSize().x; - r.y = vy; - r.height = GetClientSize().y; - // Repaint this rectangle - DrawItems(*dcPtr, r.y, r.y + r.height, &r); + DrawItems(*dcPtr, r.y, r.y + r.height-1, &r); // This blits the buffer (if used) to the window DC. delete dcPtr; @@ -1985,7 +1982,7 @@ void wxPropertyGrid::DrawItems( wxDC& dc, { tempItemsRect = wxRect(0, topItemY, m_pState->GetVirtualWidth(), - bottomItemY); + bottomItemY - topItemY + 1); itemsRect = &tempItemsRect; } @@ -1999,9 +1996,8 @@ void wxPropertyGrid::DrawItems( wxDC& dc, if ( m_pState->DoGetRoot()->GetChildCount() > 0 ) { - // paintFinishY and drawBottomY are in buffer/physical space - int paintFinishY = DoDrawItems(dc, itemsRect); - int drawBottomY = itemsRect->y + itemsRect->height - vy; + int paintFinishY = DoDrawItems(dc, itemsRect) + 1 - vy; + int drawBottomY = itemsRect->y + itemsRect->height - 1 - vy; // Clear area beyond last painted property if ( paintFinishY < drawBottomY ) @@ -2010,7 +2006,7 @@ void wxPropertyGrid::DrawItems( wxDC& dc, dc.SetBrush(m_colEmptySpace); dc.DrawRectangle(0, paintFinishY, m_width, - drawBottomY ); + drawBottomY-paintFinishY+1); } } else @@ -2047,10 +2043,14 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, if ( !lastItem ) lastItem = GetLastItem( wxPG_ITERATE_VISIBLE ); - if ( IsFrozen() || m_height < 1 || firstItem == NULL ) - return itemsRect->y; + int vy; + GetViewStart(NULL, &vy); + vy *= wxPG_PIXELS_PER_UNIT; - wxCHECK_MSG( !m_pState->m_itemsAdded, itemsRect->y, + if ( IsFrozen() || m_height < 1 || firstItem == NULL ) + return vy - 1; + + wxCHECK_MSG( !m_pState->m_itemsAdded, vy - 1, wxS("no items added") ); wxASSERT( m_pState->DoGetRoot()->GetChildCount() ); @@ -2060,7 +2060,7 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, int lastItemBottomY; firstItemTopY = itemsRect->y; - lastItemBottomY = itemsRect->y + itemsRect->height; + lastItemBottomY = itemsRect->y + itemsRect->height - 1; // Align y coordinates to item boundaries firstItemTopY -= firstItemTopY % lh; @@ -2093,20 +2093,18 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, #if WXWIN_COMPATIBILITY_3_0 int xRelMod = 0; - // Buffer's y = 0, so align itemsRect and coordinates to that if ( isBuffered ) { xRelMod = itemsRect->x; // itemsRect conversion - firstItemTopY -= itemsRect->y; - lastItemBottomY -= itemsRect->y; + firstItemTopY -= vy; + lastItemBottomY -= vy; } #else - // Buffer's y = 0, so align itemsRect and coordinates to that int xRelMod = itemsRect->x; // itemsRect conversion - firstItemTopY -= itemsRect->y; - lastItemBottomY -= itemsRect->y; + firstItemTopY -= vy; + lastItemBottomY -= vy; #endif int x = m_marginWidth - xRelMod; @@ -2512,7 +2510,7 @@ int wxPropertyGrid::DoDrawItems( wxDC& dc, y += rowHeight; } - return y; + return y - 1 + vy; } // ----------------------------------------------------------------------- @@ -2580,6 +2578,7 @@ void wxPropertyGrid::DrawItems( const wxPGProperty* p1, const wxPGProperty* p2 ) r.x -= vx; r.y -= vy; RefreshRect(r); + Update(); } }