X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8fb3a512a85572ebf4b4f46eaf536727dfe4e01e..bd3e41f6003fa1d589c1477a327931c3f57516f2:/include/wx/dc.h diff --git a/include/wx/dc.h b/include/wx/dc.h index 2388b401f8..faee757e84 100644 --- a/include/wx/dc.h +++ b/include/wx/dc.h @@ -31,6 +31,65 @@ #include "wx/list.h" // we use wxList in inline functions +class WXDLLEXPORT wxDCBase; + +class WXDLLEXPORT wxDrawObject +{ +public: + + wxDrawObject() + { + ResetBoundingBox(); + } + + virtual ~wxDrawObject() { } + + virtual void Draw(wxDCBase& dc) const { } + + virtual void CalcBoundingBox(wxCoord x, wxCoord y) + { + if ( m_isBBoxValid ) + { + if ( x < m_minX ) m_minX = x; + if ( y < m_minY ) m_minY = y; + if ( x > m_maxX ) m_maxX = x; + if ( y > m_maxY ) m_maxY = y; + } + else + { + m_isBBoxValid = TRUE; + + m_minX = x; + m_minY = y; + m_maxX = x; + m_maxY = y; + } + } + + void ResetBoundingBox() + { + m_isBBoxValid = FALSE; + + m_minX = m_maxX = m_minY = m_maxY = 0; + } + + // Get the final bounding box of the PostScript or Metafile picture. + + wxCoord MinX() const { return m_minX; } + wxCoord MaxX() const { return m_maxX; } + wxCoord MinY() const { return m_minY; } + wxCoord MaxY() const { return m_maxY; } + + //to define the type of object for derived objects + virtual int GetType()=0; + +protected: + //for boundingbox calculation + bool m_isBBoxValid:1; + //for boundingbox calculation + wxCoord m_minX, m_minY, m_maxX, m_maxY; +}; + // --------------------------------------------------------------------------- // global variables // --------------------------------------------------------------------------- @@ -43,15 +102,13 @@ WXDLLEXPORT_DATA(extern int) wxPageNumber; class WXDLLEXPORT wxDCBase : public wxObject { - DECLARE_ABSTRACT_CLASS(wxDCBase) - public: wxDCBase() { m_clipping = FALSE; m_ok = TRUE; - m_minX = m_minY = m_maxX = m_maxY = 0; + ResetBoundingBox(); m_signX = m_signY = 1; @@ -62,7 +119,7 @@ public: m_userScaleX = m_userScaleY = m_scaleX = m_scaleY = 1.0; - m_logicalFunction = -1; + m_logicalFunction = wxCOPY; m_backgroundMode = wxTRANSPARENT; @@ -84,6 +141,13 @@ public: // graphic primitives // ------------------ + virtual void DrawObject(wxDrawObject* drawobject) + { + drawobject->Draw(*this); + CalcBoundingBox(drawobject->MinX(),drawobject->MinY()); + CalcBoundingBox(drawobject->MaxX(),drawobject->MaxY()); + } + void FloodFill(wxCoord x, wxCoord y, const wxColour& col, int style = wxFLOOD_SURFACE) { DoFloodFill(x, y, col, style); } @@ -112,6 +176,12 @@ public: void DrawArc(const wxPoint& pt1, const wxPoint& pt2, const wxPoint& centre) { DoDrawArc(pt1.x, pt1.y, pt2.x, pt2.y, centre.x, centre.y); } + void DrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height) + { DoDrawCheckMark(x, y, width, height); } + void DrawCheckMark(const wxRect& rect) + { DoDrawCheckMark(rect.x, rect.y, rect.width, rect.height); } + void DrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea) { DoDrawEllipticArc(x, y, w, h, sa, ea); } @@ -181,6 +251,11 @@ public: void DrawText(const wxString& text, const wxPoint& pt) { DoDrawText(text, pt.x, pt.y); } + void DrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle) + { DoDrawRotatedText(text, x, y, angle); } + void DrawRotatedText(const wxString& text, const wxPoint& pt, double angle) + { DoDrawRotatedText(text, pt.x, pt.y, angle); } + bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, int rop = wxCOPY, bool useMask = FALSE) @@ -256,7 +331,7 @@ public: virtual wxCoord GetCharHeight() const = 0; virtual wxCoord GetCharWidth() const = 0; - + void GetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, wxCoord *descent = NULL, @@ -321,6 +396,7 @@ public: // --------- // const... + int GetBackgroundMode() const { return m_backgroundMode; } const wxBrush& GetBackground() const { return m_backgroundBrush; } const wxBrush& GetBrush() const { return m_brush; } const wxFont& GetFont() const { return m_font; } @@ -391,10 +467,29 @@ public: virtual void CalcBoundingBox(wxCoord x, wxCoord y) { - if ( x < m_minX ) m_minX = x; - if ( y < m_minY ) m_minY = y; - if ( x > m_maxX ) m_maxX = x; - if ( y > m_maxY ) m_maxY = y; + if ( m_isBBoxValid ) + { + if ( x < m_minX ) m_minX = x; + if ( y < m_minY ) m_minY = y; + if ( x > m_maxX ) m_maxX = x; + if ( y > m_maxY ) m_maxY = y; + } + else + { + m_isBBoxValid = TRUE; + + m_minX = x; + m_minY = y; + m_maxX = x; + m_maxY = y; + } + } + + void ResetBoundingBox() + { + m_isBBoxValid = FALSE; + + m_minX = m_maxX = m_minY = m_maxY = 0; } // Get the final bounding box of the PostScript or Metafile picture. @@ -448,13 +543,13 @@ public: *y = y2; } void GetClippingBox(long *x, long *y, long *w, long *h) const - { - wxCoord xx,yy,ww,hh; - DoGetClippingBox(&xx, &yy, &ww, &hh); - if (x) *x = xx; - if (y) *y = yy; - if (w) *w = ww; - if (h) *h = hh; + { + wxCoord xx,yy,ww,hh; + DoGetClippingBox(&xx, &yy, &ww, &hh); + if (x) *x = xx; + if (y) *y = yy; + if (w) *w = ww; + if (h) *h = hh; } #endif // !Win16 @@ -480,6 +575,8 @@ protected: virtual void DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) = 0; + virtual void DoDrawCheckMark(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea) = 0; @@ -497,6 +594,8 @@ protected: bool useMask = FALSE) = 0; virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) = 0; + virtual void DoDrawRotatedText(const wxString& text, + wxCoord x, wxCoord y, double angle) = 0; virtual bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, @@ -564,6 +663,7 @@ protected: bool m_ok:1; bool m_clipping:1; bool m_isInteractive:1; + bool m_isBBoxValid:1; // coordinate system variables @@ -598,6 +698,7 @@ protected: private: DECLARE_NO_COPY_CLASS(wxDCBase); + DECLARE_ABSTRACT_CLASS(wxDCBase) }; // ----------------------------------------------------------------------------