1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxDrawnShape
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
15 #if defined(__GNUG__) && !defined(__APPLE__)
16 #pragma interface "drawn.h"
20 #define oglMETAFLAGS_OUTLINE 1
21 #define oglMETAFLAGS_ATTACHMENTS 2
23 class WXDLLIMPEXP_OGL wxDrawnShape
;
24 class WXDLLIMPEXP_OGL wxPseudoMetaFile
: public wxObject
26 DECLARE_DYNAMIC_CLASS(wxPseudoMetaFile
)
29 wxPseudoMetaFile(wxPseudoMetaFile
& mf
);
32 void Draw(wxDC
& dc
, double xoffset
, double yoffset
);
35 void WriteAttributes(wxExpr
*clause
, int whichAngle
);
36 void ReadAttributes(wxExpr
*clause
, int whichAngle
);
41 void Copy(wxPseudoMetaFile
& copy
);
43 void Scale(double sx
, double sy
);
44 void ScaleTo(double w
, double h
); // Scale to fit size
45 void Translate(double x
, double y
);
47 // Rotate about the given axis by theta radians from the x axis.
48 void Rotate(double x
, double y
, double theta
);
50 bool LoadFromMetaFile(const wxString
& filename
, double *width
, double *height
);
52 void GetBounds(double *minX
, double *minY
, double *maxX
, double *maxY
);
54 // Calculate size from current operations
55 void CalculateSize(wxDrawnShape
* shape
);
57 inline wxList
& GetOutlineColours() const { return (wxList
&) m_outlineColours
; }
58 inline wxList
& GetFillColours() const { return (wxList
&) m_fillColours
; }
59 inline void SetRotateable(bool rot
) { m_rotateable
= rot
; }
60 inline bool GetRotateable() const { return m_rotateable
; }
62 inline void SetSize(double w
, double h
) { m_width
= w
; m_height
= h
; }
64 inline void SetFillBrush(wxBrush
* brush
) { m_fillBrush
= brush
; }
65 inline wxBrush
* GetFillBrush() const { return m_fillBrush
; }
67 inline void SetOutlinePen(wxPen
* pen
) { m_outlinePen
= pen
; }
68 inline wxPen
* GetOutlinePen() const { return m_outlinePen
; }
70 inline void SetOutlineOp(int op
) { m_outlineOp
= op
; }
71 inline int GetOutlineOp() const { return m_outlineOp
; }
73 inline wxList
& GetOps() const { return (wxList
&) m_ops
; }
75 // Is this a valid (non-empty) metafile?
76 inline bool IsValid() const { return (m_ops
.GetCount() > 0); }
79 /// Set of functions for drawing into a pseudo metafile.
80 /// They use integers, but doubles are used internally for accuracy
83 virtual void DrawLine(const wxPoint
& pt1
, const wxPoint
& pt2
);
84 virtual void DrawRectangle(const wxRect
& rect
);
85 virtual void DrawRoundedRectangle(const wxRect
& rect
, double radius
);
86 virtual void DrawArc(const wxPoint
& centrePt
, const wxPoint
& startPt
, const wxPoint
& endPt
);
87 virtual void DrawEllipticArc(const wxRect
& rect
, double startAngle
, double endAngle
);
88 virtual void DrawEllipse(const wxRect
& rect
);
89 virtual void DrawPoint(const wxPoint
& pt
);
90 virtual void DrawText(const wxString
& text
, const wxPoint
& pt
);
91 virtual void DrawLines(int n
, wxPoint pts
[]);
93 // oglMETAFLAGS_OUTLINE: will be used for drawing the outline and
94 // also drawing lines/arrows at the circumference.
95 // oglMETAFLAGS_ATTACHMENTS: will be used for initialising attachment points at
96 // the vertices (perhaps a rare case...)
97 virtual void DrawPolygon(int n
, wxPoint pts
[], int flags
= 0);
98 virtual void DrawSpline(int n
, wxPoint pts
[]);
100 virtual void SetClippingRect(const wxRect
& rect
);
101 virtual void DestroyClippingRect();
103 virtual void SetPen(wxPen
* pen
, bool isOutline
= false); // TODO: eventually, just store GDI object attributes, not actual
104 virtual void SetBrush(wxBrush
* brush
, bool isFill
= false); // pens/brushes etc.
105 virtual void SetFont(wxFont
* font
);
106 virtual void SetTextColour(const wxColour
& colour
);
107 virtual void SetBackgroundColour(const wxColour
& colour
);
108 virtual void SetBackgroundMode(int mode
);
114 wxList m_ops
; // List of drawing operations (see drawnp.h)
115 wxList m_gdiObjects
; // List of pens, brushes and fonts for this object.
116 int m_outlineOp
; // The op representing the outline, if any
118 // Pen/brush specifying outline/fill colours
119 // to override operations.
121 wxBrush
* m_fillBrush
;
122 wxList m_outlineColours
; // List of the GDI operations that comprise the outline
123 wxList m_fillColours
; // List of the GDI operations that fill the shape
124 double m_currentRotation
;
127 #define oglDRAWN_ANGLE_0 0
128 #define oglDRAWN_ANGLE_90 1
129 #define oglDRAWN_ANGLE_180 2
130 #define oglDRAWN_ANGLE_270 3
132 class WXDLLIMPEXP_OGL wxDrawnShape
: public wxRectangleShape
134 DECLARE_DYNAMIC_CLASS(wxDrawnShape
)
139 void OnDraw(wxDC
& dc
);
143 void WriteAttributes(wxExpr
*clause
);
144 void ReadAttributes(wxExpr
*clause
);
147 // Does the copying for this object
148 void Copy(wxShape
& copy
);
150 void Scale(double sx
, double sy
);
151 void Translate(double x
, double y
);
152 // Rotate about the given axis by theta radians from the x axis.
153 void Rotate(double x
, double y
, double theta
);
155 // Get current rotation
156 inline double GetRotation() const { return m_rotation
; }
158 void SetSize(double w
, double h
, bool recursive
= true);
159 bool LoadFromMetaFile(const wxString
& filename
);
161 inline void SetSaveToFile(bool save
) { m_saveToFile
= save
; }
162 inline wxPseudoMetaFile
& GetMetaFile(int which
= 0) const { return (wxPseudoMetaFile
&) m_metafiles
[which
]; }
164 void OnDrawOutline(wxDC
& dc
, double x
, double y
, double w
, double h
);
166 // Get the perimeter point using the special outline op, if there is one,
167 // otherwise use default wxRectangleShape scheme
168 bool GetPerimeterPoint(double x1
, double y1
,
169 double x2
, double y2
,
170 double *x3
, double *y3
);
172 /// Set of functions for drawing into a pseudo metafile.
173 /// They use integers, but doubles are used internally for accuracy
176 virtual void DrawLine(const wxPoint
& pt1
, const wxPoint
& pt2
);
177 virtual void DrawRectangle(const wxRect
& rect
);
178 virtual void DrawRoundedRectangle(const wxRect
& rect
, double radius
);
179 virtual void DrawArc(const wxPoint
& centrePt
, const wxPoint
& startPt
, const wxPoint
& endPt
);
180 virtual void DrawEllipticArc(const wxRect
& rect
, double startAngle
, double endAngle
);
181 virtual void DrawEllipse(const wxRect
& rect
);
182 virtual void DrawPoint(const wxPoint
& pt
);
183 virtual void DrawText(const wxString
& text
, const wxPoint
& pt
);
184 virtual void DrawLines(int n
, wxPoint pts
[]);
185 virtual void DrawPolygon(int n
, wxPoint pts
[], int flags
= 0);
186 virtual void DrawSpline(int n
, wxPoint pts
[]);
188 virtual void SetClippingRect(const wxRect
& rect
);
189 virtual void DestroyClippingRect();
191 virtual void SetDrawnPen(wxPen
* pen
, bool isOutline
= false); // TODO: eventually, just store GDI object attributes, not actual
192 virtual void SetDrawnBrush(wxBrush
* brush
, bool isFill
= false); // pens/brushes etc.
193 virtual void SetDrawnFont(wxFont
* font
);
194 virtual void SetDrawnTextColour(const wxColour
& colour
);
195 virtual void SetDrawnBackgroundColour(const wxColour
& colour
);
196 virtual void SetDrawnBackgroundMode(int mode
);
198 // Set the width/height according to the shapes in the metafile.
199 // Call this after drawing into the shape.
200 inline void CalculateSize() { m_metafiles
[m_currentAngle
].CalculateSize(this); }
202 inline void DrawAtAngle(int angle
) { m_currentAngle
= angle
; };
204 inline int GetAngle() const { return m_currentAngle
; }
208 // Which metafile do we use now? Based on current rotation and validity
210 int DetermineMetaFile(double rotation
);
213 // One metafile for each 90 degree rotation (or just a single one).
214 wxPseudoMetaFile m_metafiles
[4];
216 // Don't save all wxDrawnShape metafiles to file: sometimes
217 // we take the metafile data from a symbol library.
220 // Which angle are we using/drawing into?