1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  15 #if defined(__GNUG__) && !defined(__APPLE__) 
  16 #pragma interface "dc.h" 
  23 #include "wx/gdicmn.h" 
  25 //----------------------------------------------------------------------------- 
  27 //----------------------------------------------------------------------------- 
  31 #define MM_ISOTROPIC    1 
  32 #define MM_ANISOTROPIC    2 
  40 //----------------------------------------------------------------------------- 
  42 //----------------------------------------------------------------------------- 
  44 extern int wxPageNumber
; 
  46 class wxMacPortStateHelper 
; 
  47 //----------------------------------------------------------------------------- 
  49 //----------------------------------------------------------------------------- 
  51 class WXDLLEXPORT wxDC
: public wxDCBase
 
  53     DECLARE_DYNAMIC_CLASS(wxDC
) 
  54     DECLARE_NO_COPY_CLASS(wxDC
) 
  62     // implement base class pure virtuals 
  63     // ---------------------------------- 
  67     virtual bool StartDoc( const wxString
& WXUNUSED(message
) ) { return TRUE
; } 
  68     virtual void EndDoc(void) {}; 
  70     virtual void StartPage(void) {}; 
  71     virtual void EndPage(void) {}; 
  73     virtual void SetFont(const wxFont
& font
); 
  74     virtual void SetPen(const wxPen
& pen
); 
  75     virtual void SetBrush(const wxBrush
& brush
); 
  76     virtual void SetBackground(const wxBrush
& brush
); 
  77     virtual void SetBackgroundMode(int mode
); 
  78     virtual void SetPalette(const wxPalette
& palette
); 
  80     virtual void DestroyClippingRegion(); 
  82     virtual wxCoord 
GetCharHeight() const; 
  83     virtual wxCoord 
GetCharWidth() const; 
  84     virtual void DoGetTextExtent(const wxString
& string
, 
  85                                  wxCoord 
*x
, wxCoord 
*y
, 
  86                                  wxCoord 
*descent 
= NULL
, 
  87                                  wxCoord 
*externalLeading 
= NULL
, 
  88                                  wxFont 
*theFont 
= NULL
) const; 
  90     virtual bool CanDrawBitmap() const; 
  91     virtual bool CanGetTextExtent() const; 
  92     virtual int GetDepth() const; 
  93     virtual wxSize 
GetPPI() const; 
  95     virtual void SetMapMode(int mode
); 
  96     virtual void SetUserScale(double x
, double y
); 
  98     virtual void SetLogicalScale(double x
, double y
); 
  99     virtual void SetLogicalOrigin(wxCoord x
, wxCoord y
); 
 100     virtual void SetDeviceOrigin(wxCoord x
, wxCoord y
); 
 101     virtual void SetAxisOrientation(bool xLeftRight
, bool yBottomUp
); 
 102     virtual void SetLogicalFunction(int function
); 
 104     virtual void SetTextForeground(const wxColour
& colour
) ; 
 105     virtual void SetTextBackground(const wxColour
& colour
) ; 
 107     void ComputeScaleAndOrigin(void); 
 111     wxCoord 
XDEV2LOG(wxCoord x
) const 
 113       long new_x 
= x 
- m_deviceOriginX 
; 
 115         return (wxCoord
)((double)(new_x
) / m_scaleX 
+ 0.5) * m_signX 
+ m_logicalOriginX
; 
 117         return (wxCoord
)((double)(new_x
) / m_scaleX 
- 0.5) * m_signX 
+ m_logicalOriginX
; 
 119     wxCoord 
XDEV2LOGREL(wxCoord x
) const 
 122         return (wxCoord
)((double)(x
) / m_scaleX 
+ 0.5); 
 124         return (wxCoord
)((double)(x
) / m_scaleX 
- 0.5); 
 126     wxCoord 
YDEV2LOG(wxCoord y
) const 
 128       long new_y 
= y 
- m_deviceOriginY 
; 
 130         return (wxCoord
)((double)(new_y
) / m_scaleY 
+ 0.5) * m_signY 
+ m_logicalOriginY
; 
 132         return (wxCoord
)((double)(new_y
) / m_scaleY 
- 0.5) * m_signY 
+ m_logicalOriginY
; 
 134     wxCoord 
YDEV2LOGREL(wxCoord y
) const 
 137         return (wxCoord
)((double)(y
) / m_scaleY 
+ 0.5); 
 139         return (wxCoord
)((double)(y
) / m_scaleY 
- 0.5); 
 141     wxCoord 
XLOG2DEV(wxCoord x
) const 
 143       long new_x 
= x 
- m_logicalOriginX
; 
 145         return (wxCoord
)((double)(new_x
) * m_scaleX 
+ 0.5) * m_signX 
+ m_deviceOriginX  
; 
 147         return (wxCoord
)((double)(new_x
) * m_scaleX 
- 0.5) * m_signX 
+ m_deviceOriginX 
; 
 149     wxCoord 
XLOG2DEVREL(wxCoord x
) const 
 152         return (wxCoord
)((double)(x
) * m_scaleX 
+ 0.5); 
 154         return (wxCoord
)((double)(x
) * m_scaleX 
- 0.5); 
 156     wxCoord 
YLOG2DEV(wxCoord y
) const 
 158       long new_y 
= y 
- m_logicalOriginY 
; 
 160         return (wxCoord
)((double)(new_y
) * m_scaleY 
+ 0.5) * m_signY 
+ m_deviceOriginY 
; 
 162         return (wxCoord
)((double)(new_y
) * m_scaleY 
- 0.5) * m_signY 
+ m_deviceOriginY 
; 
 164     wxCoord 
YLOG2DEVREL(wxCoord y
) const 
 167         return (wxCoord
)((double)(y
) * m_scaleY 
+ 0.5); 
 169         return (wxCoord
)((double)(y
) * m_scaleY 
- 0.5); 
 171     wxCoord 
XLOG2DEVMAC(wxCoord x
) const 
 173       long new_x 
= x 
- m_logicalOriginX
; 
 175         return (wxCoord
)((double)(new_x
) * m_scaleX 
+ 0.5) * m_signX 
+ m_deviceOriginX 
+ m_macLocalOrigin
.x 
; 
 177         return (wxCoord
)((double)(new_x
) * m_scaleX 
- 0.5) * m_signX 
+ m_deviceOriginX 
+ m_macLocalOrigin
.x 
; 
 179     wxCoord 
YLOG2DEVMAC(wxCoord y
) const 
 181       long new_y 
= y 
- m_logicalOriginY 
; 
 183         return (wxCoord
)((double)(new_y
) * m_scaleY 
+ 0.5) * m_signY 
+ m_deviceOriginY 
+ m_macLocalOrigin
.y 
; 
 185         return (wxCoord
)((double)(new_y
) * m_scaleY 
- 0.5) * m_signY 
+ m_deviceOriginY 
+ m_macLocalOrigin
.y 
; 
 188     WXHRGN 
MacGetCurrentClipRgn() { return m_macCurrentClipRgn 
; } 
 189     static void MacSetupBackgroundForCurrentPort(const wxBrush
& background 
) ; 
 193     virtual bool DoFloodFill(wxCoord x
, wxCoord y
, const wxColour
& col
, 
 194                              int style 
= wxFLOOD_SURFACE
); 
 196     virtual bool DoGetPixel(wxCoord x
, wxCoord y
, wxColour 
*col
) const; 
 198     virtual void DoDrawPoint(wxCoord x
, wxCoord y
); 
 199     virtual void DoDrawLine(wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2
); 
 201     virtual void DoDrawArc(wxCoord x1
, wxCoord y1
, 
 202                            wxCoord x2
, wxCoord y2
, 
 203                            wxCoord xc
, wxCoord yc
); 
 205     virtual void DoDrawEllipticArc(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
, 
 206                                    double sa
, double ea
); 
 208     virtual void DoDrawRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
); 
 209     virtual void DoDrawRoundedRectangle(wxCoord x
, wxCoord y
, 
 210                                         wxCoord width
, wxCoord height
, 
 212     virtual void DoDrawEllipse(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
); 
 214     virtual void DoCrossHair(wxCoord x
, wxCoord y
); 
 216     virtual void DoDrawIcon(const wxIcon
& icon
, wxCoord x
, wxCoord y
); 
 217     virtual void DoDrawBitmap(const wxBitmap 
&bmp
, wxCoord x
, wxCoord y
, 
 218                               bool useMask 
= FALSE
); 
 220     virtual void DoDrawText(const wxString
& text
, wxCoord x
, wxCoord y
); 
 221     virtual void DoDrawRotatedText(const wxString
& text
, wxCoord x
, wxCoord y
, 
 224     virtual bool DoBlit(wxCoord xdest
, wxCoord ydest
, wxCoord width
, wxCoord height
, 
 225                         wxDC 
*source
, wxCoord xsrc
, wxCoord ysrc
, 
 226                         int rop 
= wxCOPY
, bool useMask 
= FALSE
, wxCoord xsrcMask 
= -1, wxCoord ysrcMask 
= -1); 
 228     // this is gnarly - we can't even call this function DoSetClippingRegion() 
 229     // because of virtual function hiding 
 230     virtual void DoSetClippingRegionAsRegion(const wxRegion
& region
); 
 231     virtual void DoSetClippingRegion(wxCoord x
, wxCoord y
, 
 232                                      wxCoord width
, wxCoord height
); 
 233     virtual void DoGetClippingRegion(wxCoord 
*x
, wxCoord 
*y
, 
 234                                      wxCoord 
*width
, wxCoord 
*height
) 
 236         GetClippingBox(x
, y
, width
, height
); 
 239     virtual void DoGetSizeMM(int* width
, int* height
) const; 
 241     virtual void DoDrawLines(int n
, wxPoint points
[], 
 242                              wxCoord xoffset
, wxCoord yoffset
); 
 243     virtual void DoDrawPolygon(int n
, wxPoint points
[], 
 244                                wxCoord xoffset
, wxCoord yoffset
, 
 245                                int fillStyle 
= wxODDEVEN_RULE
); 
 249     // Variables used for scaling 
 250     double       m_mm_to_pix_x
,m_mm_to_pix_y
;  
 252     bool         m_needComputeScaleX
,m_needComputeScaleY
;          
 253     // If un-scrolled is non-zero or d.o. changes with scrolling. 
 254     // Set using SetInternalDeviceOrigin(). 
 255     long         m_internalDeviceOriginX
,m_internalDeviceOriginY
; 
 256      // To be set by external classes such as wxScrolledWindow 
 257      // using SetDeviceOrigin() 
 258     long         m_externalDeviceOriginX
,m_externalDeviceOriginY
; 
 260     // Begin implementation for Mac 
 264     WXHBITMAP            m_macMask 
; 
 266     // in order to preserve the const inheritance of the virtual functions, we have to  
 267     // use mutable variables starting from CWPro 5 
 269     void                    MacInstallFont() const ; 
 270     void                    MacInstallPen() const ; 
 271     void                    MacInstallBrush() const ; 
 273     mutable bool    m_macFontInstalled 
; 
 274     mutable bool    m_macPenInstalled 
; 
 275     mutable bool    m_macBrushInstalled 
; 
 277     WXHRGN                    m_macBoundaryClipRgn 
; 
 278     WXHRGN                  m_macCurrentClipRgn 
; 
 279     wxPoint                    m_macLocalOrigin 
; 
 280     void                    MacSetupPort( wxMacPortStateHelper
* ph 
) const ; 
 281     void                    MacCleanupPort( wxMacPortStateHelper
* ph 
) const ; 
 282     mutable void*                   m_macATSUIStyle 
; 
 283     mutable wxMacPortStateHelper
*   m_macCurrentPortStateHelper 
; 
 284     mutable bool                    m_macFormerAliasState 
; 
 285     mutable short                   m_macFormerAliasSize 
; 
 286     mutable bool                    m_macAliasWasEnabled 
; 
 287     mutable void*                   m_macForegroundPixMap 
; 
 288     mutable void*                   m_macBackgroundPixMap 
;