Commit 820e6e5e authored by Maciej Suminski's avatar Maciej Suminski
Browse files

Introduced Cairo-based rendering backend using GAL.

Moved switching canvas routines to pcbnew, as they are used only there right now (otherwise libgal would have to be linked to every Kicad application).
parent 5b905782
Loading
Loading
Loading
Loading
+27 −6
Original line number Diff line number Diff line
@@ -46,7 +46,10 @@
#include <math/box2.h>

#include <wx/fontdlg.h>

#ifdef KICAD_GAL
#include <view/view.h>
#include <gal/graphics_abstraction_layer.h>
#endif /* KICAD_GAL */

/**
 * Definition for enabling and disabling scroll bar setting trace output.  See the
@@ -67,7 +70,6 @@ BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, EDA_BASE_FRAME )
    EVT_MENU_OPEN( EDA_DRAW_FRAME::OnMenuOpen )
    EVT_ACTIVATE( EDA_DRAW_FRAME::OnActivate )
    EVT_MENU_RANGE( ID_ZOOM_IN, ID_ZOOM_REDRAW, EDA_DRAW_FRAME::OnZoom )
    EVT_MENU( ID_SWITCH_CANVAS, EDA_DRAW_FRAME::OnZoom )
    EVT_MENU_RANGE( ID_OFFCENTER_ZOOM_IN, ID_OFFCENTER_ZOOM_OUT, EDA_DRAW_FRAME::OnZoom )
    EVT_MENU_RANGE( ID_POPUP_ZOOM_START_RANGE, ID_POPUP_ZOOM_END_RANGE,
                    EDA_DRAW_FRAME::OnZoom )
@@ -943,22 +945,41 @@ void EDA_DRAW_FRAME::AdjustScrollBars( const wxPoint& aCenterPositionIU )

void EDA_DRAW_FRAME::UseGalCanvas( bool aEnable )
{
    if( aEnable && m_galCanvasActive )
    {
        // When we switch between GAL based canvases, all we need is a refresh
        m_galCanvas->Refresh();
    }

    if( !( aEnable ^ m_galCanvasActive ) )
        return;

    KiGfx::VIEW* view = m_galCanvas->GetView();
    KiGfx::GAL* gal = m_galCanvas->GetGAL();
    double zoomFactor = gal->GetWorldScale() / gal->GetZoomFactor();

    // Display the same view after canvas switching
    if( aEnable )
    {
        m_canvas->Hide();
        double zoom =  1 / ( zoomFactor * m_canvas->GetZoom() );
        view->SetScale( zoom );

        view->SetCenter( VECTOR2D( m_canvas->GetScreenCenterLogicalPosition() ) );

        m_galCanvas->Show();
        m_galCanvas->Raise();
        m_galCanvas->Refresh();
    }
    else
    {
        m_galCanvas->Hide();

        double zoom = 1 / ( zoomFactor * view->GetScale() );
        m_canvas->SetZoom( zoom );

        VECTOR2D center = view->GetCenter();
        RedrawScreen( wxPoint( center.x, center.y ), false );

        m_canvas->Show();
        m_canvas->Raise();
        m_canvas->Refresh();
    }

    m_galCanvasActive = aEnable;
+10 −0
Original line number Diff line number Diff line
@@ -84,7 +84,11 @@ EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin
    m_gal->SetZoomFactor( 1.0 );
    m_gal->ComputeWorldScreenMatrix();

    m_painter = new KiGfx::PCB_PAINTER( m_gal );
    m_painter->SetGAL( m_gal );

    m_view = new KiGfx::VIEW( true );
    m_view->SetPainter( m_painter );
    m_view->SetGAL( m_gal );

    // View uses layers to display EDA_ITEMs (item may be displayed on several layers, for example
@@ -150,4 +154,10 @@ void EDA_DRAW_PANEL_GAL::SwitchBackend( GalType aGalType, bool aUseShaders )

    if( m_view )
        m_view->SetGAL( m_gal );

    if( m_painter )
        m_painter->SetGAL( m_gal );

    wxSize size = GetClientSize();
    m_gal->ResizeScreen( size.GetX(), size.GetY() );
}
+0 −35
Original line number Diff line number Diff line
@@ -39,11 +39,6 @@
#include <hotkeys_basic.h>
#include <menus_helpers.h>
#include <base_units.h>
#ifdef KICAD_GAL
#include <class_drawpanel_gal.h>
#include <gal/graphics_abstraction_layer.h>
#include <view/view.h>
#endif


void EDA_DRAW_FRAME::RedrawScreen( const wxPoint& aCenterPoint, bool aWarpPointer )
@@ -167,36 +162,6 @@ void EDA_DRAW_FRAME::OnZoom( wxCommandEvent& event )
        m_canvas->Refresh();
        break;

#ifdef KICAD_GAL
    // Switch canvas between standard and GAL-based
    case ID_SWITCH_CANVAS:
    {
        UseGalCanvas( !m_galCanvasActive );

        KiGfx::VIEW* view = m_galCanvas->GetView();
        KiGfx::GAL* gal = m_galCanvas->GetGAL();
        double zoomFactor = gal->GetWorldScale() / gal->GetZoomFactor();

        // Display the same view after canvas switching
        if( m_galCanvasActive )
        {
            double zoom =  1 / ( zoomFactor * m_canvas->GetZoom() );
            view->SetScale( zoom );

            view->SetCenter( VECTOR2D( m_canvas->GetScreenCenterLogicalPosition() ) );
        }
        else
        {
            double zoom = 1 / ( zoomFactor * view->GetScale() );
            m_canvas->SetZoom( zoom );

            VECTOR2D center = view->GetCenter();
            RedrawScreen( wxPoint( center.x, center.y ), false );
        }
    }
        break;
#endif

    case ID_POPUP_ZOOM_CENTER:
        center = screen->GetCrossHairPosition();
        RedrawScreen( center, true );
+0 −1
Original line number Diff line number Diff line
@@ -52,7 +52,6 @@ public:
    enum GalType {
        GAL_TYPE_OPENGL,    ///< OpenGL implementation
        GAL_TYPE_CAIRO,     ///< Cairo implementation
        GAL_TYPE_WXDC       ///< WXDC implementation
    };

    EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWindowId, const wxPoint& aPosition,
+0 −1
Original line number Diff line number Diff line
@@ -213,7 +213,6 @@ enum main_id
    ID_ZOOM_OUT,
    ID_ZOOM_PAGE,
    ID_ZOOM_REDRAW,
    ID_SWITCH_CANVAS,

    /* Panning command event IDs. */
    ID_PAN_UP,
Loading