Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
|
|
*
|
2017-01-13 16:48:23 +01:00
|
|
|
* Copyright (C) 2013-2017 CERN
|
2017-03-03 16:05:13 -05:00
|
|
|
* Copyright (C) 2013-2017 KiCad Developers, see AUTHORS.txt for contributors.
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
2015-02-15 02:18:35 +01:00
|
|
|
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, you may find one here:
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
|
|
* or you may write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
*/
|
|
|
|
|
2016-05-02 16:15:25 +02:00
|
|
|
#include <draw_frame.h>
|
|
|
|
#include <kiface_i.h>
|
2015-02-15 02:18:35 +01:00
|
|
|
#include <confirm.h>
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
|
2014-04-04 11:56:04 +02:00
|
|
|
#include <class_draw_panel_gal.h>
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
#include <view/view.h>
|
|
|
|
#include <view/wx_view_controls.h>
|
2017-02-15 22:26:03 -05:00
|
|
|
#include <painter.h>
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
|
|
|
|
#include <gal/graphics_abstraction_layer.h>
|
|
|
|
#include <gal/opengl/opengl_gal.h>
|
|
|
|
#include <gal/cairo/cairo_gal.h>
|
|
|
|
|
2013-08-02 16:53:50 +02:00
|
|
|
#include <tool/tool_dispatcher.h>
|
|
|
|
#include <tool/tool_manager.h>
|
|
|
|
|
2018-02-26 16:46:35 +01:00
|
|
|
#ifdef __WXDEBUG__
|
2013-05-16 17:17:35 +02:00
|
|
|
#include <profile.h>
|
2016-05-02 15:56:17 +02:00
|
|
|
#endif /* PROFILE */
|
|
|
|
|
2013-05-16 17:17:35 +02:00
|
|
|
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWindowId,
|
|
|
|
const wxPoint& aPosition, const wxSize& aSize,
|
2017-01-02 07:13:45 +01:00
|
|
|
KIGFX::GAL_DISPLAY_OPTIONS& aOptions, GAL_TYPE aGalType ) :
|
|
|
|
wxScrolledCanvas( aParentWindow, aWindowId, aPosition, aSize ), m_options( aOptions )
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
{
|
2014-07-09 11:22:42 +02:00
|
|
|
m_parent = aParentWindow;
|
2016-05-02 16:15:26 +02:00
|
|
|
m_edaFrame = dynamic_cast<EDA_DRAW_FRAME*>( aParentWindow );
|
2013-06-18 16:19:30 +02:00
|
|
|
m_gal = NULL;
|
2014-07-09 10:34:00 +02:00
|
|
|
m_backend = GAL_TYPE_NONE;
|
2013-06-18 16:19:30 +02:00
|
|
|
m_view = NULL;
|
|
|
|
m_painter = NULL;
|
2013-08-02 16:53:50 +02:00
|
|
|
m_eventDispatcher = NULL;
|
2015-07-02 11:40:33 +02:00
|
|
|
m_lostFocus = false;
|
2017-03-05 13:58:31 -05:00
|
|
|
m_stealsFocus = true;
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
|
2017-06-12 15:10:43 +02:00
|
|
|
#ifdef __WXMAC__
|
|
|
|
m_defaultCursor = m_currentCursor = wxCURSOR_CROSS;
|
|
|
|
#else
|
|
|
|
m_defaultCursor = m_currentCursor = wxCURSOR_ARROW;
|
|
|
|
#endif
|
|
|
|
|
2016-03-22 14:53:50 -04:00
|
|
|
SetLayoutDirection( wxLayout_LeftToRight );
|
|
|
|
|
2013-07-29 16:38:07 +02:00
|
|
|
SwitchBackend( aGalType );
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
SetBackgroundStyle( wxBG_STYLE_CUSTOM );
|
2016-06-03 15:46:11 +02:00
|
|
|
|
2015-05-18 13:48:10 +02:00
|
|
|
ShowScrollbars( wxSHOW_SB_ALWAYS, wxSHOW_SB_ALWAYS );
|
|
|
|
EnableScrolling( false, false ); // otherwise Zoom Auto disables GAL canvas
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
|
2014-07-09 11:22:42 +02:00
|
|
|
Connect( wxEVT_SIZE, wxSizeEventHandler( EDA_DRAW_PANEL_GAL::onSize ), NULL, this );
|
|
|
|
Connect( wxEVT_ENTER_WINDOW, wxEventHandler( EDA_DRAW_PANEL_GAL::onEnter ), NULL, this );
|
2015-07-02 11:40:33 +02:00
|
|
|
Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( EDA_DRAW_PANEL_GAL::onLostFocus ), NULL, this );
|
2013-10-14 13:43:57 +02:00
|
|
|
|
2014-07-09 11:22:43 +02:00
|
|
|
const wxEventType events[] =
|
|
|
|
{
|
2017-09-16 18:28:48 +02:00
|
|
|
// Binding both EVT_CHAR and EVT_CHAR_HOOK ensures that all key events,
|
|
|
|
// especially special key like arrow keys, are handled by the GAL event dispatcher,
|
|
|
|
// and not sent to GUI without filtering, because they have a default action (scroll)
|
|
|
|
// that must not be called.
|
2014-07-09 11:22:43 +02:00
|
|
|
wxEVT_LEFT_UP, wxEVT_LEFT_DOWN, wxEVT_LEFT_DCLICK,
|
|
|
|
wxEVT_RIGHT_UP, wxEVT_RIGHT_DOWN, wxEVT_RIGHT_DCLICK,
|
|
|
|
wxEVT_MIDDLE_UP, wxEVT_MIDDLE_DOWN, wxEVT_MIDDLE_DCLICK,
|
2017-09-16 18:28:48 +02:00
|
|
|
wxEVT_MOTION, wxEVT_MOUSEWHEEL, wxEVT_CHAR, wxEVT_CHAR_HOOK,
|
2016-01-24 19:18:29 -05:00
|
|
|
#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
|
2015-05-21 22:54:29 +02:00
|
|
|
wxEVT_MAGNIFY,
|
2015-06-16 17:03:36 +02:00
|
|
|
#endif
|
2015-05-21 22:54:29 +02:00
|
|
|
KIGFX::WX_VIEW_CONTROLS::EVT_REFRESH_MOUSE
|
2014-07-09 11:22:43 +02:00
|
|
|
};
|
|
|
|
|
2016-06-29 16:07:55 -04:00
|
|
|
for( wxEventType eventType : events )
|
2014-07-09 11:22:43 +02:00
|
|
|
{
|
2018-05-20 14:08:06 +01:00
|
|
|
Connect( eventType, wxEventHandler( EDA_DRAW_PANEL_GAL::OnEvent ),
|
2014-07-09 11:22:43 +02:00
|
|
|
NULL, m_eventDispatcher );
|
|
|
|
}
|
|
|
|
|
2013-11-11 10:48:49 +01:00
|
|
|
m_pendingRefresh = false;
|
|
|
|
m_drawing = false;
|
2015-08-21 10:33:36 +02:00
|
|
|
m_drawingEnabled = false;
|
2016-05-09 17:23:01 +02:00
|
|
|
|
|
|
|
// Set up timer that prevents too frequent redraw commands
|
|
|
|
m_refreshTimer.SetOwner( this );
|
|
|
|
Connect( m_refreshTimer.GetId(), wxEVT_TIMER,
|
|
|
|
wxTimerEventHandler( EDA_DRAW_PANEL_GAL::onRefreshTimer ), NULL, this );
|
|
|
|
|
|
|
|
// Set up timer to execute OnShow() method when the window appears on the screen
|
|
|
|
m_onShowTimer.SetOwner( this );
|
|
|
|
Connect( m_onShowTimer.GetId(), wxEVT_TIMER,
|
|
|
|
wxTimerEventHandler( EDA_DRAW_PANEL_GAL::onShowTimer ), NULL, this );
|
|
|
|
m_onShowTimer.Start( 10 );
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EDA_DRAW_PANEL_GAL::~EDA_DRAW_PANEL_GAL()
|
|
|
|
{
|
2016-06-03 15:46:12 +02:00
|
|
|
StopDrawing();
|
2016-05-02 16:15:25 +02:00
|
|
|
|
2018-01-17 08:58:44 +01:00
|
|
|
wxASSERT( !m_drawing );
|
2016-06-03 15:46:12 +02:00
|
|
|
|
2015-04-30 10:46:03 +02:00
|
|
|
delete m_viewControls;
|
|
|
|
delete m_view;
|
|
|
|
delete m_gal;
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-25 11:21:00 +02:00
|
|
|
void EDA_DRAW_PANEL_GAL::SetFocus()
|
|
|
|
{
|
|
|
|
// Windows has a strange manner on bringing up and activating windows
|
|
|
|
// containing a GAL canvas just after moving the mouse cursor into its area.
|
|
|
|
// Feel free to uncomment or extend the following #ifdef if you experience
|
|
|
|
// similar problems on your platform.
|
|
|
|
#ifdef __WINDOWS__
|
|
|
|
if( !GetParent()->IsDescendant( wxWindow::FindFocus() ) )
|
|
|
|
return;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
wxScrolledCanvas::SetFocus();
|
|
|
|
m_lostFocus = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-06-20 09:58:18 +02:00
|
|
|
void EDA_DRAW_PANEL_GAL::onPaint( wxPaintEvent& WXUNUSED( aEvent ) )
|
2013-04-16 11:16:27 +02:00
|
|
|
{
|
2013-09-12 11:40:16 +02:00
|
|
|
m_pendingRefresh = false;
|
|
|
|
|
2015-02-15 02:18:35 +01:00
|
|
|
if( m_drawing )
|
|
|
|
return;
|
2013-11-11 10:48:49 +01:00
|
|
|
|
2018-02-26 16:46:35 +01:00
|
|
|
#ifdef __WXDEBUG__
|
2016-12-31 13:00:24 +01:00
|
|
|
PROF_COUNTER totalRealTime;
|
2016-05-02 15:56:17 +02:00
|
|
|
#endif /* PROFILE */
|
|
|
|
|
2017-02-15 21:06:05 -05:00
|
|
|
wxASSERT( m_painter );
|
|
|
|
|
2015-02-15 02:18:35 +01:00
|
|
|
m_drawing = true;
|
2017-02-15 22:26:03 -05:00
|
|
|
KIGFX::RENDER_SETTINGS* settings = static_cast<KIGFX::RENDER_SETTINGS*>( m_painter->GetSettings() );
|
2013-11-11 10:48:49 +01:00
|
|
|
|
2015-05-18 13:48:10 +02:00
|
|
|
m_viewControls->UpdateScrollbars();
|
2016-05-21 19:38:47 -04:00
|
|
|
|
2017-01-13 16:48:23 +01:00
|
|
|
try
|
|
|
|
{
|
2018-01-17 08:58:44 +01:00
|
|
|
m_view->UpdateItems();
|
|
|
|
|
2017-01-13 16:48:23 +01:00
|
|
|
m_gal->BeginDrawing();
|
2017-08-04 14:43:02 +02:00
|
|
|
m_gal->SetClearColor( settings->GetBackgroundColor() );
|
|
|
|
m_gal->SetCursorColor( settings->GetLayerColor( LAYER_CURSOR ) );
|
|
|
|
m_gal->ClearScreen( );
|
2014-02-21 16:57:18 +01:00
|
|
|
|
2017-01-13 16:48:23 +01:00
|
|
|
if( m_view->IsDirty() )
|
|
|
|
{
|
|
|
|
m_view->ClearTargets();
|
2015-02-15 02:18:35 +01:00
|
|
|
|
2017-01-13 16:48:23 +01:00
|
|
|
// Grid has to be redrawn only when the NONCACHED target is redrawn
|
|
|
|
if( m_view->IsTargetDirty( KIGFX::TARGET_NONCACHED ) )
|
|
|
|
m_gal->DrawGrid();
|
2013-04-16 11:16:27 +02:00
|
|
|
|
2017-01-13 16:48:23 +01:00
|
|
|
m_view->Redraw();
|
|
|
|
}
|
|
|
|
|
|
|
|
m_gal->DrawCursor( m_viewControls->GetCursorPosition() );
|
|
|
|
m_gal->EndDrawing();
|
2015-02-15 02:18:35 +01:00
|
|
|
}
|
2017-01-13 16:48:23 +01:00
|
|
|
catch( std::runtime_error& err )
|
|
|
|
{
|
2018-01-17 08:58:44 +01:00
|
|
|
constexpr auto GAL_FALLBACK = GAL_TYPE_CAIRO;
|
2017-01-13 16:48:23 +01:00
|
|
|
|
|
|
|
if( m_edaFrame )
|
2018-01-17 08:58:44 +01:00
|
|
|
{
|
|
|
|
bool use_gal = m_edaFrame->SwitchCanvas( GAL_FALLBACK );
|
|
|
|
m_edaFrame->UseGalCanvas( use_gal );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SwitchBackend( GAL_TYPE_CAIRO );
|
|
|
|
}
|
2017-01-13 16:48:23 +01:00
|
|
|
|
|
|
|
DisplayError( m_parent, wxString( err.what() ) );
|
|
|
|
}
|
2013-04-16 11:16:27 +02:00
|
|
|
|
2018-02-26 16:46:35 +01:00
|
|
|
#ifdef __WXDEBUG__
|
2016-12-31 13:00:24 +01:00
|
|
|
totalRealTime.Stop();
|
2018-02-26 16:46:35 +01:00
|
|
|
wxLogTrace( "GAL_PROFILE", "EDA_DRAW_PANEL_GAL::onPaint(): %.1f ms", totalRealTime.msecs() );
|
2016-05-02 15:56:17 +02:00
|
|
|
#endif /* PROFILE */
|
|
|
|
|
2015-05-18 13:48:10 +02:00
|
|
|
m_lastRefresh = wxGetLocalTimeMillis();
|
2015-02-15 02:18:35 +01:00
|
|
|
m_drawing = false;
|
2013-04-16 11:16:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-08-27 18:08:32 +02:00
|
|
|
void EDA_DRAW_PANEL_GAL::onSize( wxSizeEvent& aEvent )
|
|
|
|
{
|
2017-09-14 10:13:50 -04:00
|
|
|
wxSize clientSize = GetClientSize();
|
|
|
|
m_gal->ResizeScreen( clientSize.x, clientSize.y );
|
2013-10-14 16:13:35 +02:00
|
|
|
m_view->MarkTargetDirty( KIGFX::TARGET_CACHED );
|
|
|
|
m_view->MarkTargetDirty( KIGFX::TARGET_NONCACHED );
|
2013-08-27 18:08:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-07-09 10:57:32 +02:00
|
|
|
void EDA_DRAW_PANEL_GAL::Refresh( bool aEraseBackground, const wxRect* aRect )
|
2013-09-12 11:40:16 +02:00
|
|
|
{
|
2013-09-12 17:42:28 +02:00
|
|
|
if( m_pendingRefresh )
|
2013-09-12 11:40:16 +02:00
|
|
|
return;
|
|
|
|
|
2016-02-16 09:05:41 +01:00
|
|
|
m_pendingRefresh = true;
|
|
|
|
|
|
|
|
#ifdef __WXMAC__
|
|
|
|
// Timers on OS X may have a high latency (seen up to 500ms and more) which
|
|
|
|
// makes repaints jerky. No negative impact seen without throttling, so just
|
|
|
|
// do an unconditional refresh for OS X.
|
|
|
|
ForceRefresh();
|
|
|
|
#else
|
2013-09-12 11:40:16 +02:00
|
|
|
wxLongLong t = wxGetLocalTimeMillis();
|
|
|
|
wxLongLong delta = t - m_lastRefresh;
|
|
|
|
|
2013-09-12 17:42:28 +02:00
|
|
|
if( delta >= MinRefreshPeriod )
|
2013-09-12 11:40:16 +02:00
|
|
|
{
|
2014-10-13 15:22:45 +02:00
|
|
|
ForceRefresh();
|
2013-09-12 17:42:28 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// One shot timer
|
|
|
|
m_refreshTimer.Start( ( MinRefreshPeriod - delta ).ToLong(), true );
|
2013-09-12 11:40:16 +02:00
|
|
|
}
|
2016-02-16 09:05:41 +01:00
|
|
|
#endif
|
2013-10-14 13:43:57 +02:00
|
|
|
}
|
2013-09-12 11:40:16 +02:00
|
|
|
|
|
|
|
|
2014-10-13 15:22:45 +02:00
|
|
|
void EDA_DRAW_PANEL_GAL::ForceRefresh()
|
|
|
|
{
|
|
|
|
wxPaintEvent redrawEvent;
|
|
|
|
wxPostEvent( this, redrawEvent );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-07-09 11:22:42 +02:00
|
|
|
void EDA_DRAW_PANEL_GAL::SetEventDispatcher( TOOL_DISPATCHER* aEventDispatcher )
|
|
|
|
{
|
|
|
|
m_eventDispatcher = aEventDispatcher;
|
2015-04-30 10:46:03 +02:00
|
|
|
const wxEventType eventTypes[] = { wxEVT_TOOL };
|
|
|
|
|
2014-07-09 11:22:42 +02:00
|
|
|
if( m_eventDispatcher )
|
|
|
|
{
|
2016-06-29 16:07:55 -04:00
|
|
|
for( wxEventType type : eventTypes )
|
2015-04-30 10:46:03 +02:00
|
|
|
{
|
|
|
|
m_parent->Connect( type, wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
|
|
|
|
NULL, m_eventDispatcher );
|
|
|
|
}
|
2014-07-09 11:22:42 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2016-06-29 16:07:55 -04:00
|
|
|
for( wxEventType type : eventTypes )
|
2015-04-30 10:46:03 +02:00
|
|
|
{
|
|
|
|
// While loop is used to be sure that all event handlers are removed.
|
|
|
|
while( m_parent->Disconnect( type,
|
|
|
|
wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
|
|
|
|
NULL, m_eventDispatcher ) );
|
|
|
|
}
|
2014-07-09 11:22:42 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-05-13 11:22:51 +02:00
|
|
|
void EDA_DRAW_PANEL_GAL::StartDrawing()
|
|
|
|
{
|
2015-08-21 10:33:36 +02:00
|
|
|
// Start querying GAL if it is ready
|
|
|
|
m_refreshTimer.StartOnce( 100 );
|
2014-05-13 11:22:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-12-05 14:54:30 +01:00
|
|
|
void EDA_DRAW_PANEL_GAL::StopDrawing()
|
|
|
|
{
|
2015-08-21 10:33:36 +02:00
|
|
|
m_drawingEnabled = false;
|
|
|
|
Disconnect( wxEVT_PAINT, wxPaintEventHandler( EDA_DRAW_PANEL_GAL::onPaint ), NULL, this );
|
2015-02-15 02:18:35 +01:00
|
|
|
m_pendingRefresh = false;
|
2013-12-05 14:54:30 +01:00
|
|
|
m_refreshTimer.Stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-02-16 19:59:31 -05:00
|
|
|
void EDA_DRAW_PANEL_GAL::SetHighContrastLayer( int aLayer )
|
2014-07-09 10:57:32 +02:00
|
|
|
{
|
|
|
|
// Set display settings for high contrast mode
|
|
|
|
KIGFX::RENDER_SETTINGS* rSettings = m_view->GetPainter()->GetSettings();
|
|
|
|
|
|
|
|
SetTopLayer( aLayer );
|
|
|
|
|
|
|
|
rSettings->ClearActiveLayers();
|
|
|
|
rSettings->SetActiveLayer( aLayer );
|
|
|
|
|
|
|
|
m_view->UpdateAllLayersColor();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-02-16 19:59:31 -05:00
|
|
|
void EDA_DRAW_PANEL_GAL::SetTopLayer( int aLayer )
|
2014-07-09 10:57:32 +02:00
|
|
|
{
|
|
|
|
m_view->ClearTopLayers();
|
|
|
|
m_view->SetTopLayer( aLayer );
|
|
|
|
m_view->UpdateAllLayersOrder();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-07-03 20:58:12 +02:00
|
|
|
double EDA_DRAW_PANEL_GAL::GetLegacyZoom() const
|
|
|
|
{
|
|
|
|
double zoomFactor = m_gal->GetWorldScale() / m_gal->GetZoomFactor();
|
|
|
|
return ( 1.0 / ( zoomFactor * m_view->GetScale() ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-07 18:24:43 +02:00
|
|
|
bool EDA_DRAW_PANEL_GAL::SwitchBackend( GAL_TYPE aGalType )
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
{
|
2013-06-04 16:18:33 +02:00
|
|
|
// Do not do anything if the currently used GAL is correct
|
2014-07-09 10:34:00 +02:00
|
|
|
if( aGalType == m_backend && m_gal != NULL )
|
2015-02-15 02:18:35 +01:00
|
|
|
return true;
|
2013-05-15 09:17:42 +02:00
|
|
|
|
2015-08-21 10:33:36 +02:00
|
|
|
bool result = true; // assume everything will be fine
|
|
|
|
|
2014-04-04 12:01:30 +02:00
|
|
|
// Prevent refreshing canvas during backend switch
|
2014-05-13 11:22:51 +02:00
|
|
|
StopDrawing();
|
2014-04-04 12:01:30 +02:00
|
|
|
|
2015-02-15 02:18:35 +01:00
|
|
|
KIGFX::GAL* new_gal = NULL;
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
|
2015-02-15 02:18:35 +01:00
|
|
|
try
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
{
|
2015-02-15 02:18:35 +01:00
|
|
|
switch( aGalType )
|
|
|
|
{
|
|
|
|
case GAL_TYPE_OPENGL:
|
2017-01-02 07:13:45 +01:00
|
|
|
new_gal = new KIGFX::OPENGL_GAL( m_options, this, this, this );
|
2015-02-15 02:18:35 +01:00
|
|
|
break;
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
|
2015-02-15 02:18:35 +01:00
|
|
|
case GAL_TYPE_CAIRO:
|
2017-02-13 19:43:28 +08:00
|
|
|
new_gal = new KIGFX::CAIRO_GAL( m_options, this, this, this );
|
2015-02-15 02:18:35 +01:00
|
|
|
break;
|
2013-06-18 16:19:30 +02:00
|
|
|
|
2015-08-07 19:15:47 +02:00
|
|
|
default:
|
|
|
|
assert( false );
|
2015-08-21 10:33:36 +02:00
|
|
|
// warn about unhandled GAL canvas type, but continue with the fallback option
|
2013-05-14 10:46:43 +02:00
|
|
|
|
2015-08-21 10:33:36 +02:00
|
|
|
case GAL_TYPE_NONE:
|
2015-10-25 17:58:04 +01:00
|
|
|
// KIGFX::GAL is a stub - it actually does cannot display anything,
|
2015-08-21 10:33:36 +02:00
|
|
|
// but prevents code relying on GAL canvas existence from crashing
|
2017-02-13 19:43:28 +08:00
|
|
|
new_gal = new KIGFX::GAL( m_options );
|
2015-08-21 10:33:36 +02:00
|
|
|
break;
|
|
|
|
}
|
2015-02-15 02:18:35 +01:00
|
|
|
}
|
2015-04-30 10:46:03 +02:00
|
|
|
catch( std::runtime_error& err )
|
2015-02-15 02:18:35 +01:00
|
|
|
{
|
2018-01-17 08:58:44 +01:00
|
|
|
// Create a dummy GAL
|
2017-02-13 19:43:28 +08:00
|
|
|
new_gal = new KIGFX::GAL( m_options );
|
2015-08-21 10:33:36 +02:00
|
|
|
aGalType = GAL_TYPE_NONE;
|
2015-05-18 13:48:10 +02:00
|
|
|
DisplayError( m_parent, wxString( err.what() ) );
|
2015-08-21 10:33:36 +02:00
|
|
|
result = false;
|
2015-02-15 02:18:35 +01:00
|
|
|
}
|
2013-04-15 17:57:03 +02:00
|
|
|
|
2017-02-13 19:43:28 +08:00
|
|
|
// trigger update of the gal options in case they differ
|
|
|
|
// from the defaults
|
|
|
|
m_options.NotifyChanged();
|
2016-05-02 16:15:25 +02:00
|
|
|
|
2015-08-21 10:33:36 +02:00
|
|
|
assert( new_gal );
|
|
|
|
delete m_gal;
|
|
|
|
m_gal = new_gal;
|
|
|
|
|
|
|
|
wxSize size = GetClientSize();
|
|
|
|
m_gal->ResizeScreen( size.GetX(), size.GetY() );
|
|
|
|
|
|
|
|
if( m_painter )
|
|
|
|
m_painter->SetGAL( m_gal );
|
|
|
|
|
|
|
|
if( m_view )
|
2017-09-17 18:36:18 -04:00
|
|
|
{
|
2015-08-21 10:33:36 +02:00
|
|
|
m_view->SetGAL( m_gal );
|
2017-09-17 18:36:18 -04:00
|
|
|
// Note: OpenGL requires reverse draw order when draw priority is enabled
|
|
|
|
m_view->ReverseDrawOrder( aGalType == GAL_TYPE_OPENGL );
|
|
|
|
}
|
2015-08-21 10:33:36 +02:00
|
|
|
|
|
|
|
m_backend = aGalType;
|
|
|
|
|
|
|
|
return result;
|
Introduction of Graphics Abstraction Layer based rendering for pcbnew.
New classes:
- VIEW - represents view that is seen by user, takes care of layer ordering & visibility and how it is displayed (which location, how much zoomed, etc.)
- VIEW_ITEM - Base class for every item that can be displayed on VIEW (the biggest change is that now it may be necessary to override ViewBBox & ViewGetLayers method for derived classes).
- EDA_DRAW_PANEL_GAL - Inherits after EDA_DRAW_PANEL, displays VIEW output, right now it is not editable (in opposite to usual EDA_DRAW_PANEL).
- GAL/OPENGL_GAL/CAIRO_GAL - Base Graphics Abstraction Layer class + two different flavours (Cairo is not fully supported yet), that offers methods to draw primitives using different libraries.
- WX_VIEW_CONTROLS - Controller for VIEW, handles user events, allows zooming, panning, etc.
- PAINTER/PCB_PAINTER - Classes that uses GAL interface to draw items (as you may have already guessed - PCB_PAINTER is a class for drawing PCB specific object, PAINTER is an abstract class). Its methods are invoked by VIEW, when an item has to be drawn. To display a new type of item - you need to implement draw(ITEM_TYPE*) method that draws it using GAL methods.
- STROKE_FONT - Implements stroke font drawing using GAL methods.
Most important changes to Kicad original code:
* EDA_ITEM now inherits from VIEW_ITEM, which is a base class for all drawable objects.
* EDA_DRAW_FRAME contains both usual EDA_DRAW_PANEL and new EDA_DRAW_PANEL_GAL, that can be switched anytime.
* There are some new layers for displaying multilayer pads, vias & pads holes (these are not shown yet on the right sidebar in pcbnew)
* Display order of layers is different than in previous versions (if you are curious - you may check m_galLayerOrder@pcbnew/basepcbframe.cpp). Preserving usual order would result in not very natural display, such as showing silkscreen texts on the bottom.
* Introduced new hotkey (Alt+F12) and new menu option (View->Switch canvas) for switching canvas during runtime.
* Some of classes (mostly derived from BOARD_ITEM) now includes ViewBBox & ViewGetLayers methods.
* Removed tools/class_painter.h, as now it is extended and included in source code.
Build changes:
* GAL-based rendering option is turned on by a new compilation CMake option KICAD_GAL.
* When compiling with CMake option KICAD_GAL=ON, GLEW and Cairo libraries are required.
* GAL-related code is compiled into a static library (common/libgal).
* Build with KICAD_GAL=OFF should not need any new libraries and should come out as a standard version of Kicad
Currently most of items in pcbnew can be displayed using OpenGL (to be done are DIMENSIONS and MARKERS).
More details about GAL can be found in: http://www.ohwr.org/attachments/1884/view-spec.pdf
2013-04-02 08:54:03 +02:00
|
|
|
}
|
2013-08-02 16:53:50 +02:00
|
|
|
|
2013-08-07 09:37:28 +02:00
|
|
|
|
2018-05-20 14:08:06 +01:00
|
|
|
void EDA_DRAW_PANEL_GAL::OnEvent( wxEvent& aEvent )
|
2014-07-09 11:22:43 +02:00
|
|
|
{
|
2017-03-03 16:05:13 -05:00
|
|
|
if( m_lostFocus && m_stealsFocus )
|
2015-07-02 11:40:33 +02:00
|
|
|
SetFocus();
|
|
|
|
|
2014-07-09 11:22:43 +02:00
|
|
|
if( !m_eventDispatcher )
|
|
|
|
aEvent.Skip();
|
|
|
|
else
|
|
|
|
m_eventDispatcher->DispatchWxEvent( aEvent );
|
|
|
|
|
|
|
|
Refresh();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-13 10:26:08 +02:00
|
|
|
void EDA_DRAW_PANEL_GAL::onEnter( wxEvent& aEvent )
|
2013-09-09 17:07:03 +02:00
|
|
|
{
|
2013-09-13 10:26:08 +02:00
|
|
|
// Getting focus is necessary in order to receive key events properly
|
2017-03-03 16:05:13 -05:00
|
|
|
if( m_stealsFocus )
|
|
|
|
SetFocus();
|
2015-08-25 11:21:00 +02:00
|
|
|
|
|
|
|
aEvent.Skip();
|
2013-09-09 17:07:03 +02:00
|
|
|
}
|
2015-07-02 11:40:33 +02:00
|
|
|
|
|
|
|
|
|
|
|
void EDA_DRAW_PANEL_GAL::onLostFocus( wxFocusEvent& aEvent )
|
|
|
|
{
|
|
|
|
m_lostFocus = true;
|
2015-08-25 11:21:00 +02:00
|
|
|
|
|
|
|
aEvent.Skip();
|
2015-07-02 11:40:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EDA_DRAW_PANEL_GAL::onRefreshTimer( wxTimerEvent& aEvent )
|
|
|
|
{
|
2015-08-21 10:33:36 +02:00
|
|
|
if( !m_drawingEnabled )
|
|
|
|
{
|
2016-05-09 17:23:01 +02:00
|
|
|
if( m_gal && m_gal->IsInitialized() )
|
2015-08-21 10:33:36 +02:00
|
|
|
{
|
|
|
|
m_drawing = false;
|
|
|
|
m_pendingRefresh = true;
|
|
|
|
Connect( wxEVT_PAINT, wxPaintEventHandler( EDA_DRAW_PANEL_GAL::onPaint ), NULL, this );
|
|
|
|
m_drawingEnabled = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Try again soon
|
2016-05-09 17:23:01 +02:00
|
|
|
m_refreshTimer.StartOnce( 100 );
|
2015-08-21 10:33:36 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-02 11:40:33 +02:00
|
|
|
wxPaintEvent redrawEvent;
|
|
|
|
wxPostEvent( this, redrawEvent );
|
|
|
|
}
|
2016-05-02 16:15:25 +02:00
|
|
|
|
2016-05-09 17:23:01 +02:00
|
|
|
|
|
|
|
void EDA_DRAW_PANEL_GAL::onShowTimer( wxTimerEvent& aEvent )
|
|
|
|
{
|
2016-05-20 12:06:08 +02:00
|
|
|
if( m_gal && m_gal->IsVisible() )
|
2016-05-09 17:23:01 +02:00
|
|
|
{
|
|
|
|
m_onShowTimer.Stop();
|
|
|
|
OnShow();
|
|
|
|
}
|
|
|
|
}
|