Fix leak of all icon bitmaps

Originally committed to SVN as r5471.
This commit is contained in:
Thomas Goyne 2011-07-15 17:24:05 +00:00
parent 7842ccbeb1
commit 1e2abbd45a
7 changed files with 18 additions and 19 deletions

View file

@ -76,14 +76,14 @@ enum AudioBoxControlIDs {
static void add_button(wxWindow *parent, wxSizer *sizer, int border, const char *command) { static void add_button(wxWindow *parent, wxSizer *sizer, int border, const char *command) {
cmd::Command *c = cmd::get(command); cmd::Command *c = cmd::get(command);
wxBitmapButton *btn = new wxBitmapButton(parent, cmd::id(command), *c->Icon(16)); wxBitmapButton *btn = new wxBitmapButton(parent, cmd::id(command), c->Icon(16));
ToolTipManager::Bind(btn, c->StrHelp(), "Audio", command); ToolTipManager::Bind(btn, c->StrHelp(), "Audio", command);
sizer->Add(btn, 0, wxRIGHT, border); sizer->Add(btn, 0, wxRIGHT, border);
} }
static void add_option(wxWindow *parent, wxSizer *sizer, int border, const char *command, const char *option) { static void add_option(wxWindow *parent, wxSizer *sizer, int border, const char *command, const char *option) {
cmd::Command *c = cmd::get(command); cmd::Command *c = cmd::get(command);
ToggleBitmap *btn = new ToggleBitmap(parent, cmd::id(command), *c->Icon(16), wxSize(20, -1)); ToggleBitmap *btn = new ToggleBitmap(parent, cmd::id(command), c->Icon(16), wxSize(20, -1));
ToolTipManager::Bind(btn, c->StrHelp(), "Audio", command); ToolTipManager::Bind(btn, c->StrHelp(), "Audio", command);
btn->SetValue(OPT_GET(option)->GetBool()); btn->SetValue(OPT_GET(option)->GetBool());
sizer->Add(btn, 0, wxRIGHT | wxALIGN_CENTER | wxEXPAND, border); sizer->Add(btn, 0, wxRIGHT | wxALIGN_CENTER | wxEXPAND, border);

View file

@ -61,7 +61,7 @@ namespace cmd {
} }
} }
wxBitmap* Command::Icon(int size) { wxBitmap const& Command::Icon(int size) {
if (size == 16) { if (size == 16) {
return icon::get(name(), 16); return icon::get(name(), 16);
} else if (size == 24) { } else if (size == 24) {

View file

@ -95,7 +95,7 @@ namespace cmd {
/// Request icon. /// Request icon.
/// @param size Icon size. /// @param size Icon size.
wxBitmap* Icon(int size); wxBitmap const& Icon(int size);
/// Command function /// Command function
virtual void operator()(agi::Context *c)=0; virtual void operator()(agi::Context *c)=0;

View file

@ -33,13 +33,12 @@
#include "../libresrc/bitmap.h" #include "../libresrc/bitmap.h"
namespace icon { namespace icon {
typedef std::map<std::string, wxBitmap*> iconMap; typedef std::map<std::string, wxBitmap> iconMap;
typedef std::pair<std::string, wxBitmap*> iconPair;
iconMap icon16; iconMap icon16;
iconMap icon24; iconMap icon24;
wxBitmap* get(std::string const& name, const int size) { wxBitmap const& get(std::string const& name, const int size) {
// XXX: This code will go away with dynamic icon generation so I'm not // XXX: This code will go away with dynamic icon generation so I'm not
// concerned about it. // concerned about it.
if (size != 24) { if (size != 24) {
@ -58,21 +57,21 @@ wxBitmap* get(std::string const& name, const int size) {
} }
printf("icon::get NOT FOUND (%s)\n", name.c_str()); printf("icon::get NOT FOUND (%s)\n", name.c_str());
} }
return new wxBitmap(); static wxBitmap empty;
return empty;
} }
wxBitmap* getimage(const unsigned char *buff, size_t size) { wxBitmap getimage(const unsigned char *buff, size_t size) {
wxMemoryInputStream mem(buff, size); wxMemoryInputStream mem(buff, size);
wxImage img(mem); wxImage img(mem);
wxBitmap *bitmap = new wxBitmap(img); return wxBitmap(img);
return bitmap;
} }
#define INSERT_ICON(a, b) \ #define INSERT_ICON(a, b) \
icon16.insert(iconPair(a, getimage(b##_16, sizeof(b##_16)))); \ icon16.insert(std::make_pair(a, getimage(b##_16, sizeof(b##_16)))); \
icon24.insert(iconPair(a, getimage(b##_24, sizeof(b##_24)))); icon24.insert(std::make_pair(a, getimage(b##_24, sizeof(b##_24))));
void icon_init() { void icon_init() {

View file

@ -29,5 +29,5 @@ DEFINE_SIMPLE_EXCEPTION_NOINNER(IconInvalid, IconError, "icon/invalid")
namespace icon { namespace icon {
void icon_init(); void icon_init();
wxBitmap* get(std::string const& name, int size); wxBitmap const& get(std::string const& name, int size);
} }

View file

@ -107,9 +107,9 @@ namespace {
else { else {
cmd::Command *command = cmd::get(command_name.Value()); cmd::Command *command = cmd::get(command_name.Value());
wxBitmap *bitmap = command->Icon(icon_size); wxBitmap const& bitmap = command->Icon(icon_size);
// this hack is needed because ??? // this hack is needed because ???
wxBitmap icon = bitmap->GetSubBitmap(wxRect(0, 0, bitmap->GetWidth(), bitmap->GetHeight())); wxBitmap icon = bitmap.GetSubBitmap(wxRect(0, 0, bitmap.GetWidth(), bitmap.GetHeight()));
int flags = command->Type(); int flags = command->Type();
wxItemKind kind = wxItemKind kind =

View file

@ -65,14 +65,14 @@
static void add_button(wxWindow *parent, wxSizer *sizer, const char *command) { static void add_button(wxWindow *parent, wxSizer *sizer, const char *command) {
cmd::Command *c = cmd::get(command); cmd::Command *c = cmd::get(command);
wxBitmapButton *btn = new wxBitmapButton(parent, cmd::id(command), *c->Icon(24)); wxBitmapButton *btn = new wxBitmapButton(parent, cmd::id(command), c->Icon(24));
ToolTipManager::Bind(btn, c->StrHelp(), "Video", command); ToolTipManager::Bind(btn, c->StrHelp(), "Video", command);
sizer->Add(btn, 0, wxTOP | wxLEFT | wxBOTTOM | wxALIGN_CENTER, 2);; sizer->Add(btn, 0, wxTOP | wxLEFT | wxBOTTOM | wxALIGN_CENTER, 2);;
} }
static void add_option(wxWindow *parent, wxSizer *sizer, const char *command, const char *option) { static void add_option(wxWindow *parent, wxSizer *sizer, const char *command, const char *option) {
cmd::Command *c = cmd::get(command); cmd::Command *c = cmd::get(command);
ToggleBitmap *btn = new ToggleBitmap(parent, cmd::id(command), *c->Icon(24)); ToggleBitmap *btn = new ToggleBitmap(parent, cmd::id(command), c->Icon(24));
ToolTipManager::Bind(btn, c->StrHelp(), "Video", command); ToolTipManager::Bind(btn, c->StrHelp(), "Video", command);
btn->SetValue(OPT_GET(option)->GetBool()); btn->SetValue(OPT_GET(option)->GetBool());
sizer->Add(btn, 0, wxTOP | wxLEFT | wxBOTTOM | wxALIGN_CENTER, 2); sizer->Add(btn, 0, wxTOP | wxLEFT | wxBOTTOM | wxALIGN_CENTER, 2);
@ -121,7 +121,7 @@ VideoBox::VideoBox(wxWindow *parent, bool isDetached, agi::Context *context)
visualToolBar->AddTool(Video_Mode_Clip,_("Clip"),GETIMAGE(visual_clip_24),_("Clip subtitles to a rectangle."),wxITEM_RADIO); visualToolBar->AddTool(Video_Mode_Clip,_("Clip"),GETIMAGE(visual_clip_24),_("Clip subtitles to a rectangle."),wxITEM_RADIO);
visualToolBar->AddTool(Video_Mode_Vector_Clip,_("Vector Clip"),GETIMAGE(visual_vector_clip_24),_("Clip subtitles to a vectorial area."),wxITEM_RADIO); visualToolBar->AddTool(Video_Mode_Vector_Clip,_("Vector Clip"),GETIMAGE(visual_vector_clip_24),_("Clip subtitles to a vectorial area."),wxITEM_RADIO);
visualToolBar->AddSeparator(); visualToolBar->AddSeparator();
visualToolBar->AddTool(cmd::id("help/video"),_("Help"),*cmd::get("help/video")->Icon(24),_("Open the manual page for Visual Typesetting.")); visualToolBar->AddTool(cmd::id("help/video"),_("Help"),cmd::get("help/video")->Icon(24),_("Open the manual page for Visual Typesetting."));
visualToolBar->Realize(); visualToolBar->Realize();
// Avoid ugly themed background on Vista and possibly also Win7 // Avoid ugly themed background on Vista and possibly also Win7
visualToolBar->SetBackgroundStyle(wxBG_STYLE_COLOUR); visualToolBar->SetBackgroundStyle(wxBG_STYLE_COLOUR);