home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / samples / image / image.cpp < prev    next >
C/C++ Source or Header  |  2002-12-04  |  23KB  |  814 lines

  1. /*
  2.  * Program: image
  3.  *
  4.  * Author: Robert Roebling
  5.  *
  6.  * Copyright: (C) 1998, Robert Roebling
  7.  *
  8.  */
  9.  
  10. // For compilers that support precompilation, includes "wx/wx.h".
  11. #include "wx/wxprec.h"
  12.  
  13. #ifdef __BORLANDC__
  14. #pragma hdrstop
  15. #endif
  16.  
  17. #ifndef WX_PRECOMP
  18. #include "wx/wx.h"
  19. #endif
  20.  
  21. #include "wx/image.h"
  22. #include "wx/file.h"
  23. #include "wx/mstream.h"
  24. #include "wx/wfstream.h"
  25. #include "wx/quantize.h"
  26.  
  27. #include "smile.xbm"
  28.  
  29. #if !defined(__WINDOWS__) || wxUSE_XPM_IN_MSW
  30.     #include "smile.xpm"
  31. #endif
  32.  
  33.  
  34. // derived classes
  35.  
  36. class MyFrame;
  37. class MyApp;
  38.  
  39. // MyCanvas
  40.  
  41. class MyCanvas: public wxScrolledWindow
  42. {
  43. public:
  44.     MyCanvas() {}
  45.     MyCanvas( wxWindow *parent, wxWindowID, const wxPoint &pos, const wxSize &size );
  46.     ~MyCanvas();
  47.     void OnPaint( wxPaintEvent &event );
  48.     void CreateAntiAliasedBitmap();
  49.  
  50.     wxBitmap  *my_horse_png;
  51.     wxBitmap  *my_horse_jpeg;
  52.     wxBitmap  *my_horse_gif;
  53.     wxBitmap  *my_horse_bmp;
  54.     wxBitmap  *my_horse_bmp2;
  55.     wxBitmap  *my_horse_pcx;
  56.     wxBitmap  *my_horse_pnm;
  57.     wxBitmap  *my_horse_tiff;
  58.     wxBitmap  *my_horse_xpm;
  59.     wxBitmap  *my_horse_ico32;
  60.     wxBitmap  *my_horse_ico16;
  61.     wxBitmap  *my_horse_ico;
  62.     wxBitmap  *my_horse_cur;
  63.     wxBitmap  *my_horse_ani;
  64.  
  65.     wxBitmap  *my_smile_xbm;
  66.     wxBitmap  *my_square;
  67.     wxBitmap  *my_anti;
  68.  
  69.     int xH, yH ;
  70.     int m_ani_images ;
  71.  
  72. protected:
  73.     wxBitmap m_bmpSmileXpm;
  74.     wxIcon   m_iconSmileXpm;
  75.  
  76. private:
  77.     DECLARE_DYNAMIC_CLASS(MyCanvas)
  78.     DECLARE_EVENT_TABLE()
  79. };
  80.  
  81.  
  82. const int nChoices = 8 ;
  83. static const wxString bppchoices[nChoices] =
  84. {
  85.     _T("1 bpp color"),
  86.     _T("1 bpp B&W"),
  87.     _T("4 bpp color"),
  88.     _T("8 bpp color"),
  89.     _T("8 bpp greyscale"),
  90.     _T("8 bpp red"),
  91.     _T("8 bpp own palette"),
  92.     _T("24 bpp")
  93. };
  94.  
  95. static const int bppvalues[nChoices] =
  96. {
  97.     wxBMP_1BPP,
  98.     wxBMP_1BPP_BW,
  99.     wxBMP_4BPP,
  100.     wxBMP_8BPP,
  101.     wxBMP_8BPP_GREY,
  102.     wxBMP_8BPP_RED,
  103.     wxBMP_8BPP_PALETTE,
  104.     wxBMP_24BPP
  105. };
  106.  
  107. // MyFrame
  108.  
  109.  
  110. class MyFrame: public wxFrame
  111. {
  112. public:
  113.     MyFrame();
  114.  
  115.     void OnAbout( wxCommandEvent &event );
  116.     void OnNewFrame( wxCommandEvent &event );
  117.     void OnQuit( wxCommandEvent &event );
  118.  
  119.     MyCanvas         *m_canvas;
  120.  
  121. private:
  122.     DECLARE_DYNAMIC_CLASS(MyFrame)
  123.     DECLARE_EVENT_TABLE()
  124. };
  125.  
  126. class MyImageFrame : public wxFrame
  127. {
  128. public:
  129.     MyImageFrame(wxFrame *parent, const wxBitmap& bitmap)
  130.         : wxFrame(parent, -1, _T("Double click to save"),
  131.                   wxDefaultPosition, wxDefaultSize,
  132.                   wxCAPTION | wxSYSTEM_MENU),
  133.                   m_bitmap(bitmap)
  134.     {
  135.         SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
  136.     }
  137.  
  138.     void OnPaint(wxPaintEvent& WXUNUSED(event))
  139.     {
  140.         wxPaintDC dc( this );
  141.         //TRUE for masked images
  142.         dc.DrawBitmap( m_bitmap, 0, 0, TRUE );
  143.     }
  144.  
  145.     void OnSave(wxCommandEvent& WXUNUSED(event))
  146.     {
  147.         wxImage image = m_bitmap.ConvertToImage();
  148.  
  149.         int bppselection = wxGetSingleChoiceIndex(_T("Set BMP BPP"),
  150.                                                   _T("Set BMP BPP"),
  151.                                                   nChoices,
  152.                                                   bppchoices,
  153.                                                   this);
  154.         if ( bppselection == -1 )
  155.         {
  156.             // cancelled
  157.             return;
  158.         }
  159.  
  160.         image.SetOption(wxIMAGE_OPTION_BMP_FORMAT, bppvalues[bppselection]);
  161.  
  162.         wxString deffilename = bppchoices[bppselection];
  163.         deffilename.Replace(wxT(" "), wxT("_"));
  164.         deffilename += wxT(".bmp");
  165.         wxString savefilename = wxFileSelector( wxT("Save Image"),
  166.                                                 wxT(""),
  167.                                                 deffilename,
  168.                                                 (const wxChar *)NULL,
  169.                                             wxT("BMP files (*.bmp)|*.bmp|")
  170.                                             wxT("PNG files (*.png)|*.png|")
  171.                                             wxT("JPEG files (*.jpg)|*.jpg|")
  172.                                             wxT("GIF files (*.gif)|*.gif|")
  173.                                             wxT("TIFF files (*.tif)|*.tif|")
  174.                                             wxT("PCX files (*.pcx)|*.pcx|")
  175.                                             wxT("ICO files (*.ico)|*.ico|")
  176.                                             wxT("CUR files (*.cur)|*.cur"),
  177.                                                 wxSAVE);
  178.  
  179.         if ( savefilename.empty() )
  180.             return;
  181.  
  182.         if ( image.GetOptionInt(wxIMAGE_OPTION_BMP_FORMAT) == wxBMP_8BPP_PALETTE )
  183.         {
  184.             unsigned char *cmap = new unsigned char [256];
  185.             for ( int i = 0; i < 256; i++ )
  186.                 cmap[i] = i;
  187.             image.SetPalette(wxPalette(256, cmap, cmap, cmap));
  188.  
  189.             delete cmap;
  190.         }
  191.  
  192.         bool loaded;
  193.         wxString extension = savefilename.AfterLast('.').Lower();
  194.  
  195.         if (extension == _T("cur"))
  196.         {
  197.             image.Rescale(32,32);
  198.             image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 0);
  199.             image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 0);
  200.             // This shows how you can save an image with explicitly
  201.             // specified image format:
  202.             loaded = image.SaveFile(savefilename, wxBITMAP_TYPE_CUR);
  203.         }
  204.         else
  205.         {
  206.             // This one guesses image format from filename extension
  207.             // (it may fail if the extension is not recognized):
  208.             loaded = image.SaveFile(savefilename);
  209.         }
  210.  
  211.         if ( !loaded )
  212.             wxMessageBox(_T("No handler for this file type."),
  213.                          _T("File was not saved"),
  214.                          wxOK|wxCENTRE, this);
  215.     }
  216.  
  217. private:
  218.     wxBitmap m_bitmap;
  219.  
  220.     DECLARE_EVENT_TABLE()
  221. };
  222.  
  223. // MyApp
  224.  
  225. class MyApp: public wxApp
  226. {
  227. public:
  228.     virtual bool OnInit();
  229. };
  230.  
  231. // main program
  232.  
  233. IMPLEMENT_APP(MyApp)
  234.  
  235. // MyCanvas
  236.  
  237. IMPLEMENT_DYNAMIC_CLASS(MyCanvas, wxScrolledWindow)
  238.  
  239. BEGIN_EVENT_TABLE(MyImageFrame, wxFrame)
  240.   EVT_PAINT(MyImageFrame::OnPaint)
  241.   EVT_LEFT_DCLICK(MyImageFrame::OnSave)
  242. END_EVENT_TABLE()
  243.  
  244. BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
  245.   EVT_PAINT(MyCanvas::OnPaint)
  246. END_EVENT_TABLE()
  247.  
  248. MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id,
  249.                     const wxPoint &pos, const wxSize &size )
  250.         : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER )
  251. #if !defined(__WINDOWS__) || wxUSE_XPM_IN_MSW
  252.           , m_bmpSmileXpm((const char **) smile_xpm)
  253.           , m_iconSmileXpm((const char **) smile_xpm)
  254. #endif
  255. {
  256.     my_horse_png = (wxBitmap*) NULL;
  257.     my_horse_jpeg = (wxBitmap*) NULL;
  258.     my_horse_gif = (wxBitmap*) NULL;
  259.     my_horse_bmp = (wxBitmap*) NULL;
  260.     my_horse_bmp2 = (wxBitmap*) NULL;
  261.     my_horse_pcx = (wxBitmap*) NULL;
  262.     my_horse_pnm = (wxBitmap*) NULL;
  263.     my_horse_tiff = (wxBitmap*) NULL;
  264.     my_horse_xpm = (wxBitmap*) NULL;
  265.     my_horse_ico32 = (wxBitmap*) NULL;
  266.     my_horse_ico16 = (wxBitmap*) NULL;
  267.     my_horse_ico = (wxBitmap*) NULL;
  268.     my_horse_cur = (wxBitmap*) NULL;
  269.     my_horse_ani = (wxBitmap*) NULL;
  270.  
  271.     my_smile_xbm = (wxBitmap*) NULL;
  272.     my_square = (wxBitmap*) NULL;
  273.     my_anti = (wxBitmap*) NULL;
  274.  
  275.     m_ani_images = 0 ;
  276.  
  277.     SetBackgroundColour(* wxWHITE);
  278.  
  279.     wxBitmap bitmap( 100, 100 );
  280.  
  281.     wxMemoryDC dc;
  282.     dc.SelectObject( bitmap );
  283.     dc.SetBrush( wxBrush( wxT("orange"), wxSOLID ) );
  284.     dc.SetPen( *wxBLACK_PEN );
  285.     dc.DrawRectangle( 0, 0, 100, 100 );
  286.     dc.SetBrush( *wxWHITE_BRUSH );
  287.     dc.DrawRectangle( 20, 20, 60, 60 );
  288.     dc.SelectObject( wxNullBitmap );
  289.  
  290.     // try to find the directory with our images
  291.     wxString dir;
  292.     if ( wxFile::Exists(wxT("./horse.png")) )
  293.         dir = wxT("./");
  294.     else if ( wxFile::Exists(wxT("../horse.png")) )
  295.         dir = wxT("../");
  296.     else
  297.         wxLogWarning(wxT("Can't find image files in either '.' or '..'!"));
  298.  
  299.     wxImage image = bitmap.ConvertToImage();
  300.  
  301. #if wxUSE_LIBPNG
  302.     if ( !image.SaveFile( dir + _T("test.png"), wxBITMAP_TYPE_PNG ))
  303.         wxLogError(wxT("Can't save file"));
  304.  
  305.     image.Destroy();
  306.  
  307.     image.LoadFile( dir + _T("test.png") );
  308.     my_square = new wxBitmap( image );
  309.  
  310.     image.Destroy();
  311.  
  312.     if ( !image.LoadFile( dir + _T("horse.png")) )
  313.         wxLogError(wxT("Can't load PNG image"));
  314.     else
  315.         my_horse_png = new wxBitmap( image );
  316. #endif // wxUSE_LIBPNG
  317.  
  318. #if wxUSE_LIBJPEG
  319.     image.Destroy();
  320.  
  321.     if ( !image.LoadFile( dir + _T("horse.jpg")) )
  322.         wxLogError(wxT("Can't load JPG image"));
  323.     else
  324.         my_horse_jpeg = new wxBitmap( image );
  325. #endif // wxUSE_LIBJPEG
  326.  
  327. #if wxUSE_GIF
  328.     image.Destroy();
  329.  
  330.     if ( !image.LoadFile( dir + _T("horse.gif" )) )
  331.         wxLogError(wxT("Can't load GIF image"));
  332.     else
  333.         my_horse_gif = new wxBitmap( image );
  334. #endif
  335.  
  336. #if wxUSE_PCX
  337.     image.Destroy();
  338.  
  339.     if ( !image.LoadFile( dir + _T("horse.pcx"), wxBITMAP_TYPE_PCX ) )
  340.         wxLogError(wxT("Can't load PCX image"));
  341.     else
  342.         my_horse_pcx = new wxBitmap( image );
  343. #endif
  344.  
  345.     image.Destroy();
  346.  
  347.     if ( !image.LoadFile( dir + _T("horse.bmp"), wxBITMAP_TYPE_BMP ) )
  348.         wxLogError(wxT("Can't load BMP image"));
  349.     else
  350.         my_horse_bmp = new wxBitmap( image );
  351.  
  352. #if wxUSE_XPM
  353.     image.Destroy();
  354.  
  355.     if ( !image.LoadFile( dir + _T("horse.xpm"), wxBITMAP_TYPE_XPM ) )
  356.         wxLogError(wxT("Can't load XPM image"));
  357.     else
  358.         my_horse_xpm = new wxBitmap( image );
  359.  
  360.     if ( !image.SaveFile( dir + _T("test.xpm"), wxBITMAP_TYPE_XPM ))
  361.         wxLogError(wxT("Can't save file"));
  362. #endif
  363.  
  364. #if wxUSE_PNM
  365.     image.Destroy();
  366.  
  367.     if ( !image.LoadFile( dir + _T("horse.pnm"), wxBITMAP_TYPE_PNM ) )
  368.         wxLogError(wxT("Can't load PNM image"));
  369.     else
  370.         my_horse_pnm = new wxBitmap( image );
  371. #endif
  372.  
  373. #if wxUSE_LIBTIFF
  374.     image.Destroy();
  375.  
  376.     if ( !image.LoadFile( dir + _T("horse.tif"), wxBITMAP_TYPE_TIF ) )
  377.         wxLogError(wxT("Can't load TIFF image"));
  378.     else
  379.         my_horse_tiff = new wxBitmap( image );
  380. #endif
  381.  
  382.     CreateAntiAliasedBitmap();
  383.  
  384.     my_smile_xbm = new wxBitmap( (const char*)smile_bits, smile_width,
  385.                                  smile_height, 1 );
  386.  
  387. #if !defined(__WINDOWS__) || wxUSE_XPM_IN_MSW
  388.     // demonstrates XPM automatically using the mask when saving
  389.     if ( m_bmpSmileXpm.Ok() )
  390.         m_bmpSmileXpm.SaveFile(_T("saved.xpm"), wxBITMAP_TYPE_XPM);
  391. #endif
  392.  
  393. #if wxUSE_ICO_CUR
  394.     image.Destroy();
  395.  
  396.     if ( !image.LoadFile( dir + _T("horse.ico"), wxBITMAP_TYPE_ICO, 0 ) )
  397.         wxLogError(wxT("Can't load first ICO image"));
  398.     else
  399.         my_horse_ico32 = new wxBitmap( image );
  400.  
  401.     image.Destroy();
  402.  
  403.     if ( !image.LoadFile( dir + _T("horse.ico"), wxBITMAP_TYPE_ICO, 1 ) )
  404.         wxLogError(wxT("Can't load second ICO image"));
  405.     else
  406.         my_horse_ico16 = new wxBitmap( image );
  407.  
  408.     image.Destroy();
  409.  
  410.     if ( !image.LoadFile( dir + _T("horse.ico") ) )
  411.         wxLogError(wxT("Can't load best ICO image"));
  412.     else
  413.         my_horse_ico = new wxBitmap( image );
  414.  
  415.     image.Destroy();
  416.  
  417.     if ( !image.LoadFile( dir + _T("horse.cur"), wxBITMAP_TYPE_CUR ) )
  418.         wxLogError(wxT("Can't load best ICO image"));
  419.     else
  420.     {
  421.         my_horse_cur = new wxBitmap( image );
  422.         xH = 30 + image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X) ;
  423.         yH = 2420 + image.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y) ;
  424.     }
  425.  
  426.     m_ani_images = wxImage::GetImageCount ( dir + _T("horse3.ani"), wxBITMAP_TYPE_ANI );
  427.     if (m_ani_images==0)
  428.         wxLogError(wxT("No ANI-format images found"));
  429.     else
  430.         my_horse_ani = new wxBitmap [m_ani_images];
  431.     int i ;
  432.     for (i=0; i < m_ani_images; i++)
  433.     {
  434.         image.Destroy();
  435.         if (!image.LoadFile( dir + _T("horse3.ani"), wxBITMAP_TYPE_ANI, i ))
  436.         {
  437.             wxString tmp = wxT("Can't load image number ");
  438.             tmp << i ;
  439.             wxLogError(tmp);
  440.         }
  441.         else    
  442.             my_horse_ani [i] = wxBitmap( image );
  443.     }
  444.     
  445.     
  446. #endif
  447.  
  448.     image.Destroy();
  449.  
  450.     // test image loading from stream
  451.     wxFile file(dir + _T("horse.bmp"));
  452.     off_t len = file.Length();
  453.     void *data = malloc(len);
  454.     if ( file.Read(data, len) != len )
  455.         wxLogError(_T("Reading bitmap file failed"));
  456.     else
  457.     {
  458.         wxMemoryInputStream mis(data, len);
  459.         if ( !image.LoadFile(mis) )
  460.             wxLogError(wxT("Can't load BMP image from stream"));
  461.         else
  462.             my_horse_bmp2 = new wxBitmap( image );
  463.     }
  464.  
  465.     free(data);
  466. }
  467.  
  468. MyCanvas::~MyCanvas()
  469. {
  470.     delete my_horse_pnm;
  471.     delete my_horse_png;
  472.     delete my_horse_jpeg;
  473.     delete my_horse_gif;
  474.     delete my_horse_bmp;
  475.     delete my_horse_bmp2;
  476.     delete my_horse_pcx;
  477.     delete my_horse_tiff;
  478.     delete my_horse_xpm;
  479.     delete my_horse_ico32;
  480.     delete my_horse_ico16;
  481.     delete my_horse_ico;
  482.     delete my_horse_cur;
  483.     delete [] my_horse_ani;
  484.     delete my_smile_xbm;
  485.     delete my_square;
  486.     delete my_anti;
  487. }
  488.  
  489. void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
  490. {
  491.     wxPaintDC dc( this );
  492.     PrepareDC( dc );
  493.  
  494.     dc.DrawText( _T("Loaded image"), 30, 10 );
  495.     if (my_square && my_square->Ok()) dc.DrawBitmap( *my_square, 30, 30 );
  496.  
  497.     dc.DrawText( _T("Drawn directly"), 150, 10 );
  498.     dc.SetBrush( wxBrush( wxT("orange"), wxSOLID ) );
  499.     dc.SetPen( *wxBLACK_PEN );
  500.     dc.DrawRectangle( 150, 30, 100, 100 );
  501.     dc.SetBrush( *wxWHITE_BRUSH );
  502.     dc.DrawRectangle( 170, 50, 60, 60 );
  503.  
  504.     if (my_anti && my_anti->Ok())
  505.         dc.DrawBitmap( *my_anti, 280, 30 );
  506.  
  507.     dc.DrawText( _T("PNG handler"), 30, 135 );
  508.     if (my_horse_png && my_horse_png->Ok())
  509.     {
  510.         dc.DrawBitmap( *my_horse_png, 30, 150 );
  511.         wxRect rect(0,0,100,100);
  512.         wxBitmap sub( my_horse_png->GetSubBitmap(rect) );
  513.         dc.DrawText( _T("GetSubBitmap()"), 280, 190 );
  514.         dc.DrawBitmap( sub, 280, 210 );
  515.     }
  516.  
  517.     dc.DrawText( _T("JPEG handler"), 30, 365 );
  518.     if (my_horse_jpeg && my_horse_jpeg->Ok())
  519.         dc.DrawBitmap( *my_horse_jpeg, 30, 380 );
  520.  
  521.     dc.DrawText( _T("GIF handler"), 30, 595 );
  522.     if (my_horse_gif && my_horse_gif->Ok())
  523.         dc.DrawBitmap( *my_horse_gif, 30, 610 );
  524.  
  525.     dc.DrawText( _T("PCX handler"), 30, 825 );
  526.     if (my_horse_pcx && my_horse_pcx->Ok())
  527.         dc.DrawBitmap( *my_horse_pcx, 30, 840 );
  528.  
  529.     dc.DrawText( _T("BMP handler"), 30, 1055 );
  530.     if (my_horse_bmp && my_horse_bmp->Ok())
  531.         dc.DrawBitmap( *my_horse_bmp, 30, 1070 );
  532.  
  533.     dc.DrawText( _T("BMP read from memory"), 280, 1055 );
  534.     if (my_horse_bmp2 && my_horse_bmp2->Ok())
  535.         dc.DrawBitmap( *my_horse_bmp2, 280, 1070 );
  536.  
  537.     dc.DrawText( _T("PNM handler"), 30, 1285 );
  538.     if (my_horse_pnm && my_horse_pnm->Ok())
  539.         dc.DrawBitmap( *my_horse_pnm, 30, 1300 );
  540.  
  541.     dc.DrawText( _T("TIFF handler"), 30, 1515 );
  542.     if (my_horse_tiff && my_horse_tiff->Ok())
  543.         dc.DrawBitmap( *my_horse_tiff, 30, 1530 );
  544.  
  545.     dc.DrawText( _T("XPM handler"), 30, 1745 );
  546.     if (my_horse_xpm && my_horse_xpm->Ok())
  547.         dc.DrawBitmap( *my_horse_xpm, 30, 1760 );
  548.  
  549.  
  550.     if (my_smile_xbm && my_smile_xbm->Ok())
  551.     {
  552.         dc.DrawText( _T("XBM bitmap"), 30, 1975 );
  553.         dc.DrawText( _T("(green on red)"), 30, 1990 );
  554.         dc.SetTextForeground( _T("GREEN") );
  555.         dc.SetTextBackground( _T("RED") );
  556.         dc.DrawBitmap( *my_smile_xbm, 30, 2010 );
  557.  
  558.         dc.SetTextForeground( wxT("BLACK") );
  559.         dc.DrawText( _T("After wxImage conversion"), 150, 1975 );
  560.         dc.DrawText( _T("(red on white)"), 150, 1990 );
  561.         dc.SetTextForeground( wxT("RED") );
  562.         wxImage i = my_smile_xbm->ConvertToImage();
  563.         i.SetMaskColour( 255, 255, 255 );
  564.         i.Replace( 0, 0, 0,
  565.                wxRED_PEN->GetColour().Red(),
  566.                wxRED_PEN->GetColour().Green(),
  567.                wxRED_PEN->GetColour().Blue() );
  568.         dc.DrawBitmap( wxBitmap(i), 150, 2010, TRUE );
  569.         dc.SetTextForeground( wxT("BLACK") );
  570.     }
  571.  
  572.  
  573.     wxBitmap mono( 60,50,1 );
  574.     wxMemoryDC memdc;
  575.     memdc.SelectObject( mono );
  576.     memdc.SetPen( *wxBLACK_PEN );
  577.     memdc.SetBrush( *wxWHITE_BRUSH );
  578.     memdc.DrawRectangle( 0,0,60,50 );
  579.     memdc.SetTextForeground( *wxBLACK );
  580.     memdc.DrawText( _T("Hi!"), 5, 5 );
  581.     memdc.SetBrush( *wxBLACK_BRUSH );
  582.     memdc.DrawRectangle( 33,5,20,20 );
  583.     memdc.SetPen( *wxRED_PEN );
  584.     memdc.DrawLine( 5, 42, 50, 42 );
  585.     memdc.SelectObject( wxNullBitmap );
  586.  
  587.     if (mono.Ok())
  588.     {
  589.         dc.DrawText( _T("Mono bitmap"), 30, 2095 );
  590.         dc.DrawText( _T("(red on green)"), 30, 2110 );
  591.         dc.SetTextForeground( wxT("RED") );
  592.         dc.SetTextBackground( wxT("GREEN") );
  593.         dc.DrawBitmap( mono, 30, 2130 );
  594.  
  595.         dc.SetTextForeground( wxT("BLACK") );
  596.         dc.DrawText( _T("After wxImage conversion"), 150, 2095 );
  597.         dc.DrawText( _T("(red on white)"), 150, 2110 );
  598.         dc.SetTextForeground( wxT("RED") );
  599.         wxImage i = mono.ConvertToImage();
  600.         i.SetMaskColour( 255,255,255 );
  601.         i.Replace( 0,0,0,
  602.                wxRED_PEN->GetColour().Red(),
  603.                wxRED_PEN->GetColour().Green(),
  604.                wxRED_PEN->GetColour().Blue() );
  605.         dc.DrawBitmap( wxBitmap(i), 150, 2130, TRUE );
  606.         dc.SetTextForeground( wxT("BLACK") );
  607.     }
  608.  
  609.     dc.DrawText(_T("XPM bitmap"), 30, 2230);
  610.     if ( m_bmpSmileXpm.Ok() )
  611.     {
  612.         dc.DrawBitmap(m_bmpSmileXpm, 30, 2250, TRUE);
  613.     }
  614.  
  615.     dc.DrawText(_T("XPM icon"), 150, 2230);
  616.     if ( m_iconSmileXpm.Ok() )
  617.     {
  618.         dc.DrawIcon(m_iconSmileXpm, 150, 2250);
  619.     }
  620.  
  621.     dc.DrawText( _T("ICO handler (1st image)"), 30, 2290 );
  622.     if (my_horse_ico32 && my_horse_ico32->Ok())
  623.         dc.DrawBitmap( *my_horse_ico32, 30, 2330, TRUE );
  624.  
  625.     dc.DrawText( _T("ICO handler (2nd image)"), 230, 2290 );
  626.     if (my_horse_ico16 && my_horse_ico16->Ok())
  627.         dc.DrawBitmap( *my_horse_ico16, 230, 2330, TRUE );
  628.  
  629.     dc.DrawText( _T("ICO handler (best image)"), 430, 2290 );
  630.     if (my_horse_ico && my_horse_ico->Ok())
  631.         dc.DrawBitmap( *my_horse_ico, 430, 2330, TRUE );
  632.  
  633.     dc.DrawText( _T("CUR handler"), 30, 2390 );
  634.     if (my_horse_cur && my_horse_cur->Ok())
  635.     {
  636.         dc.DrawBitmap( *my_horse_cur, 30, 2420, TRUE );
  637.         dc.SetPen (*wxRED_PEN);
  638.         dc.DrawLine (xH-10,yH,xH+10,yH);
  639.         dc.DrawLine (xH,yH-10,xH,yH+10);
  640.     }
  641.     dc.DrawText( _T("ANI handler"), 230, 2390 );
  642.     int i ;
  643.     for (i=0; i < m_ani_images; i ++)
  644.         if (my_horse_ani[i].Ok())
  645.         {
  646.             dc.DrawBitmap( my_horse_ani[i], 230 + i * 2 * my_horse_ani[i].GetWidth() , 2420, TRUE );
  647.         }
  648. }
  649.  
  650. void MyCanvas::CreateAntiAliasedBitmap()
  651. {
  652.   wxBitmap bitmap( 300, 300 );
  653.  
  654.   wxMemoryDC dc;
  655.  
  656.   dc.SelectObject( bitmap );
  657.  
  658.   dc.Clear();
  659.  
  660.   dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL) );
  661.   dc.SetTextForeground( wxT("RED") );
  662.   dc.DrawText( _T("This is anti-aliased Text."), 20, 20 );
  663.   dc.DrawText( _T("And a Rectangle."), 20, 60 );
  664.  
  665.   dc.SetBrush( *wxRED_BRUSH );
  666.   dc.SetPen( *wxTRANSPARENT_PEN );
  667.   dc.DrawRoundedRectangle( 20, 100, 200, 180, 20 );
  668.  
  669.   wxImage original= bitmap.ConvertToImage();
  670.   wxImage anti( 150, 150 );
  671.  
  672.   /* This is quite slow, but safe. Use wxImage::GetData() for speed instead. */
  673.  
  674.   for (int y = 1; y < 149; y++)
  675.     for (int x = 1; x < 149; x++)
  676.     {
  677.        int red = original.GetRed( x*2, y*2 ) +
  678.                  original.GetRed( x*2-1, y*2 ) +
  679.                  original.GetRed( x*2, y*2+1 ) +
  680.                  original.GetRed( x*2+1, y*2+1 );
  681.        red = red/4;
  682.  
  683.        int green = original.GetGreen( x*2, y*2 ) +
  684.                    original.GetGreen( x*2-1, y*2 ) +
  685.                    original.GetGreen( x*2, y*2+1 ) +
  686.                    original.GetGreen( x*2+1, y*2+1 );
  687.        green = green/4;
  688.  
  689.        int blue = original.GetBlue( x*2, y*2 ) +
  690.                   original.GetBlue( x*2-1, y*2 ) +
  691.                   original.GetBlue( x*2, y*2+1 ) +
  692.                   original.GetBlue( x*2+1, y*2+1 );
  693.        blue = blue/4;
  694.        anti.SetRGB( x, y, red, green, blue );
  695.     }
  696.   my_anti = new wxBitmap(anti);
  697. }
  698.  
  699. // MyFrame
  700.  
  701. const int ID_QUIT  = 108;
  702. const int ID_ABOUT = 109;
  703. const int ID_NEW = 110;
  704.  
  705. IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
  706.  
  707. BEGIN_EVENT_TABLE(MyFrame,wxFrame)
  708.   EVT_MENU    (ID_ABOUT, MyFrame::OnAbout)
  709.   EVT_MENU    (ID_QUIT,  MyFrame::OnQuit)
  710.   EVT_MENU    (ID_NEW,  MyFrame::OnNewFrame)
  711. END_EVENT_TABLE()
  712.  
  713. MyFrame::MyFrame()
  714.        : wxFrame( (wxFrame *)NULL, -1, _T("wxImage sample"),
  715.                   wxPoint(20,20), wxSize(470,360) )
  716. {
  717.   wxMenu *file_menu = new wxMenu();
  718.   file_menu->Append( ID_NEW, _T("&Show image..."));
  719.   file_menu->AppendSeparator();
  720.   file_menu->Append( ID_ABOUT, _T("&About..."));
  721.   file_menu->AppendSeparator();
  722.   file_menu->Append( ID_QUIT, _T("E&xit"));
  723.  
  724.   wxMenuBar *menu_bar = new wxMenuBar();
  725.   menu_bar->Append(file_menu, _T("&File"));
  726.  
  727.   SetMenuBar( menu_bar );
  728.  
  729.   CreateStatusBar(2);
  730.   int widths[] = { -1, 100 };
  731.   SetStatusWidths( 2, widths );
  732.  
  733.   m_canvas = new MyCanvas( this, -1, wxPoint(0,0), wxSize(10,10) );
  734.  
  735.   // 500 width * 2500 height
  736.   m_canvas->SetScrollbars( 10, 10, 50, 250 );
  737. }
  738.  
  739. void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
  740. {
  741.   Close( TRUE );
  742. }
  743.  
  744. void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
  745. {
  746.   (void)wxMessageBox( _T("wxImage demo\n")
  747.                       _T("Robert Roebling (c) 1998,2000"),
  748.                       _T("About wxImage Demo"), wxICON_INFORMATION | wxOK );
  749. }
  750.  
  751. void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) )
  752. {
  753.     wxString filename = wxFileSelector(_T("Select image file"));
  754.     if ( !filename )
  755.         return;
  756.  
  757.     wxImage image;
  758.     if ( !image.LoadFile(filename) )
  759.     {
  760.         wxLogError(_T("Couldn't load image from '%s'."), filename.c_str());
  761.  
  762.         return;
  763.     }
  764.  
  765.     (new MyImageFrame(this, wxBitmap(image)))->Show();
  766. }
  767.  
  768. //-----------------------------------------------------------------------------
  769. // MyApp
  770. //-----------------------------------------------------------------------------
  771.  
  772. bool MyApp::OnInit()
  773. {
  774. #if wxUSE_LIBPNG
  775.   wxImage::AddHandler( new wxPNGHandler );
  776. #endif
  777.  
  778. #if wxUSE_LIBJPEG
  779.   wxImage::AddHandler( new wxJPEGHandler );
  780. #endif
  781.  
  782. #if wxUSE_LIBTIFF
  783.   wxImage::AddHandler( new wxTIFFHandler );
  784. #endif
  785.  
  786. #if wxUSE_GIF
  787.   wxImage::AddHandler( new wxGIFHandler );
  788. #endif
  789.  
  790. #if wxUSE_PCX
  791.   wxImage::AddHandler( new wxPCXHandler );
  792. #endif
  793.  
  794. #if wxUSE_PNM
  795.   wxImage::AddHandler( new wxPNMHandler );
  796. #endif
  797.  
  798. #if wxUSE_XPM
  799.   wxImage::AddHandler( new wxXPMHandler );
  800. #endif
  801.  
  802. #if wxUSE_ICO_CUR
  803.   wxImage::AddHandler( new wxICOHandler );
  804.   wxImage::AddHandler( new wxCURHandler );
  805.   wxImage::AddHandler( new wxANIHandler );
  806. #endif
  807.  
  808.   wxFrame *frame = new MyFrame();
  809.   frame->Show( TRUE );
  810.  
  811.   return TRUE;
  812. }
  813.  
  814.