Commit f85bf48a authored by tomasz.wlostowski@cern.ch's avatar tomasz.wlostowski@cern.ch
Browse files

EDA_DRAW_PANEL_GAL: redraw stuff in a single place, with "coalescing"

Redraws can be requested way too often than it is required. This commit adds redraw timeout:
- if the view became dirty and there has been no redraw for longer than certain time, it is redrawed immediately
- otherwise, we wait for the next frame

This in general improves smoothness of rendering.
parent 660d4cc6
Loading
Loading
Loading
Loading
+31 −2
Original line number Diff line number Diff line
@@ -91,6 +91,11 @@ EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin
	Connect( wxEVT_KEY_UP,      wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
	Connect( wxEVT_KEY_DOWN,    wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
    Connect( wxEVT_ENTER_WINDOW, wxEventHandler (EDA_DRAW_PANEL_GAL::onEnter ), NULL, this );
    

    m_refreshTimer.SetOwner( this );
    Connect( wxEVT_TIMER, wxTimerEventHandler( EDA_DRAW_PANEL_GAL::onRefreshTimer ), NULL, this );

    this->SetFocus();
}

@@ -113,6 +118,9 @@ EDA_DRAW_PANEL_GAL::~EDA_DRAW_PANEL_GAL()

void EDA_DRAW_PANEL_GAL::onPaint( wxPaintEvent& WXUNUSED( aEvent ) )
{
    m_pendingRefresh = false;
    m_lastRefresh = wxGetLocalTimeMillis();

#ifdef __WXDEBUG__
    prof_counter time;
    prof_start( &time, false );
@@ -147,10 +155,30 @@ void EDA_DRAW_PANEL_GAL::onSize( wxSizeEvent& aEvent )
}


void EDA_DRAW_PANEL_GAL::onRefreshTimer( wxTimerEvent& aEvent )
{
    wxPaintEvent redrawEvent;
    wxPostEvent( this, redrawEvent );
}


void EDA_DRAW_PANEL_GAL::Refresh( bool eraseBackground, const wxRect* rect )
{
    if(m_pendingRefresh)
        return;

    wxLongLong t = wxGetLocalTimeMillis();
    wxLongLong delta = t - m_lastRefresh;

    if(t >= MinRefreshPeriod)
    {
        wxPaintEvent redrawEvent;
        wxPostEvent( this, redrawEvent );
        m_pendingRefresh = true;
    } else {
        m_refreshTimer.Start ( (MinRefreshPeriod - t).ToLong(), true );
        m_pendingRefresh = true;
    }
} 


@@ -208,6 +236,7 @@ void EDA_DRAW_PANEL_GAL::onEvent( wxEvent& aEvent )
        m_eventDispatcher->DispatchWxEvent( aEvent );
    }

	if(m_view->IsDirty())
        Refresh();
}

+1 −2
Original line number Diff line number Diff line
@@ -196,8 +196,7 @@ void WX_VIEW_CONTROLS::onTimer( wxTimerEvent& aEvent )

        dir = m_view->ToWorld( dir, false );
        m_view->SetCenter( m_view->GetCenter() + dir * m_autoPanSpeed );

        m_parentPanel->Refresh();
        m_view->MakeDirty();
    }
    break;

+7 −0
Original line number Diff line number Diff line
@@ -116,8 +116,15 @@ protected:
    void onSize( wxSizeEvent& aEvent );
    void onEvent( wxEvent& aEvent );
    void onEnter( wxEvent& aEvent );
    void onRefreshTimer ( wxTimerEvent& aEvent );
    void skipEvent( wxEvent& aEvent );

    static const int MinRefreshPeriod = 17;             ///< 60 FPS.

    wxLongLong               m_lastRefresh;      ///< Last time the panel was refreshed
    bool                     m_pendingRefresh;
    wxTimer                  m_refreshTimer;

    KiGfx::GAL*              m_gal;              ///< Interface for drawing objects on a 2D-surface
    KiGfx::VIEW*             m_view;             ///< Stores view settings (scale, center, etc.)
                                                 ///< and items to be drawn
+5 −0
Original line number Diff line number Diff line
@@ -443,6 +443,11 @@ public:
        return ( m_layers.at( aLayer ).target == TARGET_CACHED );
    }

    void MakeDirty()
    {
        for(int i = 0; i < TARGETS_NUMBER; i++)
            m_dirtyTargets[i] = true;
    }

    static const int VIEW_MAX_LAYERS = 128;      ///* maximum number of layers that may be shown