1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/dcmirror.h
3 // Purpose:     wxMirrorDC class
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     21.07.2003
7 // RCS-ID:      $Id: dcmirror.h 61872 2009-09-09 22:37:05Z VZ $
8 // Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
9 // Licence:     wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_DCMIRROR_H_
13 #define _WX_DCMIRROR_H_
14 
15 #include "wx/dc.h"
16 
17 // ----------------------------------------------------------------------------
18 // wxMirrorDC allows to write the same code for horz/vertical layout
19 // ----------------------------------------------------------------------------
20 
21 class WXDLLEXPORT wxMirrorDC : public wxDC
22 {
23 public:
24     // constructs a mirror DC associated with the given real DC
25     //
26     // if mirror parameter is true, all vertical and horizontal coordinates are
27     // exchanged, otherwise this class behaves in exactly the same way as a
28     // plain DC
29     //
30     // the cast to wxMirrorDC is a dirty hack done to allow us to call the
31     // protected methods of wxDCBase directly in our code below, without it it
32     // would be impossible (this is correct from C++ point of view but doesn't
33     // make any sense in this particular situation)
wxMirrorDC(wxDC & dc,bool mirror)34     wxMirrorDC(wxDC& dc, bool mirror) : m_dc((wxMirrorDC&)dc)
35         { m_mirror = mirror; }
36 
37     // wxDCBase operations
Clear()38     virtual void Clear() { m_dc.Clear(); }
SetFont(const wxFont & font)39     virtual void SetFont(const wxFont& font) { m_dc.SetFont(font); }
SetPen(const wxPen & pen)40     virtual void SetPen(const wxPen& pen) { m_dc.SetPen(pen); }
SetBrush(const wxBrush & brush)41     virtual void SetBrush(const wxBrush& brush) { m_dc.SetBrush(brush); }
SetBackground(const wxBrush & brush)42     virtual void SetBackground(const wxBrush& brush)
43         { m_dc.SetBackground(brush); }
SetBackgroundMode(int mode)44     virtual void SetBackgroundMode(int mode) { m_dc.SetBackgroundMode(mode); }
45 #if wxUSE_PALETTE
SetPalette(const wxPalette & palette)46     virtual void SetPalette(const wxPalette& palette)
47         { m_dc.SetPalette(palette); }
48 #endif // wxUSE_PALETTE
DestroyClippingRegion()49     virtual void DestroyClippingRegion() { m_dc.DestroyClippingRegion(); }
GetCharHeight()50     virtual wxCoord GetCharHeight() const { return m_dc.GetCharHeight(); }
GetCharWidth()51     virtual wxCoord GetCharWidth() const { return m_dc.GetCharWidth(); }
CanDrawBitmap()52     virtual bool CanDrawBitmap() const { return m_dc.CanDrawBitmap(); }
CanGetTextExtent()53     virtual bool CanGetTextExtent() const { return m_dc.CanGetTextExtent(); }
GetDepth()54     virtual int GetDepth() const { return m_dc.GetDepth(); }
GetPPI()55     virtual wxSize GetPPI() const { return m_dc.GetPPI(); }
Ok()56     virtual bool Ok() const { return IsOk(); }
IsOk()57     virtual bool IsOk() const { return m_dc.Ok(); }
SetMapMode(int mode)58     virtual void SetMapMode(int mode) { m_dc.SetMapMode(mode); }
SetUserScale(double x,double y)59     virtual void SetUserScale(double x, double y)
60         { m_dc.SetUserScale(GetX(x, y), GetY(x, y)); }
SetLogicalOrigin(wxCoord x,wxCoord y)61     virtual void SetLogicalOrigin(wxCoord x, wxCoord y)
62         { m_dc.SetLogicalOrigin(GetX(x, y), GetY(x, y)); }
SetDeviceOrigin(wxCoord x,wxCoord y)63     virtual void SetDeviceOrigin(wxCoord x, wxCoord y)
64         { m_dc.SetDeviceOrigin(GetX(x, y), GetY(x, y)); }
SetAxisOrientation(bool xLeftRight,bool yBottomUp)65     virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp)
66         { m_dc.SetAxisOrientation(GetX(xLeftRight, yBottomUp),
67                                   GetY(xLeftRight, yBottomUp)); }
SetLogicalFunction(int function)68     virtual void SetLogicalFunction(int function)
69         { m_dc.SetLogicalFunction(function); }
70 
71     // helper functions which may be useful for the users of this class
Reflect(const wxSize & sizeOrig)72     wxSize Reflect(const wxSize& sizeOrig)
73     {
74         return m_mirror ? wxSize(sizeOrig.y, sizeOrig.x) : sizeOrig;
75     }
76 
77 protected:
78     // returns x and y if not mirroring or y and x if mirroring
GetX(wxCoord x,wxCoord y)79     wxCoord GetX(wxCoord x, wxCoord y) const { return m_mirror ? y : x; }
GetY(wxCoord x,wxCoord y)80     wxCoord GetY(wxCoord x, wxCoord y) const { return m_mirror ? x : y; }
GetX(double x,double y)81     double GetX(double x, double y) const { return m_mirror ? y : x; }
GetY(double x,double y)82     double GetY(double x, double y) const { return m_mirror ? x : y; }
GetX(bool x,bool y)83     bool GetX(bool x, bool y) const { return m_mirror ? y : x; }
GetY(bool x,bool y)84     bool GetY(bool x, bool y) const { return m_mirror ? x : y; }
85 
86     // same thing but for pointers
GetX(wxCoord * x,wxCoord * y)87     wxCoord *GetX(wxCoord *x, wxCoord *y) const { return m_mirror ? y : x; }
GetY(wxCoord * x,wxCoord * y)88     wxCoord *GetY(wxCoord *x, wxCoord *y) const { return m_mirror ? x : y; }
89 
90     // exchange x and y unconditionally
Swap(wxCoord & x,wxCoord & y)91     static void Swap(wxCoord& x, wxCoord& y)
92     {
93         wxCoord t = x;
94         x = y;
95         y = t;
96     }
97 
98     // exchange x and y components of all points in the array if necessary
Mirror(int n,wxPoint points[])99     void Mirror(int n, wxPoint points[]) const
100     {
101         if ( m_mirror )
102         {
103             for ( int i = 0; i < n; i++ )
104             {
105                 Swap(points[i].x, points[i].y);
106             }
107         }
108     }
109 
110 
111     // wxDCBase functions
112     virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col,
113                              int style = wxFLOOD_SURFACE)
114     {
115         return m_dc.DoFloodFill(GetX(x, y), GetY(x, y), col, style);
116     }
117 
DoGetPixel(wxCoord x,wxCoord y,wxColour * col)118     virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const
119     {
120         return m_dc.DoGetPixel(GetX(x, y), GetY(x, y), col);
121     }
122 
123 
DoDrawPoint(wxCoord x,wxCoord y)124     virtual void DoDrawPoint(wxCoord x, wxCoord y)
125     {
126         m_dc.DoDrawPoint(GetX(x, y), GetY(x, y));
127     }
128 
DoDrawLine(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2)129     virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
130     {
131         m_dc.DoDrawLine(GetX(x1, y1), GetY(x1, y1), GetX(x2, y2), GetY(x2, y2));
132     }
133 
DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc)134     virtual void DoDrawArc(wxCoord x1, wxCoord y1,
135                            wxCoord x2, wxCoord y2,
136                            wxCoord xc, wxCoord yc)
137     {
138         wxFAIL_MSG( wxT("this is probably wrong") );
139 
140         m_dc.DoDrawArc(GetX(x1, y1), GetY(x1, y1),
141                        GetX(x2, y2), GetY(x2, y2),
142                        xc, yc);
143     }
144 
DoDrawCheckMark(wxCoord x,wxCoord y,wxCoord w,wxCoord h)145     virtual void DoDrawCheckMark(wxCoord x, wxCoord y,
146                                  wxCoord w, wxCoord h)
147     {
148         m_dc.DoDrawCheckMark(GetX(x, y), GetY(x, y),
149                              GetX(w, h), GetY(w, h));
150     }
151 
DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)152     virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h,
153                                    double sa, double ea)
154     {
155         wxFAIL_MSG( wxT("this is probably wrong") );
156 
157         m_dc.DoDrawEllipticArc(GetX(x, y), GetY(x, y),
158                                GetX(w, h), GetY(w, h),
159                                sa, ea);
160     }
161 
DoDrawRectangle(wxCoord x,wxCoord y,wxCoord w,wxCoord h)162     virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
163     {
164         m_dc.DoDrawRectangle(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h));
165     }
166 
DoDrawRoundedRectangle(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double radius)167     virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y,
168                                         wxCoord w, wxCoord h,
169                                         double radius)
170     {
171         m_dc.DoDrawRoundedRectangle(GetX(x, y), GetY(x, y),
172                                     GetX(w, h), GetY(w, h),
173                                     radius);
174     }
175 
DoDrawEllipse(wxCoord x,wxCoord y,wxCoord w,wxCoord h)176     virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
177     {
178         m_dc.DoDrawEllipse(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h));
179     }
180 
DoCrossHair(wxCoord x,wxCoord y)181     virtual void DoCrossHair(wxCoord x, wxCoord y)
182     {
183         m_dc.DoCrossHair(GetX(x, y), GetY(x, y));
184     }
185 
DoDrawIcon(const wxIcon & icon,wxCoord x,wxCoord y)186     virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y)
187     {
188         m_dc.DoDrawIcon(icon, GetX(x, y), GetY(x, y));
189     }
190 
191     virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y,
192                               bool useMask = false)
193     {
194         m_dc.DoDrawBitmap(bmp, GetX(x, y), GetY(x, y), useMask);
195     }
196 
DoDrawText(const wxString & text,wxCoord x,wxCoord y)197     virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y)
198     {
199         // this is never mirrored
200         m_dc.DoDrawText(text, x, y);
201     }
202 
DoDrawRotatedText(const wxString & text,wxCoord x,wxCoord y,double angle)203     virtual void DoDrawRotatedText(const wxString& text,
204                                    wxCoord x, wxCoord y, double angle)
205     {
206         // this is never mirrored
207         m_dc.DoDrawRotatedText(text, x, y, angle);
208     }
209 
210     virtual bool DoBlit(wxCoord xdest, wxCoord ydest,
211                         wxCoord w, wxCoord h,
212                         wxDC *source, wxCoord xsrc, wxCoord ysrc,
213                         int rop = wxCOPY, bool useMask = false,
214                         wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord)
215     {
216         return m_dc.DoBlit(GetX(xdest, ydest), GetY(xdest, ydest),
217                            GetX(w, h), GetY(w, h),
218                            source, GetX(xsrc, ysrc), GetY(xsrc, ysrc),
219                            rop, useMask,
220                            GetX(xsrcMask, ysrcMask), GetX(xsrcMask, ysrcMask));
221     }
222 
DoGetSize(int * w,int * h)223     virtual void DoGetSize(int *w, int *h) const
224     {
225         m_dc.DoGetSize(GetX(w, h), GetY(w, h));
226     }
227 
DoGetSizeMM(int * w,int * h)228     virtual void DoGetSizeMM(int *w, int *h) const
229     {
230         m_dc.DoGetSizeMM(GetX(w, h), GetY(w, h));
231     }
232 
DoDrawLines(int n,wxPoint points[],wxCoord xoffset,wxCoord yoffset)233     virtual void DoDrawLines(int n, wxPoint points[],
234                              wxCoord xoffset, wxCoord yoffset)
235     {
236         Mirror(n, points);
237 
238         m_dc.DoDrawLines(n, points,
239                          GetX(xoffset, yoffset), GetY(xoffset, yoffset));
240 
241         Mirror(n, points);
242     }
243 
244     virtual void DoDrawPolygon(int n, wxPoint points[],
245                                wxCoord xoffset, wxCoord yoffset,
246                                int fillStyle = wxODDEVEN_RULE)
247     {
248         Mirror(n, points);
249 
250         m_dc.DoDrawPolygon(n, points,
251                            GetX(xoffset, yoffset), GetY(xoffset, yoffset),
252                            fillStyle);
253 
254         Mirror(n, points);
255     }
256 
DoSetClippingRegionAsRegion(const wxRegion & WXUNUSED (region))257     virtual void DoSetClippingRegionAsRegion(const wxRegion& WXUNUSED(region))
258     {
259         wxFAIL_MSG( wxT("not implemented") );
260     }
261 
DoSetClippingRegion(wxCoord x,wxCoord y,wxCoord w,wxCoord h)262     virtual void DoSetClippingRegion(wxCoord x, wxCoord y,
263                                      wxCoord w, wxCoord h)
264     {
265         m_dc.DoSetClippingRegion(GetX(x, y), GetY(x, y), GetX(w, h), GetY(w, h));
266     }
267 
268     virtual void DoGetTextExtent(const wxString& string,
269                                  wxCoord *x, wxCoord *y,
270                                  wxCoord *descent = NULL,
271                                  wxCoord *externalLeading = NULL,
272                                  wxFont *theFont = NULL) const
273     {
274         // never mirrored
275         m_dc.DoGetTextExtent(string, x, y, descent, externalLeading, theFont);
276     }
277 
278 private:
279     wxMirrorDC& m_dc;
280 
281     bool m_mirror;
282 
283     DECLARE_NO_COPY_CLASS(wxMirrorDC)
284 };
285 
286 #endif // _WX_DCMIRROR_H_
287 
288