]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/dc.h
bugfixes
[wxWidgets.git] / include / wx / msw / dc.h
index 5392a19a3b3212e8c19d2cbfe9120b38e705af17..54c6302975696320ddb0f53abb439714e67e6ea4 100644 (file)
 // 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_DC_H_
+#define _WX_DC_H_
 
 #ifdef __GNUG__
-#pragma interface "dc.h"
+    #pragma interface "dc.h"
 #endif
 
-#include "wx/pen.h"
-#include "wx/brush.h"
-#include "wx/icon.h"
-#include "wx/font.h"
-#include "wx/gdicmn.h"
+#include "wx/defs.h"
+#include "wx/dc.h"
 
-class WXDLLEXPORT wxDC: 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 ;
-#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); }
-
-  // Size in mm
-  virtual void GetSizeMM(long* width, long* height) const ;
-
-  // 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 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[]);
-#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; }
-
-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;
-};
+// ---------------------------------------------------------------------------
+// macros
+// ---------------------------------------------------------------------------
 
 // Logical to device
 // Absolute
-#define XLOG2DEV(x) ImplLogicalToDeviceX(x)
-
-#define YLOG2DEV(y) ImplLogicalToDeviceY(y)
+#define XLOG2DEV(x) (x)
+#define YLOG2DEV(y) (y)
 
 // Relative
-#define XLOG2DEVREL(x) ImplLogicalToDeviceXRel(x)
-#define YLOG2DEVREL(y) ImplLogicalToDeviceYRel(y)
+#define XLOG2DEVREL(x) (x)
+#define YLOG2DEVREL(y) (y)
 
 // Device to logical
 // Absolute
-#define XDEV2LOG(x) ImplDeviceToLogicalX(x)
+#define XDEV2LOG(x) (x)
 
-#define YDEV2LOG(y) ImplDeviceToLogicalY(y)
+#define YDEV2LOG(y) (y)
 
 // Relative
-#define XDEV2LOGREL(x) ImplDeviceToLogicalXRel(x)
-#define YDEV2LOGREL(y) ImplDeviceToLogicalYRel(y)
+#define XDEV2LOGREL(x) (x)
+#define YDEV2LOGREL(y) (y)
 
 /*
  * Have the same macros as for XView but not for every operation:
@@ -320,26 +67,160 @@ protected:
 #define MS_XDEV2LOGREL(x) DeviceToLogicalXRel(x)
 #define MS_YDEV2LOGREL(y) DeviceToLogicalYRel(y)
 
-#define MM_POINTS      7
-#define MM_METRIC      8
-
-extern int wxPageNumber;
+#define YSCALE(y) (yorigin - (y))
 
-// 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     wx_round(a)    (int)((a)+.5)
 
-#define mm2pt (METRIC_CONVERSION_CONSTANT*72)
-#define pt2mm (1/(METRIC_CONVERSION_CONSTANT*72))
+class WXDLLEXPORT wxDC : public wxDCBase
+{
+    DECLARE_DYNAMIC_CLASS(wxDC)
 
-#define     wx_round(a)    (int)((a)+.5)
+public:
+    wxDC();
+    ~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);
+    virtual void SetPalette(const wxPalette& palette);
+
+    virtual void DestroyClippingRegion();
+
+    virtual long GetCharHeight() const;
+    virtual long GetCharWidth() const;
+    virtual void GetTextExtent(const wxString& string,
+                               long *x, long *y,
+                               long *descent = NULL,
+                               long *externalLeading = NULL,
+                               wxFont *theFont = NULL) 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 SetSystemScale(double x, double y);
+    virtual void SetLogicalScale(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);
+    virtual void SetLogicalFunction(int function);
+
+    // implementation from now on
+    // --------------------------
+
+    virtual void SetRop(WXHDC cdc);
+    virtual void DoClipping(WXHDC cdc);
+    virtual void SelectOldObjects(WXHDC dc);
+
+    wxWindow *GetWindow() const { return m_canvas; }
+    void SetWindow(wxWindow *win) { m_canvas = win; }
+
+    WXHDC GetHDC() const { return m_hDC; }
+    void SetHDC(WXHDC dc, bool bOwnsDC = FALSE)
+    {
+        m_hDC = dc;
+        m_bOwnsDC = bOwnsDC;
+    }
 
+protected:
+    virtual void DoFloodFill(long x, long y, const wxColour& col,
+                             int style = wxFLOOD_SURFACE);
+
+    virtual bool DoGetPixel(long x, long y, wxColour *col) const;
+
+    virtual void DoDrawPoint(long x, long y);
+    virtual void DoDrawLine(long x1, long y1, long x2, long y2);
+
+    virtual void DoDrawArc(long x1, long y1,
+                           long x2, long y2,
+                           long xc, long yc);
+    virtual void DoDrawEllipticArc(long x, long y, long w, long h,
+                                   double sa, double ea);
+
+    virtual void DoDrawRectangle(long x, long y, long width, long height);
+    virtual void DoDrawRoundedRectangle(long x, long y,
+                                        long width, long height,
+                                        double radius);
+    virtual void DoDrawEllipse(long x, long y, long width, long height);
+
+    virtual void DoCrossHair(long x, long y);
+
+    virtual void DoDrawIcon(const wxIcon& icon, long x, long y);
+    virtual void DoDrawBitmap(const wxBitmap &bmp, long x, long y,
+                              bool useMask = FALSE);
+
+    virtual void DoDrawText(const wxString& text, long x, long y);
+
+    virtual bool DoBlit(long xdest, long ydest, long width, long height,
+                        wxDC *source, long xsrc, long ysrc,
+                        int rop = wxCOPY, bool useMask = FALSE);
+
+    // 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(long x, long y,
+                                     long width, long height);
+    virtual void DoGetClippingRegion(long *x, long *y,
+                                     long *width, long *height)
+    {
+        GetClippingBox(x, y, width, height);
+    }
+
+    virtual void DoGetSize(int *width, int *height) const;
+    virtual void DoGetSizeMM(int* width, int* height) const;
+
+    virtual void DoDrawLines(int n, wxPoint points[],
+                             long xoffset, long yoffset);
+    virtual void DoDrawPolygon(int n, wxPoint points[],
+                               long xoffset, long yoffset,
+                               int fillStyle = wxODDEVEN_RULE);
+
+#if wxUSE_SPLINES
+    virtual void DoDrawSpline(wxList *points);
+#endif // wxUSE_SPLINES
+
+    // MSW-specific member variables
+    int               m_windowExtX;
+    int               m_windowExtY;
+
+    // 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 and its usage count: we only free it when the usage count drops
+    // to 0
+    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;
+};
 
 #endif
-    // __DCH__
+    // _WX_DC_H_