#define _WX_MSW_DC_H_
#include "wx/defs.h"
+#include "wx/dc.h"
// ---------------------------------------------------------------------------
// macros
// this is an ABC: use one of the derived classes to create a DC associated
// with a window, screen, printer and so on
-class WXDLLEXPORT wxDC : public wxDCBase
+class WXDLLIMPEXP_CORE wxMSWDCImpl: public wxDCImpl
{
public:
- wxDC(WXHDC hDC) { Init(); m_hDC = hDC; }
- virtual ~wxDC();
+ wxMSWDCImpl(wxDC *owner, WXHDC hDC);
+ virtual ~wxMSWDCImpl();
// implement base class pure virtuals
// ----------------------------------
virtual int GetDepth() const;
virtual wxSize GetPPI() const;
- virtual void SetMapMode(int mode);
+
+ virtual void SetMapMode(wxMappingMode mode);
virtual void SetUserScale(double x, double y);
- virtual void SetSystemScale(double x, double y);
virtual void SetLogicalScale(double x, double y);
virtual void SetLogicalOrigin(wxCoord x, wxCoord y);
virtual void SetDeviceOrigin(wxCoord x, wxCoord y);
virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp);
- virtual void SetLogicalFunction(int function);
+
+ virtual void SetLogicalFunction(wxRasterOperationMode function);
// implementation from now on
// --------------------------
virtual void SetRop(WXHDC cdc);
virtual void SelectOldObjects(WXHDC dc);
- wxWindow *GetWindow() const { return m_canvas; }
void SetWindow(wxWindow *win)
{
- m_canvas = win;
+ m_window = win;
#if wxUSE_PALETTE
// if we have palettes use the correct one for this window
static void ClearCache();
#endif
+ // RTL related functions
+ // ---------------------
+
+ // get or change the layout direction (LTR or RTL) for this dc,
+ // wxLayout_Default is returned if layout direction is not supported
+ virtual wxLayoutDirection GetLayoutDirection() const;
+ virtual void SetLayoutDirection(wxLayoutDirection dir);
+
protected:
void Init()
{
- m_canvas = NULL;
m_bOwnsDC = false;
m_hDC = NULL;
// create an uninitialized DC: this should be only used by the derived
// classes
- wxDC() { Init(); }
+ wxMSWDCImpl( wxDC *owner ) : wxDCImpl( owner ) { Init(); }
+
+ void RealizeScaleAndOrigin();
+public:
virtual void DoGetTextExtent(const wxString& string,
wxCoord *x, wxCoord *y,
wxCoord *descent = NULL,
wxCoord *externalLeading = NULL,
- wxFont *theFont = NULL) const;
+ const wxFont *theFont = NULL) const;
virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const;
virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col,
- int style = wxFLOOD_SURFACE);
+ wxFloodFillStyle style = wxFLOOD_SURFACE);
virtual void DoGradientFillLinear(const wxRect& rect,
const wxColour& initialColour,
double radius);
virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
-#if wxUSE_SPLINES
- virtual void DoDrawSpline(wxList *points);
+#if wxUSE_SPLINES && !defined(__WXWINCE__)
+ virtual void DoDrawSpline(const wxPointList *points);
#endif
virtual void DoCrossHair(wxCoord x, wxCoord y);
virtual bool DoBlit(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);
+
+ virtual bool DoStretchBlit(wxCoord xdest, wxCoord ydest,
+ wxCoord dstWidth, wxCoord dstHeight,
+ wxDC *source,
+ wxCoord xsrc, wxCoord ysrc,
+ wxCoord srcWidth, wxCoord srcHeight,
+ wxRasterOperationMode rop = wxCOPY, bool useMask = false,
+ wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord);
- // this is gnarly - we can't even call this function DoSetClippingRegion()
- // because of virtual function hiding
- virtual void DoSetClippingRegionAsRegion(const wxRegion& region);
virtual void DoSetClippingRegion(wxCoord x, wxCoord y,
wxCoord width, wxCoord height);
+ virtual void DoSetDeviceClippingRegion(const wxRegion& region);
virtual void DoGetClippingBox(wxCoord *x, wxCoord *y,
wxCoord *w, wxCoord *h) const;
wxCoord xoffset, wxCoord yoffset);
virtual void DoDrawPolygon(int n, wxPoint points[],
wxCoord xoffset, wxCoord yoffset,
- int fillStyle = wxODDEVEN_RULE);
+ wxPolygonFillMode fillStyle = wxODDEVEN_RULE);
virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[],
wxCoord xoffset, wxCoord yoffset,
- int fillStyle = wxODDEVEN_RULE);
+ wxPolygonFillMode fillStyle = wxODDEVEN_RULE);
+ virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const
+ {
+ return subrect == NULL ? GetSelectedBitmap()
+ : GetSelectedBitmap().GetSubBitmap(*subrect);
+ }
#if wxUSE_PALETTE
void InitializePalette();
#endif // wxUSE_PALETTE
+protected:
// common part of DoDrawText() and DoDrawRotatedText()
void DrawAnyText(const wxString& text, wxCoord x, wxCoord y);
- // common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion()
+ // common part of DoSetClippingRegion() and DoSetDeviceClippingRegion()
void SetClippingHrgn(WXHRGN hrgn);
// implementation of DoGetSize() for wxScreen/PrinterDC: this simply
#endif // wxUSE_PALETTE
#if wxUSE_DC_CACHEING
- static wxList sm_bitmapCache;
- static wxList sm_dcCache;
+ static wxObjectList sm_bitmapCache;
+ static wxObjectList sm_dcCache;
#endif
- DECLARE_DYNAMIC_CLASS(wxDC)
- DECLARE_NO_COPY_CLASS(wxDC)
+ DECLARE_CLASS(wxMSWDCImpl)
+ wxDECLARE_NO_COPY_CLASS(wxMSWDCImpl);
};
// ----------------------------------------------------------------------------
// only/mainly)
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxDCTemp : public wxDC
+class WXDLLIMPEXP_CORE wxDCTempImpl : public wxMSWDCImpl
{
public:
- wxDCTemp(WXHDC hdc) : wxDC(hdc)
+ // construct a temporary DC with the specified HDC and size (it should be
+ // specified whenever we know it for this HDC)
+ wxDCTempImpl(wxDC *owner, WXHDC hdc, const wxSize& size )
+ : wxMSWDCImpl( owner, hdc ),
+ m_size(size)
{
}
- virtual ~wxDCTemp()
+ virtual ~wxDCTempImpl()
{
// prevent base class dtor from freeing it
SetHDC((WXHDC)NULL);
}
-protected:
virtual void DoGetSize(int *w, int *h) const
{
- wxFAIL_MSG( _T("no way to retrieve the size of generic DC") );
+ wxASSERT_MSG( m_size.IsFullySpecified(),
+ _T("size of this DC hadn't been set and is unknown") );
if ( w )
- *w = 0;
+ *w = m_size.x;
if ( h )
- *h = 0;
+ *h = m_size.y;
}
private:
- DECLARE_NO_COPY_CLASS(wxDCTemp)
+ // size of this DC must be explicitly set by SetSize() as we have no way to
+ // find it ourselves
+ const wxSize m_size;
+
+ wxDECLARE_NO_COPY_CLASS(wxDCTempImpl);
+};
+
+class WXDLLIMPEXP_CORE wxDCTemp : public wxDC
+{
+public:
+ wxDCTemp(WXHDC hdc, const wxSize& size = wxDefaultSize)
+ : wxDC(new wxDCTempImpl(this, hdc, size))
+ {
+ }
};
#endif // _WX_MSW_DC_H_