]>
git.saurik.com Git - wxWidgets.git/blob - samples/rotate/rotate.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Image rotation test
4 // Author: Carlos Moreno
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
32 #include "wx/numdlg.h"
33 #include "wx/dynarray.h"
35 // ----------------------------------------------------------------------------
37 // ----------------------------------------------------------------------------
39 class MyApp
: public wxApp
42 virtual bool OnInit();
43 const wxImage
& GetImage() const { return m_image
; }
49 // ----------------------------------------------------------------------------
50 // data class for images that need to be rendered
51 // ----------------------------------------------------------------------------
56 MyRenderedImage(const wxBitmap
& bmp
, int x
, int y
)
57 : m_bmp(bmp
), m_x(x
), m_y(y
) { }
62 // Declare a wxArray type to hold MyRenderedImages.
63 WX_DECLARE_OBJARRAY(MyRenderedImage
, ArrayOfImages
);
65 // ----------------------------------------------------------------------------
66 // custom canvas control that we can draw on
67 // ----------------------------------------------------------------------------
69 class MyCanvas
: public wxScrolledWindow
72 MyCanvas(wxWindow
* parent
);
76 void OnMouseLeftUp (wxMouseEvent
& event
);
77 void OnMouseRightUp (wxMouseEvent
& event
);
78 void OnPaint (wxPaintEvent
& event
);
81 ArrayOfImages m_images
;
86 // ----------------------------------------------------------------------------
88 // ----------------------------------------------------------------------------
90 class MyFrame
: public wxFrame
93 MyFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
);
95 void OnQuit (wxCommandEvent
&);
96 void OnAngle(wxCommandEvent
&);
97 void OnClear(wxCommandEvent
&);
101 DECLARE_EVENT_TABLE()
107 // ----------------------------------------------------------------------------
108 // menu item identifiers
109 // ----------------------------------------------------------------------------
118 // ============================================================================
120 // ============================================================================
122 // ----------------------------------------------------------------------------
124 // ----------------------------------------------------------------------------
131 wxImage::AddHandler( new wxPNGHandler
);
134 m_image
= wxImage(_T("duck.png"), wxBITMAP_TYPE_PNG
);
138 wxLogError(wxT("Can't load the test image, please copy it to the ")
139 wxT("program directory"));
143 MyFrame
*frame
= new MyFrame (_T("wxWidgets rotate sample"),
144 wxPoint(20, 20), wxSize(600, 450));
147 SetTopWindow (frame
);
151 // ----------------------------------------------------------------------------
152 // data class for images that need to be rendered
153 // ----------------------------------------------------------------------------
155 #include "wx/arrimpl.cpp"
156 WX_DEFINE_OBJARRAY(ArrayOfImages
)
158 // ----------------------------------------------------------------------------
159 // custom canvas control that we can draw on
160 // ----------------------------------------------------------------------------
162 BEGIN_EVENT_TABLE(MyCanvas
, wxScrolledWindow
)
163 EVT_LEFT_UP (MyCanvas::OnMouseLeftUp
)
164 EVT_RIGHT_UP (MyCanvas::OnMouseRightUp
)
165 EVT_PAINT (MyCanvas::OnPaint
)
168 MyCanvas::MyCanvas(wxWindow
* parent
):
169 wxScrolledWindow(parent
, wxID_ANY
)
171 SetBackgroundColour (wxColour (0,80,60));
175 void MyCanvas::ClearImages ()
181 // Rotate with interpolation and with offset correction
182 void MyCanvas::OnMouseLeftUp (wxMouseEvent
& event
)
184 MyFrame
* frame
= (MyFrame
*) GetParent();
187 const wxImage
& img
= wxGetApp().GetImage();
188 wxImage img2
= img
.Rotate(frame
->m_angle
,
189 wxPoint(img
.GetWidth() / 2, img
.GetHeight() / 2), true, &offset
);
191 // Add the images to an array to be drawn later in OnPaint()
192 m_images
.Add(new MyRenderedImage(wxBitmap(img2
),
193 event
.m_x
+ offset
.x
, event
.m_y
+ offset
.y
));
197 // without interpolation, and without offset correction
198 void MyCanvas::OnMouseRightUp (wxMouseEvent
& event
)
200 MyFrame
* frame
= (MyFrame
*) GetParent();
202 const wxImage
& img
= wxGetApp().GetImage();
203 wxImage img2
= img
.Rotate(frame
->m_angle
,
204 wxPoint(img
.GetWidth() / 2, img
.GetHeight() / 2), false);
206 // Add the images to an array to be drawn later in OnPaint()
207 m_images
.Add(new MyRenderedImage(wxBitmap(img2
), event
.m_x
, event
.m_y
));
211 void MyCanvas::OnPaint (wxPaintEvent
&)
213 size_t numImages
= m_images
.GetCount();
217 dc
.SetTextForeground(wxColour(255, 255, 255));
218 dc
.DrawText(wxT("Click on the canvas to draw a duck."), 10, 10);
220 for (size_t i
= 0; i
< numImages
; i
++) {
221 MyRenderedImage
& image
= m_images
.Item(i
);
222 dc
.DrawBitmap(image
.m_bmp
, image
.m_x
, image
.m_y
, true);
226 // ----------------------------------------------------------------------------
228 // ----------------------------------------------------------------------------
230 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
231 EVT_MENU (ID_Quit
, MyFrame::OnQuit
)
232 EVT_MENU (ID_Angle
, MyFrame::OnAngle
)
233 EVT_MENU (ID_Clear
, MyFrame::OnClear
)
236 MyFrame::MyFrame(const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
)
237 : wxFrame((wxFrame
*)NULL
, wxID_ANY
, title
, pos
, size
)
241 m_canvas
= new MyCanvas(this);
243 wxMenu
*menuFile
= new wxMenu
;
244 menuFile
->Append (ID_Angle
, _T("Set &angle...\tCtrl-A"));
245 menuFile
->Append (ID_Clear
, _T("&Clear all ducks\tCtrl-C"));
246 menuFile
->AppendSeparator();
247 menuFile
->Append (ID_Quit
, _T("E&xit\tAlt-X"));
249 wxMenuBar
*menuBar
= new wxMenuBar
;
250 menuBar
->Append (menuFile
, _T("&File"));
252 SetMenuBar (menuBar
);
255 void MyFrame::OnAngle (wxCommandEvent
&)
257 long degrees
= (long)((180*m_angle
)/M_PI
);
258 degrees
= wxGetNumberFromUser(_T("Change the image rotation angle"),
259 _T("Angle in degrees:"),
260 _T("wxWidgets rotate sample"),
265 m_angle
= (degrees
* M_PI
) / 180.0;
268 void MyFrame::OnQuit (wxCommandEvent
&)
273 void MyFrame::OnClear (wxCommandEvent
&)
275 m_canvas
->ClearImages ();