]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/dc.h
don't hardcode 16/32 as sizes for small/normal icons (fixes bug 1862812)
[wxWidgets.git] / include / wx / msw / dc.h
index 5392a19a3b3212e8c19d2cbfe9120b38e705af17..bd0fdb87af3d6f61102edf83b41b6416180b1868 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
-// Name:        dc.h
+// Name:        wx/msw/dc.h
 // Purpose:     wxDC class
 // Author:      Julian Smart
 // Modified by:
 // Created:     01/02/97
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:    wxWindows license
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef __DCH__
-#define __DCH__
+#ifndef _WX_MSW_DC_H_
+#define _WX_MSW_DC_H_
 
-#ifdef __GNUG__
-#pragma interface "dc.h"
-#endif
+#include "wx/defs.h"
+#include "wx/dc.h"
+
+// ---------------------------------------------------------------------------
+// macros
+// ---------------------------------------------------------------------------
 
-#include "wx/pen.h"
-#include "wx/brush.h"
-#include "wx/icon.h"
-#include "wx/font.h"
-#include "wx/gdicmn.h"
+#if wxUSE_DC_CACHEING
+/*
+ * Cached blitting, maintaining a cache
+ * of bitmaps required for transparent blitting
+ * instead of constant creation/deletion
+ */
 
-class WXDLLEXPORT wxDC: public wxObject
+class wxDCCacheEntry: public wxObject
 {
-  DECLARE_ABSTRACT_CLASS(wxDC)
- protected:
 public:
-  wxDC(void);
-  ~wxDC(void);
-
-  inline void wxDC::BeginDrawing(void) {}
-  inline void wxDC::EndDrawing(void) {}
-
-  virtual void FloodFill(long x1, long y1, wxColour *col, int style=wxFLOOD_SURFACE) ;
-  virtual bool GetPixel(long x1, long y1, wxColour *col) const ;
-
-  virtual void DrawLine(long x1, long y1, long x2, long y2);
-  virtual void CrossHair(long x, long y) ;
-  virtual void DrawArc(long x1,long y1,long x2,long y2,double xc, double yc);
-  virtual void DrawEllipticArc (long x, long y, long w, long h, double sa, double ea);
-  virtual void DrawPoint(long x, long y);
-
-  virtual void DrawLines(int n, wxPoint points[], long xoffset = 0, long yoffset = 0);
-
-  virtual void DrawPolygon(int n, wxPoint points[], long xoffset = 0, long yoffset = 0, int fillStyle=wxODDEVEN_RULE);
-
-  virtual void DrawRectangle(long x, long y, long width, long height);
-  virtual void DrawRoundedRectangle(long x, long y, long width, long height, double radius = 20.0);
-  virtual void DrawEllipse(long x, long y, long width, long height);
-
-  virtual void DrawIcon(const wxIcon& icon, long x, long y);
-
-  virtual void Clear(void);
-  virtual void SetFont(const wxFont& font);
-  virtual void SetPen(const wxPen& pen);
-  virtual void SetBrush(const wxBrush& brush);
-  virtual void SetLogicalFunction(int function);
-  virtual void SetBackground(const wxBrush& brush);
-  virtual void SetBackgroundMode(int mode);
-  virtual void SetClippingRegion(long x, long y, long width, long height);
-  virtual void SetPalette(const wxPalette& palette);
-#if WXWIN_COMPATIBILITY
-  virtual inline void SetColourMap(const wxPalette& palette) { SetPalette(palette); };
-#endif
-  virtual void DestroyClippingRegion(void);
-  virtual void DrawText(const wxString& text, long x, long y, bool use16bit = FALSE);
-
-  virtual long GetCharHeight(void) const;
-  virtual long GetCharWidth(void) const;
-  virtual void GetTextExtent(const wxString& string, long *x, long *y,
-                     long *descent = NULL, long *externalLeading = NULL,
-                     wxFont *theFont = NULL, bool use16bit = FALSE) const;
-#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 ;
+    wxDCCacheEntry(WXHBITMAP hBitmap, int w, int h, int depth);
+    wxDCCacheEntry(WXHDC hDC, int depth);
+    virtual ~wxDCCacheEntry();
+
+    WXHBITMAP   m_bitmap;
+    WXHDC       m_dc;
+    int         m_width;
+    int         m_height;
+    int         m_depth;
+};
 #endif
 
-  // Size in device units
-  virtual void GetSize(int* width, int* height) const;
-  inline wxSize GetSize(void) const { int w, h; GetSize(&w, &h); return wxSize(w, h); }
+// 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 wxMSWDCImpl: public wxDCImpl
+{
+public:
+    wxMSWDCImpl(wxDC *owner, WXHDC hDC);
+    virtual ~wxMSWDCImpl();
 
-  // Size in mm
-  virtual void GetSizeMM(long* width, long* height) const ;
+    // implement base class pure virtuals
+    // ----------------------------------
 
-  // Compatibility
-#if WXWIN_COMPATIBILITY
-  inline void GetSize(float* width, float* height) const { int w, h; GetSize(& w, & h); *width = w; *height = h; }
-  inline void GetSizeMM(float *width, float *height) const { long w, h; GetSizeMM(& w, & h); *width = (float) w; *height = (float) h; }
-#endif
+    virtual void Clear();
+
+    virtual bool StartDoc(const wxString& message);
+    virtual void EndDoc();
+
+    virtual void StartPage();
+    virtual void EndPage();
+
+    virtual void SetFont(const wxFont& font);
+    virtual void SetPen(const wxPen& pen);
+    virtual void SetBrush(const wxBrush& brush);
+    virtual void SetBackground(const wxBrush& brush);
+    virtual void SetBackgroundMode(int mode);
+#if wxUSE_PALETTE
+    virtual void SetPalette(const wxPalette& palette);
+#endif // wxUSE_PALETTE
+
+    virtual void DestroyClippingRegion();
+
+    virtual wxCoord GetCharHeight() const;
+    virtual wxCoord GetCharWidth() const;
+
+    virtual bool CanDrawBitmap() const;
+    virtual bool CanGetTextExtent() const;
+    virtual int GetDepth() const;
+    virtual wxSize GetPPI() const;
+
+
+    virtual void SetMapMode(int mode);
+    virtual void SetUserScale(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);
+
+    // implementation from now on
+    // --------------------------
+
+    virtual void SetRop(WXHDC cdc);
+    virtual void SelectOldObjects(WXHDC dc);
+
+    void SetWindow(wxWindow *win)
+    {
+        m_window = win;
+
+#if wxUSE_PALETTE
+        // if we have palettes use the correct one for this window
+        InitializePalette();
+#endif // wxUSE_PALETTE
+    }
+
+    WXHDC GetHDC() const { return m_hDC; }
+    void SetHDC(WXHDC dc, bool bOwnsDC = false)
+    {
+        m_hDC = dc;
+        m_bOwnsDC = bOwnsDC;
 
-  virtual bool StartDoc(const wxString& message);
-  virtual void EndDoc(void);
-  virtual void StartPage(void);
-  virtual void EndPage(void);
-  virtual void SetMapMode(int mode);
-  virtual void SetUserScale(double x, double y);
-  virtual void SetSystemScale(double x, double y);
-  virtual void SetLogicalOrigin(long x, long y);
-  virtual void SetDeviceOrigin(long x, long y);
-  virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp);
-
-  // This group of functions does actual conversion
-  // of the input, as you'd expect.
-
-  long DeviceToLogicalX(long x) const;
-  long DeviceToLogicalY(long y) const;
-  long DeviceToLogicalXRel(long x) const;
-  long DeviceToLogicalYRel(long y) const;
-  long LogicalToDeviceX(long x) const;
-  long LogicalToDeviceY(long y) const;
-  long LogicalToDeviceXRel(long x) const;
-  long LogicalToDeviceYRel(long y) const;
-
-  // This group of functions may not do any conversion
-  // if m_scaleGDI is TRUE, since the HDC does the
-  // conversion automatically.
-  // m_scaleGDI NOW OBSOLETE
-  long ImplDeviceToLogicalX(long x) const;
-  long ImplDeviceToLogicalY(long y) const;
-  long ImplDeviceToLogicalXRel(long x) const;
-  long ImplDeviceToLogicalYRel(long y) const;
-  long ImplLogicalToDeviceX(long x) const;
-  long ImplLogicalToDeviceY(long y) const;
-  long ImplLogicalToDeviceXRel(long x) const;
-  long ImplLogicalToDeviceYRel(long y) const;
-
-  virtual bool Blit(long xdest, long ydest, long width, long height,
-            wxDC *source, long xsrc, long ysrc, int rop = wxCOPY, bool useMask = FALSE);
-
-  virtual bool CanDrawBitmap(void) const;
-  virtual bool CanGetTextExtent(void) const;
-
-  //
-  // This function is intended to improves drawing, by avoiding to
-  // repeatly call ::SetPen/::SetBrush. If set to FALSE, these functions
-  // aren't called when calling ::DrawLine(),...
-  // Please note that this is YOUR responsability to use it, and do it
-  // only when you KNOWN that pen/brush isn't changed between 2 calls to
-  // DrawLine,... !!!
-  // Note also that in X, we don't test m_autoSetting on brushes, because they
-  // modify Foreground, as pens. So, convention is:
-  //   - call your SetBrush(), THEN your SetPen, THEN AutoSetTools(FALSE)
-  //   - call DrawLine,...
-  // [mainly coded for Windows]
-  inline virtual void AutoSetTools(bool auto_setting) { m_autoSetting = auto_setting ; }
-  inline virtual void DrawPoint(wxPoint& point) { DrawPoint(point.x, point.y); }
-  virtual void DrawLines(wxList *list, long xoffset = 0, long yoffset = 0);
-  virtual void DrawPolygon(wxList *list, long xoffset = 0, long yoffset = 0, int fillStyle=wxODDEVEN_RULE);
-#if USE_SPLINES
-  // Splines
-  // 3-point spline
-  virtual void DrawSpline(long x1, long y1, long x2, long y2, long x3, long y3);
-  // Any number of control points - a list of pointers to wxPoints
-  virtual void DrawSpline(wxList *points);
-  virtual void DrawSpline(int n, wxPoint points[]);
+        // we might have a pre existing clipping region, make sure that we
+        // return it if asked -- but avoid calling ::GetClipBox() right now as
+        // it could be unnecessary wasteful
+        m_clipping = true;
+        m_clipX1 =
+        m_clipX2 = 0;
+    }
+
+    const wxBitmap& GetSelectedBitmap() const { return m_selectedBitmap; }
+    wxBitmap& GetSelectedBitmap() { return m_selectedBitmap; }
+
+    // update the internal clip box variables
+    void UpdateClipBox();
+
+#if wxUSE_DC_CACHEING
+    static wxDCCacheEntry* FindBitmapInCache(WXHDC hDC, int w, int h);
+    static wxDCCacheEntry* FindDCInCache(wxDCCacheEntry* notThis, WXHDC hDC);
+
+    static void AddToBitmapCache(wxDCCacheEntry* entry);
+    static void AddToDCCache(wxDCCacheEntry* entry);
+    static void ClearCache();
 #endif
-  virtual void SetTextForeground(const wxColour& colour);
-  virtual void SetTextBackground(const wxColour& colour);
-  inline virtual bool Ok(void) const {return m_ok;};
-  inline virtual int  GetMapMode(void) const {return m_mappingMode;};
-
-  inline virtual wxBrush *GetBackground(void) const { return (wxBrush*) &m_backgroundBrush ;}
-  inline virtual wxBrush *GetBrush(void) const { return (wxBrush*) &m_brush ;}
-  inline virtual wxFont  *GetFont(void) const { return (wxFont*) &m_font ;}
-  inline virtual int      GetLogicalFunction(void) const { return m_logicalFunction ;}
-  inline virtual wxPen   *GetPen(void) const { return (wxPen*) &m_pen ;}
-  inline virtual wxColour&GetTextBackground(void) const { return (wxColour&) m_textBackgroundColour ;}
-  inline virtual wxColour&GetTextForeground(void) const { return (wxColour&) m_textForegroundColour ;}
-
-  virtual void SetLogicalScale(double x, double y);
-  virtual inline  void GetUserScale(double* x, double *y) const { *x = m_userScaleX; *y = m_userScaleY; }
-  virtual void CalcBoundingBox(long x, long y);
-  // Get the final bounding box of the PostScript or Metafile picture.
-  virtual inline long MinX(void) const { return m_minX; }
-  virtual inline long MaxX(void) const { return m_maxX; }
-  virtual inline long MinY(void) const { return m_minY; }
-  virtual inline long MaxY(void) const { return m_maxY; }
-  // 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.
-  virtual inline void SetOptimization(bool WXUNUSED(opt)) { }
-  virtual inline bool GetOptimization(void) { return FALSE; }
-
-  virtual void GetClippingBox(long *x,long *y,long *w,long *h) const ;
-
-  virtual void SetRop(WXHDC cdc);
-  virtual void DoClipping(WXHDC cdc);
-  virtual void SelectOldObjects(WXHDC dc);
-
-  inline wxWindow *GetWindow(void) const { return m_canvas; }
-  inline void SetWindow(wxWindow *win) { m_canvas = win; }
-  inline WXHDC GetHDC(void) const { return m_hDC; }
-  inline void SetHDC(WXHDC dc, bool bOwnsDC = FALSE) { m_hDC = dc; m_bOwnsDC = bOwnsDC; }
-  inline bool GetAutoSetting(void) const { return m_autoSetting; }
-
-//  inline bool GetScaleGDI(void) const { return m_scaleGDI; }
-//  inline void SetScaleGDI(bool flag) { m_scaleGDI = flag; }
+
+    // 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:
-  bool              m_colour;
-  bool              m_ok;
-  bool              m_clipping;
-  bool              m_isInteractive;
-
-  // Coordinate system variables
-  long             m_logicalOriginX;
-  long             m_logicalOriginY;
-
-  long             m_deviceOriginX;
-  long             m_deviceOriginY;
-
-  double             m_logicalScaleX;
-  double             m_logicalScaleY;
-
-  double             m_userScaleX;
-  double             m_userScaleY;
-
-  int                m_signX;          // Used by SetAxisOrientation() to
-  int                m_signY;          // invert the axes
-
-  int               m_mappingMode;
-
-  long             m_minX;          // bounding box
-  long             m_minY;
-  long             m_maxX;
-  long             m_maxY;
-
-  int               m_logicalFunction;
-  int               m_backgroundMode;
-
-  wxPen             m_pen;
-  wxBrush           m_brush;
-  wxBrush           m_backgroundBrush;
-  wxColour          m_textForegroundColour;
-  wxColour          m_textBackgroundColour;
-  wxFont            m_font;
-  wxPalette         m_palette;
-  bool              m_autoSetting ;
-  int               m_clipX1;
-  int               m_clipY1;
-  int               m_clipX2;
-  int               m_clipY2;
-//  bool              m_dontDelete;
-  int               m_windowExtX;
-  int               m_windowExtY;
-  double            m_systemScaleX;
-  double            m_systemScaleY;
-
-  wxWindow *        m_canvas;
-  wxBitmap          m_selectedBitmap;
-  wxString          m_filename;
-
-  // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it
-  bool              m_bOwnsDC;
-
-  WXHDC             m_hDC;
-  int               m_hDCCount;
-
-  // Store all old GDI objects when do a SelectObject,
-  // so we can select them back in (this unselecting user's
-  // objects) so we can safely delete the DC.
-  WXHBITMAP         m_oldBitmap;
-  WXHPEN            m_oldPen;
-  WXHBRUSH          m_oldBrush;
-  WXHFONT           m_oldFont;
-  WXHPALETTE        m_oldPalette;
-
-  // Stores scaling, translation, rotation
-//  wxTransformMatrix  m_transformMatrix;
-
-  // Do we wish to scale GDI objects too, e.g. pen width?
-//  bool                               m_scaleGDI;
-};
+    void Init()
+    {
+        m_bOwnsDC = false;
+        m_hDC = NULL;
 
-// Logical to device
-// Absolute
-#define XLOG2DEV(x) ImplLogicalToDeviceX(x)
+        m_oldBitmap = NULL;
+        m_oldPen = NULL;
+        m_oldBrush = NULL;
+        m_oldFont = NULL;
 
-#define YLOG2DEV(y) ImplLogicalToDeviceY(y)
+#if wxUSE_PALETTE
+        m_oldPalette = NULL;
+#endif // wxUSE_PALETTE
+    }
 
-// Relative
-#define XLOG2DEVREL(x) ImplLogicalToDeviceXRel(x)
-#define YLOG2DEVREL(y) ImplLogicalToDeviceYRel(y)
+    // create an uninitialized DC: this should be only used by the derived
+    // classes
+    wxMSWDCImpl( wxDC *owner ) : wxDCImpl( owner ) { Init(); }
 
-// Device to logical
-// Absolute
-#define XDEV2LOG(x) ImplDeviceToLogicalX(x)
+    void RealizeScaleAndOrigin();
 
-#define YDEV2LOG(y) ImplDeviceToLogicalY(y)
+public:
+    virtual void DoGetTextExtent(const wxString& string,
+                                 wxCoord *x, wxCoord *y,
+                                 wxCoord *descent = NULL,
+                                 wxCoord *externalLeading = NULL,
+                                 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);
+
+    virtual void DoGradientFillLinear(const wxRect& rect,
+                                      const wxColour& initialColour,
+                                      const wxColour& destColour,
+                                      wxDirection nDirection = wxEAST);
+
+    virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const;
+
+    virtual void DoDrawPoint(wxCoord x, wxCoord y);
+    virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2);
+
+    virtual void DoDrawArc(wxCoord x1, wxCoord y1,
+                           wxCoord x2, wxCoord y2,
+                           wxCoord xc, wxCoord yc);
+    virtual void DoDrawCheckMark(wxCoord x, wxCoord y,
+                                 wxCoord width, wxCoord height);
+    virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h,
+                                   double sa, double ea);
+
+    virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
+    virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y,
+                                        wxCoord width, wxCoord height,
+                                        double radius);
+    virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
+
+#if wxUSE_SPLINES
+    virtual void DoDrawSpline(const wxPointList *points);
+#endif
 
-// Relative
-#define XDEV2LOGREL(x) ImplDeviceToLogicalXRel(x)
-#define YDEV2LOGREL(y) ImplDeviceToLogicalYRel(y)
+    virtual void DoCrossHair(wxCoord x, wxCoord y);
+
+    virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y);
+    virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y,
+                              bool useMask = false);
+
+    virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y);
+    virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y,
+                                   double angle);
+
+    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);
+
+    virtual bool DoStretchBlit(wxCoord xdest, wxCoord ydest,
+                               wxCoord dstWidth, wxCoord dstHeight,
+                               wxDC *source,
+                               wxCoord xsrc, wxCoord ysrc,
+                               wxCoord srcWidth, wxCoord srcHeight,
+                               int 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 DoGetClippingBox(wxCoord *x, wxCoord *y,
+                                  wxCoord *w, wxCoord *h) const;
+
+    virtual void DoGetSizeMM(int* width, int* height) const;
+
+    virtual void DoDrawLines(int n, wxPoint points[],
+                             wxCoord xoffset, wxCoord yoffset);
+    virtual void DoDrawPolygon(int n, wxPoint points[],
+                               wxCoord xoffset, wxCoord yoffset,
+                               int fillStyle = wxODDEVEN_RULE);
+    virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[],
+                                   wxCoord xoffset, wxCoord yoffset,
+                                   int fillStyle = wxODDEVEN_RULE);
+    virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const
+    {
+        return subrect == NULL ? GetSelectedBitmap()
+                               : GetSelectedBitmap().GetSubBitmap(*subrect);
+    }
+
+
+#if wxUSE_PALETTE
+    // MSW specific, select a logical palette into the HDC
+    // (tell windows to translate pixel from other palettes to our custom one
+    // and vice versa)
+    // Realize tells it to also reset the system palette to this one.
+    void DoSelectPalette(bool realize = false);
+
+    // Find out what palette our parent window has, then select it into the dc
+    void InitializePalette();
+#endif // wxUSE_PALETTE
 
-/*
- * Have the same macros as for XView but not for every operation:
- * just for calculating window/viewport extent (a better way of scaling).
- */
+protected:
+    // common part of DoDrawText() and DoDrawRotatedText()
+    void DrawAnyText(const wxString& text, wxCoord x, wxCoord y);
 
-// Logical to device
-// Absolute
-#define MS_XLOG2DEV(x) LogicalToDevice(x)
+    // common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion()
+    void SetClippingHrgn(WXHRGN hrgn);
 
-#define MS_YLOG2DEV(y) LogicalToDevice(y)
+    // implementation of DoGetSize() for wxScreen/PrinterDC: this simply
+    // returns the size of the entire device this DC is associated with
+    //
+    // notice that we intentionally put it in a separate function instead of
+    // DoGetSize() itself because we want it to remain pure virtual both
+    // because each derived class should take care to define it as needed (this
+    // implementation is not at all always appropriate) and because we want
+    // wxDC to be an ABC to prevent it from being created directly
+    void GetDeviceSize(int *width, int *height) const;
 
-// Relative
-#define MS_XLOG2DEVREL(x) LogicalToDeviceXRel(x)
-#define MS_YLOG2DEVREL(y) LogicalToDeviceYRel(y)
 
-// Device to logical
-// Absolute
-#define MS_XDEV2LOG(x) DeviceToLogicalX(x)
+    // MSW-specific member variables
+    // -----------------------------
 
-#define MS_YDEV2LOG(y) DeviceToLogicalY(y)
+    // the window associated with this DC (may be NULL)
+    wxWindow         *m_canvas;
 
-// Relative
-#define MS_XDEV2LOGREL(x) DeviceToLogicalXRel(x)
-#define MS_YDEV2LOGREL(y) DeviceToLogicalYRel(y)
+    wxBitmap          m_selectedBitmap;
 
-#define MM_POINTS      7
-#define MM_METRIC      8
+    // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it
+    bool              m_bOwnsDC:1;
 
-extern int wxPageNumber;
+    // our HDC
+    WXHDC             m_hDC;
 
-// Conversion
-#define METRIC_CONVERSION_CONSTANT  0.0393700787
+    // Store all old GDI objects when do a SelectObject, so we can select them
+    // back in (this unselecting user's objects) so we can safely delete the
+    // DC.
+    WXHBITMAP         m_oldBitmap;
+    WXHPEN            m_oldPen;
+    WXHBRUSH          m_oldBrush;
+    WXHFONT           m_oldFont;
 
-// Scaling factors for various unit conversions
-#define mm2inches (METRIC_CONVERSION_CONSTANT)
-#define inches2mm (1/METRIC_CONVERSION_CONSTANT)
+#if wxUSE_PALETTE
+    WXHPALETTE        m_oldPalette;
+#endif // wxUSE_PALETTE
 
-#define mm2twips (METRIC_CONVERSION_CONSTANT*1440)
-#define twips2mm (1/(METRIC_CONVERSION_CONSTANT*1440))
+#if wxUSE_DC_CACHEING
+    static wxObjectList     sm_bitmapCache;
+    static wxObjectList     sm_dcCache;
+#endif
 
-#define mm2pt (METRIC_CONVERSION_CONSTANT*72)
-#define pt2mm (1/(METRIC_CONVERSION_CONSTANT*72))
+    DECLARE_CLASS(wxMSWDCImpl)
+    DECLARE_NO_COPY_CLASS(wxMSWDCImpl)
+};
 
-#define     wx_round(a)    (int)((a)+.5)
+// ----------------------------------------------------------------------------
+// wxDCTemp: a wxDC which doesn't free the given HDC (used by wxWidgets
+// only/mainly)
+// ----------------------------------------------------------------------------
 
+class WXDLLEXPORT wxDCTempImpl : public wxMSWDCImpl
+{
+public:
+    // 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 ~wxDCTempImpl()
+    {
+        // prevent base class dtor from freeing it
+        SetHDC((WXHDC)NULL);
+    }
+
+    virtual void DoGetSize(int *w, int *h) const
+    {
+        wxASSERT_MSG( m_size.IsFullySpecified(),
+                      _T("size of this DC hadn't been set and is unknown") );
+
+        if ( w )
+            *w = m_size.x;
+        if ( h )
+            *h = m_size.y;
+    }
+
+private:
+    // size of this DC must be explicitly set by SetSize() as we have no way to
+    // find it ourselves
+    const wxSize m_size;
+
+    DECLARE_NO_COPY_CLASS(wxDCTempImpl)
+};
+
+class WXDLLEXPORT wxDCTemp : public wxDC
+{
+public:
+    wxDCTemp(WXHDC hdc, const wxSize& size = wxDefaultSize)
+        : wxDC(new wxDCTempImpl(this, hdc, size))
+    {
+    }
+};
+
+#endif // _WX_MSW_DC_H_
 
-#endif
-    // __DCH__