X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..b640fa17f3359e2766232e5dae3922de28236bde:/samples/image/image.cpp diff --git a/samples/image/image.cpp b/samples/image/image.cpp index f42aca9f04..e9de0eecc7 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -7,7 +7,7 @@ // RCS-ID: $Id$ // Copyright: (c) 1998-2005 Robert Roebling // (c) 2005-2009 Vadim Zeitlin -// License: wxWindows licence +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". @@ -24,10 +24,13 @@ #include "wx/image.h" #include "wx/file.h" #include "wx/filename.h" +#include "wx/graphics.h" #include "wx/mstream.h" #include "wx/wfstream.h" #include "wx/quantize.h" +#include "wx/scopedptr.h" #include "wx/stopwatch.h" +#include "wx/versioninfo.h" #if wxUSE_CLIPBOARD #include "wx/dataobj.h" @@ -47,7 +50,7 @@ #include "canvas.h" -#ifndef __WXMSW__ +#ifndef wxHAS_IMAGES_IN_RESOURCES #include "../sample.xpm" #endif @@ -82,6 +85,9 @@ public: #ifdef wxHAVE_RAW_BITMAP void OnTestRawBitmap( wxCommandEvent &event ); #endif // wxHAVE_RAW_BITMAP +#if wxUSE_GRAPHICS_CONTEXT + void OnTestGraphics(wxCommandEvent& event); +#endif // wxUSE_GRAPHICS_CONTEXT void OnQuit( wxCommandEvent &event ); #if wxUSE_CLIPBOARD @@ -144,7 +150,7 @@ private: m_zoom = 1.; wxMenu *menu = new wxMenu; - menu->Append(wxID_SAVE); + menu->Append(wxID_SAVEAS); menu->AppendSeparator(); menu->AppendCheckItem(ID_PAINT_BG, wxT("&Paint background"), "Uncheck this for transparent images"); @@ -186,7 +192,7 @@ private: wxPaintDC dc(this); if ( GetMenuBar()->IsChecked(ID_PAINT_BG) ) - ClearBackground(); + dc.Clear(); dc.SetUserScale(m_zoom, m_zoom); @@ -208,16 +214,29 @@ private: wxString savefilename = wxFileSelector( wxT("Save Image"), wxEmptyString, wxEmptyString, - (const wxChar *)NULL, + wxEmptyString, wxT("BMP files (*.bmp)|*.bmp|") +#if wxUSE_LIBPNG wxT("PNG files (*.png)|*.png|") +#endif +#if wxUSE_LIBJPEG wxT("JPEG files (*.jpg)|*.jpg|") +#endif +#if wxUSE_GIF wxT("GIF files (*.gif)|*.gif|") +#endif +#if wxUSE_LIBTIFF wxT("TIFF files (*.tif)|*.tif|") +#endif +#if wxUSE_PCX wxT("PCX files (*.pcx)|*.pcx|") +#endif +#if wxUSE_XPM + wxT("X PixMap files (*.xpm)|*.xpm|") +#endif wxT("ICO files (*.ico)|*.ico|") wxT("CUR files (*.cur)|*.cur"), - wxFD_SAVE, + wxFD_SAVE | wxFD_OVERWRITE_PROMPT, this); if ( savefilename.empty() ) @@ -274,6 +293,7 @@ private: } } } +#if wxUSE_LIBPNG else if ( extension == wxT("png") ) { static const int pngvalues[] = @@ -344,6 +364,7 @@ private: } } } +#endif // wxUSE_LIBPNG else if ( extension == wxT("cur") ) { image.Rescale(32,32); @@ -394,7 +415,7 @@ private: wxImage img(m_bitmap.ConvertToImage()); img = img.Rotate(angle, wxPoint(img.GetWidth() / 2, img.GetHeight() / 2)); - if ( !img.Ok() ) + if ( !img.IsOk() ) { wxLogWarning(wxT("Rotation failed")); return; @@ -572,7 +593,7 @@ BEGIN_EVENT_TABLE(MyImageFrame, wxFrame) EVT_ERASE_BACKGROUND(MyImageFrame::OnEraseBackground) EVT_PAINT(MyImageFrame::OnPaint) - EVT_MENU(wxID_SAVE, MyImageFrame::OnSave) + EVT_MENU(wxID_SAVEAS, MyImageFrame::OnSave) EVT_MENU_RANGE(ID_ROTATE_LEFT, ID_ROTATE_RIGHT, MyImageFrame::OnRotate) EVT_MENU(ID_RESIZE, MyImageFrame::OnResize) @@ -604,6 +625,7 @@ enum ID_NEW = 100, ID_INFO, ID_SHOWRAW, + ID_GRAPHICS, ID_SHOWTHUMBNAIL }; @@ -617,6 +639,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) #ifdef wxHAVE_RAW_BITMAP EVT_MENU (ID_SHOWRAW, MyFrame::OnTestRawBitmap) #endif +#if wxUSE_GRAPHICS_CONTEXT + EVT_MENU (ID_GRAPHICS, MyFrame::OnTestGraphics) +#endif // wxUSE_GRAPHICS_CONTEXT #if wxUSE_CLIPBOARD EVT_MENU(wxID_COPY, MyFrame::OnCopy) EVT_MENU(wxID_PASTE, MyFrame::OnPaste) @@ -638,11 +663,15 @@ MyFrame::MyFrame() menuImage->AppendSeparator(); menuImage->Append( ID_SHOWRAW, wxT("Test &raw bitmap...\tCtrl-R")); #endif +#if wxUSE_GRAPHICS_CONTEXT + menuImage->AppendSeparator(); + menuImage->Append(ID_GRAPHICS, "Test &graphics context...\tCtrl-G"); +#endif // wxUSE_GRAPHICS_CONTEXT menuImage->AppendSeparator(); menuImage->Append( ID_SHOWTHUMBNAIL, wxT("Test &thumbnail...\tCtrl-T"), "Test scaling the image during load (try with JPEG)"); menuImage->AppendSeparator(); - menuImage->Append( ID_ABOUT, wxT("&About...")); + menuImage->Append( ID_ABOUT, wxT("&About\tF1")); menuImage->AppendSeparator(); menuImage->Append( ID_QUIT, wxT("E&xit\tCtrl-Q")); menu_bar->Append(menuImage, wxT("&Image")); @@ -666,6 +695,7 @@ MyFrame::MyFrame() // 500 width * 2750 height m_canvas->SetScrollbars( 10, 10, 50, 275 ); + m_canvas->SetCursor(wxImage("cursor.png")); } void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) @@ -673,11 +703,35 @@ void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) Close( true ); } +#if wxUSE_ZLIB && wxUSE_STREAMS +#include "wx/zstream.h" +#endif + void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) ) { - (void)wxMessageBox( "wxImage demo\n" - "(c) Robert Roebling 1998-2005" - "(c) Vadim Zeitlin 2005-2009", + wxArrayString array; + + array.Add("wxImage demo"); + array.Add("(c) Robert Roebling 1998-2005"); + array.Add("(c) Vadim Zeitlin 2005-2009"); + + array.Add(wxEmptyString); + array.Add("Version of the libraries used:"); + +#if wxUSE_LIBPNG + array.Add(wxPNGHandler::GetLibraryVersionInfo().ToString()); +#endif +#if wxUSE_LIBJPEG + array.Add(wxJPEGHandler::GetLibraryVersionInfo().ToString()); +#endif +#if wxUSE_LIBTIFF + array.Add(wxTIFFHandler::GetLibraryVersionInfo().ToString()); +#endif +#if wxUSE_ZLIB && wxUSE_STREAMS + // zlib is used by libpng + array.Add(wxGetZlibVersionInfo().ToString()); +#endif + (void)wxMessageBox( wxJoin(array, '\n'), "About wxImage Demo", wxICON_INFORMATION | wxOK ); } @@ -758,6 +812,85 @@ void MyFrame::OnTestRawBitmap( wxCommandEvent &WXUNUSED(event) ) #endif // wxHAVE_RAW_BITMAP +#if wxUSE_GRAPHICS_CONTEXT + +class MyGraphicsFrame : public wxFrame +{ +public: + enum + { + WIDTH = 256, + HEIGHT = 90 + }; + + MyGraphicsFrame(wxWindow* parent) : + wxFrame(parent, wxID_ANY, "Graphics context test"), + m_image(WIDTH, HEIGHT, false) + { + // Create a test image: it has 3 horizontal primary colour bands with + // alpha increasing from left to right. + m_image.SetAlpha(); + unsigned char* alpha = m_image.GetAlpha(); + unsigned char* data = m_image.GetData(); + + for ( int y = 0; y < HEIGHT; y++ ) + { + unsigned char r = 0, + g = 0, + b = 0; + if ( y < HEIGHT/3 ) + r = 0xff; + else if ( y < (2*HEIGHT)/3 ) + g = 0xff; + else + b = 0xff; + + for ( int x = 0; x < WIDTH; x++ ) + { + *alpha++ = x; + *data++ = r; + *data++ = g; + *data++ = b; + } + } + + m_bitmap = wxBitmap(m_image); + + Connect(wxEVT_PAINT, wxPaintEventHandler(MyGraphicsFrame::OnPaint)); + + Show(); + } + +private: + void OnPaint(wxPaintEvent& WXUNUSED(event)) + { + wxPaintDC dc(this); + wxScopedPtr gc(wxGraphicsContext::Create(dc)); + wxGraphicsBitmap gb(gc->CreateBitmapFromImage(m_image)); + + gc->SetFont(*wxNORMAL_FONT, *wxBLACK); + gc->DrawText("Bitmap", 0, HEIGHT/2); + gc->DrawBitmap(m_bitmap, 0, 0, WIDTH, HEIGHT); + + wxGraphicsFont gf = gc->CreateFont(wxNORMAL_FONT->GetPixelSize().y, ""); + gc->SetFont(gf); + gc->DrawText("Graphics bitmap", 0, (3*HEIGHT)/2); + gc->DrawBitmap(gb, 0, HEIGHT, WIDTH, HEIGHT); + } + + wxImage m_image; + wxBitmap m_bitmap; + + wxDECLARE_NO_COPY_CLASS(MyGraphicsFrame); +}; + +void MyFrame::OnTestGraphics(wxCommandEvent& WXUNUSED(event)) +{ + new MyGraphicsFrame(this); +} + +#endif // wxUSE_GRAPHICS_CONTEXT + #if wxUSE_CLIPBOARD void MyFrame::OnCopy(wxCommandEvent& WXUNUSED(event)) @@ -814,10 +947,14 @@ void MyFrame::OnThumbnail( wxCommandEvent &WXUNUSED(event) ) return; } + int origWidth = image.GetOptionInt( wxIMAGE_OPTION_ORIGINAL_WIDTH ); + int origHeight = image.GetOptionInt( wxIMAGE_OPTION_ORIGINAL_HEIGHT ); + const long loadTime = sw.Time(); MyImageFrame * const frame = new MyImageFrame(this, filename, image); - wxLogStatus(frame, "Loaded \"%s\" in %ldms", filename, loadTime); + wxLogStatus(frame, "Loaded \"%s\" in %ldms; original size was (%d, %d)", + filename, loadTime, origWidth, origHeight); #else wxLogError( wxT("Couldn't create file selector dialog") ); return;