X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1d8acb7d4d9bd0a8343ee811f98f22388e08e2df..05e0b047d879cdbfade7f2ab346c0acdf3e29f96:/samples/image/image.cpp?ds=sidebyside diff --git a/samples/image/image.cpp b/samples/image/image.cpp index 6d4bc60ef1..a365d34310 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -118,6 +118,7 @@ public: void OnAbout( wxCommandEvent &event ); void OnNewFrame( wxCommandEvent &event ); + void OnImageInfo( wxCommandEvent &event ); #ifdef wxHAVE_RAW_BITMAP void OnTestRawBitmap( wxCommandEvent &event ); #endif // wxHAVE_RAW_BITMAP @@ -131,6 +132,13 @@ public: MyCanvas *m_canvas; private: + // ask user for the file name and try to load an image from it + // + // return the file path on success, empty string if we failed to load the + // image or were cancelled by user + static wxString LoadUserImage(wxImage& image); + + DECLARE_DYNAMIC_CLASS(MyFrame) DECLARE_EVENT_TABLE() }; @@ -142,7 +150,8 @@ private: enum { ID_ROTATE_LEFT = 100, - ID_ROTATE_RIGHT + ID_ROTATE_RIGHT, + ID_RESIZE }; class MyImageFrame : public wxFrame @@ -152,12 +161,14 @@ public: : wxFrame(parent, wxID_ANY, wxString::Format(_T("Image from %s"), desc.c_str()), wxDefaultPosition, wxDefaultSize, - wxCAPTION | wxSYSTEM_MENU | wxCLOSE_BOX), + wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE), m_bitmap(bitmap) { wxMenu *menu = new wxMenu; menu->Append(wxID_SAVE); menu->AppendSeparator(); + menu->Append(ID_RESIZE, _T("&Fit to window\tCtrl-F")); + menu->AppendSeparator(); menu->Append(ID_ROTATE_LEFT, _T("Rotate &left\tCtrl-L")); menu->Append(ID_ROTATE_RIGHT, _T("Rotate &right\tCtrl-R")); @@ -165,7 +176,11 @@ public: mbar->Append(menu, _T("&Image")); SetMenuBar(mbar); + CreateStatusBar(); + SetClientSize(bitmap.GetWidth(), bitmap.GetHeight()); + + UpdateStatusBar(); } void OnEraseBackground(wxEraseEvent& WXUNUSED(event)) @@ -175,8 +190,12 @@ public: void OnPaint(wxPaintEvent& WXUNUSED(event)) { - wxPaintDC dc( this ); - dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ ); + wxPaintDC dc(this); + const wxSize size = GetClientSize(); + dc.DrawBitmap(m_bitmap, + (size.x - m_bitmap.GetWidth())/2, + (size.y - m_bitmap.GetHeight())/2, + true /* use mask */); } void OnSave(wxCommandEvent& WXUNUSED(event)) @@ -305,6 +324,18 @@ public: #endif // wxUSE_FILEDLG } + void OnResize(wxCommandEvent& WXUNUSED(event)) + { + wxImage img(m_bitmap.ConvertToImage()); + + const wxSize size = GetClientSize(); + img.Rescale(size.x, size.y, wxIMAGE_QUALITY_HIGH); + m_bitmap = wxBitmap(img); + + UpdateStatusBar(); + Refresh(); + } + void OnRotate(wxCommandEvent& event) { double angle = 5; @@ -312,7 +343,7 @@ public: angle = -angle; wxImage img(m_bitmap.ConvertToImage()); - img = img.Rotate(angle, wxPoint(0, 0));//wxPoint(img.GetWidth() / 2, img.GetHeight() / 2)); + img = img.Rotate(angle, wxPoint(img.GetWidth() / 2, img.GetHeight() / 2)); if ( !img.Ok() ) { wxLogWarning(_T("Rotation failed")); @@ -320,10 +351,19 @@ public: } m_bitmap = wxBitmap(img); + + UpdateStatusBar(); Refresh(); } private: + void UpdateStatusBar() + { + wxLogStatus(this, _T("Image size: (%d, %d)"), + m_bitmap.GetWidth(), + m_bitmap.GetHeight()); + } + wxBitmap m_bitmap; DECLARE_EVENT_TABLE() @@ -365,7 +405,6 @@ public: wxLogError(_T("Failed to gain raw access to bitmap data")); return; } - data.UseAlpha(); wxAlphaPixelData::Iterator p(data); for ( int y = 0; y < SIZE; ++y ) { @@ -389,7 +428,6 @@ public: return; } - data.UseAlpha(); wxAlphaPixelData::Iterator p(data); for ( int y = 0; y < REAL_SIZE; ++y ) @@ -490,6 +528,7 @@ BEGIN_EVENT_TABLE(MyImageFrame, wxFrame) EVT_MENU(wxID_SAVE, MyImageFrame::OnSave) EVT_MENU_RANGE(ID_ROTATE_LEFT, ID_ROTATE_RIGHT, MyImageFrame::OnRotate) + EVT_MENU(ID_RESIZE, MyImageFrame::OnResize) END_EVENT_TABLE() #ifdef wxHAVE_RAW_BITMAP @@ -1070,17 +1109,19 @@ enum ID_QUIT = wxID_EXIT, ID_ABOUT = wxID_ABOUT, ID_NEW = 100, - ID_SHOWRAW = 101 + ID_INFO, + ID_SHOWRAW }; IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame ) -BEGIN_EVENT_TABLE(MyFrame,wxFrame) +BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU (ID_ABOUT, MyFrame::OnAbout) EVT_MENU (ID_QUIT, MyFrame::OnQuit) - EVT_MENU (ID_NEW, MyFrame::OnNewFrame) + EVT_MENU (ID_NEW, MyFrame::OnNewFrame) + EVT_MENU (ID_INFO, MyFrame::OnImageInfo) #ifdef wxHAVE_RAW_BITMAP - EVT_MENU (ID_SHOWRAW, MyFrame::OnTestRawBitmap) + EVT_MENU (ID_SHOWRAW, MyFrame::OnTestRawBitmap) #endif #if wxUSE_CLIPBOARD @@ -1097,8 +1138,9 @@ MyFrame::MyFrame() wxMenu *menuImage = new wxMenu; menuImage->Append( ID_NEW, _T("&Show any image...\tCtrl-O")); - + menuImage->Append( ID_INFO, _T("Show image &information...\tCtrl-I")); #ifdef wxHAVE_RAW_BITMAP + menuImage->AppendSeparator(); menuImage->Append( ID_SHOWRAW, _T("Test &raw bitmap...\tCtrl-R")); #endif menuImage->AppendSeparator(); @@ -1140,23 +1182,71 @@ void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) ) _T("About wxImage Demo"), wxICON_INFORMATION | wxOK ); } -void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) ) +wxString MyFrame::LoadUserImage(wxImage& image) { + wxString filename; + #if wxUSE_FILEDLG - wxString filename = wxFileSelector(_T("Select image file")); - if ( !filename ) - return; + filename = wxFileSelector(_T("Select image file")); + if ( !filename.empty() ) + { + if ( !image.LoadFile(filename) ) + { + wxLogError(_T("Couldn't load image from '%s'."), filename.c_str()); + + return wxEmptyString; + } + } +#endif // wxUSE_FILEDLG + + return filename; +} + +void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) ) +{ + wxImage image; + wxString filename = LoadUserImage(image); + if ( !filename.empty() ) + (new MyImageFrame(this, filename, wxBitmap(image)))->Show(); +} +void MyFrame::OnImageInfo( wxCommandEvent &WXUNUSED(event) ) +{ wxImage image; - if ( !image.LoadFile(filename) ) + if ( !LoadUserImage(image).empty() ) { - wxLogError(_T("Couldn't load image from '%s'."), filename.c_str()); + // TODO: show more information about the file + wxString info = wxString::Format("Image size: %dx%d", + image.GetWidth(), + image.GetHeight()); + + int xres = image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONX), + yres = image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONY); + if ( xres || yres ) + { + info += wxString::Format("\nResolution: %dx%d", xres, yres); + switch ( image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONUNIT) ) + { + default: + wxFAIL_MSG( "unknown image resolution units" ); + // fall through - return; - } + case wxIMAGE_RESOLUTION_NONE: + info += " in default units"; + break; - (new MyImageFrame(this, filename, wxBitmap(image)))->Show(); -#endif // wxUSE_FILEDLG + case wxIMAGE_RESOLUTION_INCHES: + info += " in"; + break; + + case wxIMAGE_RESOLUTION_CM: + info += " cm"; + break; + } + } + + wxLogMessage("%s", info); + } } #ifdef wxHAVE_RAW_BITMAP