]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/dc.h
process pending wx events before sending idle events
[wxWidgets.git] / include / wx / msw / dc.h
index 94e313b9735b42ee7b4003a9106b75060b9de707..7f2abb4bf673e35a80db3f864cc43cd8bc643cc8 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
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef _WX_DC_H_
-#define _WX_DC_H_
+#ifndef _WX_MSW_DC_H_
+#define _WX_MSW_DC_H_
 
-#ifdef __GNUG__
-#pragma interface "dc.h"
-#endif
+#include "wx/defs.h"
 
-#include "wx/pen.h"
-#include "wx/brush.h"
-#include "wx/icon.h"
-#include "wx/font.h"
-#include "wx/gdicmn.h"
+// ---------------------------------------------------------------------------
+// macros
+// ---------------------------------------------------------------------------
 
-class WXDLLEXPORT wxDC: public wxObject
+#if wxUSE_DC_CACHEING
+/*
+ * Cached blitting, maintaining a cache
+ * of bitmaps required for transparent blitting
+ * instead of constant creation/deletion
+ */
+
+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, const wxColour& col, int style=wxFLOOD_SURFACE) ;
-  inline void FloodFill(const wxPoint& pt, const wxColour& col, int style=wxFLOOD_SURFACE)
-  {
-    FloodFill(pt.x, pt.y, col, style);
-  }
-
-  virtual bool GetPixel(long x1, long y1, wxColour *col) const ;
-  inline bool GetPixel(const wxPoint& pt, wxColour *col) const
-  {
-    return GetPixel(pt.x, pt.y, col);
-  }
-
-  virtual void DrawLine(long x1, long y1, long x2, long y2);
-  inline void DrawLine(const wxPoint& pt1, const wxPoint& pt2)
-  {
-    DrawLine(pt1.x, pt1.y, pt2.x, pt2.y);
-  }
-
-  virtual void CrossHair(long x, long y) ;
-  inline void CrossHair(const wxPoint& pt)
-  {
-    CrossHair(pt.x, pt.y);
-  }
-
-  virtual void DrawArc(long x1,long y1,long x2,long y2,long xc, long yc);
-  inline void DrawArc(const wxPoint& pt1, const wxPoint& pt2, const wxPoint& centre)
-  {
-    DrawArc(pt1.x, pt1.y, pt2.x, pt2.y, centre.x, centre.y);
-  }
-
-  virtual void DrawEllipticArc (long x, long y, long w, long h, double sa, double ea);
-  virtual void DrawEllipticArc (const wxPoint& pt, const wxSize& sz, double sa, double ea)
-  {
-    DrawEllipticArc(pt.x, pt.y, sz.x, sz.y, sa, ea);
-  }
-
-  virtual void DrawPoint(long x, long y);
-  inline void DrawPoint(const wxPoint& pt)
-  {
-    DrawPoint(pt.x, pt.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);
-  inline void DrawRectangle(const wxPoint& pt, const wxSize& sz)
-  {
-    DrawRectangle(pt.x, pt.y, sz.x, sz.y);
-  }
-  inline void DrawRectangle(const wxRect& rect)
-  {
-    DrawRectangle(rect.x, rect.y, rect.width, rect.height);
-  }
-
-  virtual void DrawRoundedRectangle(long x, long y, long width, long height, double radius = 20.0);
-  inline void DrawRoundedRectangle(const wxPoint& pt, const wxSize& sz, double radius = 20.0)
-  {
-    DrawRoundedRectangle(pt.x, pt.y, sz.x, sz.y, radius);
-  }
-  inline void DrawRoundedRectangle(const wxRect& rect, double radius = 20.0)
-  {
-    DrawRoundedRectangle(rect.x, rect.y, rect.width, rect.height, radius);
-  }
-
-  virtual void DrawEllipse(long x, long y, long width, long height);
-  inline void DrawEllipse(const wxPoint& pt, const wxSize& sz)
-  {
-    DrawEllipse(pt.x, pt.y, sz.x, sz.y);
-  }
-  inline void DrawEllipse(const wxRect& rect)
-  {
-    DrawEllipse(rect.x, rect.y, rect.width, rect.height);
-  }
-
-  virtual void DrawIcon(const wxIcon& icon, long x, long y);
-  inline void DrawIcon(const wxIcon& icon, const wxPoint& pt)
-  {
-    DrawIcon(icon, pt.x, pt.y);
-  }
-
-  inline 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);
-
-  virtual void DrawText(const wxString& text, long x, long y, bool use16bit = FALSE);
-  inline void DrawText(const wxString& text, const wxPoint& pt, bool use16bit = FALSE)
-  {
-    DrawText(text, pt.x, pt.y, use16bit);
-  }
-
-  virtual bool Blit(long xdest, long ydest, long width, long height,
-            wxDC *source, long xsrc, long ysrc, int rop = wxCOPY, bool useMask = FALSE);
-  inline bool Blit(const wxPoint& destPt, const wxSize& sz,
-            wxDC *source, const wxPoint& srcPt, int rop = wxCOPY, bool useMask = FALSE)
-  {
-    return Blit(destPt.x, destPt.y, sz.x, sz.y, source, srcPt.x, srcPt.y, rop, useMask);
-  }
-
-#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[]);
-#endif
-  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);
-  inline void SetClippingRegion(const wxPoint& pt, const wxSize& sz)
-  {
-    SetClippingRegion(pt.x, pt.y, sz.x, sz.y);
-  }
-  inline void SetClippingRegion(const wxRect& rect)
-  {
-    SetClippingRegion(rect.x, rect.y, rect.width, rect.height);
-  }
-
-  virtual void SetPalette(const wxPalette& palette);
-#if WXWIN_COMPATIBILITY
-  virtual inline void SetColourMap(const wxPalette& palette) { SetPalette(palette); };
+    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
-  virtual void DestroyClippingRegion(void);
-  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 ;
+
+// 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
+{
+public:
+    wxDC(WXHDC hDC) { Init(); m_hDC = hDC; }
+    virtual ~wxDC();
+
+    // implement base class pure virtuals
+    // ----------------------------------
+
+    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);
+
+    wxWindow *GetWindow() const { return m_canvas; }
+    void SetWindow(wxWindow *win)
+    {
+        m_canvas = 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;
+
+        // 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
 
-  // 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); }
+    // RTL related functions
+    // ---------------------
 
-  // Size in mm
-  virtual void GetSizeMM(long* width, long* height) const ;
+    // 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);
 
-  // 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; }
+protected:
+    void Init()
+    {
+        m_canvas = NULL;
+        m_bOwnsDC = false;
+        m_hDC = NULL;
+
+        m_oldBitmap = NULL;
+        m_oldPen = NULL;
+        m_oldBrush = NULL;
+        m_oldFont = NULL;
+
+#if wxUSE_PALETTE
+        m_oldPalette = NULL;
+#endif // wxUSE_PALETTE
+    }
+
+    // create an uninitialized DC: this should be only used by the derived
+    // classes
+    wxDC() { Init(); }
+
+    void RealizeScaleAndOrigin();
+
+    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(wxList *points);
 #endif
 
-  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 CanDrawBitmap(void) const;
-  virtual bool CanGetTextExtent(void) const;
-
-  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 ;
-  inline void GetClippingBox(wxRect& rect) const
-  {
-    long x, y, w, h;
-    GetClippingBox(&x, &y, &w, &h); rect.x = x; rect.y = y; rect.width = w; rect.height = h;
-  }
-
-  // This should probably be made available on other platforms
-  int wxDC::GetDepth(void) const ;
-
-// Implementation
-  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; }
+    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
+
+    // common part of DoDrawText() and DoDrawRotatedText()
+    void DrawAnyText(const wxString& text, wxCoord x, wxCoord y);
+
+    // common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion()
+    void SetClippingHrgn(WXHRGN hrgn);
+
+    // 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;
+
+
+    // MSW-specific member variables
+    // -----------------------------
+
+    // the window associated with this DC (may be NULL)
+    wxWindow         *m_canvas;
+
+    wxBitmap          m_selectedBitmap;
+
+    // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it
+    bool              m_bOwnsDC:1;
+
+    // our HDC
+    WXHDC             m_hDC;
+
+    // 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;
+
+#if wxUSE_PALETTE
+    WXHPALETTE        m_oldPalette;
+#endif // wxUSE_PALETTE
+
+#if wxUSE_DC_CACHEING
+    static wxList     sm_bitmapCache;
+    static wxList     sm_dcCache;
+#endif
 
-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;
-  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;
+    DECLARE_DYNAMIC_CLASS(wxDC)
+    DECLARE_NO_COPY_CLASS(wxDC)
 };
 
-// Logical to device
-// Absolute
-#define XLOG2DEV(x) ImplLogicalToDeviceX(x)
-
-#define YLOG2DEV(y) ImplLogicalToDeviceY(y)
-
-// Relative
-#define XLOG2DEVREL(x) ImplLogicalToDeviceXRel(x)
-#define YLOG2DEVREL(y) ImplLogicalToDeviceYRel(y)
-
-// Device to logical
-// Absolute
-#define XDEV2LOG(x) ImplDeviceToLogicalX(x)
-
-#define YDEV2LOG(y) ImplDeviceToLogicalY(y)
-
-// Relative
-#define XDEV2LOGREL(x) ImplDeviceToLogicalXRel(x)
-#define YDEV2LOGREL(y) ImplDeviceToLogicalYRel(y)
-
-/*
- * Have the same macros as for XView but not for every operation:
- * just for calculating window/viewport extent (a better way of scaling).
- */
-
-// Logical to device
-// Absolute
-#define MS_XLOG2DEV(x) LogicalToDevice(x)
-
-#define MS_YLOG2DEV(y) LogicalToDevice(y)
-
-// Relative
-#define MS_XLOG2DEVREL(x) LogicalToDeviceXRel(x)
-#define MS_YLOG2DEVREL(y) LogicalToDeviceYRel(y)
-
-// Device to logical
-// Absolute
-#define MS_XDEV2LOG(x) DeviceToLogicalX(x)
-
-#define MS_YDEV2LOG(y) DeviceToLogicalY(y)
-
-// Relative
-#define MS_XDEV2LOGREL(x) DeviceToLogicalXRel(x)
-#define MS_YDEV2LOGREL(y) DeviceToLogicalYRel(y)
-
-#define MM_POINTS      7
-#define MM_METRIC      8
+// ----------------------------------------------------------------------------
+// wxDCTemp: a wxDC which doesn't free the given HDC (used by wxWidgets
+// only/mainly)
+// ----------------------------------------------------------------------------
 
-extern int wxPageNumber;
-
-// Conversion
-#define METRIC_CONVERSION_CONSTANT  0.0393700787
-
-// Scaling factors for various unit conversions
-#define mm2inches (METRIC_CONVERSION_CONSTANT)
-#define inches2mm (1/METRIC_CONVERSION_CONSTANT)
-
-#define mm2twips (METRIC_CONVERSION_CONSTANT*1440)
-#define twips2mm (1/(METRIC_CONVERSION_CONSTANT*1440))
-
-#define mm2pt (METRIC_CONVERSION_CONSTANT*72)
-#define pt2mm (1/(METRIC_CONVERSION_CONSTANT*72))
+class WXDLLEXPORT wxDCTemp : public wxDC
+{
+public:
+    // construct a temporary DC with the specified HDC and size (it should be
+    // specified whenever we know it for this HDC)
+    wxDCTemp(WXHDC hdc, const wxSize& size = wxDefaultSize)
+        : wxDC(hdc),
+          m_size(size)
+    {
+    }
+
+    virtual ~wxDCTemp()
+    {
+        // prevent base class dtor from freeing it
+        SetHDC((WXHDC)NULL);
+    }
 
-#define     wx_round(a)    (int)((a)+.5)
+protected:
+    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(wxDCTemp)
+};
 
+#endif // _WX_MSW_DC_H_
 
-#endif
-    // _WX_DC_H_