100 lines
3.0 KiB
C++
100 lines
3.0 KiB
C++
/*
|
|
* 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;
|
|
} |