+#ifndef _WX_DC_H_BASE_
+#define _WX_DC_H_BASE_
+
+#ifdef __GNUG__
+ #pragma interface "dcbase.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// headers which we must include here
+// ----------------------------------------------------------------------------
+
+#include "wx/object.h" // the base class
+
+#include "wx/cursor.h" // we have member variables of these classes
+#include "wx/font.h" // so we can't do without them
+#include "wx/colour.h"
+#include "wx/brush.h"
+#include "wx/pen.h"
+#include "wx/palette.h"
+#include "wx/list.h" // we use wxList in inline functions
+
+class WXDLLEXPORT wxDCBase;
+
+class WXDLLEXPORT wxDrawObject
+{
+public:
+
+ wxDrawObject()
+ : m_isBBoxValid(FALSE)
+ , m_minX(0), m_minY(0), m_maxX(0), m_maxY(0)
+ { }
+
+ virtual ~wxDrawObject() { }
+
+ virtual void Draw(wxDCBase&) 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
+// ---------------------------------------------------------------------------
+
+WXDLLEXPORT_DATA(extern int) wxPageNumber;
+
+// ---------------------------------------------------------------------------
+// wxDC is the device context - object on which any drawing is done
+// ---------------------------------------------------------------------------
+
+class WXDLLEXPORT wxDCBase : public wxObject
+{
+public:
+ wxDCBase()
+ : m_colour(wxColourDisplay())
+ , m_ok(TRUE)
+ , m_clipping(FALSE)
+ , m_isInteractive(0)
+ , m_isBBoxValid(FALSE)
+ , m_logicalOriginX(0), m_logicalOriginY(0)
+ , m_deviceOriginX(0), m_deviceOriginY(0)
+ , m_logicalScaleX(1.0), m_logicalScaleY(1.0)
+ , m_userScaleX(1.0), m_userScaleY(1.0)
+ , m_scaleX(1.0), m_scaleY(1.0)
+ , m_signX(1), m_signY(1)
+ , m_minX(0), m_minY(0), m_maxX(0), m_maxY(0)
+ , m_clipX1(0), m_clipY1(0), m_clipX2(0), m_clipY2(0)
+ , m_logicalFunction(wxCOPY)
+ , m_backgroundMode(wxTRANSPARENT)
+ , m_mappingMode(wxMM_TEXT)
+ , m_pen()
+ , m_brush()
+ , m_backgroundBrush(*wxTRANSPARENT_BRUSH)
+ , m_textForegroundColour(*wxBLACK)
+ , m_textBackgroundColour(*wxWHITE)
+ , m_font()
+#if wxUSE_PALETTE
+ , m_palette()
+ , m_hasCustomPalette(FALSE)
+#endif // wxUSE_PALETTE
+ {
+ ResetBoundingBox();
+ }
+
+ ~wxDCBase() { }
+
+ virtual void BeginDrawing() { }
+ virtual void EndDrawing() { }
+
+ // graphic primitives
+ // ------------------
+
+ virtual void DrawObject(wxDrawObject* drawobject)
+ {
+ drawobject->Draw(*this);
+ CalcBoundingBox(drawobject->MinX(),drawobject->MinY());
+ CalcBoundingBox(drawobject->MaxX(),drawobject->MaxY());
+ }
+
+ bool FloodFill(wxCoord x, wxCoord y, const wxColour& col,
+ int style = wxFLOOD_SURFACE)
+ { return DoFloodFill(x, y, col, style); }
+ bool FloodFill(const wxPoint& pt, const wxColour& col,
+ int style = wxFLOOD_SURFACE)
+ { return DoFloodFill(pt.x, pt.y, col, style); }
+
+ bool GetPixel(wxCoord x, wxCoord y, wxColour *col) const
+ { return DoGetPixel(x, y, col); }
+ bool GetPixel(const wxPoint& pt, wxColour *col) const
+ { return DoGetPixel(pt.x, pt.y, col); }
+
+ void DrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
+ { DoDrawLine(x1, y1, x2, y2); }
+ void DrawLine(const wxPoint& pt1, const wxPoint& pt2)
+ { DoDrawLine(pt1.x, pt1.y, pt2.x, pt2.y); }
+
+ void CrossHair(wxCoord x, wxCoord y)
+ { DoCrossHair(x, y); }
+ void CrossHair(const wxPoint& pt)
+ { DoCrossHair(pt.x, pt.y); }
+
+ void DrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
+ wxCoord xc, wxCoord yc)
+ { DoDrawArc(x1, y1, x2, y2, xc, yc); }
+ 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); }
+ void DrawEllipticArc(const wxPoint& pt, const wxSize& sz,
+ double sa, double ea)
+ { DoDrawEllipticArc(pt.x, pt.y, sz.x, sz.y, sa, ea); }
+
+ void DrawPoint(wxCoord x, wxCoord y)
+ { DoDrawPoint(x, y); }
+ void DrawPoint(const wxPoint& pt)
+ { DoDrawPoint(pt.x, pt.y); }
+
+ void DrawLines(int n, wxPoint points[],
+ wxCoord xoffset = 0, wxCoord yoffset = 0)
+ { DoDrawLines(n, points, xoffset, yoffset); }
+ void DrawLines(const wxList *list,
+ wxCoord xoffset = 0, wxCoord yoffset = 0);
+
+ void DrawPolygon(int n, wxPoint points[],
+ wxCoord xoffset = 0, wxCoord yoffset = 0,
+ int fillStyle = wxODDEVEN_RULE)
+ { DoDrawPolygon(n, points, xoffset, yoffset, fillStyle); }
+
+ void DrawPolygon(const wxList *list,
+ wxCoord xoffset = 0, wxCoord yoffset = 0,
+ int fillStyle = wxODDEVEN_RULE);
+
+ void DrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
+ { DoDrawRectangle(x, y, width, height); }
+ void DrawRectangle(const wxPoint& pt, const wxSize& sz)
+ { DoDrawRectangle(pt.x, pt.y, sz.x, sz.y); }
+ void DrawRectangle(const wxRect& rect)
+ { DoDrawRectangle(rect.x, rect.y, rect.width, rect.height); }
+
+ void DrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height,
+ double radius)
+ { DoDrawRoundedRectangle(x, y, width, height, radius); }
+ void DrawRoundedRectangle(const wxPoint& pt, const wxSize& sz,
+ double radius)
+ { DoDrawRoundedRectangle(pt.x, pt.y, sz.x, sz.y, radius); }
+ void DrawRoundedRectangle(const wxRect& r, double radius)
+ { DoDrawRoundedRectangle(r.x, r.y, r.width, r.height, radius); }
+
+ void DrawCircle(wxCoord x, wxCoord y, wxCoord radius)
+ { DoDrawEllipse(x - radius, y - radius, 2*radius, 2*radius); }
+ void DrawCircle(const wxPoint& pt, wxCoord radius)
+ { DrawCircle(pt.x, pt.y, radius); }
+
+ void DrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
+ { DoDrawEllipse(x, y, width, height); }
+ void DrawEllipse(const wxPoint& pt, const wxSize& sz)
+ { DoDrawEllipse(pt.x, pt.y, sz.x, sz.y); }
+ void DrawEllipse(const wxRect& rect)
+ { DoDrawEllipse(rect.x, rect.y, rect.width, rect.height); }
+
+ void DrawIcon(const wxIcon& icon, wxCoord x, wxCoord y)
+ { DoDrawIcon(icon, x, y); }
+ void DrawIcon(const wxIcon& icon, const wxPoint& pt)
+ { DoDrawIcon(icon, pt.x, pt.y); }
+
+ void DrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y,
+ bool useMask = FALSE)
+ { DoDrawBitmap(bmp, x, y, useMask); }
+ void DrawBitmap(const wxBitmap &bmp, const wxPoint& pt,
+ bool useMask = FALSE)
+ { DoDrawBitmap(bmp, pt.x, pt.y, useMask); }
+
+ void DrawText(const wxString& text, wxCoord x, wxCoord y)
+ { DoDrawText(text, x, y); }
+ 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); }
+
+ // this version puts both optional bitmap and the text into the given
+ // rectangle and aligns is as specified by alignment parameter; it also
+ // will emphasize the character with the given index if it is != -1 and
+ // return the bounding rectangle if required
+ virtual void DrawLabel(const wxString& text,
+ const wxBitmap& image,
+ const wxRect& rect,
+ int alignment = wxALIGN_LEFT | wxALIGN_TOP,
+ int indexAccel = -1,
+ wxRect *rectBounding = NULL);
+
+ void DrawLabel(const wxString& text, const wxRect& rect,
+ int alignment = wxALIGN_LEFT | wxALIGN_TOP,
+ int indexAccel = -1)
+ { DrawLabel(text, wxNullBitmap, rect, alignment, indexAccel); }
+
+ bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
+ wxDC *source, wxCoord xsrc, wxCoord ysrc,
+ int rop = wxCOPY, bool useMask = FALSE, wxCoord xsrcMask = -1, wxCoord ysrcMask = -1)
+ {
+ return DoBlit(xdest, ydest, width, height,
+ source, xsrc, ysrc, rop, useMask, xsrcMask, ysrcMask);
+ }
+ bool Blit(const wxPoint& destPt, const wxSize& sz,
+ wxDC *source, const wxPoint& srcPt,
+ int rop = wxCOPY, bool useMask = FALSE, const wxPoint& srcPtMask = wxPoint(-1, -1))
+ {
+ return DoBlit(destPt.x, destPt.y, sz.x, sz.y,
+ source, srcPt.x, srcPt.y, rop, useMask, srcPtMask.x, srcPtMask.y);
+ }
+
+#if wxUSE_SPLINES
+ // TODO: this API needs fixing (wxPointList, why (!const) "wxList *"?)
+ void DrawSpline(wxCoord x1, wxCoord y1,
+ wxCoord x2, wxCoord y2,
+ wxCoord x3, wxCoord y3);
+ void DrawSpline(int n, wxPoint points[]);
+
+ void DrawSpline(wxList *points) { DoDrawSpline(points); }
+#endif // wxUSE_SPLINES
+
+ // global DC operations
+ // --------------------
+
+ virtual void Clear() = 0;
+
+ virtual bool StartDoc(const wxString& WXUNUSED(message)) { return TRUE; }
+ virtual void EndDoc() { }
+
+ virtual void StartPage() { }
+ virtual void EndPage() { }
+
+ // set objects to use for drawing
+ // ------------------------------
+
+ virtual void SetFont(const wxFont& font) = 0;
+ virtual void SetPen(const wxPen& pen) = 0;
+ virtual void SetBrush(const wxBrush& brush) = 0;
+ virtual void SetBackground(const wxBrush& brush) = 0;
+ virtual void SetBackgroundMode(int mode) = 0;
+#if wxUSE_PALETTE
+ virtual void SetPalette(const wxPalette& palette) = 0;
+#endif // wxUSE_PALETTE
+
+ // clipping region
+ // ---------------
+
+ void SetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
+ { DoSetClippingRegion(x, y, width, height); }
+ void SetClippingRegion(const wxPoint& pt, const wxSize& sz)
+ { DoSetClippingRegion(pt.x, pt.y, sz.x, sz.y); }
+ void SetClippingRegion(const wxRect& rect)
+ { DoSetClippingRegion(rect.x, rect.y, rect.width, rect.height); }
+ void SetClippingRegion(const wxRegion& region)
+ { DoSetClippingRegionAsRegion(region); }
+
+ virtual void DestroyClippingRegion() = 0;
+
+ void GetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const
+ { DoGetClippingBox(x, y, w, h); }
+ void GetClippingBox(wxRect& rect) const
+ {
+ // Necessary to use intermediate variables for 16-bit compilation
+ wxCoord x, y, w, h;
+ DoGetClippingBox(&x, &y, &w, &h);
+ rect.x = x; rect.y = y; rect.width = w; rect.height = h;
+ }
+
+ // text extent
+ // -----------
+
+ virtual wxCoord GetCharHeight() const = 0;
+ virtual wxCoord GetCharWidth() const = 0;
+
+ // only works for single line strings
+ void GetTextExtent(const wxString& string,
+ wxCoord *x, wxCoord *y,
+ wxCoord *descent = NULL,
+ wxCoord *externalLeading = NULL,
+ wxFont *theFont = NULL) const
+ { DoGetTextExtent(string, x, y, descent, externalLeading, theFont); }
+
+ // works for single as well as multi-line strings
+ virtual void GetMultiLineTextExtent(const wxString& text,
+ wxCoord *width,
+ wxCoord *height,
+ wxCoord *heightLine = NULL,
+ wxFont *font = NULL);
+
+ // size and resolution
+ // -------------------
+
+ // in device units
+ void GetSize(int *width, int *height) const
+ { DoGetSize(width, height); }
+ wxSize GetSize() const
+ {
+ int w, h;
+ DoGetSize(&w, &h);
+
+ return wxSize(w, h);
+ }
+
+ // in mm
+ void GetSizeMM(int* width, int* height) const
+ { DoGetSizeMM(width, height); }
+ wxSize GetSizeMM() const
+ {
+ int w, h;
+ DoGetSizeMM(&w, &h);
+
+ return wxSize(w, h);
+ }
+
+ // coordinates conversions
+ // -----------------------
+
+ // This group of functions does actual conversion of the input, as you'd
+ // expect.
+ wxCoord DeviceToLogicalX(wxCoord x) const;
+ wxCoord DeviceToLogicalY(wxCoord y) const;
+ wxCoord DeviceToLogicalXRel(wxCoord x) const;
+ wxCoord DeviceToLogicalYRel(wxCoord y) const;
+ wxCoord LogicalToDeviceX(wxCoord x) const;
+ wxCoord LogicalToDeviceY(wxCoord y) const;
+ wxCoord LogicalToDeviceXRel(wxCoord x) const;
+ wxCoord LogicalToDeviceYRel(wxCoord y) const;
+
+ // query DC capabilities
+ // ---------------------
+
+ virtual bool CanDrawBitmap() const = 0;
+ virtual bool CanGetTextExtent() const = 0;
+
+ // colour depth
+ virtual int GetDepth() const = 0;
+
+ // Resolution in Pixels per inch
+ virtual wxSize GetPPI() const = 0;
+
+ virtual bool Ok() const { return m_ok; }
+
+ // accessors
+ // ---------
+
+ // 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; }
+
+ virtual void SetTextForeground(const wxColour& colour)
+ { m_textForegroundColour = colour; }
+ virtual void SetTextBackground(const wxColour& colour)
+ { m_textBackgroundColour = colour; }
+
+ int GetMapMode() const { return m_mappingMode; }
+ virtual void SetMapMode(int mode) = 0;
+
+ virtual void GetUserScale(double *x, double *y) const
+ {
+ if ( x ) *x = m_userScaleX;
+ if ( y ) *y = m_userScaleY;
+ }
+ virtual void SetUserScale(double x, double y) = 0;
+
+ virtual void GetLogicalScale(double *x, double *y)
+ {
+ if ( x ) *x = m_logicalScaleX;
+ if ( y ) *y = m_logicalScaleY;
+ }
+ virtual void SetLogicalScale(double x, double y)
+ {
+ m_logicalScaleX = x;
+ m_logicalScaleY = y;
+ }
+
+ void GetLogicalOrigin(wxCoord *x, wxCoord *y) const
+ { DoGetLogicalOrigin(x, y); }
+ wxPoint GetLogicalOrigin() const
+ { wxCoord x, y; DoGetLogicalOrigin(&x, &y); return wxPoint(x, y); }
+ virtual void SetLogicalOrigin(wxCoord x, wxCoord y) = 0;
+
+ void GetDeviceOrigin(wxCoord *x, wxCoord *y) const
+ { DoGetDeviceOrigin(x, y); }
+ wxPoint GetDeviceOrigin() const
+ { wxCoord x, y; DoGetDeviceOrigin(&x, &y); return wxPoint(x, y); }
+ virtual void SetDeviceOrigin(wxCoord x, wxCoord y) = 0;
+
+ virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp) = 0;
+
+ int GetLogicalFunction() const { return m_logicalFunction; }
+ virtual void SetLogicalFunction(int function) = 0;
+
+ // Sometimes we need to override optimization, e.g. if other software is
+ // drawing onto our surface and we can't be sure of who's done what.
+ //
+ // FIXME: is this (still) used?
+ virtual void SetOptimization(bool WXUNUSED(opt)) { }
+ virtual bool GetOptimization() { return FALSE; }
+
+ // Some platforms have a DC cache, which should be cleared
+ // at appropriate points such as after a series of DC operations.
+ // Put ClearCache in the wxDC implementation class, since it has to be
+ // static.
+ // static void ClearCache() ;
+#if 0 // wxUSE_DC_CACHEING
+ static void EnableCache(bool cacheing) { sm_cacheing = cacheing; }
+ static bool CacheEnabled() { return sm_cacheing ; }