X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a3bf7524f394af039efe196a186f7969cbabcc19..dc5960727c6161aaf98e512e396ae1a021326de8:/include/wx/dc.h diff --git a/include/wx/dc.h b/include/wx/dc.h index b536b75d9e..24899df0a0 100644 --- a/include/wx/dc.h +++ b/include/wx/dc.h @@ -5,7 +5,7 @@ // Modified by: // Created: 05/25/99 // RCS-ID: $Id$ -// Copyright: (c) wxWindows team +// Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -29,6 +29,7 @@ #include "wx/pen.h" #include "wx/palette.h" #include "wx/list.h" // we use wxList in inline functions +#include "wx/dynarray.h" class WXDLLEXPORT wxDC; class WXDLLEXPORT wxDCBase; @@ -132,6 +133,7 @@ public: #endif // wxUSE_PALETTE { ResetBoundingBox(); + ResetClipping(); } ~wxDCBase() { } @@ -210,6 +212,11 @@ public: wxCoord xoffset = 0, wxCoord yoffset = 0, int fillStyle = wxODDEVEN_RULE); + void DrawPolyPolygon(int n, int count[], wxPoint points[], + wxCoord xoffset = 0, wxCoord yoffset = 0, + int fillStyle = wxODDEVEN_RULE) + { DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); } + void DrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { DoDrawRectangle(x, y, width, height); } void DrawRectangle(const wxPoint& pt, const wxSize& sz) @@ -308,18 +315,18 @@ public: * \param y Upper left corner of bounding box. * \param w Width of bounding box. * \param h Height of bounding box. - * \param sa Starting angle of arc + * \param sa Starting angle of arc * (counterclockwise, start at 3 o'clock, 360 is full circle). * \param ea Ending angle of arc. - * \param angle Rotation angle, the Arc will be rotated after + * \param angle Rotation angle, the Arc will be rotated after * calculating begin and end. */ - void DrawEllipticArcRot( wxCoord x, wxCoord y, - wxCoord width, wxCoord height, + void DrawEllipticArcRot( wxCoord x, wxCoord y, + wxCoord width, wxCoord height, double sa = 0, double ea = 0, double angle = 0 ) { DoDrawEllipticArcRot( x, y, width, height, sa, ea, angle ); } - - void DrawEllipticArcRot( const wxPoint& pt, + + void DrawEllipticArcRot( const wxPoint& pt, const wxSize& sz, double sa = 0, double ea = 0, double angle = 0 ) { DoDrawEllipticArcRot( pt.x, pt.y, sz.x, sz.y, sa, ea, angle ); } @@ -328,27 +335,27 @@ public: double sa = 0, double ea = 0, double angle = 0 ) { DoDrawEllipticArcRot( rect.x, rect.y, rect.width, rect.height, sa, ea, angle ); } - virtual void DoDrawEllipticArcRot( wxCoord x, wxCoord y, - wxCoord w, wxCoord h, + virtual void DoDrawEllipticArcRot( wxCoord x, wxCoord y, + wxCoord w, wxCoord h, double sa = 0, double ea = 0, double angle = 0 ); - + //! Rotates points around center. /*! This is a quite straight method, it calculates in pixels * and so it produces rounding errors. * \param points The points inside will be rotated. * \param angle Rotating angle (counterclockwise, start at 3 o'clock, 360 is full circle). * \param center Center of rotation. - */ + */ void Rotate( wxList* points, double angle, wxPoint center = wxPoint() ); // used by DrawEllipticArcRot // Careful: wxList gets filled with points you have to delete later. - void CalculateEllipticPoints( wxList* points, - wxCoord xStart, wxCoord yStart, - wxCoord w, wxCoord h, + void CalculateEllipticPoints( wxList* points, + wxCoord xStart, wxCoord yStart, + wxCoord w, wxCoord h, double sa, double ea ); #endif - + // global DC operations // -------------------- @@ -384,21 +391,13 @@ public: void SetClippingRegion(const wxRegion& region) { DoSetClippingRegionAsRegion(region); } - virtual void DestroyClippingRegion() = 0; + virtual void DestroyClippingRegion() { ResetClipping(); } void GetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const { DoGetClippingBox(x, y, w, h); } void GetClippingBox(wxRect& rect) const { -#if 1 DoGetClippingBox(&rect.x, &rect.y, &rect.width, &rect.height); -#else - // Necessary to use intermediate variables for 16-bit compilation - // REMOVE ME if the above is OK for all current platforms - wxCoord x, y, w, h; - DoGetClippingBox(&x, &y, &w, &h); - rect.x = x; rect.y = y; rect.width = w; rect.height = h; -#endif } // text extent @@ -422,6 +421,11 @@ public: wxCoord *heightLine = NULL, wxFont *font = NULL); + // Measure cumulative width of text after each character + bool GetPartialTextExtents(const wxString& text, wxArrayInt& widths) const + { return DoGetPartialTextExtents(text, widths); } + + // size and resolution // ------------------- @@ -475,26 +479,17 @@ public: virtual bool Ok() const { return m_ok; } - // accessors - // --------- + // accessors and setters + // --------------------- - // 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; } const wxPen& GetPen() const { return m_pen; } - const wxColour& GetTextBackground() const { return m_textBackgroundColour; } - const wxColour& GetTextForeground() const { return m_textForegroundColour; } - - // ... and non const - wxBrush& GetBackground() { return m_backgroundBrush; } - wxBrush& GetBrush() { return m_brush; } - wxFont& GetFont() { return m_font; } - wxPen& GetPen() { return m_pen; } - wxColour& GetTextBackground() { return m_textBackgroundColour; } - wxColour& GetTextForeground() { return m_textForegroundColour; } + const wxColour& GetTextForeground() const { return m_textForegroundColour; } + const wxColour& GetTextBackground() const { return m_textBackgroundColour; } virtual void SetTextForeground(const wxColour& colour) { m_textForegroundColour = colour; } virtual void SetTextBackground(const wxColour& colour) @@ -585,7 +580,6 @@ public: // ------------------ // for compatibility with the old code when wxCoord was long everywhere -#ifndef __WIN16__ void GetTextExtent(const wxString& string, long *x, long *y, long *descent = NULL, @@ -634,7 +628,6 @@ public: if (w) *w = ww; if (h) *h = hh; } -#endif // !Win16 protected: // the pure virtual functions which should be implemented by wxDC @@ -684,6 +677,9 @@ protected: virtual void DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle = wxODDEVEN_RULE) = 0; + virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle); virtual void DoSetClippingRegionAsRegion(const wxRegion& region) = 0; virtual void DoSetClippingRegion(wxCoord x, wxCoord y, @@ -696,17 +692,14 @@ protected: virtual void DoGetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const { - if ( m_clipping ) - { - if ( x ) *x = m_clipX1; - if ( y ) *y = m_clipY1; - if ( w ) *w = m_clipX2 - m_clipX1; - if ( h ) *h = m_clipY2 - m_clipY1; - } - else - { - *x = *y = *w = *h = 0; - } + if ( x ) + *x = m_clipX1; + if ( y ) + *y = m_clipY1; + if ( w ) + *w = m_clipX2 - m_clipX1; + if ( h ) + *h = m_clipY2 - m_clipY1; } virtual void DoGetLogicalOrigin(wxCoord *x, wxCoord *y) const @@ -727,11 +720,21 @@ protected: wxCoord *externalLeading = NULL, wxFont *theFont = NULL) const = 0; + virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; + #if wxUSE_SPLINES virtual void DoDrawSpline(wxList *points); #endif protected: + // unset clipping variables (after clipping region was destroyed) + void ResetClipping() + { + m_clipping = false; + + m_clipX1 = m_clipX2 = m_clipY1 = m_clipY2 = 0; + } + // flags bool m_colour:1; bool m_ok:1;