]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/image/image.cpp
fix the MSVC check in the last comment and accompanying comment
[wxWidgets.git] / samples / image / image.cpp
index 2ea3512b84168aefd7e054cedb0be1b2d2afd459..01af647f11d9fa230abc2a97486378bcb1bcd625 100644 (file)
@@ -26,6 +26,7 @@
 #include "wx/mstream.h"
 #include "wx/wfstream.h"
 #include "wx/quantize.h"
 #include "wx/mstream.h"
 #include "wx/wfstream.h"
 #include "wx/quantize.h"
+#include "wx/stopwatch.h"
 
 #if wxUSE_CLIPBOARD
     #include "wx/dataobj.h"
 
 #if wxUSE_CLIPBOARD
     #include "wx/dataobj.h"
@@ -118,6 +119,9 @@ public:
 
     void OnAbout( wxCommandEvent &event );
     void OnNewFrame( wxCommandEvent &event );
 
     void OnAbout( wxCommandEvent &event );
     void OnNewFrame( wxCommandEvent &event );
+    void OnImageInfo( wxCommandEvent &event );
+    void OnThumbnail( wxCommandEvent &event );
+
 #ifdef wxHAVE_RAW_BITMAP
     void OnTestRawBitmap( wxCommandEvent &event );
 #endif // wxHAVE_RAW_BITMAP
 #ifdef wxHAVE_RAW_BITMAP
     void OnTestRawBitmap( wxCommandEvent &event );
 #endif // wxHAVE_RAW_BITMAP
@@ -131,6 +135,13 @@ public:
     MyCanvas         *m_canvas;
 
 private:
     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()
 };
     DECLARE_DYNAMIC_CLASS(MyFrame)
     DECLARE_EVENT_TABLE()
 };
@@ -141,9 +152,10 @@ private:
 
 enum
 {
 
 enum
 {
-    ID_ROTATE_LEFT = 100,
+    ID_ROTATE_LEFT = wxID_HIGHEST+1,
     ID_ROTATE_RIGHT,
     ID_ROTATE_RIGHT,
-    ID_RESIZE
+    ID_RESIZE,
+    ID_PAINT_BG
 };
 
 class MyImageFrame : public wxFrame
 };
 
 class MyImageFrame : public wxFrame
@@ -159,6 +171,8 @@ public:
         wxMenu *menu = new wxMenu;
         menu->Append(wxID_SAVE);
         menu->AppendSeparator();
         wxMenu *menu = new wxMenu;
         menu->Append(wxID_SAVE);
         menu->AppendSeparator();
+        m_pClearBgMenu = menu->AppendCheckItem(ID_PAINT_BG, _T("&Paint background"));
+        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_RESIZE, _T("&Fit to window\tCtrl-F"));
         menu->AppendSeparator();
         menu->Append(ID_ROTATE_LEFT, _T("Rotate &left\tCtrl-L"));
@@ -173,6 +187,8 @@ public:
         SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
 
         UpdateStatusBar();
         SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
 
         UpdateStatusBar();
+
+//        SetBackgroundColour(*wxWHITE);
     }
 
     void OnEraseBackground(wxEraseEvent& WXUNUSED(event))
     }
 
     void OnEraseBackground(wxEraseEvent& WXUNUSED(event))
@@ -183,6 +199,10 @@ public:
     void OnPaint(wxPaintEvent& WXUNUSED(event))
     {
         wxPaintDC dc(this);
     void OnPaint(wxPaintEvent& WXUNUSED(event))
     {
         wxPaintDC dc(this);
+
+        if (m_pClearBgMenu->IsChecked())
+            ClearBackground();
+
         const wxSize size = GetClientSize();
         dc.DrawBitmap(m_bitmap,
                       (size.x - m_bitmap.GetWidth())/2,
         const wxSize size = GetClientSize();
         dc.DrawBitmap(m_bitmap,
                       (size.x - m_bitmap.GetWidth())/2,
@@ -357,6 +377,7 @@ private:
     }
 
     wxBitmap m_bitmap;
     }
 
     wxBitmap m_bitmap;
+    wxMenuItem* m_pClearBgMenu;
 
     DECLARE_EVENT_TABLE()
 };
 
     DECLARE_EVENT_TABLE()
 };
@@ -1101,17 +1122,21 @@ enum
     ID_QUIT  = wxID_EXIT,
     ID_ABOUT = wxID_ABOUT,
     ID_NEW = 100,
     ID_QUIT  = wxID_EXIT,
     ID_ABOUT = wxID_ABOUT,
     ID_NEW = 100,
-    ID_SHOWRAW = 101
+    ID_INFO,
+    ID_SHOWRAW,
+    ID_SHOWTHUMBNAIL
 };
 
 IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
 
 };
 
 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_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)
+  EVT_MENU    (ID_SHOWTHUMBNAIL, MyFrame::OnThumbnail)
 #ifdef wxHAVE_RAW_BITMAP
 #ifdef wxHAVE_RAW_BITMAP
-  EVT_MENU    (ID_SHOWRAW,  MyFrame::OnTestRawBitmap)
+  EVT_MENU    (ID_SHOWRAW, MyFrame::OnTestRawBitmap)
 #endif
 
 #if wxUSE_CLIPBOARD
 #endif
 
 #if wxUSE_CLIPBOARD
@@ -1128,11 +1153,15 @@ MyFrame::MyFrame()
 
   wxMenu *menuImage = new wxMenu;
   menuImage->Append( ID_NEW, _T("&Show any image...\tCtrl-O"));
 
   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
 #ifdef wxHAVE_RAW_BITMAP
+  menuImage->AppendSeparator();
   menuImage->Append( ID_SHOWRAW, _T("Test &raw bitmap...\tCtrl-R"));
 #endif
   menuImage->AppendSeparator();
   menuImage->Append( ID_SHOWRAW, _T("Test &raw bitmap...\tCtrl-R"));
 #endif
   menuImage->AppendSeparator();
+  menuImage->Append( ID_SHOWTHUMBNAIL, _T("Test &thumbnail...\tCtrl-T"),
+                    "Test scaling the image during load (try with JPEG)");
+  menuImage->AppendSeparator();
   menuImage->Append( ID_ABOUT, _T("&About..."));
   menuImage->AppendSeparator();
   menuImage->Append( ID_QUIT, _T("E&xit\tCtrl-Q"));
   menuImage->Append( ID_ABOUT, _T("&About..."));
   menuImage->AppendSeparator();
   menuImage->Append( ID_QUIT, _T("E&xit\tCtrl-Q"));
@@ -1171,23 +1200,71 @@ void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
                       _T("About wxImage Demo"), wxICON_INFORMATION | wxOK );
 }
 
                       _T("About wxImage Demo"), wxICON_INFORMATION | wxOK );
 }
 
-void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) )
+wxString MyFrame::LoadUserImage(wxImage& image)
 {
 {
+    wxString filename;
+
 #if wxUSE_FILEDLG
 #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;
     wxImage image;
-    if ( !image.LoadFile(filename) )
+    wxString filename = LoadUserImage(image);
+    if ( !filename.empty() )
+        (new MyImageFrame(this, filename, wxBitmap(image)))->Show();
+}
+
+void MyFrame::OnImageInfo( wxCommandEvent &WXUNUSED(event) )
+{
+    wxImage image;
+    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
 }
 
 #ifdef wxHAVE_RAW_BITMAP
@@ -1250,3 +1327,37 @@ bool MyApp::OnInit()
 
     return true;
 }
 
     return true;
 }
+
+void MyFrame::OnThumbnail( wxCommandEvent &WXUNUSED(event) )
+{
+#if wxUSE_FILEDLG
+    wxString filename = wxFileSelector(_T("Select image file"));
+    if ( filename.empty() )
+        return;
+
+    static const int THUMBNAIL_WIDTH = 320;
+    static const int THUMBNAIL_HEIGHT = 240;
+
+    wxImage image;
+    image.SetOption(wxIMAGE_OPTION_MAX_WIDTH, THUMBNAIL_WIDTH);
+    image.SetOption(wxIMAGE_OPTION_MAX_HEIGHT, THUMBNAIL_HEIGHT);
+
+    wxStopWatch sw;
+    if ( !image.LoadFile(filename) )
+    {
+        wxLogError(_T("Couldn't load image from '%s'."), filename.c_str());
+        return;
+    }
+
+    const long loadTime = sw.Time();
+
+    MyImageFrame * const
+        frame = new MyImageFrame(this, filename, wxBitmap(image));
+    frame->Show();
+    wxLogStatus(frame, "Loaded \"%s\" in %ldms", filename, loadTime);
+#else
+    wxLogError( _T("Couldn't create file selector dialog") );
+    return;
+#endif // wxUSE_FILEDLG
+}
+