// 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 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)
void DrawSpline(wxList *points) { DoDrawSpline(points); }
#endif // wxUSE_SPLINES
+ // Eventually we will have wxUSE_GENERIC_DRAWELLIPSE
+#ifdef __WXWINCE__
+ //! Generic method to draw ellipses, circles and arcs with current pen and brush.
+ /*! \param x Upper left corner of bounding box.
+ * \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
+ * (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
+ * calculating begin and end.
+ */
+ 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,
+ const wxSize& sz,
+ double sa = 0, double ea = 0, double angle = 0 )
+ { DoDrawEllipticArcRot( pt.x, pt.y, sz.x, sz.y, sa, ea, angle ); }
+
+ void DrawEllipticArcRot( const wxRect& rect,
+ 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,
+ 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,
+ 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
-
-#if WXWIN_COMPATIBILITY
-
- void GetTextExtent(const wxString& string, float *x, float *y,
- float *descent = NULL, float *externalLeading = NULL,
- wxFont *theFont = NULL, bool use16bit = FALSE) const ;
- void GetSize(float* width, float* height) const { int w, h; GetSize(& w, & h); *width = w; *height = h; }
- void GetSizeMM(float *width, float *height) const { int w, h; GetSizeMM(& w, & h); *width = (float) w; *height = (float) h; }
-
-#endif // WXWIN_COMPATIBILITY
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 count[], wxPoint points[],
+ wxCoord xoffset, wxCoord yoffset,
+ int fillStyle);
virtual void DoSetClippingRegionAsRegion(const wxRegion& region) = 0;
virtual void DoSetClippingRegion(wxCoord x, wxCoord y,
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;