KiCad PCB EDA Suite
bitmap.cpp File Reference
#include <wx/image.h>
#include <wx/bitmap.h>
#include <wx/gdicmn.h>
#include <wx/mstream.h>
#include <wx/menu.h>
#include <wx/menuitem.h>
#include <wx/aui/auibar.h>
#include <wx/dcclient.h>
#include <wx/dcmemory.h>
#include <cstdint>
#include <mutex>
#include <unordered_map>
#include <asset_archive.h>
#include <bitmaps.h>
#include <bitmap_store.h>
#include <bitmaps/bitmap_opaque.h>
#include <pgm_base.h>
#include <eda_base_frame.h>
#include <eda_draw_frame.h>
#include <paths.h>

Go to the source code of this file.

Classes

struct  SCALED_BITMAP_ID
 
struct  std::hash< SCALED_BITMAP_ID >
 

Namespaces

 std
 

Functions

BITMAP_STOREGetBitmapStore ()
 
wxBitmap KiBitmap (BITMAPS aBitmap, int aHeightTag)
 Construct a wxBitmap from an image identifier Returns the image from the active theme if the image has multiple theme variants. More...
 
wxBitmap KiBitmap (const BITMAP_OPAQUE *aBitmap)
 Compatibility shim for pcb_calculator until its images are pulled into the PNG pipeline. More...
 
int KiIconScale (wxWindow *aWindow)
 Return the automatic scale factor that would be used for a given window by KiScaledBitmap and KiScaledSeparator. More...
 
static int get_scale_factor (wxWindow *aWindow)
 
wxBitmap KiScaledBitmap (BITMAPS aBitmap, wxWindow *aWindow, int aHeight)
 Construct a wxBitmap from a memory record, scaling it if device DPI demands it. More...
 
void ClearScaledBitmapCache ()
 Wipes out the scaled bitmap cache so that the icon theme can be changed. More...
 
wxBitmap KiScaledBitmap (const wxBitmap &aBitmap, wxWindow *aWindow)
 Overload of the above function that takes another wxBitmap as a parameter. More...
 
wxBitmap * KiBitmapNew (BITMAPS aBitmap)
 Allocate a wxBitmap on heap from a memory record, held in a BITMAPS. More...
 
bool SaveCanvasImageToFile (EDA_DRAW_FRAME *aFrame, const wxString &aFileName, BITMAP_TYPE aBitmapType)
 Save the current view as an image file. More...
 
void AddBitmapToMenuItem (wxMenuItem *aMenu, const wxBitmap &aImage)
 Add a bitmap to a menuitem. More...
 
wxMenuItem * AddMenuItem (wxMenu *aMenu, int aId, const wxString &aText, const wxBitmap &aImage, wxItemKind aType=wxITEM_NORMAL)
 Create and insert a menu item with an icon into aMenu. More...
 
wxMenuItem * AddMenuItem (wxMenu *aMenu, int aId, const wxString &aText, const wxString &aHelpText, const wxBitmap &aImage, wxItemKind aType=wxITEM_NORMAL)
 Create and insert a menu item with an icon and a help message string into aMenu. More...
 
wxMenuItem * AddMenuItem (wxMenu *aMenu, wxMenu *aSubMenu, int aId, const wxString &aText, const wxBitmap &aImage)
 Create and insert a menu item with an icon into aSubMenu in aMenu. More...
 
wxMenuItem * AddMenuItem (wxMenu *aMenu, wxMenu *aSubMenu, int aId, const wxString &aText, const wxString &aHelpText, const wxBitmap &aImage)
 Create and insert a menu item with an icon and a help message string into aSubMenu in aMenu. More...
 

Variables

static std::unique_ptr< BITMAP_STOREs_BitmapStore
 
static std::unordered_map< SCALED_BITMAP_ID, wxBitmap > s_ScaledBitmapCache
 
static std::mutex s_BitmapCacheMutex
 

Function Documentation

◆ AddBitmapToMenuItem()

void AddBitmapToMenuItem ( wxMenuItem *  aMenu,
const wxBitmap &  aImage 
)

Add a bitmap to a menuitem.

It is added only if use images in menus config option allows it. For wxITEM_CHECK or wxITEM_RADIO menuitems, the bitmap is added only on Windows, other platforms do not support it

Parameters
aMenuis the menuitem.
aImageis the icon to add to aMenu.

Definition at line 240 of file bitmap.cpp.

241 {
242  // Retrieve the global application show icon option:
243  bool useImagesInMenus = Pgm().GetCommonSettings()->m_Appearance.use_icons_in_menus;
244 
245  wxItemKind menu_type = aMenu->GetKind();
246 
247  if( useImagesInMenus && menu_type != wxITEM_CHECK && menu_type != wxITEM_RADIO )
248  {
249  aMenu->SetBitmap( aImage );
250  }
251 }
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106

References Pgm().

Referenced by ACTION_MENU::Add(), CONDITIONAL_MENU::AddCheckItem(), CONDITIONAL_MENU::AddItem(), AddMenuItem(), ACTION_MENU::appendCopy(), ACTION_MENU::DisplayTitle(), CONDITIONAL_MENU::Evaluate(), and SIM_PLOT_FRAME::setIconsForMenuItems().

◆ AddMenuItem() [1/4]

wxMenuItem* AddMenuItem ( wxMenu *  aMenu,
int  aId,
const wxString &  aText,
const wxBitmap &  aImage,
wxItemKind  aType = wxITEM_NORMAL 
)

Create and insert a menu item with an icon into aMenu.

Parameters
aMenuis the menu to add the new item.
aIdis the command ID for the new menu item.
aTextis the string for the new menu item.
aImageis the icon to add to the new menu item.
aTypeis the type of menu :wxITEM_NORMAL (default), wxITEM_CHECK ...
Returns
a pointer to the new created wxMenuItem.

Definition at line 254 of file bitmap.cpp.

256 {
257  wxMenuItem* item = new wxMenuItem( aMenu, aId, aText, wxEmptyString, aType );
258  AddBitmapToMenuItem( item, aImage );
259 
260  aMenu->Append( item );
261 
262  return item;
263 }
void AddBitmapToMenuItem(wxMenuItem *aMenu, const wxBitmap &aImage)
Add a bitmap to a menuitem.
Definition: bitmap.cpp:240

References AddBitmapToMenuItem().

Referenced by GERBER_LAYER_WIDGET::AddRightClickMenuItems(), PCB_EDIT_FRAME::buildActionPluginMenus(), DIALOG_CONFIGURE_PATHS::OnGridCellRightClick(), PROJECT_TREE_PANE::onRight(), LAYER_WIDGET::OnRightDownLayer(), LAYER_WIDGET::OnRightDownRender(), APPEARANCE_CONTROLS::rebuildLayerContextMenu(), PANEL_COLOR_SETTINGS::ShowColorContextMenu(), and SIM_PLOT_FRAME::SIGNAL_CONTEXT_MENU::SIGNAL_CONTEXT_MENU().

◆ AddMenuItem() [2/4]

wxMenuItem* AddMenuItem ( wxMenu *  aMenu,
int  aId,
const wxString &  aText,
const wxString &  aHelpText,
const wxBitmap &  aImage,
wxItemKind  aType = wxITEM_NORMAL 
)

Create and insert a menu item with an icon and a help message string into aMenu.

Parameters
aMenuis the menu to add the new item.
aIdis the command ID for the new menu item.
aTextis the string for the new menu item.
aHelpTextis the help message string for the new menu item.
aImageis the icon to add to the new menu item.
aTypeis the type of menu :wxITEM_NORMAL (default), wxITEM_CHECK ...
Returns
a pointer to the new created wxMenuItem.

Definition at line 266 of file bitmap.cpp.

269 {
270  wxMenuItem* item = new wxMenuItem( aMenu, aId, aText, aHelpText, aType );
271  AddBitmapToMenuItem( item, aImage );
272 
273  aMenu->Append( item );
274 
275  return item;
276 }
void AddBitmapToMenuItem(wxMenuItem *aMenu, const wxBitmap &aImage)
Add a bitmap to a menuitem.
Definition: bitmap.cpp:240

References AddBitmapToMenuItem().

◆ AddMenuItem() [3/4]

wxMenuItem* AddMenuItem ( wxMenu *  aMenu,
wxMenu *  aSubMenu,
int  aId,
const wxString &  aText,
const wxBitmap &  aImage 
)

Create and insert a menu item with an icon into aSubMenu in aMenu.

Parameters
aMenuis the menu to add the new submenu item.
aSubMenuis the submenu to add the new menu.
aIdis the command ID for the new menu item.
aTextis the string for the new menu item.
aImageis the icon to add to the new menu item.
Returns
a pointer to the new created wxMenuItem,

Definition at line 279 of file bitmap.cpp.

281 {
282  wxMenuItem* item = new wxMenuItem( aMenu, aId, aText );
283  item->SetSubMenu( aSubMenu );
284  AddBitmapToMenuItem( item, aImage );
285 
286  aMenu->Append( item );
287 
288  return item;
289 }
void AddBitmapToMenuItem(wxMenuItem *aMenu, const wxBitmap &aImage)
Add a bitmap to a menuitem.
Definition: bitmap.cpp:240

References AddBitmapToMenuItem().

◆ AddMenuItem() [4/4]

wxMenuItem* AddMenuItem ( wxMenu *  aMenu,
wxMenu *  aSubMenu,
int  aId,
const wxString &  aText,
const wxString &  aHelpText,
const wxBitmap &  aImage 
)

Create and insert a menu item with an icon and a help message string into aSubMenu in aMenu.

Parameters
aMenuis the menu to add the new submenu item.
aSubMenuis the submenu to add the new menu.
aIdis the command ID for the new menu item.
aTextis the string for the new menu item.
aHelpTextis the help message string for the new menu item.
aImageis the icon to add to the new menu item.
Returns
a pointer to the new created wxMenuItem.

Definition at line 292 of file bitmap.cpp.

295 {
296  wxMenuItem* item = new wxMenuItem( aMenu, aId, aText, aHelpText );
297  item->SetSubMenu( aSubMenu );
298  AddBitmapToMenuItem( item, aImage );
299 
300  aMenu->Append( item );
301 
302  return item;
303 }
void AddBitmapToMenuItem(wxMenuItem *aMenu, const wxBitmap &aImage)
Add a bitmap to a menuitem.
Definition: bitmap.cpp:240

References AddBitmapToMenuItem().

◆ ClearScaledBitmapCache()

void ClearScaledBitmapCache ( )

Wipes out the scaled bitmap cache so that the icon theme can be changed.

TODO: move scaling system into BITMAP_STORE so this global doesn't need to exist

Definition at line 170 of file bitmap.cpp.

171 {
172  std::lock_guard<std::mutex> guard( s_BitmapCacheMutex );
173  s_ScaledBitmapCache.clear();
174 }
static std::unordered_map< SCALED_BITMAP_ID, wxBitmap > s_ScaledBitmapCache
Definition: bitmap.cpp:88
static std::mutex s_BitmapCacheMutex
Definition: bitmap.cpp:90

References s_BitmapCacheMutex, and s_ScaledBitmapCache.

Referenced by EDA_BASE_FRAME::ThemeChanged().

◆ get_scale_factor()

static int get_scale_factor ( wxWindow *  aWindow)
static

Definition at line 137 of file bitmap.cpp.

138 {
139  int requested_scale = Pgm().GetCommonSettings()->m_Appearance.icon_scale;
140 
141  if( requested_scale > 0 )
142  return requested_scale;
143  else
144  return KiIconScale( aWindow );
145 }
int KiIconScale(wxWindow *aWindow)
Return the automatic scale factor that would be used for a given window by KiScaledBitmap and KiScale...
Definition: bitmap.cpp:122
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106

References KiIconScale(), and Pgm().

Referenced by KiScaledBitmap().

◆ GetBitmapStore()

BITMAP_STORE* GetBitmapStore ( )

Definition at line 93 of file bitmap.cpp.

94 {
95  if( !s_BitmapStore )
96  {
97  wxFileName path( PATHS::GetStockDataPath() + wxT( "/resources" ), wxT( "images.zip" ) );
98  s_BitmapStore = std::make_unique<BITMAP_STORE>();
99  }
100 
101  return s_BitmapStore.get();
102 }
static wxString GetStockDataPath(bool aRespectRunFromBuildDir=true)
Gets the stock (install) data path, which is the base path for things like scripting,...
Definition: paths.cpp:141
static std::unique_ptr< BITMAP_STORE > s_BitmapStore
Definition: bitmap.cpp:50

References PATHS::GetStockDataPath(), path, and s_BitmapStore.

Referenced by EDA_BASE_FRAME::CommonSettingsChanged(), EDA_BASE_FRAME::HandleSystemColorChange(), KiBitmap(), KiBitmapNew(), KiScaledBitmap(), and ACTION_PLUGINS::register_action().

◆ KiBitmap() [1/2]

wxBitmap KiBitmap ( BITMAPS  aBitmap,
int  aHeightTag = -1 
)

Construct a wxBitmap from an image identifier Returns the image from the active theme if the image has multiple theme variants.

Parameters
aBitmapis from the BITMAPS enum in bitmaps_list.h
aHeightTagis the requested height tag for multi-res bitmaps (-1 for any)

Definition at line 105 of file bitmap.cpp.

106 {
107  return GetBitmapStore()->GetBitmap( aBitmap, aHeightTag );
108 }
wxBitmap GetBitmap(BITMAPS aBitmapId, int aHeight=-1)
Retrieves a bitmap from the given bitmap id.
BITMAP_STORE * GetBitmapStore()
Definition: bitmap.cpp:93

References BITMAP_STORE::GetBitmap(), and GetBitmapStore().

Referenced by ACTION_MENU::Add(), CONDITIONAL_MENU::AddCheckItem(), CONDITIONAL_MENU::AddItem(), GERBER_LAYER_WIDGET::AddRightClickMenuItems(), APPEARANCE_CONTROLS::APPEARANCE_CONTROLS(), BM2CMP_FRAME::BM2CMP_FRAME(), PCB_EDIT_FRAME::buildActionPluginMenus(), GRID_CELL_ICON_TEXT_POPUP::Create(), PANEL_KICAD_LAUNCHER::CreateLaunchers(), DIALOG_ABOUT::createStaticBitmap(), CVPCB_MAINFRAME::CVPCB_MAINFRAME(), DIALOG_ABOUT::DIALOG_ABOUT(), DIALOG_BOARD_REANNOTATE::DIALOG_BOARD_REANNOTATE(), DIALOG_BOM::DIALOG_BOM(), DIALOG_CHANGE_SYMBOLS::DIALOG_CHANGE_SYMBOLS(), DIALOG_CONFIGURE_PATHS::DIALOG_CONFIGURE_PATHS(), DIALOG_COPPER_ZONE::DIALOG_COPPER_ZONE(), DIALOG_EDIT_LINE_STYLE::DIALOG_EDIT_LINE_STYLE(), DIALOG_EXCHANGE_FOOTPRINTS::DIALOG_EXCHANGE_FOOTPRINTS(), DIALOG_EXPORT_SVG::DIALOG_EXPORT_SVG(), DIALOG_FIELDS_EDITOR_GLOBAL::DIALOG_FIELDS_EDITOR_GLOBAL(), DIALOG_FOOTPRINT_PROPERTIES::DIALOG_FOOTPRINT_PROPERTIES(), DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR::DIALOG_FOOTPRINT_PROPERTIES_FP_EDITOR(), DIALOG_FP_PLUGIN_OPTIONS::DIALOG_FP_PLUGIN_OPTIONS(), DIALOG_GROUP_PROPERTIES::DIALOG_GROUP_PROPERTIES(), DIALOG_IMPORT_GFX::DIALOG_IMPORT_GFX(), DIALOG_IMPORT_SETTINGS::DIALOG_IMPORT_SETTINGS(), DIALOG_LIB_EDIT_PIN_TABLE::DIALOG_LIB_EDIT_PIN_TABLE(), DIALOG_LIB_SYMBOL_PROPERTIES::DIALOG_LIB_SYMBOL_PROPERTIES(), DIALOG_LOCKED_ITEMS_QUERY::DIALOG_LOCKED_ITEMS_QUERY(), DIALOG_MIGRATE_SETTINGS::DIALOG_MIGRATE_SETTINGS(), DIALOG_NET_INSPECTOR::DIALOG_NET_INSPECTOR(), DIALOG_NETLIST::DIALOG_NETLIST(), DIALOG_PAD_PRIMITIVE_POLY_PROPS::DIALOG_PAD_PRIMITIVE_POLY_PROPS(), DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES(), DIALOG_PIN_PROPERTIES::DIALOG_PIN_PROPERTIES(), DIALOG_PLOT_SCHEMATIC::DIALOG_PLOT_SCHEMATIC(), DIALOG_SCH_IMPORT_SETTINGS::DIALOG_SCH_IMPORT_SETTINGS(), DIALOG_SHEET_PROPERTIES::DIALOG_SHEET_PROPERTIES(), DIALOG_SYMBOL_PROPERTIES::DIALOG_SYMBOL_PROPERTIES(), DIALOG_UNUSED_PAD_LAYERS::DIALOG_UNUSED_PAD_LAYERS(), DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME(), ACTION_MENU::DisplayTitle(), GRID_CELL_ICON_TEXT_RENDERER::Draw(), CONDITIONAL_MENU::Evaluate(), EVT_GRID_CMD_CELL_CHANGED(), EVT_MENU_RANGE(), EVT_TOOL_RANGE(), EVT_UPDATE_UI_RANGE(), FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME(), FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME(), GERBVIEW_FRAME::GERBVIEW_FRAME(), GRID_CELL_ICON_TEXT_RENDERER::GetBestSize(), HIERARCHY_TREE::HIERARCHY_TREE(), DIALOG_EDIT_ONE_FIELD::init(), DIALOG_PLOT::init_Dialog(), DIALOG_GEN_FOOTPRINT_POSITION::initDialog(), DIALOG_GENDRILL::InitDisplayParams(), DIALOG_ANNOTATE::InitValues(), DIALOG_CONFIGURE_PATHS::OnGridCellRightClick(), PROJECT_TREE_PANE::onRight(), LAYER_WIDGET::OnRightDownLayer(), LAYER_WIDGET::OnRightDownRender(), SIM_PLOT_FRAME::onSimFinished(), SIM_PLOT_FRAME::onSimStarted(), PCB_CALCULATOR_FRAME::OnUpdateUI(), PANEL_COMMON_SETTINGS::PANEL_COMMON_SETTINGS(), PANEL_EESCHEMA_TEMPLATE_FIELDNAMES::PANEL_EESCHEMA_TEMPLATE_FIELDNAMES(), PANEL_FP_LIB_TABLE::PANEL_FP_LIB_TABLE(), PANEL_PCBNEW_ACTION_PLUGINS::PANEL_PCBNEW_ACTION_PLUGINS(), PANEL_PREVIEW_3D_MODEL::PANEL_PREVIEW_3D_MODEL(), PANEL_SETUP_NETCLASSES::PANEL_SETUP_NETCLASSES(), PANEL_SETUP_RULES::PANEL_SETUP_RULES(), PANEL_SETUP_TRACKS_AND_VIAS::PANEL_SETUP_TRACKS_AND_VIAS(), PANEL_SYM_LIB_TABLE::PANEL_SYM_LIB_TABLE(), PANEL_TEXT_VARIABLES::PANEL_TEXT_VARIABLES(), PCB_CALCULATOR_FRAME::PCB_CALCULATOR_FRAME(), PinShapeComboBox::PinShapeComboBox(), PinTypeComboBox::PinTypeComboBox(), PL_EDITOR_FRAME::PL_EDITOR_FRAME(), PROJECT_TREE::PROJECT_TREE(), APPEARANCE_CONTROLS::rebuildLayerContextMenu(), APPEARANCE_CONTROLS::rebuildLayers(), PANEL_SETUP_PINMAP::reBuildMatrixPanel(), APPEARANCE_CONTROLS::rebuildNets(), APPEARANCE_CONTROLS::rebuildObjects(), FOOTPRINT_WIZARD_FRAME::ReCreateHToolbar(), SCH_EDIT_FRAME::SCH_EDIT_FRAME(), PANEL_SETUP_PINMAP::setDRCMatrixButtonState(), SIM_PLOT_FRAME::setIconsForMenuItems(), PANEL_FP_EDITOR_DEFAULTS::Show(), PANEL_SETUP_CONSTRAINTS::Show(), DIALOG_PAD_PROPERTIES::Show(), PANEL_COLOR_SETTINGS::ShowColorContextMenu(), SIM_PLOT_FRAME::SIGNAL_CONTEXT_MENU::SIGNAL_CONTEXT_MENU(), SIM_PLOT_FRAME::SIM_PLOT_FRAME(), SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME(), SYMBOL_VIEWER_FRAME::SYMBOL_VIEWER_FRAME(), DIALOG_UNUSED_PAD_LAYERS::syncImages(), TEXT_BUTTON_FILE_BROWSER::TEXT_BUTTON_FILE_BROWSER(), TEXT_BUTTON_FP_CHOOSER::TEXT_BUTTON_FP_CHOOSER(), TEXT_BUTTON_SYMBOL_CHOOSER::TEXT_BUTTON_SYMBOL_CHOOSER(), TEXT_BUTTON_URL::TEXT_BUTTON_URL(), BM2CMP_FRAME::ToggleAspectRatioLock(), DIALOG_PNS_LENGTH_TUNING_SETTINGS::TransferDataToWindow(), and PCB_CALCULATOR_FRAME::TranslineTypeSelection().

◆ KiBitmap() [2/2]

wxBitmap KiBitmap ( const BITMAP_OPAQUE aBitmap)

Compatibility shim for pcb_calculator until its images are pulled into the PNG pipeline.

Definition at line 112 of file bitmap.cpp.

113 {
114  wxMemoryInputStream is( aBitmap->png, aBitmap->byteCount );
115  wxImage image( is, wxBITMAP_TYPE_PNG );
116  wxBitmap bitmap( image );
117 
118  return bitmap;
119 }
const unsigned char * png
Definition: bitmap_opaque.h:27

References BITMAP_OPAQUE::byteCount, image, and BITMAP_OPAQUE::png.

◆ KiBitmapNew()

wxBitmap* KiBitmapNew ( BITMAPS  aBitmap)

Allocate a wxBitmap on heap from a memory record, held in a BITMAPS.

Parameters
aBitmapis from the BITMAPS enum in bitmaps_list.h
Returns
wxBitmap* - caller owns it.

Definition at line 196 of file bitmap.cpp.

197 {
198  wxBitmap* bitmap = new wxBitmap( GetBitmapStore()->GetBitmap( aBitmap ) );
199 
200  return bitmap;
201 }
BITMAP_STORE * GetBitmapStore()
Definition: bitmap.cpp:93

References GetBitmapStore().

Referenced by ABOUT_APP_INFO::CreateKiBitmap(), PCB_CALCULATOR_FRAME::initColorCodePanel(), and TRANSLINE_IDENT::TRANSLINE_IDENT().

◆ KiIconScale()

int KiIconScale ( wxWindow *  aWindow)

Return the automatic scale factor that would be used for a given window by KiScaledBitmap and KiScaledSeparator.

Definition at line 122 of file bitmap.cpp.

123 {
124  const int vert_size = aWindow->ConvertDialogToPixels( wxSize( 0, 8 ) ).y;
125 
126  // Autoscale won't exceed unity until the system has quite high resolution,
127  // because we don't want the icons to look obviously scaled on a system
128  // where it's easy to see it.
129 
130  if( vert_size > 34 ) return 8;
131  else if( vert_size > 29 ) return 7;
132  else if( vert_size > 24 ) return 6;
133  else return 4;
134 }

Referenced by ACTION_TOOLBAR::AddScaledSeparator(), PANEL_COMMON_SETTINGS::applySettingsToPanel(), get_scale_factor(), PANEL_COMMON_SETTINGS::OnIconScaleAuto(), and PCB_EDIT_FRAME::PrepareLayerIndicator().

◆ KiScaledBitmap() [1/2]

wxBitmap KiScaledBitmap ( BITMAPS  aBitmap,
wxWindow *  aWindow,
int  aHeight = -1 
)

Construct a wxBitmap from a memory record, scaling it if device DPI demands it.

Internally this may use caching to avoid scaling the same image twice. If caching is used, it's guaranteed threadsafe.

Parameters
aBitmapis from the BITMAPS enum in bitmaps_list.h
aWindowtarget window for scaling context
aHeightis the requested image height for the source bitmap, or -1 for any height

Definition at line 148 of file bitmap.cpp.

149 {
150  // Bitmap conversions are cached because they can be slow.
151  const int scale = get_scale_factor( aWindow );
152 
153  SCALED_BITMAP_ID id = { static_cast<BITMAPS>( aBitmap ), scale };
154 
155  std::lock_guard<std::mutex> guard( s_BitmapCacheMutex );
156  auto it = s_ScaledBitmapCache.find( id );
157 
158  if( it != s_ScaledBitmapCache.end() )
159  {
160  return it->second;
161  }
162  else
163  {
164  wxBitmap bitmap = GetBitmapStore()->GetBitmapScaled( aBitmap, scale, aHeight );
165  return s_ScaledBitmapCache.emplace( id, bitmap ).first->second;
166  }
167 }
wxBitmap GetBitmapScaled(BITMAPS aBitmapId, int aScaleFactor, int aHeight=-1)
Retrieves a bitmap from the given bitmap id, scaled to a given factor.
static std::unordered_map< SCALED_BITMAP_ID, wxBitmap > s_ScaledBitmapCache
Definition: bitmap.cpp:88
static int get_scale_factor(wxWindow *aWindow)
Definition: bitmap.cpp:137
const int scale
static std::mutex s_BitmapCacheMutex
Definition: bitmap.cpp:90
BITMAP_STORE * GetBitmapStore()
Definition: bitmap.cpp:93

References get_scale_factor(), BITMAP_STORE::GetBitmapScaled(), GetBitmapStore(), s_BitmapCacheMutex, s_ScaledBitmapCache, and scale.

Referenced by ACTION_TOOLBAR::Add(), ACTION_TOOLBAR_PALETTE::AddAction(), PCB_EDIT_FRAME::AddActionPluginTools(), ACTION_TOOLBAR::AddButton(), ACTION_TOOLBAR::AddGroup(), ACTION_TOOLBAR::doSelectAction(), PANEL_SETUP_BOARD_STACKUP::PANEL_SETUP_BOARD_STACKUP(), PCB_EDIT_FRAME::ReCreateAuxiliaryToolbar(), KICAD_MANAGER_FRAME::RecreateBaseHToolbar(), SYMBOL_VIEWER_FRAME::ReCreateHToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateHToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar(), EDA_3D_VIEWER_FRAME::ReCreateMainToolbar(), and ACTION_TOOLBAR::RefreshBitmaps().

◆ KiScaledBitmap() [2/2]

wxBitmap KiScaledBitmap ( const wxBitmap &  aBitmap,
wxWindow *  aWindow 
)

Overload of the above function that takes another wxBitmap as a parameter.

Parameters
aBitmapis the source bitmap to scale
aWindowtarget window for scaling context

Definition at line 177 of file bitmap.cpp.

178 {
179  const int scale = get_scale_factor( aWindow );
180 
181  if( scale == 4 )
182  {
183  return wxBitmap( aBitmap );
184  }
185  else
186  {
187  wxImage image = aBitmap.ConvertToImage();
188  image.Rescale( scale * image.GetWidth() / 4, scale * image.GetHeight() / 4,
189  wxIMAGE_QUALITY_BILINEAR );
190 
191  return wxBitmap( image );
192  }
193 }
static int get_scale_factor(wxWindow *aWindow)
Definition: bitmap.cpp:137
const int scale

References get_scale_factor(), image, and scale.

◆ SaveCanvasImageToFile()

bool SaveCanvasImageToFile ( EDA_DRAW_FRAME aFrame,
const wxString &  aFileName,
BITMAP_TYPE  aBitmapType = BITMAP_TYPE::PNG 
)

Save the current view as an image file.

Parameters
aFrameThe current draw frame view to save.
aFileNameThe file name to save the image. This will overwrite an existing file.
aBitmapTypeThe type of bitmap create as defined by wxImage.
Returns
True if the file was successfully saved or false if the file failed to be saved.

Definition at line 204 of file bitmap.cpp.

206 {
207  wxCHECK( aFrame != nullptr, false );
208 
209  bool retv = true;
210 
211  // Make a screen copy of the canvas:
212  wxSize image_size = aFrame->GetCanvas()->GetClientSize();
213 
214  wxClientDC dc( aFrame->GetCanvas() );
215  wxBitmap bitmap( image_size.x, image_size.y );
216  wxMemoryDC memdc;
217 
218  memdc.SelectObject( bitmap );
219  memdc.Blit( 0, 0, image_size.x, image_size.y, &dc, 0, 0 );
220  memdc.SelectObject( wxNullBitmap );
221 
222  wxImage image = bitmap.ConvertToImage();
223 
224  wxBitmapType type = wxBITMAP_TYPE_PNG;
225  switch( aBitmapType )
226  {
227  case BITMAP_TYPE::PNG: type = wxBITMAP_TYPE_PNG; break;
228  case BITMAP_TYPE::BMP: type = wxBITMAP_TYPE_BMP; break;
229  case BITMAP_TYPE::JPG: type = wxBITMAP_TYPE_JPEG; break;
230  }
231 
232  if( !image.SaveFile( aFileName, type ) )
233  retv = false;
234 
235  image.Destroy();
236  return retv;
237 }
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.

References BMP, EDA_DRAW_FRAME::GetCanvas(), image, JPG, and PNG.

Referenced by SYMBOL_EDITOR_CONTROL::ExportView(), and FOOTPRINT_EDIT_FRAME::OnSaveFootprintAsPng().

Variable Documentation

◆ s_BitmapCacheMutex

std::mutex s_BitmapCacheMutex
static

Definition at line 90 of file bitmap.cpp.

Referenced by ClearScaledBitmapCache(), and KiScaledBitmap().

◆ s_BitmapStore

std::unique_ptr<BITMAP_STORE> s_BitmapStore
static

Definition at line 50 of file bitmap.cpp.

Referenced by GetBitmapStore().

◆ s_ScaledBitmapCache

std::unordered_map<SCALED_BITMAP_ID, wxBitmap> s_ScaledBitmapCache
static

Definition at line 88 of file bitmap.cpp.

Referenced by ClearScaledBitmapCache(), and KiScaledBitmap().