Eeschema: construct simulator cursors on demand
Statically constructing wxCursors as used for the probe
and tune cursors crashes the qa_eagle_plugin test
instantly.
Fix this by introducing a new class CURSOR_STORE,
which allows to abstract the platform wierdness of wxCursors
and allow the simulator to laziliy init its own cursors
at runtime.
This code isn't properly tested, as these cursors are never
actually used. However, it does allow the eeschema unit test
to run.
Fixes: lp:1781191
* https://bugs.launchpad.net/kicad/+bug/1781191
(cherry picked from commit 6f1c3f5ef8
)
This commit is contained in:
parent
7cc3e9a16d
commit
d4883da98b
|
@ -293,6 +293,7 @@ set( COMMON_SRCS
|
||||||
config_params.cpp
|
config_params.cpp
|
||||||
confirm.cpp
|
confirm.cpp
|
||||||
convert_basic_shapes_to_polygon.cpp
|
convert_basic_shapes_to_polygon.cpp
|
||||||
|
cursor_store.cpp
|
||||||
dialog_shim.cpp
|
dialog_shim.cpp
|
||||||
displlst.cpp
|
displlst.cpp
|
||||||
dpi_scaling.cpp
|
dpi_scaling.cpp
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cursor_store.h>
|
||||||
|
|
||||||
|
#include <wx/bitmap.h>
|
||||||
|
#include <wx/debug.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a cursor for the given definition.
|
||||||
|
*
|
||||||
|
* How to do this depends on the platform, see
|
||||||
|
* http://docs.wxwidgets.org/trunk/classwx_cursor.html
|
||||||
|
*
|
||||||
|
* @param aDef the cursor definition
|
||||||
|
* @return a newly constructed cursor if the platform is supported,
|
||||||
|
* else wxNullCursor
|
||||||
|
*/
|
||||||
|
wxCursor constructCursor( const CURSOR_STORE::CURSOR_DEF& aDef )
|
||||||
|
{
|
||||||
|
#if defined( __WXMSW__ ) or defined( __WXMAC__ )
|
||||||
|
|
||||||
|
wxBitmap img_bitmap(
|
||||||
|
reinterpret_cast<const char*>( aDef.m_image_data ), aDef.m_size.x, aDef.m_size.y );
|
||||||
|
wxBitmap msk_bitmap(
|
||||||
|
reinterpret_cast<const char*>( aDef.m_mask_data ), aDef.m_size.x, aDef.m_size.y );
|
||||||
|
img_bitmap.SetMask( new wxMask( msk_bitmap ) );
|
||||||
|
|
||||||
|
wxImage image( img_bitmap.ConvertToImage() );
|
||||||
|
|
||||||
|
#if defined( __WXMSW__ )
|
||||||
|
image.SetMaskColour( 255, 255, 255 );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, aDef.m_hotspot.x );
|
||||||
|
image.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, aDef.m_hotspot.y );
|
||||||
|
|
||||||
|
return wxCursor{ image };
|
||||||
|
|
||||||
|
#elif defined( __WXGTK__ ) or defined( __WXMOTIF__ )
|
||||||
|
|
||||||
|
return wxCursor{
|
||||||
|
reinterpret_cast<const char*>( aDef.m_image_data ),
|
||||||
|
aDef.m_size.x,
|
||||||
|
aDef.m_size.y,
|
||||||
|
aDef.m_hotspot.x,
|
||||||
|
aDef.m_hotspot.y,
|
||||||
|
reinterpret_cast<const char*>( aDef.m_mask_data ),
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
wxASSERT_MSG( false, "Unknown platform for cursor construction." );
|
||||||
|
return wxNullCursor;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CURSOR_STORE::CURSOR_STORE( const std::vector<CURSOR_DEF>& aDefs )
|
||||||
|
{
|
||||||
|
for( const auto& def : aDefs )
|
||||||
|
{
|
||||||
|
m_store[def.m_id_key] = constructCursor( def );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const wxCursor& CURSOR_STORE::Get( int aIdKey ) const
|
||||||
|
{
|
||||||
|
const auto find_iter = m_store.find( aIdKey );
|
||||||
|
|
||||||
|
if( find_iter != m_store.end() )
|
||||||
|
{
|
||||||
|
return find_iter->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxASSERT_MSG( false,
|
||||||
|
wxString::Format( "Could not find cursor with ID %d", static_cast<int>( aIdKey ) ) );
|
||||||
|
return wxNullCursor;
|
||||||
|
}
|
|
@ -1506,12 +1506,6 @@ public:
|
||||||
|
|
||||||
virtual const BOX2I GetDocumentExtents() const override;
|
virtual const BOX2I GetDocumentExtents() const override;
|
||||||
|
|
||||||
///> Probe cursor, used by circuit simulator
|
|
||||||
const static wxCursor CURSOR_PROBE;
|
|
||||||
|
|
||||||
///> Tuner cursor, used by circuit simulator
|
|
||||||
const static wxCursor CURSOR_TUNE;
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
#include <sch_sheet.h>
|
#include <sch_sheet.h>
|
||||||
#include <sch_sheet_path.h>
|
#include <sch_sheet_path.h>
|
||||||
#include <sch_view.h>
|
#include <sch_view.h>
|
||||||
|
#include <simulation_cursors.h>
|
||||||
|
|
||||||
|
|
||||||
void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
||||||
|
@ -589,12 +590,12 @@ void SCH_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
|
||||||
#ifdef KICAD_SPICE
|
#ifdef KICAD_SPICE
|
||||||
case ID_SIM_PROBE:
|
case ID_SIM_PROBE:
|
||||||
SetToolID( id, -1, _( "Add a simulator probe" ) );
|
SetToolID( id, -1, _( "Add a simulator probe" ) );
|
||||||
//GAL TODO: m_canvas->SetCurrentCursor( CURSOR_PROBE );
|
//GAL TODO: m_canvas->SetCurrentCursor( SIMULATION_CURSORS::GetCursor( SIMULATION_CURSORS::CURSOR::PROBE ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_SIM_TUNE:
|
case ID_SIM_TUNE:
|
||||||
SetToolID( id, -1, _( "Select a value to be tuned" ) );
|
SetToolID( id, -1, _( "Select a value to be tuned" ) );
|
||||||
//GAL TODO: m_canvas->SetCurrentCursor( CURSOR_TUNE );
|
//GAL TODO: m_canvas->SetCurrentCursor( SIMULATION_CURSORS::GetCursor( SIMULATION_CURSORS::CURSOR::TUNE ) );
|
||||||
break;
|
break;
|
||||||
#endif /* KICAD_SPICE */
|
#endif /* KICAD_SPICE */
|
||||||
|
|
||||||
|
|
|
@ -36,111 +36,4 @@ void SCH_EDIT_FRAME::OnSimulate( wxCommandEvent& event )
|
||||||
simFrame->Iconize( false );
|
simFrame->Iconize( false );
|
||||||
|
|
||||||
simFrame->Raise();
|
simFrame->Raise();
|
||||||
}
|
}
|
||||||
|
|
||||||
// I apologize for the following lines, but this is more or less what wxWidgets
|
|
||||||
// authors suggest (http://docs.wxwidgets.org/trunk/classwx_cursor.html)
|
|
||||||
|
|
||||||
static const unsigned char cursor_probe[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70,
|
|
||||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04,
|
|
||||||
0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x04,
|
|
||||||
0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x84, 0x00,
|
|
||||||
0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x80, 0x10, 0x00,
|
|
||||||
0x00, 0x40, 0x08, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x10, 0x02, 0x00,
|
|
||||||
0x00, 0x08, 0x01, 0x00, 0x80, 0x85, 0x00, 0x00, 0x40, 0x42, 0x00, 0x00,
|
|
||||||
0x20, 0x21, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00,
|
|
||||||
0x20, 0x16, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00,
|
|
||||||
0x44, 0x07, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
|
|
||||||
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static const unsigned char cursor_probe_mask[] {
|
|
||||||
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70,
|
|
||||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04,
|
|
||||||
0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x07,
|
|
||||||
0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xfc, 0x00,
|
|
||||||
0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x1f, 0x00,
|
|
||||||
0x00, 0xc0, 0x0f, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00,
|
|
||||||
0x00, 0xf8, 0x01, 0x00, 0x80, 0xfd, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00,
|
|
||||||
0xe0, 0x3f, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00,
|
|
||||||
0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00,
|
|
||||||
0x7c, 0x07, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
|
|
||||||
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static const unsigned char cursor_tune[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x0f,
|
|
||||||
0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f,
|
|
||||||
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x01,
|
|
||||||
0x00, 0x80, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00,
|
|
||||||
0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00,
|
|
||||||
0x00, 0xfc, 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
|
|
||||||
0x00, 0xea, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00,
|
|
||||||
0x40, 0x01, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
|
|
||||||
0x2c, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
|
|
||||||
0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static const unsigned char cursor_tune_mask[] = {
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x0f,
|
|
||||||
0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f,
|
|
||||||
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x01,
|
|
||||||
0x00, 0x80, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00,
|
|
||||||
0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00,
|
|
||||||
0x00, 0xfc, 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
|
|
||||||
0x00, 0xee, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00,
|
|
||||||
0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
|
|
||||||
0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
|
|
||||||
0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
|
|
||||||
|
|
||||||
#if defined(__WXMSW__) or defined(__WXMAC__)
|
|
||||||
struct SIM_CURSORS_INIT
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static wxImage& GetProbeImage()
|
|
||||||
{
|
|
||||||
static wxImage* probe_image = NULL;
|
|
||||||
|
|
||||||
if( probe_image == NULL )
|
|
||||||
{
|
|
||||||
wxBitmap probe_bitmap( (const char*) cursor_probe, 32, 32 );
|
|
||||||
wxBitmap probe_mask_bitmap( (const char*) cursor_probe_mask, 32, 32 );
|
|
||||||
probe_bitmap.SetMask( new wxMask( probe_mask_bitmap ) );
|
|
||||||
probe_image = new wxImage( probe_bitmap.ConvertToImage() );
|
|
||||||
#ifdef __WXMSW__
|
|
||||||
probe_image->SetMaskColour( 255, 255, 255 );
|
|
||||||
#endif
|
|
||||||
probe_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, 0 );
|
|
||||||
probe_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, 31 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return *probe_image;
|
|
||||||
}
|
|
||||||
|
|
||||||
static wxImage& GetTuneImage()
|
|
||||||
{
|
|
||||||
static wxImage* tune_image = NULL;
|
|
||||||
|
|
||||||
if( tune_image == NULL )
|
|
||||||
{
|
|
||||||
wxBitmap tune_bitmap( (const char*) cursor_tune, 32, 32 );
|
|
||||||
wxBitmap tune_mask_bitmap( (const char*) cursor_tune_mask, 32, 32 );
|
|
||||||
tune_bitmap.SetMask( new wxMask( tune_mask_bitmap ) );
|
|
||||||
tune_image = new wxImage( tune_bitmap.ConvertToImage() );
|
|
||||||
#ifdef __WXMSW__
|
|
||||||
tune_image->SetMaskColour( 255, 255, 255 );
|
|
||||||
#endif
|
|
||||||
tune_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X, 0 );
|
|
||||||
tune_image->SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y, 31 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return *tune_image;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const wxCursor SCH_EDIT_FRAME::CURSOR_PROBE( SIM_CURSORS_INIT::GetProbeImage() );
|
|
||||||
const wxCursor SCH_EDIT_FRAME::CURSOR_TUNE( SIM_CURSORS_INIT::GetTuneImage() );
|
|
||||||
#elif defined(__WXGTK__) or defined(__WXMOTIF__)
|
|
||||||
const wxCursor SCH_EDIT_FRAME::CURSOR_PROBE( (const char*) cursor_probe, 32, 32, 0, 31, (const char*) cursor_probe_mask );
|
|
||||||
const wxCursor SCH_EDIT_FRAME::CURSOR_TUNE( (const char*) cursor_tune, 32, 32, 1, 30, (const char*) cursor_tune_mask );
|
|
||||||
#endif
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <simulation_cursors.h>
|
||||||
|
|
||||||
|
#include <cursor_store.h>
|
||||||
|
|
||||||
|
static const unsigned char cursor_probe[] = {
|
||||||
|
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70,
|
||||||
|
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04,
|
||||||
|
0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x04,
|
||||||
|
0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x84, 0x00,
|
||||||
|
0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x80, 0x10, 0x00,
|
||||||
|
0x00, 0x40, 0x08, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x10, 0x02, 0x00,
|
||||||
|
0x00, 0x08, 0x01, 0x00, 0x80, 0x85, 0x00, 0x00, 0x40, 0x42, 0x00, 0x00,
|
||||||
|
0x20, 0x21, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00,
|
||||||
|
0x20, 0x16, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00,
|
||||||
|
0x44, 0x07, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
|
||||||
|
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
static const unsigned char cursor_probe_mask[] {
|
||||||
|
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70,
|
||||||
|
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04,
|
||||||
|
0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xe0, 0x07,
|
||||||
|
0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xfc, 0x00,
|
||||||
|
0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x1f, 0x00,
|
||||||
|
0x00, 0xc0, 0x0f, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00,
|
||||||
|
0x00, 0xf8, 0x01, 0x00, 0x80, 0xfd, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00,
|
||||||
|
0xe0, 0x3f, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00,
|
||||||
|
0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00,
|
||||||
|
0x7c, 0x07, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
|
||||||
|
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
static const unsigned char cursor_tune[] = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x0f,
|
||||||
|
0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f,
|
||||||
|
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x01,
|
||||||
|
0x00, 0x80, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00,
|
||||||
|
0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00,
|
||||||
|
0x00, 0xfc, 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00,
|
||||||
|
0x00, 0xea, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00,
|
||||||
|
0x40, 0x01, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
|
||||||
|
0x2c, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
|
||||||
|
0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
static const unsigned char cursor_tune_mask[] = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc0, 0x0f,
|
||||||
|
0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf8, 0x0f,
|
||||||
|
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x01,
|
||||||
|
0x00, 0x80, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00,
|
||||||
|
0x00, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00,
|
||||||
|
0x00, 0xfc, 0x03, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
|
||||||
|
0x00, 0xee, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00,
|
||||||
|
0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
|
||||||
|
0x3c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
|
||||||
|
0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
static const std::vector<CURSOR_STORE::CURSOR_DEF> simulation_cursors = {
|
||||||
|
{
|
||||||
|
static_cast<int>( SIMULATION_CURSORS::CURSOR::TUNE ),
|
||||||
|
cursor_tune,
|
||||||
|
cursor_tune_mask,
|
||||||
|
{ 32, 32 },
|
||||||
|
{ 1, 30 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
static_cast<int>( SIMULATION_CURSORS::CURSOR::PROBE ),
|
||||||
|
cursor_probe,
|
||||||
|
cursor_probe_mask,
|
||||||
|
{ 32, 32 },
|
||||||
|
{ 0, 31 },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const wxCursor& SIMULATION_CURSORS::GetCursor( CURSOR aCursorType )
|
||||||
|
{
|
||||||
|
static CURSOR_STORE store( simulation_cursors );
|
||||||
|
return store.Get( static_cast<int>( aCursorType ) );
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EESCHEMA_SIMULATION_CURSORS__H
|
||||||
|
#define EESCHEMA_SIMULATION_CURSORS__H
|
||||||
|
|
||||||
|
#include <wx/cursor.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple class to provide cursors for simulation functions.
|
||||||
|
*
|
||||||
|
* For now, it's using simple static-access, but could be made more advanced
|
||||||
|
* in future.
|
||||||
|
*/
|
||||||
|
class SIMULATION_CURSORS
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
///> Probe cursor, used by circuit simulator
|
||||||
|
enum class CURSOR
|
||||||
|
{
|
||||||
|
PROBE,
|
||||||
|
TUNE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const wxCursor& GetCursor( CURSOR aCursorType );
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // EESCHEMA_SIMULATION_CURSORS__H
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CURSOR_STORE__H
|
||||||
|
#define CURSOR_STORE__H
|
||||||
|
|
||||||
|
#include <wx/cursor.h>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple class to construct and store cursors against unique ID keys.
|
||||||
|
*
|
||||||
|
* This can be used to lazily construct cursors as needed for specific
|
||||||
|
* applications.
|
||||||
|
*/
|
||||||
|
class CURSOR_STORE
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Definition of a cursor
|
||||||
|
*/
|
||||||
|
struct CURSOR_DEF
|
||||||
|
{
|
||||||
|
///> The ID key used to uniquely identify a cursor in a given store
|
||||||
|
int m_id_key;
|
||||||
|
|
||||||
|
///> The image data bitmap
|
||||||
|
const unsigned char* m_image_data;
|
||||||
|
|
||||||
|
///> The mask data bitmap
|
||||||
|
const unsigned char* m_mask_data;
|
||||||
|
|
||||||
|
///> The image size in pixels
|
||||||
|
wxSize m_size;
|
||||||
|
|
||||||
|
///> The "hotspot" where the cursor "is" in the image
|
||||||
|
wxPoint m_hotspot;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a store with a pre-set list of cursors.
|
||||||
|
*
|
||||||
|
* In future, an "Add()" function could be added if stores need to
|
||||||
|
* dynamically add cursors.
|
||||||
|
*
|
||||||
|
* @param aDefs: the list of pre-set cursor definitions
|
||||||
|
*/
|
||||||
|
CURSOR_STORE( const std::vector<CURSOR_DEF>& aDefs );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a given cursor by its ID
|
||||||
|
* @param aIdKey the ID key to look up
|
||||||
|
* @return the cursor, if found, else wxNullCursor
|
||||||
|
*/
|
||||||
|
const wxCursor& Get( int aIdKey ) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
///> Internal store of cursors by ID
|
||||||
|
std::map<int, wxCursor> m_store;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CURSOR_STORE__H
|
Loading…
Reference in New Issue