X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f9ebac93e71d7e97259593390dcbbbe306714dce..61c213fe224da24ce33c9187263e75a17ca83a04:/samples/image/image.cpp diff --git a/samples/image/image.cpp b/samples/image/image.cpp index 7d6f8acd75..7bfe2db778 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -1,11 +1,13 @@ -/* - * Program: image - * - * Author: Robert Roebling - * - * Copyright: (C) 1998, Robert Roebling - * - */ +/////////////////////////////////////////////////////////////////////////////// +// Name: samples/image/image.cpp +// Purpose: sample showing operations with wxImage +// Author: Robert Roebling +// Modified by: +// Created: 1998 +// RCS-ID: $Id$ +// Copyright: (c) 1998-2005 Robert Roebling +// License: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -20,6 +22,7 @@ #include "wx/image.h" #include "wx/file.h" +#include "wx/filename.h" #include "wx/mstream.h" #include "wx/wfstream.h" #include "wx/quantize.h" @@ -30,17 +33,19 @@ #endif // wxUSE_CLIPBOARD #include "smile.xbm" +#include "smile.xpm" -#if !defined(__WINDOWS__) || wxUSE_XPM_IN_MSW - #include "smile.xpm" -#endif - -#if defined(__WXMSW__) || defined(__WXMAC__) +#if defined(__WXMSW__) #ifdef wxHAVE_RAW_BITMAP #include "wx/rawbmp.h" #endif #endif +#if defined(__WXMAC__) || defined(__WXGTK__) + #define wxHAVE_RAW_BITMAP + #include "wx/rawbmp.h" +#endif + // derived classes class MyFrame; @@ -89,31 +94,6 @@ private: }; -const int nChoices = 8 ; -static const wxString bppchoices[nChoices] = -{ - _T("1 bpp color"), - _T("1 bpp B&W"), - _T("4 bpp color"), - _T("8 bpp color"), - _T("8 bpp greyscale"), - _T("8 bpp red"), - _T("8 bpp own palette"), - _T("24 bpp") -}; - -static const int bppvalues[nChoices] = -{ - wxBMP_1BPP, - wxBMP_1BPP_BW, - wxBMP_4BPP, - wxBMP_8BPP, - wxBMP_8BPP_GREY, - wxBMP_8BPP_RED, - wxBMP_8BPP_PALETTE, - wxBMP_24BPP -}; - // MyFrame @@ -145,7 +125,7 @@ class MyImageFrame : public wxFrame { public: MyImageFrame(wxFrame *parent, const wxBitmap& bitmap) - : wxFrame(parent, -1, _T("Double click to save"), + : wxFrame(parent, wxID_ANY, _T("Double click to save"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxSYSTEM_MENU | wxCLOSE_BOX), m_bitmap(bitmap) @@ -161,32 +141,16 @@ public: void OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc( this ); - dc.DrawBitmap( m_bitmap, 0, 0, TRUE /* use mask */ ); + dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ ); } void OnSave(wxMouseEvent& WXUNUSED(event)) { wxImage image = m_bitmap.ConvertToImage(); - int bppselection = wxGetSingleChoiceIndex(_T("Set BMP BPP"), - _T("Set BMP BPP"), - nChoices, - bppchoices, - this); - if ( bppselection == -1 ) - { - // cancelled - return; - } - - image.SetOption(wxIMAGE_OPTION_BMP_FORMAT, bppvalues[bppselection]); - - wxString deffilename = bppchoices[bppselection]; - deffilename.Replace(wxT(" "), wxT("_")); - deffilename += wxT(".bmp"); wxString savefilename = wxFileSelector( wxT("Save Image"), wxT(""), - deffilename, + wxT(""), (const wxChar *)NULL, wxT("BMP files (*.bmp)|*.bmp|") wxT("PNG files (*.png)|*.png|") @@ -196,44 +160,112 @@ public: wxT("PCX files (*.pcx)|*.pcx|") wxT("ICO files (*.ico)|*.ico|") wxT("CUR files (*.cur)|*.cur"), - wxSAVE); + wxSAVE, + this); if ( savefilename.empty() ) return; - if ( image.GetOptionInt(wxIMAGE_OPTION_BMP_FORMAT) == wxBMP_8BPP_PALETTE ) - { - unsigned char *cmap = new unsigned char [256]; - for ( int i = 0; i < 256; i++ ) - cmap[i] = i; - image.SetPalette(wxPalette(256, cmap, cmap, cmap)); + wxString extension; + wxFileName::SplitPath(savefilename, NULL, NULL, &extension); - delete cmap; + bool saved = false; + if ( extension == _T("bpp") ) + { + static const int bppvalues[] = + { + wxBMP_1BPP, + wxBMP_1BPP_BW, + wxBMP_4BPP, + wxBMP_8BPP, + wxBMP_8BPP_GREY, + wxBMP_8BPP_RED, + wxBMP_8BPP_PALETTE, + wxBMP_24BPP + }; + + const wxString bppchoices[] = + { + _T("1 bpp color"), + _T("1 bpp B&W"), + _T("4 bpp color"), + _T("8 bpp color"), + _T("8 bpp greyscale"), + _T("8 bpp red"), + _T("8 bpp own palette"), + _T("24 bpp") + }; + + int bppselection = wxGetSingleChoiceIndex(_T("Set BMP BPP"), + _T("Image sample: save file"), + WXSIZEOF(bppchoices), + bppchoices, + this); + if ( bppselection != -1 ) + { + int format = bppvalues[bppselection]; + image.SetOption(wxIMAGE_OPTION_BMP_FORMAT, format); + + if ( format == wxBMP_8BPP_PALETTE ) + { + unsigned char *cmap = new unsigned char [256]; + for ( int i = 0; i < 256; i++ ) + cmap[i] = (unsigned char)i; + image.SetPalette(wxPalette(256, cmap, cmap, cmap)); + + delete cmap; + } + } } - - bool loaded; - wxString extension = savefilename.AfterLast('.').Lower(); - - if (extension == _T("cur")) + else if ( extension == _T("png") ) + { + static const int pngvalues[] = + { + wxPNG_TYPE_COLOUR, + wxPNG_TYPE_COLOUR, + wxPNG_TYPE_GREY, + wxPNG_TYPE_GREY, + wxPNG_TYPE_GREY_RED, + wxPNG_TYPE_GREY_RED, + }; + + const wxString pngchoices[] = + { + _T("Colour 8bpp"), + _T("Colour 16bpp"), + _T("Grey 8bpp"), + _T("Grey 16bpp"), + _T("Grey red 8bpp"), + _T("Grey red 16bpp"), + }; + + int sel = wxGetSingleChoiceIndex(_T("Set PNG format"), + _T("Image sample: save file"), + WXSIZEOF(pngchoices), + pngchoices, + this); + if ( sel != -1 ) + { + image.SetOption(wxIMAGE_OPTION_PNG_FORMAT, pngvalues[sel]); + image.SetOption(wxIMAGE_OPTION_PNG_BITDEPTH, sel % 2 ? 16 : 8); + } + } + else if ( extension == _T("cur") ) { image.Rescale(32,32); image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 0); image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 0); // This shows how you can save an image with explicitly // specified image format: - loaded = image.SaveFile(savefilename, wxBITMAP_TYPE_CUR); + saved = image.SaveFile(savefilename, wxBITMAP_TYPE_CUR); } - else + + if ( !saved ) { // This one guesses image format from filename extension // (it may fail if the extension is not recognized): - loaded = image.SaveFile(savefilename); + image.SaveFile(savefilename); } - - if ( !loaded ) - wxMessageBox(_T("No handler for this file type."), - _T("File was not saved"), - wxOK|wxCENTRE, this); } private: @@ -257,7 +289,7 @@ public: }; MyRawBitmapFrame(wxFrame *parent) - : wxFrame(parent, -1, _T("Raw bitmaps (how exciting)")), + : wxFrame(parent, wxID_ANY, _T("Raw bitmaps (how exciting)")), m_bitmap(SIZE, SIZE, 32) { SetClientSize(SIZE, SIZE); @@ -287,10 +319,12 @@ public: for ( int x = 0; x < REAL_SIZE; ++x ) { - p.Red() = r; - p.Green() = g; - p.Blue() = b; - p.Alpha() = (Data::Iterator::ChannelType)((x*255.)/REAL_SIZE); + // note that RGB must be premultiplied by alpha + unsigned a = (Data::Iterator::ChannelType)((x*255.)/REAL_SIZE); + p.Red() = r * a / 256; + p.Green() = g * a / 256; + p.Blue() = b * a / 256; + p.Alpha() = a; ++p; // same as p.OffsetX(1) } @@ -306,7 +340,7 @@ public: dc.DrawText(_T("This is alpha and raw bitmap test"), 0, BORDER); dc.DrawText(_T("This is alpha and raw bitmap test"), 0, SIZE/2 - BORDER); dc.DrawText(_T("This is alpha and raw bitmap test"), 0, SIZE - 2*BORDER); - dc.DrawBitmap( m_bitmap, 0, 0, TRUE /* use mask */ ); + dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ ); } private: @@ -354,10 +388,8 @@ END_EVENT_TABLE() MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER ) -#if !defined(__WINDOWS__) || wxUSE_XPM_IN_MSW , m_bmpSmileXpm((const char **) smile_xpm) , m_iconSmileXpm((const char **) smile_xpm) -#endif { my_horse_png = (wxBitmap*) NULL; my_horse_jpeg = (wxBitmap*) NULL; @@ -490,11 +522,9 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, my_smile_xbm = new wxBitmap( (const char*)smile_bits, smile_width, smile_height, 1 ); -#if !defined(__WINDOWS__) || wxUSE_XPM_IN_MSW // demonstrates XPM automatically using the mask when saving if ( m_bmpSmileXpm.Ok() ) m_bmpSmileXpm.SaveFile(_T("saved.xpm"), wxBITMAP_TYPE_XPM); -#endif #if wxUSE_ICO_CUR image.Destroy(); @@ -544,7 +574,7 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, tmp << i ; wxLogError(tmp); } - else + else my_horse_ani [i] = wxBitmap( image ); } #endif // wxUSE_ICO_CUR @@ -555,13 +585,14 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, wxFile file(dir + _T("horse.bmp")); if ( file.IsOpened() ) { - off_t len = file.Length(); - void *data = malloc(len); - if ( file.Read(data, len) != len ) + wxFileOffset len = file.Length(); + size_t dataSize = (size_t)len; + void *data = malloc(dataSize); + if ( file.Read(data, dataSize) != len ) wxLogError(_T("Reading bitmap file failed")); else { - wxMemoryInputStream mis(data, len); + wxMemoryInputStream mis(data, dataSize); if ( !image.LoadFile(mis) ) wxLogError(wxT("Can't load BMP image from stream")); else @@ -672,7 +703,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxRED_PEN->GetColour().Red(), wxRED_PEN->GetColour().Green(), wxRED_PEN->GetColour().Blue() ); - dc.DrawBitmap( wxBitmap(i), 150, 2010, TRUE ); + dc.DrawBitmap( wxBitmap(i), 150, 2010, true ); dc.SetTextForeground( wxT("BLACK") ); } @@ -712,62 +743,65 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxRED_PEN->GetColour().Red(), wxRED_PEN->GetColour().Green(), wxRED_PEN->GetColour().Blue() ); - dc.DrawBitmap( wxBitmap(i), 150, 2130, TRUE ); + dc.DrawBitmap( wxBitmap(i), 150, 2130, true ); dc.SetTextForeground( wxT("BLACK") ); } // For testing transparency dc.SetBrush( *wxRED_BRUSH ); dc.DrawRectangle( 20, 2220, 560, 68 ); - + dc.DrawText(_T("XPM bitmap"), 30, 2230 ); if ( m_bmpSmileXpm.Ok() ) - dc.DrawBitmap(m_bmpSmileXpm, 30, 2250, TRUE); + dc.DrawBitmap(m_bmpSmileXpm, 30, 2250, true); dc.DrawText(_T("XPM icon"), 110, 2230 ); if ( m_iconSmileXpm.Ok() ) dc.DrawIcon(m_iconSmileXpm, 110, 2250); - - // testing icon -> bitmap conversion - wxBitmap to_blit( m_iconSmileXpm ); - dc.DrawText( _T("SubBitmap"), 170, 2230 ); - wxBitmap sub = to_blit.GetSubBitmap( wxRect(0,0,15,15) ); - dc.DrawBitmap( sub, 170, 2250, TRUE ); - - dc.DrawText( _T("Enlarged"), 250, 2230 ); - dc.SetUserScale( 1.5, 1.5 ); - dc.DrawBitmap( to_blit, (int)(250/1.5), (int)(2250/1.5), TRUE ); - dc.SetUserScale( 2, 2 ); - dc.DrawBitmap( to_blit, (int)(300/2), (int)(2250/2), TRUE ); - dc.SetUserScale( 1.0, 1.0 ); - - dc.DrawText( _T("Blit"), 400, 2230); - wxMemoryDC blit_dc; - blit_dc.SelectObject( to_blit ); - dc.Blit( 400, 2250, to_blit.GetWidth(), to_blit.GetHeight(), &blit_dc, 0, 0, wxCOPY, TRUE ); - dc.SetUserScale( 1.5, 1.5 ); - dc.Blit( (int)(450/1.5), (int)(2250/1.5), to_blit.GetWidth(), to_blit.GetHeight(), &blit_dc, 0, 0, wxCOPY, TRUE ); - dc.SetUserScale( 2, 2 ); - dc.Blit( (int)(500/2), (int)(2250/2), to_blit.GetWidth(), to_blit.GetHeight(), &blit_dc, 0, 0, wxCOPY, TRUE ); - dc.SetUserScale( 1.0, 1.0 ); + // testing icon -> bitmap conversion + wxBitmap to_blit( m_iconSmileXpm ); + if (to_blit.Ok()) + { + dc.DrawText( _T("SubBitmap"), 170, 2230 ); + wxBitmap sub = to_blit.GetSubBitmap( wxRect(0,0,15,15) ); + if (sub.Ok()) + dc.DrawBitmap( sub, 170, 2250, true ); + + dc.DrawText( _T("Enlarged"), 250, 2230 ); + dc.SetUserScale( 1.5, 1.5 ); + dc.DrawBitmap( to_blit, (int)(250/1.5), (int)(2250/1.5), true ); + dc.SetUserScale( 2, 2 ); + dc.DrawBitmap( to_blit, (int)(300/2), (int)(2250/2), true ); + dc.SetUserScale( 1.0, 1.0 ); + + dc.DrawText( _T("Blit"), 400, 2230); + wxMemoryDC blit_dc; + blit_dc.SelectObject( to_blit ); + dc.Blit( 400, 2250, to_blit.GetWidth(), to_blit.GetHeight(), &blit_dc, 0, 0, wxCOPY, true ); + dc.SetUserScale( 1.5, 1.5 ); + dc.Blit( (int)(450/1.5), (int)(2250/1.5), to_blit.GetWidth(), to_blit.GetHeight(), &blit_dc, 0, 0, wxCOPY, true ); + dc.SetUserScale( 2, 2 ); + dc.Blit( (int)(500/2), (int)(2250/2), to_blit.GetWidth(), to_blit.GetHeight(), &blit_dc, 0, 0, wxCOPY, true ); + dc.SetUserScale( 1.0, 1.0 ); + } dc.DrawText( _T("ICO handler (1st image)"), 30, 2290 ); if (my_horse_ico32 && my_horse_ico32->Ok()) - dc.DrawBitmap( *my_horse_ico32, 30, 2330, TRUE ); + dc.DrawBitmap( *my_horse_ico32, 30, 2330, true ); dc.DrawText( _T("ICO handler (2nd image)"), 230, 2290 ); if (my_horse_ico16 && my_horse_ico16->Ok()) - dc.DrawBitmap( *my_horse_ico16, 230, 2330, TRUE ); + dc.DrawBitmap( *my_horse_ico16, 230, 2330, true ); dc.DrawText( _T("ICO handler (best image)"), 430, 2290 ); if (my_horse_ico && my_horse_ico->Ok()) - dc.DrawBitmap( *my_horse_ico, 430, 2330, TRUE ); + dc.DrawBitmap( *my_horse_ico, 430, 2330, true ); dc.DrawText( _T("CUR handler"), 30, 2390 ); if (my_horse_cur && my_horse_cur->Ok()) { - dc.DrawBitmap( *my_horse_cur, 30, 2420, TRUE ); + dc.DrawBitmap( *my_horse_cur, 30, 2420, true ); dc.SetPen (*wxRED_PEN); dc.DrawLine (xH-10,yH,xH+10,yH); dc.DrawLine (xH,yH-10,xH,yH+10); @@ -777,7 +811,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) for (i=0; i < m_ani_images; i ++) if (my_horse_ani[i].Ok()) { - dc.DrawBitmap( my_horse_ani[i], 230 + i * 2 * my_horse_ani[i].GetWidth() , 2420, TRUE ); + dc.DrawBitmap( my_horse_ani[i], 230 + i * 2 * my_horse_ani[i].GetWidth() , 2420, true ); } } @@ -825,7 +859,7 @@ void MyCanvas::CreateAntiAliasedBitmap() original.GetBlue( x*2, y*2+1 ) + original.GetBlue( x*2+1, y*2+1 ); blue = blue/4; - anti.SetRGB( x, y, red, green, blue ); + anti.SetRGB( x, y, (unsigned char)red, (unsigned char)green, (unsigned char)blue ); } my_anti = new wxBitmap(anti); } @@ -857,7 +891,7 @@ BEGIN_EVENT_TABLE(MyFrame,wxFrame) END_EVENT_TABLE() MyFrame::MyFrame() - : wxFrame( (wxFrame *)NULL, -1, _T("wxImage sample"), + : wxFrame( (wxFrame *)NULL, wxID_ANY, _T("wxImage sample"), wxPoint(20,20), wxSize(470,360) ) { wxMenuBar *menu_bar = new wxMenuBar(); @@ -883,11 +917,13 @@ MyFrame::MyFrame() SetMenuBar( menu_bar ); +#if wxUSE_STATUSBAR CreateStatusBar(2); int widths[] = { -1, 100 }; SetStatusWidths( 2, widths ); +#endif // wxUSE_STATUSBAR - m_canvas = new MyCanvas( this, -1, wxPoint(0,0), wxSize(10,10) ); + m_canvas = new MyCanvas( this, wxID_ANY, wxPoint(0,0), wxSize(10,10) ); // 500 width * 2500 height m_canvas->SetScrollbars( 10, 10, 50, 250 ); @@ -895,7 +931,7 @@ MyFrame::MyFrame() void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) { - Close( TRUE ); + Close( true ); } void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) ) @@ -1007,8 +1043,8 @@ bool MyApp::OnInit() #endif wxFrame *frame = new MyFrame(); - frame->Show( TRUE ); + frame->Show( true ); - return TRUE; + return true; }