X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bd981f27c91ebf89188b4f0c38a107d5aab739ac..08a581335008a302a5104d9629359ab6eab61de4:/samples/image/image.cpp diff --git a/samples/image/image.cpp b/samples/image/image.cpp index b8d131102a..9a3ac09a01 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -17,7 +17,7 @@ #endif #ifndef WX_PRECOMP -#include "wx/wx.h" + #include "wx/wx.h" #endif #include "wx/image.h" @@ -83,11 +83,13 @@ public: wxBitmap my_horse_rawgrey_pnm; wxBitmap colorized_horse_jpeg; + wxBitmap my_cmyk_jpeg; wxBitmap my_toucan; wxBitmap my_toucan_flipped_horiz; wxBitmap my_toucan_flipped_vert; wxBitmap my_toucan_flipped_both; + wxBitmap my_toucan_grey; wxBitmap my_toucan_head; int xH, yH ; @@ -169,7 +171,7 @@ public: wxT("PCX files (*.pcx)|*.pcx|") wxT("ICO files (*.ico)|*.ico|") wxT("CUR files (*.cur)|*.cur"), - wxSAVE, + wxFD_SAVE, this); if ( savefilename.empty() ) @@ -300,28 +302,31 @@ public: MyRawBitmapFrame(wxFrame *parent) : wxFrame(parent, wxID_ANY, _T("Raw bitmaps (how exciting)")), - m_bitmap(SIZE, SIZE, 32) + m_bitmap(SIZE, SIZE, 24), + m_alphaBitmap(SIZE, SIZE, 32) { - SetClientSize(SIZE, SIZE); + SetClientSize(SIZE, SIZE*2+25); - // another possibility: wxNativePixelData (don't forget to remove code - // setting alpha in the loop below then) - typedef wxAlphaPixelData Data; - // typedef wxNativePixelData Data; + InitAlphaBitmap(); + InitBitmap(); + } + + void InitAlphaBitmap() + { // First, clear the whole bitmap by making it alpha { - Data data( m_bitmap, wxPoint(0,0), wxSize(SIZE, SIZE) ); + wxAlphaPixelData data( m_alphaBitmap, wxPoint(0,0), wxSize(SIZE, SIZE) ); if ( !data ) { wxLogError(_T("Failed to gain raw access to bitmap data")); return; } data.UseAlpha(); - Data::Iterator p(data); + wxAlphaPixelData::Iterator p(data); for ( int y = 0; y < SIZE; ++y ) { - Data::Iterator rowStart = p; + wxAlphaPixelData::Iterator rowStart = p; for ( int x = 0; x < SIZE; ++x ) { p.Alpha() = 0; @@ -333,7 +338,8 @@ public: } // Then, draw colourful alpha-blended stripes - Data data(m_bitmap, wxPoint(BORDER, BORDER) , wxSize(REAL_SIZE, REAL_SIZE)); + wxAlphaPixelData data(m_alphaBitmap, wxPoint(BORDER, BORDER), + wxSize(REAL_SIZE, REAL_SIZE)); if ( !data ) { wxLogError(_T("Failed to gain raw access to bitmap data")); @@ -341,12 +347,11 @@ public: } data.UseAlpha(); - - Data::Iterator p(data); + wxAlphaPixelData::Iterator p(data); for ( int y = 0; y < REAL_SIZE; ++y ) { - Data::Iterator rowStart = p; + wxAlphaPixelData::Iterator rowStart = p; int r = y < REAL_SIZE/3 ? 255 : 0, g = (REAL_SIZE/3 <= y) && (y < 2*(REAL_SIZE/3)) ? 255 : 0, @@ -355,7 +360,7 @@ public: for ( int x = 0; x < REAL_SIZE; ++x ) { // note that RGB must be premultiplied by alpha - unsigned a = (Data::Iterator::ChannelType)((x*255.)/REAL_SIZE); + unsigned a = (wxAlphaPixelData::Iterator::ChannelType)((x*255.)/REAL_SIZE); p.Red() = r * a / 256; p.Green() = g * a / 256; p.Blue() = b * a / 256; @@ -369,17 +374,53 @@ public: } } + void InitBitmap() + { + // draw some colourful stripes without alpha + wxNativePixelData data(m_bitmap); + if ( !data ) + { + wxLogError(_T("Failed to gain raw access to bitmap data")); + return; + } + + wxNativePixelData::Iterator p(data); + for ( int y = 0; y < SIZE; ++y ) + { + wxNativePixelData::Iterator rowStart = p; + + int r = y < SIZE/3 ? 255 : 0, + g = (SIZE/3 <= y) && (y < 2*(SIZE/3)) ? 255 : 0, + b = 2*(SIZE/3) <= y ? 255 : 0; + + for ( int x = 0; x < SIZE; ++x ) + { + p.Red() = r; + p.Green() = g; + p.Blue() = b; + ++p; // same as p.OffsetX(1) + } + + p = rowStart; + p.OffsetY(data, 1); + } + } + void OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc( this ); 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_alphaBitmap, 0, 0, true /* use mask */ ); + + dc.DrawText(_T("Raw bitmap access without alpha"), 0, SIZE+5); + dc.DrawBitmap( m_bitmap, 0, SIZE+5+dc.GetCharHeight()); } private: wxBitmap m_bitmap; + wxBitmap m_alphaBitmap; DECLARE_EVENT_TABLE() }; @@ -467,11 +508,15 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, else my_horse_png = wxBitmap( image ); - image = wxImage(wxT("toucan.png")); - my_toucan = wxBitmap(image); + if ( !image.LoadFile( dir + _T("toucan.png")) ) + wxLogError(wxT("Can't load PNG image")); + else + my_toucan = wxBitmap(image); + my_toucan_flipped_horiz = wxBitmap(image.Mirror(true)); my_toucan_flipped_vert = wxBitmap(image.Mirror(false)); my_toucan_flipped_both = wxBitmap(image.Mirror(true).Mirror(false)); + my_toucan_grey = wxBitmap(image.ConvertToGreyscale()); my_toucan_head = wxBitmap(image.GetSubImage(wxRect(40, 7, 80, 60))); #endif // wxUSE_LIBPNG @@ -484,12 +529,18 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, else { my_horse_jpeg = wxBitmap( image ); + // Colorize by rotating green hue to red wxImage::HSVValue greenHSV = wxImage::RGBtoHSV(wxImage::RGBValue(0, 255, 0)); wxImage::HSVValue redHSV = wxImage::RGBtoHSV(wxImage::RGBValue(255, 0, 0)); image.RotateHue(redHSV.hue - greenHSV.hue); colorized_horse_jpeg = wxBitmap( image ); } + + if ( !image.LoadFile( dir + _T("cmyk.jpg")) ) + wxLogError(_T("Can't load CMYK JPG image")); + else + my_cmyk_jpeg = wxBitmap(image); #endif // wxUSE_LIBJPEG #if wxUSE_GIF @@ -685,6 +736,14 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (my_horse_jpeg.Ok()) dc.DrawBitmap( my_horse_jpeg, 30, 380 ); + dc.DrawText( _T("Green rotated to red"), 280, 365 ); + if (colorized_horse_jpeg.Ok()) + dc.DrawBitmap( colorized_horse_jpeg, 280, 380 ); + + dc.DrawText( _T("CMYK JPEG image"), 530, 365 ); + if (my_cmyk_jpeg.Ok()) + dc.DrawBitmap( my_cmyk_jpeg, 530, 380 ); + dc.DrawText( _T("GIF handler"), 30, 595 ); if (my_horse_gif.Ok()) dc.DrawBitmap( my_horse_gif, 30, 610 ); @@ -721,24 +780,29 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (my_horse_xpm.Ok()) dc.DrawBitmap( my_horse_xpm, 30, 1760 ); + // toucans { - int x = 200, y = 300, yy = 170;; + int x = 750, y = 10, yy = 170; dc.DrawText(wxT("Original toucan"), x+50, y); - dc.DrawBitmap(my_toucan, x, y+15); + dc.DrawBitmap(my_toucan, x, y+15, true); y += yy; dc.DrawText(wxT("Flipped horizontally"), x+50, y); - dc.DrawBitmap(my_toucan_flipped_horiz, x, y+15); + dc.DrawBitmap(my_toucan_flipped_horiz, x, y+15, true); y += yy; dc.DrawText(wxT("Flipped vertically"), x+50, y); - dc.DrawBitmap(my_toucan_flipped_vert, x, y+15); + dc.DrawBitmap(my_toucan_flipped_vert, x, y+15, true); y += yy; dc.DrawText(wxT("Flipped both h&v"), x+50, y); - dc.DrawBitmap(my_toucan_flipped_both, x, y+15); + dc.DrawBitmap(my_toucan_flipped_both, x, y+15, true); + + y += yy; + dc.DrawText(wxT("In greyscale"), x+50, y); + dc.DrawBitmap(my_toucan_grey, x, y+15, true); y += yy; dc.DrawText(wxT("Toucan's head"), x+50, y); - dc.DrawBitmap(my_toucan_head, x, y+15); + dc.DrawBitmap(my_toucan_head, x, y+15, true); } if (my_smile_xbm.Ok()) @@ -749,7 +813,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.SetTextBackground( _T("RED") ); dc.DrawBitmap( my_smile_xbm, 30, 2010 ); - dc.SetTextForeground( wxT("BLACK") ); + dc.SetTextForeground( *wxBLACK ); dc.DrawText( _T("After wxImage conversion"), 150, 1975 ); dc.DrawText( _T("(red on white)"), 150, 1990 ); dc.SetTextForeground( wxT("RED") ); @@ -760,7 +824,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxRED_PEN->GetColour().Green(), wxRED_PEN->GetColour().Blue() ); dc.DrawBitmap( wxBitmap(i), 150, 2010, true ); - dc.SetTextForeground( wxT("BLACK") ); + dc.SetTextForeground( *wxBLACK ); } @@ -789,7 +853,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.SetTextBackground( wxT("GREEN") ); dc.DrawBitmap( mono, 30, 2130 ); - dc.SetTextForeground( wxT("BLACK") ); + dc.SetTextForeground( *wxBLACK ); dc.DrawText( _T("After wxImage conversion"), 150, 2095 ); dc.DrawText( _T("(red on white)"), 150, 2110 ); dc.SetTextForeground( wxT("RED") ); @@ -800,7 +864,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxRED_PEN->GetColour().Green(), wxRED_PEN->GetColour().Blue() ); dc.DrawBitmap( wxBitmap(i), 150, 2130, true ); - dc.SetTextForeground( wxT("BLACK") ); + dc.SetTextForeground( *wxBLACK ); } // For testing transparency @@ -871,15 +935,6 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.DrawBitmap( my_horse_ani[i], 230 + i * 2 * my_horse_ani[i].GetWidth() , 2420, true ); } } - -#if wxUSE_LIBJPEG - if (colorized_horse_jpeg.Ok()) - { - dc.DrawText( _T("Colorize image by rotating green hue to red"), 30, 2490 ); - dc.DrawBitmap( colorized_horse_jpeg, 30, 2520 ); - } -#endif // wxUSE_LIBJPEG - } void MyCanvas::CreateAntiAliasedBitmap() @@ -959,7 +1014,7 @@ END_EVENT_TABLE() MyFrame::MyFrame() : wxFrame( (wxFrame *)NULL, wxID_ANY, _T("wxImage sample"), - wxPoint(20,20), wxSize(470,360) ) + wxPoint(20, 20), wxSize(950, 700) ) { wxMenuBar *menu_bar = new wxMenuBar();