X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9928536b3a83586c473c96000c2d3a32e4c3f576..6d8978f030996c834fcd29d85d95ebe261b8defc:/include/wx/dc.h diff --git a/include/wx/dc.h b/include/wx/dc.h index 9c8974f8ae..1fd9da829b 100644 --- a/include/wx/dc.h +++ b/include/wx/dc.h @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// // Name: wx/dc.h // Purpose: wxDC class -// Author: Vadim Zeitlin +// Author: Vadim Zeitlin // Modified by: // Created: 05/25/99 // RCS-ID: $Id$ @@ -42,6 +42,85 @@ class WXDLLIMPEXP_FWD_CORE wxMemoryDC; class WXDLLIMPEXP_FWD_CORE wxPrinterDC; class WXDLLIMPEXP_FWD_CORE wxPrintData; +// Logical ops +enum wxRasterOperationMode +{ + wxCLEAR, // 0 + wxXOR, // src XOR dst + wxINVERT, // NOT dst + wxOR_REVERSE, // src OR (NOT dst) + wxAND_REVERSE, // src AND (NOT dst) + wxCOPY, // src + wxAND, // src AND dst + wxAND_INVERT, // (NOT src) AND dst + wxNO_OP, // dst + wxNOR, // (NOT src) AND (NOT dst) + wxEQUIV, // (NOT src) XOR dst + wxSRC_INVERT, // (NOT src) + wxOR_INVERT, // (NOT src) OR dst + wxNAND, // (NOT src) OR (NOT dst) + wxOR, // src OR dst + wxSET // 1 +#if WXWIN_COMPATIBILITY_2_8 + ,wxROP_BLACK = wxCLEAR, + wxBLIT_BLACKNESS = wxCLEAR, + wxROP_XORPEN = wxXOR, + wxBLIT_SRCINVERT = wxXOR, + wxROP_NOT = wxINVERT, + wxBLIT_DSTINVERT = wxINVERT, + wxROP_MERGEPENNOT = wxOR_REVERSE, + wxBLIT_00DD0228 = wxOR_REVERSE, + wxROP_MASKPENNOT = wxAND_REVERSE, + wxBLIT_SRCERASE = wxAND_REVERSE, + wxROP_COPYPEN = wxCOPY, + wxBLIT_SRCCOPY = wxCOPY, + wxROP_MASKPEN = wxAND, + wxBLIT_SRCAND = wxAND, + wxROP_MASKNOTPEN = wxAND_INVERT, + wxBLIT_00220326 = wxAND_INVERT, + wxROP_NOP = wxNO_OP, + wxBLIT_00AA0029 = wxNO_OP, + wxROP_NOTMERGEPEN = wxNOR, + wxBLIT_NOTSRCERASE = wxNOR, + wxROP_NOTXORPEN = wxEQUIV, + wxBLIT_00990066 = wxEQUIV, + wxROP_NOTCOPYPEN = wxSRC_INVERT, + wxBLIT_NOTSCRCOPY = wxSRC_INVERT, + wxROP_MERGENOTPEN = wxOR_INVERT, + wxBLIT_MERGEPAINT = wxOR_INVERT, + wxROP_NOTMASKPEN = wxNAND, + wxBLIT_007700E6 = wxNAND, + wxROP_MERGEPEN = wxOR, + wxBLIT_SRCPAINT = wxOR, + wxROP_WHITE = wxSET, + wxBLIT_WHITENESS = wxSET +#endif //WXWIN_COMPATIBILITY_2_8 +}; + +// Flood styles +enum wxFloodFillStyle +{ + wxFLOOD_SURFACE = 1, + wxFLOOD_BORDER +}; + +// Mapping modes (same values as used by Windows, don't change) +enum wxMappingMode +{ + wxMM_TEXT = 1, + wxMM_LOMETRIC, + wxMM_HIMETRIC, + wxMM_LOENGLISH, + wxMM_HIENGLISH, + wxMM_TWIPS, + wxMM_ISOTROPIC, + wxMM_ANISOTROPIC, + wxMM_POINTS, + wxMM_METRIC +}; + +#if WXWIN_COMPATIBILITY_2_8 + //----------------------------------------------------------------------------- // wxDrawObject helper class //----------------------------------------------------------------------------- @@ -49,8 +128,7 @@ class WXDLLIMPEXP_FWD_CORE wxPrintData; class WXDLLIMPEXP_CORE wxDrawObject { public: - - wxDrawObject() + wxDEPRECATED_CONSTRUCTOR(wxDrawObject)() : m_isBBoxValid(false) , m_minX(0), m_minY(0), m_maxX(0), m_maxY(0) { } @@ -103,6 +181,8 @@ protected: wxCoord m_minX, m_minY, m_maxX, m_maxY; }; +#endif // WXWIN_COMPATIBILITY_2_8 + //----------------------------------------------------------------------------- // wxDCFactory @@ -163,7 +243,7 @@ class WXDLLIMPEXP_CORE wxDCImpl: public wxObject { public: wxDCImpl( wxDC *owner ); - ~wxDCImpl(); + virtual ~wxDCImpl(); wxDC *GetOwner() const { return m_owner; } @@ -255,36 +335,46 @@ public: // setters and getters virtual void SetFont(const wxFont& font) = 0; - virtual const wxFont& GetFont() const { return m_font; } + virtual const wxFont& GetFont() const { return m_font; } virtual void SetPen(const wxPen& pen) = 0; - virtual const wxPen& GetPen() const { return m_pen; } + virtual const wxPen& GetPen() const { return m_pen; } virtual void SetBrush(const wxBrush& brush) = 0; - virtual const wxBrush& GetBrush() const { return m_brush; } + virtual const wxBrush& GetBrush() const { return m_brush; } virtual void SetBackground(const wxBrush& brush) = 0; - virtual const wxBrush& GetBackground() const { return m_backgroundBrush; } + virtual const wxBrush& GetBackground() const { return m_backgroundBrush; } virtual void SetBackgroundMode(int mode) = 0; virtual int GetBackgroundMode() const { return m_backgroundMode; } virtual void SetTextForeground(const wxColour& colour) { m_textForegroundColour = colour; } - virtual const wxColour& GetTextForeground() const { return m_textForegroundColour; } + virtual const wxColour& GetTextForeground() const + { return m_textForegroundColour; } virtual void SetTextBackground(const wxColour& colour) { m_textBackgroundColour = colour; } - virtual const wxColour& GetTextBackground() const { return m_textBackgroundColour; } + virtual const wxColour& GetTextBackground() const + { return m_textBackgroundColour; } #if wxUSE_PALETTE virtual void SetPalette(const wxPalette& palette) = 0; #endif // wxUSE_PALETTE + // inherit the DC attributes (font and colours) from the given window + // + // this is called automatically when a window, client or paint DC is + // created + virtual void InheritAttributes(wxWindow *win); + + // logical functions - virtual void SetLogicalFunction(int function) = 0; - virtual int GetLogicalFunction() const { return m_logicalFunction; } + virtual void SetLogicalFunction(wxRasterOperationMode function) = 0; + virtual wxRasterOperationMode GetLogicalFunction() const + { return m_logicalFunction; } // text measurement @@ -341,8 +431,8 @@ public: virtual wxCoord LogicalToDeviceXRel(wxCoord x) const; virtual wxCoord LogicalToDeviceYRel(wxCoord y) const; - virtual void SetMapMode(int mode); - virtual int GetMapMode() const { return m_mappingMode; } + virtual void SetMapMode(wxMappingMode mode); + virtual wxMappingMode GetMapMode() const { return m_mappingMode; } virtual void SetUserScale(double x, double y); virtual void GetUserScale(double *x, double *y) const @@ -383,7 +473,7 @@ public: // the actual drawing API virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, - int style = wxFLOOD_SURFACE) = 0; + wxFloodFillStyle style = wxFLOOD_SURFACE) = 0; virtual void DoGradientFillLinear(const wxRect& rect, const wxColour& initialColour, @@ -429,7 +519,7 @@ public: wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, - int rop = wxCOPY, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord) = 0; @@ -439,7 +529,7 @@ public: wxDC *source, wxCoord xsrc, wxCoord ysrc, wxCoord srcWidth, wxCoord srcHeight, - int rop = wxCOPY, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); @@ -454,14 +544,14 @@ public: wxCoord xoffset, wxCoord yoffset ); virtual void DoDrawPolygon(int n, wxPoint points[], - wxCoord xoffset, wxCoord yoffset, - int fillStyle = wxODDEVEN_RULE) = 0; + wxCoord xoffset, wxCoord yoffset, + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) = 0; virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], wxCoord xoffset, wxCoord yoffset, - int fillStyle); + wxPolygonFillMode fillStyle); void DrawPolygon(const wxPointList *list, wxCoord xoffset, wxCoord yoffset, - int fillStyle ); + wxPolygonFillMode fillStyle ); #if wxUSE_SPLINES @@ -488,10 +578,10 @@ public: // --------------------------------------------------------- // wxPrinterDC Impl API - virtual wxRect GetPaperRect() + virtual wxRect GetPaperRect() const { int w = 0; int h = 0; DoGetSize( &w, &h ); return wxRect(0,0,w,h); } - virtual int GetResolution() + virtual int GetResolution() const { return -1; } private: @@ -553,6 +643,10 @@ protected: double sa, double ea ); #endif // __WXWINCE__ + // returns adjustment factor for converting wxFont "point size"; in wx + // it is point size on screen and needs to be multiplied by this value + // for rendering on higher-resolution DCs such as printer ones + static float GetFontPointSizeAdjustment(float dpi); // window on which the DC draws or NULL wxWindow *m_window; @@ -589,9 +683,9 @@ protected: wxCoord m_minX, m_minY, m_maxX, m_maxY; wxCoord m_clipX1, m_clipY1, m_clipX2, m_clipY2; - int m_logicalFunction; + wxRasterOperationMode m_logicalFunction; int m_backgroundMode; - int m_mappingMode; + wxMappingMode m_mappingMode; wxPen m_pen; wxBrush m_brush; @@ -654,7 +748,7 @@ public: wxSize GetPPI() const { return m_pimpl->GetPPI(); } - virtual int GetResolution() + virtual int GetResolution() const { return m_pimpl->GetResolution(); } // Right-To-Left (RTL) modes @@ -736,9 +830,9 @@ public: // logical functions - void SetLogicalFunction(int function) + void SetLogicalFunction(wxRasterOperationMode function) { m_pimpl->SetLogicalFunction(function); } - int GetLogicalFunction() const + wxRasterOperationMode GetLogicalFunction() const { return m_pimpl->GetLogicalFunction(); } // text measurement @@ -835,9 +929,9 @@ public: wxCoord LogicalToDeviceYRel(wxCoord y) const { return m_pimpl->LogicalToDeviceYRel(y); } - void SetMapMode(int mode) + void SetMapMode(wxMappingMode mode) { m_pimpl->SetMapMode(mode); } - int GetMapMode() const + wxMappingMode GetMapMode() const { return m_pimpl->GetMapMode(); } void SetUserScale(double x, double y) @@ -872,23 +966,14 @@ public: { m_pimpl->SetDeviceLocalOrigin( x, y ); } - // draw generic object - - void DrawObject(wxDrawObject* drawobject) - { - drawobject->Draw(*this); - CalcBoundingBox(drawobject->MinX(),drawobject->MinY()); - CalcBoundingBox(drawobject->MaxX(),drawobject->MaxY()); - } - // ----------------------------------------------- // the actual drawing API bool FloodFill(wxCoord x, wxCoord y, const wxColour& col, - int style = wxFLOOD_SURFACE) + wxFloodFillStyle style = wxFLOOD_SURFACE) { return m_pimpl->DoFloodFill(x, y, col, style); } bool FloodFill(const wxPoint& pt, const wxColour& col, - int style = wxFLOOD_SURFACE) + wxFloodFillStyle style = wxFLOOD_SURFACE) { return m_pimpl->DoFloodFill(pt.x, pt.y, col, style); } // fill the area specified by rect with a radial gradient, starting from @@ -965,20 +1050,20 @@ public: void DrawPolygon(int n, wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, - int fillStyle = wxODDEVEN_RULE) + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) { m_pimpl->DoDrawPolygon(n, points, xoffset, yoffset, fillStyle); } void DrawPolygon(const wxPointList *list, wxCoord xoffset = 0, wxCoord yoffset = 0, - int fillStyle = wxODDEVEN_RULE) + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) { m_pimpl->DrawPolygon( list, xoffset, yoffset, fillStyle ); } void DrawPolyPolygon(int n, int count[], wxPoint points[], wxCoord xoffset = 0, wxCoord yoffset = 0, - int fillStyle = wxODDEVEN_RULE) + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) { m_pimpl->DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); } #if WXWIN_COMPATIBILITY_2_8 wxDEPRECATED( void DrawPolygon(const wxList *list, wxCoord xoffset = 0, wxCoord yoffset = 0, - int fillStyle = wxODDEVEN_RULE) ); + wxPolygonFillMode fillStyle = wxODDEVEN_RULE) ); #endif // WXWIN_COMPATIBILITY_2_8 void DrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) @@ -1049,14 +1134,16 @@ public: bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, - int rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord) + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord) { return m_pimpl->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 = wxDefaultPosition) + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + const wxPoint& srcPtMask = wxDefaultPosition) { return m_pimpl->DoBlit(destPt.x, destPt.y, sz.x, sz.y, source, srcPt.x, srcPt.y, rop, useMask, srcPtMask.x, srcPtMask.y); @@ -1067,7 +1154,7 @@ public: wxDC *source, wxCoord srcX, wxCoord srcY, wxCoord srcWidth, wxCoord srcHeight, - int rop = wxCOPY, bool useMask = false, + wxRasterOperationMode rop = wxCOPY, bool useMask = false, wxCoord srcMaskX = wxDefaultCoord, wxCoord srcMaskY = wxDefaultCoord) { return m_pimpl->DoStretchBlit(dstX, dstY, dstWidth, dstHeight, @@ -1075,7 +1162,8 @@ public: } bool StretchBlit(const wxPoint& dstPt, const wxSize& dstSize, wxDC *source, const wxPoint& srcPt, const wxSize& srcSize, - int rop = wxCOPY, bool useMask = false, const wxPoint& srcMaskPt = wxDefaultPosition) + wxRasterOperationMode rop = wxCOPY, bool useMask = false, + const wxPoint& srcMaskPt = wxDefaultPosition) { return m_pimpl->DoStretchBlit(dstPt.x, dstPt.y, dstSize.x, dstSize.y, source, srcPt.x, srcPt.y, srcSize.x, srcSize.y, rop, useMask, srcMaskPt.x, srcMaskPt.y); @@ -1108,8 +1196,13 @@ public: wxDEPRECATED( void GetLogicalOrigin(long *x, long *y) const ); wxDEPRECATED( void GetDeviceOrigin(long *x, long *y) const ); wxDEPRECATED( void GetClippingBox(long *x, long *y, long *w, long *h) const ); + + wxDEPRECATED( void DrawObject(wxDrawObject* drawobject) ); #endif // WXWIN_COMPATIBILITY_2_8 +#ifdef __WXMSW__ + WXHDC GetHDC() const; +#endif // __WXMSW__ protected: // ctor takes ownership of the pointer @@ -1235,4 +1328,32 @@ private: DECLARE_NO_COPY_CLASS(wxDCClipper) }; +// ---------------------------------------------------------------------------- +// helper class: you can use it to temporarily change the DC font and +// restore it automatically when the object goes out of scope +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDCFontChanger +{ +public: + wxDCFontChanger(wxDC& dc, const wxFont& font) : m_dc(dc), m_fontOld(dc.GetFont()) + { + m_dc.SetFont(font); + } + + ~wxDCFontChanger() + { + if ( m_fontOld.Ok() ) + m_dc.SetFont(m_fontOld); + } + +private: + wxDC& m_dc; + + wxFont m_fontOld; + + DECLARE_NO_COPY_CLASS(wxDCFontChanger) +}; + + #endif // _WX_DC_H_BASE_