// Modified by:
// Created: 05/25/99
// RCS-ID: $Id$
-// Copyright: (c) wxWindows team
+// Copyright: (c) wxWidgets team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#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;
#endif // wxUSE_PALETTE
{
ResetBoundingBox();
+ ResetClipping();
}
~wxDCBase() { }
wxCoord xoffset = 0, wxCoord yoffset = 0,
int fillStyle = wxODDEVEN_RULE);
- void DrawPolyPolygon(int n, int start[], wxPoint points[],
+ void DrawPolyPolygon(int n, int count[], wxPoint points[],
wxCoord xoffset = 0, wxCoord yoffset = 0,
int fillStyle = wxODDEVEN_RULE)
- { DoDrawPolyPolygon(n, start, points, xoffset, yoffset, fillStyle); }
+ { DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); }
void DrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{ DoDrawRectangle(x, y, width, height); }
* \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 ); }
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
// --------------------
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
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
// -------------------
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)
// ------------------
// 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,
if (w) *w = ww;
if (h) *h = hh;
}
-#endif // !Win16
protected:
// the pure virtual functions which should be implemented by wxDC
virtual void DoDrawPolygon(int n, wxPoint points[],
wxCoord xoffset, wxCoord yoffset,
int fillStyle = wxODDEVEN_RULE) = 0;
- virtual void DoDrawPolyPolygon(int n, int start[], wxPoint points[],
+ virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[],
wxCoord xoffset, wxCoord yoffset,
int fillStyle);
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
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;