1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  16     #pragma interface "dc.h" 
  22 // --------------------------------------------------------------------------- 
  24 // --------------------------------------------------------------------------- 
  28  * Cached blitting, maintaining a cache 
  29  * of bitmaps required for transparent blitting 
  30  * instead of constant creation/deletion 
  33 class wxDCCacheEntry
: public wxObject
 
  36     wxDCCacheEntry(WXHBITMAP hBitmap
, int w
, int h
, int depth
); 
  37     wxDCCacheEntry(WXHDC hDC
, int depth
); 
  48 class WXDLLEXPORT wxDC 
: public wxDCBase
 
  54     // implement base class pure virtuals 
  55     // ---------------------------------- 
  59     virtual bool StartDoc(const wxString
& message
); 
  60     virtual void EndDoc(); 
  62     virtual void StartPage(); 
  63     virtual void EndPage(); 
  65     virtual void SetFont(const wxFont
& font
); 
  66     virtual void SetPen(const wxPen
& pen
); 
  67     virtual void SetBrush(const wxBrush
& brush
); 
  68     virtual void SetBackground(const wxBrush
& brush
); 
  69     virtual void SetBackgroundMode(int mode
); 
  71     virtual void SetPalette(const wxPalette
& palette
); 
  72 #endif // wxUSE_PALETTE 
  74     virtual void DestroyClippingRegion(); 
  76     virtual wxCoord 
GetCharHeight() const; 
  77     virtual wxCoord 
GetCharWidth() const; 
  78     virtual void DoGetTextExtent(const wxString
& string
, 
  79                                  wxCoord 
*x
, wxCoord 
*y
, 
  80                                  wxCoord 
*descent 
= NULL
, 
  81                                  wxCoord 
*externalLeading 
= NULL
, 
  82                                  wxFont 
*theFont 
= NULL
) const; 
  84     virtual bool CanDrawBitmap() const; 
  85     virtual bool CanGetTextExtent() const; 
  86     virtual int GetDepth() const; 
  87     virtual wxSize 
GetPPI() const; 
  89     virtual void SetMapMode(int mode
); 
  90     virtual void SetUserScale(double x
, double y
); 
  91     virtual void SetSystemScale(double x
, double y
); 
  92     virtual void SetLogicalScale(double x
, double y
); 
  93     virtual void SetLogicalOrigin(wxCoord x
, wxCoord y
); 
  94     virtual void SetDeviceOrigin(wxCoord x
, wxCoord y
); 
  95     virtual void SetAxisOrientation(bool xLeftRight
, bool yBottomUp
); 
  96     virtual void SetLogicalFunction(int function
); 
  98     // implementation from now on 
  99     // -------------------------- 
 101     virtual void SetRop(WXHDC cdc
); 
 102     virtual void SelectOldObjects(WXHDC dc
); 
 104     wxWindow 
*GetWindow() const { return m_canvas
; } 
 105     void SetWindow(wxWindow 
*win
) 
 110         // if we have palettes use the correct one for this window 
 112 #endif // wxUSE_PALETTE 
 115     WXHDC 
GetHDC() const { return m_hDC
; } 
 116     void SetHDC(WXHDC dc
, bool bOwnsDC 
= FALSE
) 
 122     const wxBitmap
& GetSelectedBitmap() const { return m_selectedBitmap
; } 
 123     wxBitmap
& GetSelectedBitmap() { return m_selectedBitmap
; } 
 125     // update the internal clip box variables 
 126     void UpdateClipBox(); 
 128 #if wxUSE_DC_CACHEING 
 129     static wxDCCacheEntry
* FindBitmapInCache(WXHDC hDC
, int w
, int h
); 
 130     static wxDCCacheEntry
* FindDCInCache(wxDCCacheEntry
* notThis
, WXHDC hDC
); 
 132     static void AddToBitmapCache(wxDCCacheEntry
* entry
); 
 133     static void AddToDCCache(wxDCCacheEntry
* entry
); 
 134     static void ClearCache(); 
 138     virtual bool DoFloodFill(wxCoord x
, wxCoord y
, const wxColour
& col
, 
 139                              int style 
= wxFLOOD_SURFACE
); 
 141     virtual bool DoGetPixel(wxCoord x
, wxCoord y
, wxColour 
*col
) const; 
 143     virtual void DoDrawPoint(wxCoord x
, wxCoord y
); 
 144     virtual void DoDrawLine(wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2
); 
 146     virtual void DoDrawArc(wxCoord x1
, wxCoord y1
, 
 147                            wxCoord x2
, wxCoord y2
, 
 148                            wxCoord xc
, wxCoord yc
); 
 149     virtual void DoDrawCheckMark(wxCoord x
, wxCoord y
, 
 150                                  wxCoord width
, wxCoord height
); 
 151     virtual void DoDrawEllipticArc(wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
, 
 152                                    double sa
, double ea
); 
 154     virtual void DoDrawRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
); 
 155     virtual void DoDrawRoundedRectangle(wxCoord x
, wxCoord y
, 
 156                                         wxCoord width
, wxCoord height
, 
 158     virtual void DoDrawEllipse(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
); 
 160     virtual void DoCrossHair(wxCoord x
, wxCoord y
); 
 162     virtual void DoDrawIcon(const wxIcon
& icon
, wxCoord x
, wxCoord y
); 
 163     virtual void DoDrawBitmap(const wxBitmap 
&bmp
, wxCoord x
, wxCoord y
, 
 164                               bool useMask 
= FALSE
); 
 166     virtual void DoDrawText(const wxString
& text
, wxCoord x
, wxCoord y
); 
 167     virtual void DoDrawRotatedText(const wxString
& text
, wxCoord x
, wxCoord y
, 
 170     virtual bool DoBlit(wxCoord xdest
, wxCoord ydest
, wxCoord width
, wxCoord height
, 
 171                         wxDC 
*source
, wxCoord xsrc
, wxCoord ysrc
, 
 172                         int rop 
= wxCOPY
, bool useMask 
= FALSE
, wxCoord xsrcMask 
= -1, wxCoord ysrcMask 
= -1); 
 174     // this is gnarly - we can't even call this function DoSetClippingRegion() 
 175     // because of virtual function hiding 
 176     virtual void DoSetClippingRegionAsRegion(const wxRegion
& region
); 
 177     virtual void DoSetClippingRegion(wxCoord x
, wxCoord y
, 
 178                                      wxCoord width
, wxCoord height
); 
 179     virtual void DoGetClippingRegion(wxCoord 
*x
, wxCoord 
*y
, 
 180                                      wxCoord 
*width
, wxCoord 
*height
) 
 182         GetClippingBox(x
, y
, width
, height
); 
 185     virtual void DoGetSize(int *width
, int *height
) const; 
 186     virtual void DoGetSizeMM(int* width
, int* height
) const; 
 188     virtual void DoDrawLines(int n
, wxPoint points
[], 
 189                              wxCoord xoffset
, wxCoord yoffset
); 
 190     virtual void DoDrawPolygon(int n
, wxPoint points
[], 
 191                                wxCoord xoffset
, wxCoord yoffset
, 
 192                                int fillStyle 
= wxODDEVEN_RULE
); 
 196     // MSW specific, select a logical palette into the HDC 
 197     // (tell windows to translate pixel from other palettes to our custom one 
 199     // Realize tells it to also reset the system palette to this one. 
 200     void DoSelectPalette(bool realize 
= FALSE
); 
 202     // Find out what palette our parent window has, then select it into the dc 
 203     void InitializePalette(); 
 204 #endif // wxUSE_PALETTE 
 206     // common part of DoDrawText() and DoDrawRotatedText() 
 207     void DrawAnyText(const wxString
& text
, wxCoord x
, wxCoord y
); 
 209     // common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion() 
 210     void SetClippingHrgn(WXHRGN hrgn
); 
 212     // MSW-specific member variables 
 213     // ----------------------------- 
 215     // the window associated with this DC (may be NULL) 
 218     wxBitmap          m_selectedBitmap
; 
 220     // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it 
 226     // Store all old GDI objects when do a SelectObject, so we can select them 
 227     // back in (this unselecting user's objects) so we can safely delete the 
 229     WXHBITMAP         m_oldBitmap
; 
 235     WXHPALETTE        m_oldPalette
; 
 236 #endif // wxUSE_PALETTE 
 238 #if wxUSE_DC_CACHEING 
 239     static wxList     sm_bitmapCache
; 
 240     static wxList     sm_dcCache
; 
 243     DECLARE_DYNAMIC_CLASS(wxDC
) 
 244     DECLARE_NO_COPY_CLASS(wxDC
) 
 247 // ---------------------------------------------------------------------------- 
 248 // wxDCTemp: a wxDC which doesn't free the given HDC (used by wxWindows 
 250 // ---------------------------------------------------------------------------- 
 252 class WXDLLEXPORT wxDCTemp 
: public wxDC
 
 255     wxDCTemp(WXHDC hdc
) { SetHDC(hdc
); } 
 256     virtual ~wxDCTemp() { SetHDC((WXHDC
)NULL
); } 
 259     DECLARE_NO_COPY_CLASS(wxDCTemp
)