]> git.saurik.com Git - wxWidgets.git/blame - samples/image/image.cpp
Minor doc fixes
[wxWidgets.git] / samples / image / image.cpp
CommitLineData
01111366
RR
1/*
2 * Program: image
1d5b7a0b 3 *
01111366
RR
4 * Author: Robert Roebling
5 *
6 * Copyright: (C) 1998, Robert Roebling
7 *
8 */
9
3d05544e
JS
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
01111366 18#include "wx/wx.h"
3d05544e
JS
19#endif
20
01111366
RR
21#include "wx/image.h"
22
a23fd0e1
VZ
23#include "wx/file.h"
24
01111366
RR
25// derived classes
26
27class MyFrame;
28class MyApp;
29
30// MyCanvas
31
32class MyCanvas: public wxScrolledWindow
33{
1d5b7a0b
VZ
34public:
35 MyCanvas() {};
01111366 36 MyCanvas( wxWindow *parent, wxWindowID, const wxPoint &pos, const wxSize &size );
1d5b7a0b 37 ~MyCanvas();
01111366 38 void OnPaint( wxPaintEvent &event );
9390a202 39 void CreateAntiAliasedBitmap();
1d5b7a0b 40
e1929140
RR
41 wxBitmap *my_horse_png;
42 wxBitmap *my_horse_jpeg;
43 wxBitmap *my_horse_gif;
ca26177c 44 wxBitmap *my_horse_bmp;
cbd4be25 45 wxBitmap *my_horse_pcx;
6319afe3 46 wxBitmap *my_horse_pnm;
e8fdc264 47 wxBitmap *my_square;
9390a202 48 wxBitmap *my_anti;
1d5b7a0b
VZ
49
50 DECLARE_DYNAMIC_CLASS(MyCanvas)
51 DECLARE_EVENT_TABLE()
01111366
RR
52};
53
54// MyFrame
55
56class MyFrame: public wxFrame
57{
1d5b7a0b
VZ
58public:
59 MyFrame();
01111366 60
01111366
RR
61 void OnAbout( wxCommandEvent &event );
62 void OnQuit( wxCommandEvent &event );
1d5b7a0b 63
01111366 64 MyCanvas *m_canvas;
1d5b7a0b
VZ
65
66 DECLARE_DYNAMIC_CLASS(MyFrame)
67 DECLARE_EVENT_TABLE()
01111366
RR
68};
69
70// MyApp
71
72class MyApp: public wxApp
73{
1d5b7a0b
VZ
74public:
75 virtual bool OnInit();
01111366
RR
76};
77
78// main program
79
80IMPLEMENT_APP(MyApp)
81
82// MyCanvas
83
84IMPLEMENT_DYNAMIC_CLASS(MyCanvas, wxScrolledWindow)
85
1d5b7a0b
VZ
86BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
87 EVT_PAINT(MyCanvas::OnPaint)
01111366
RR
88END_EVENT_TABLE()
89
acbd13a3 90MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id,
1d5b7a0b
VZ
91 const wxPoint &pos, const wxSize &size )
92 : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER )
01111366 93{
e1929140
RR
94 my_horse_png = (wxBitmap*) NULL;
95 my_horse_jpeg = (wxBitmap*) NULL;
96 my_horse_gif = (wxBitmap*) NULL;
ca26177c 97 my_horse_bmp = (wxBitmap*) NULL;
cbd4be25 98 my_horse_pcx = (wxBitmap*) NULL;
a91b47e8
JS
99 my_square = (wxBitmap*) NULL;
100 my_anti = (wxBitmap*) NULL;
101
3d05544e
JS
102 SetBackgroundColour(* wxWHITE);
103
dc86cb34 104 wxBitmap bitmap( 100, 100 );
1d5b7a0b 105
dc86cb34
RR
106 wxMemoryDC dc;
107 dc.SelectObject( bitmap );
4cb122de
RR
108 dc.SetBrush( wxBrush( "orange", wxSOLID ) );
109 dc.SetPen( *wxWHITE_PEN );
dc86cb34
RR
110 dc.DrawRectangle( 0, 0, 100, 100 );
111 dc.SelectObject( wxNullBitmap );
3d05544e 112
a23fd0e1
VZ
113 // try to find the directory with our images
114 wxString dir;
115 if ( wxFile::Exists("./horse.png") )
116 dir = "./";
117 else if ( wxFile::Exists("../horse.png") )
118 dir = "../";
119 else
120 wxLogWarning("Can't find image files in either '.' or '..'!");
3d05544e 121
8b53e5a2 122 wxImage image( bitmap );
073478b3 123
a23fd0e1
VZ
124 if ( !image.SaveFile( dir + wxString("test.png"), wxBITMAP_TYPE_PNG ) )
125 wxLogError("Can't save file");
b75867a6 126
a23fd0e1
VZ
127 if ( !image.LoadFile( dir + wxString("horse.png"), wxBITMAP_TYPE_PNG ) )
128 wxLogError("Can't load PNG image");
129 else
130 my_horse_png = new wxBitmap( image.ConvertToBitmap() );
e1929140 131
0828c087 132 if ( !image.LoadFile( dir + wxString("horse.jpg") ) )
a23fd0e1
VZ
133 wxLogError("Can't load JPG image");
134 else
135 my_horse_jpeg = new wxBitmap( image.ConvertToBitmap() );
e1929140 136
0828c087 137 if ( !image.LoadFile( dir + wxString("horse.gif") ) )
a23fd0e1
VZ
138 wxLogError("Can't load GIF image");
139 else
140 my_horse_gif = new wxBitmap( image.ConvertToBitmap() );
cbd4be25
GRG
141
142 if ( !image.LoadFile( dir + wxString("horse.pcx"), wxBITMAP_TYPE_PCX ) )
143 wxLogError("Can't load PCX image");
144 else
145 my_horse_pcx = new wxBitmap( image.ConvertToBitmap() );
146
147 if ( !image.LoadFile( dir + wxString("horse.bmp"), wxBITMAP_TYPE_BMP ) )
ca26177c
RR
148 wxLogError("Can't load BMP image");
149 else
150 my_horse_bmp = new wxBitmap( image.ConvertToBitmap() );
6319afe3
GL
151
152 if ( !image.LoadFile( dir + wxString("horse.pnm"), wxBITMAP_TYPE_PNM ) )
153 wxLogError("Can't load PNM image");
154 else
155 my_horse_pnm = new wxBitmap( image.ConvertToBitmap() );
ca26177c 156
0828c087 157 image.LoadFile( dir + wxString("test.png") );
8b53e5a2 158 my_square = new wxBitmap( image.ConvertToBitmap() );
96d5ab4d 159
9390a202 160 CreateAntiAliasedBitmap();
01111366
RR
161}
162
1d5b7a0b 163MyCanvas::~MyCanvas()
01111366 164{
6319afe3 165 delete my_horse_pnm;
e1929140
RR
166 delete my_horse_png;
167 delete my_horse_jpeg;
168 delete my_horse_gif;
ca26177c 169 delete my_horse_bmp;
cbd4be25 170 delete my_horse_pcx;
e8fdc264 171 delete my_square;
9390a202 172 delete my_anti;
01111366
RR
173}
174
175void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
176{
177 wxPaintDC dc( this );
178 PrepareDC( dc );
a91b47e8 179
9390a202 180 dc.DrawText( "Loaded image", 30, 10 );
a91b47e8 181 if (my_square && my_square->Ok()) dc.DrawBitmap( *my_square, 30, 30 );
eefa26be 182
9390a202 183 dc.DrawText( "Drawn directly", 150, 10 );
910276d7 184 dc.SetBrush( wxBrush( "orange", wxSOLID ) );
e8fdc264 185 dc.SetPen( *wxWHITE_PEN );
9390a202
RR
186 dc.DrawRectangle( 150, 30, 100, 100 );
187
a91b47e8 188 if (my_anti && my_anti->Ok()) dc.DrawBitmap( *my_anti, 250, 140 );
6e13c196 189
e1929140
RR
190 dc.DrawText( "PNG handler", 30, 135 );
191 if (my_horse_png && my_horse_png->Ok()) dc.DrawBitmap( *my_horse_png, 30, 150 );
192
193 dc.DrawText( "JPEG handler", 30, 365 );
194 if (my_horse_jpeg && my_horse_jpeg->Ok()) dc.DrawBitmap( *my_horse_jpeg, 30, 380 );
195
196 dc.DrawText( "GIF handler", 30, 595 );
197 if (my_horse_gif && my_horse_gif->Ok()) dc.DrawBitmap( *my_horse_gif, 30, 610 );
cbd4be25
GRG
198
199 dc.DrawText( "PCX handler", 30, 825 );
200 if (my_horse_pcx && my_horse_pcx->Ok()) dc.DrawBitmap( *my_horse_pcx, 30, 840 );
201
202 dc.DrawText( "BMP handler", 30, 1055 );
203 if (my_horse_bmp && my_horse_bmp->Ok()) dc.DrawBitmap( *my_horse_bmp, 30, 1070 );
6319afe3
GL
204
205 dc.DrawText( "PNM handler", 30, 1285 );
206 if (my_horse_pnm && my_horse_pnm->Ok()) dc.DrawBitmap( *my_horse_pnm, 30, 1300 );
9390a202 207}
1d5b7a0b 208
9390a202
RR
209void MyCanvas::CreateAntiAliasedBitmap()
210{
211 wxBitmap bitmap( 300, 300 );
a91b47e8 212
9390a202 213 wxMemoryDC dc;
a91b47e8 214
9390a202 215 dc.SelectObject( bitmap );
a91b47e8 216
9390a202
RR
217 dc.Clear();
218
219 dc.SetFont( wxFont( 24, wxDECORATIVE, wxDEFAULT, wxDEFAULT ) );
220 dc.SetTextForeground( "RED" );
221 dc.DrawText( "This is anti-aliased Text.", 20, 20 );
222 dc.DrawText( "And a Rectangle.", 20, 60 );
223
224 dc.SetBrush( *wxRED_BRUSH );
91b8de8d 225 dc.SetPen( *wxTRANSPARENT_PEN );
9390a202
RR
226 dc.DrawRoundedRectangle( 20, 100, 200, 180, 20 );
227
228 wxImage original( bitmap );
229 wxImage anti( 150, 150 );
a91b47e8 230
9390a202
RR
231 /* This is quite slow, but safe. Use wxImage::GetData() for speed instead. */
232
233 for (int y = 1; y < 149; y++)
234 for (int x = 1; x < 149; x++)
235 {
236 int red = original.GetRed( x*2, y*2 ) +
237 original.GetRed( x*2-1, y*2 ) +
238 original.GetRed( x*2, y*2+1 ) +
239 original.GetRed( x*2+1, y*2+1 );
240 red = red/4;
241
242 int green = original.GetGreen( x*2, y*2 ) +
243 original.GetGreen( x*2-1, y*2 ) +
244 original.GetGreen( x*2, y*2+1 ) +
245 original.GetGreen( x*2+1, y*2+1 );
246 green = green/4;
247
248 int blue = original.GetBlue( x*2, y*2 ) +
249 original.GetBlue( x*2-1, y*2 ) +
250 original.GetBlue( x*2, y*2+1 ) +
251 original.GetBlue( x*2+1, y*2+1 );
252 blue = blue/4;
253 anti.SetRGB( x, y, red, green, blue );
254 }
255 my_anti = new wxBitmap( anti.ConvertToBitmap() );
01111366
RR
256}
257
258// MyFrame
259
79490c3d
VZ
260const int ID_QUIT = 108;
261const int ID_ABOUT = 109;
01111366
RR
262
263IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
264
265BEGIN_EVENT_TABLE(MyFrame,wxFrame)
266 EVT_MENU (ID_ABOUT, MyFrame::OnAbout)
267 EVT_MENU (ID_QUIT, MyFrame::OnQuit)
268END_EVENT_TABLE()
269
1d5b7a0b
VZ
270MyFrame::MyFrame()
271 : wxFrame( (wxFrame *)NULL, -1, "wxImage sample",
272 wxPoint(20,20), wxSize(470,360) )
01111366
RR
273{
274 wxMenu *file_menu = new wxMenu();
90e58684
RR
275 file_menu->Append( ID_ABOUT, "&About..");
276 file_menu->Append( ID_QUIT, "E&xit");
1d5b7a0b 277
01111366 278 wxMenuBar *menu_bar = new wxMenuBar();
90e58684 279 menu_bar->Append(file_menu, "&File");
3d05544e 280
01111366 281 SetMenuBar( menu_bar );
1d5b7a0b 282
917e533b
RR
283 CreateStatusBar(2);
284 int widths[] = { -1, 100 };
285 SetStatusWidths( 2, widths );
1d5b7a0b 286
fb1585ae 287 m_canvas = new MyCanvas( this, -1, wxPoint(0,0), wxSize(10,10) );
cbd4be25
GRG
288
289 // 500 width * 1300 height
6319afe3 290 m_canvas->SetScrollbars( 10, 10, 50, 152 );
01111366
RR
291}
292
293void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
294{
295 Close( TRUE );
296}
297
298void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
299{
1d5b7a0b 300 (void)wxMessageBox( "wxImage demo\n"
8a5137d7 301 "\n"
1d5b7a0b
VZ
302 "Robert Roebling (c) 1998",
303 "About wxImage Demo", wxICON_INFORMATION | wxOK );
fb1585ae
RR
304}
305
01111366
RR
306//-----------------------------------------------------------------------------
307// MyApp
308//-----------------------------------------------------------------------------
309
1d5b7a0b 310bool MyApp::OnInit()
01111366 311{
e9c4b1a2
JS
312#if wxUSE_LIBPNG
313 wxImage::AddHandler( new wxPNGHandler );
314#endif
315
316#if wxUSE_LIBJPEG
317 wxImage::AddHandler( new wxJPEGHandler );
318#endif
319
e1929140 320 wxImage::AddHandler( new wxGIFHandler );
cbd4be25 321 wxImage::AddHandler( new wxPCXHandler );
6319afe3 322 wxImage::AddHandler( new wxPNMHandler );
e1929140 323
01111366
RR
324 wxFrame *frame = new MyFrame();
325 frame->Show( TRUE );
1d5b7a0b 326
01111366
RR
327 return TRUE;
328}
329