]> git.saurik.com Git - wxWidgets.git/blob - samples/png/pngdemo.cpp
Better fix for 'int i' used twice in the same block.
[wxWidgets.git] / samples / png / pngdemo.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: pngdemo.cpp
3 // Purpose: Demos PNG reading
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "pngdemo.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #include "wx/image.h"
24
25 #include "pngdemo.h"
26
27 MyFrame *frame = (MyFrame *) NULL;
28 wxBitmap *g_TestBitmap = (wxBitmap *) NULL;
29
30 IMPLEMENT_APP(MyApp)
31
32 bool MyApp::OnInit(void)
33 {
34 wxImage::AddHandler(new wxPNGHandler);
35
36 // Create the main frame window
37 frame = new MyFrame((wxFrame *) NULL, _T("wxPNGBitmap Demo"), wxPoint(0, 0), wxSize(300, 300));
38
39 #if wxUSE_STATUSBAR
40 // Give it a status line
41 frame->CreateStatusBar(2);
42 #endif // wxUSE_STATUSBAR
43
44 // Make a menubar
45 wxMenu *file_menu = new wxMenu;
46 wxMenu *help_menu = new wxMenu;
47
48 file_menu->Append(PNGDEMO_LOAD_FILE, _T("&Load file"), _T("Load file"));
49 file_menu->Append(PNGDEMO_SAVE_FILE, _T("&Save file"), _T("Save file"));
50 file_menu->Append(PNGDEMO_QUIT, _T("E&xit"), _T("Quit program"));
51 help_menu->Append(PNGDEMO_ABOUT, _T("&About"), _T("About PNG demo"));
52
53 wxMenuBar *menu_bar = new wxMenuBar;
54
55 menu_bar->Append(file_menu, _T("&File"));
56 menu_bar->Append(help_menu, _T("&Help"));
57
58 // Associate the menu bar with the frame
59 frame->SetMenuBar(menu_bar);
60
61 MyCanvas *canvas = new MyCanvas(frame, wxPoint(0, 0), wxSize(100, 100));
62
63 // Give it scrollbars: the virtual canvas is 20 * 50 = 1000 pixels in each direction
64 // canvas->SetScrollbars(20, 20, 50, 50, 4, 4);
65 frame->canvas = canvas;
66
67 frame->Show(true);
68
69 #if wxUSE_STATUSBAR
70 frame->SetStatusText(_T("Hello, wxWidgets"));
71 #endif // wxUSE_STATUSBAR
72
73 return true;
74 }
75
76 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
77 EVT_MENU(PNGDEMO_QUIT, MyFrame::OnQuit)
78 EVT_MENU(PNGDEMO_ABOUT, MyFrame::OnAbout)
79 EVT_MENU(PNGDEMO_LOAD_FILE, MyFrame::OnLoadFile)
80 EVT_MENU(PNGDEMO_SAVE_FILE, MyFrame::OnSaveFile)
81 END_EVENT_TABLE()
82
83 // Define my frame constructor
84 MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size):
85 wxFrame(frame, wxID_ANY, title, pos, size)
86 {
87 canvas = (MyCanvas *) NULL;
88 }
89
90 // frame destructor
91 MyFrame::~MyFrame()
92 {
93 if (g_TestBitmap)
94 {
95 delete g_TestBitmap;
96 g_TestBitmap = (wxBitmap *) NULL;
97 }
98 }
99
100 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
101 {
102 Close(true);
103 }
104
105 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
106 {
107 (void)wxMessageBox(_T("PNG demo\nJulian Smart (c) 1998"),
108 _T("About PNG Demo"), wxOK);
109 }
110
111 void MyFrame::OnSaveFile(wxCommandEvent& WXUNUSED(event))
112 {
113 #if wxUSE_FILEDLG
114 wxString f = wxFileSelector( wxT("Save Image"), (const wxChar *)NULL,
115 (const wxChar *)NULL,
116 wxT("png"), wxT("PNG files (*.png)|*.png") );
117
118 if (f.empty()) return;
119
120 wxBitmap *backstore = new wxBitmap( 150, 150 );
121
122 wxMemoryDC memDC;
123 memDC.SelectObject( *backstore );
124 memDC.Clear();
125 memDC.SetBrush( *wxBLACK_BRUSH );
126 memDC.SetPen( *wxWHITE_PEN );
127 memDC.DrawRectangle( 0, 0, 150, 150 );
128 memDC.SetPen( *wxBLACK_PEN );
129 memDC.DrawLine( 0, 0, 0, 10 );
130 memDC.SetTextForeground( *wxWHITE );
131 memDC.DrawText( _T("This is a memory dc."), 10, 10 );
132
133 memDC.SelectObject( wxNullBitmap );
134
135 backstore->SaveFile( f, wxBITMAP_TYPE_PNG, (wxPalette*)NULL );
136
137 delete backstore;
138 #endif // wxUSE_FILEDLG
139 }
140
141 void MyFrame::OnLoadFile(wxCommandEvent& WXUNUSED(event))
142 {
143 #if wxUSE_FILEDLG
144 // Show file selector.
145 wxString f = wxFileSelector(wxT("Open Image"), (const wxChar *) NULL,
146 (const wxChar *) NULL, wxT("png"),
147 wxT("PNG files (*.png)|*.png"));
148
149 if (f.empty())
150 return;
151
152 if ( g_TestBitmap )
153 delete g_TestBitmap;
154
155 g_TestBitmap = new wxBitmap(f, wxBITMAP_TYPE_PNG);
156 if (!g_TestBitmap->Ok())
157 {
158 delete g_TestBitmap;
159 g_TestBitmap = (wxBitmap *) NULL;
160 }
161
162 canvas->Refresh();
163 #endif // wxUSE_FILEDLG
164 }
165
166 BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
167 EVT_PAINT(MyCanvas::OnPaint)
168 END_EVENT_TABLE()
169
170 // Define a constructor for my canvas
171 MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size):
172 wxScrolledWindow(parent, wxID_ANY, pos, size)
173 {
174 }
175
176 // Define the repainting behaviour
177 void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
178 {
179 wxPaintDC dc(this);
180 dc.SetPen(* wxRED_PEN);
181
182 int i;
183 for ( i = 0; i < 500; i += 10)
184 {
185 dc.DrawLine(0, i, 800, i);
186 }
187 if ( g_TestBitmap && g_TestBitmap->Ok() )
188 {
189 wxMemoryDC memDC;
190 if ( g_TestBitmap->GetPalette() )
191 {
192 memDC.SetPalette(* g_TestBitmap->GetPalette());
193 dc.SetPalette(* g_TestBitmap->GetPalette());
194 }
195 memDC.SelectObject(* g_TestBitmap);
196
197 // Normal, non-transparent blitting
198 dc.Blit(20, 20, g_TestBitmap->GetWidth(), g_TestBitmap->GetHeight(), & memDC, 0, 0, wxCOPY, false);
199
200 memDC.SelectObject(wxNullBitmap);
201 }
202
203 if ( g_TestBitmap && g_TestBitmap->Ok() )
204 {
205 wxMemoryDC memDC;
206 memDC.SelectObject(* g_TestBitmap);
207
208 // Transparent blitting if there's a mask in the bitmap
209 dc.Blit(20 + g_TestBitmap->GetWidth() + 20, 20, g_TestBitmap->GetWidth(), g_TestBitmap->GetHeight(), & memDC,
210 0, 0, wxCOPY, true);
211
212 memDC.SelectObject(wxNullBitmap);
213 }
214 }