#define _WX_DC_H_
#include "wx/defs.h"
-//#include "wx/dc.h"
+#include "wx/dc.h"
// ---------------------------------------------------------------------------
// macros
#define wx_round(a) (int)((a)+.5)
-class WXDLLEXPORT wxDC : public wxDCBase
+#if wxUSE_DC_CACHEING
+/*
+ * Cached blitting, maintaining a cache
+ * of bitmaps required for transparent blitting
+ * instead of constant creation/deletion
+ */
+
+class wxDCCacheEntry : public wxObject
+{
+public:
+ wxDCCacheEntry( WXHBITMAP hBitmap
+ ,int nWidth
+ ,int nHeight
+ ,int nDepth
+ );
+ wxDCCacheEntry( HPS hPS
+ ,int nDepth
+ );
+ virtual ~wxDCCacheEntry();
+
+ WXHBITMAP m_hBitmap;
+ HPS m_hPS;
+ int m_nWidth;
+ int m_nHeight;
+ int m_nDepth;
+}; // end of CLASS wxDCCacheEntry
+#endif
+
+// this is an ABC: use one of the derived classes to create a DC associated
+// with a window, screen, printer and so on
+class WXDLLIMPEXP_CORE wxPMDCImpl : public wxDCImpl
{
DECLARE_DYNAMIC_CLASS(wxDC)
public:
- wxDC(void);
- ~wxDC();
+ wxPMDCImpl(wxDC *owner, WXHDC hDC);
+ virtual ~wxPMDCImpl();
// implement base class pure virtuals
// ----------------------------------
- virtual void Clear(void);
+ virtual void Clear();
virtual bool StartDoc(const wxString& rsMessage);
- virtual void EndDoc(void);
+ virtual void EndDoc();
- virtual void StartPage(void);
- virtual void EndPage(void);
+ virtual void StartPage();
+ virtual void EndPage();
virtual void SetFont(const wxFont& rFont);
virtual void SetPen(const wxPen& rPen);
virtual void SetBackgroundMode(int nMode);
virtual void SetPalette(const wxPalette& rPalette);
- virtual void DestroyClippingRegion(void);
+ virtual void DestroyClippingRegion();
- virtual wxCoord GetCharHeight(void) const;
- virtual wxCoord GetCharWidth(void) const;
- virtual void DoGetTextExtent( const wxString& rsString
- ,wxCoord* pX
- ,wxCoord* pY
- ,wxCoord* pDescent = NULL
- ,wxCoord* pExternalLeading = NULL
- ,wxFont* pTheFont = NULL
- ) const;
- virtual bool CanDrawBitmap(void) const;
- virtual bool CanGetTextExtent(void) const;
- virtual int GetDepth(void) const;
- virtual wxSize GetPPI(void) const;
+ 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 nMode);
+ virtual void SetMapMode(wxMappingMode nMode);
virtual void SetUserScale( double dX
,double dY
);
- virtual void SetSystemScale( double dX
- ,double dY
- );
virtual void SetLogicalScale( double dX
,double dY
);
virtual void SetAxisOrientation( bool bXLeftRight
,bool bYBottomUp
);
- virtual void SetLogicalFunction(int nFunction);
+ virtual void SetLogicalFunction(wxRasterOperationMode nFunction);
// implementation from now on
// --------------------------
virtual void SetRop(WXHDC hCdc);
virtual void SelectOldObjects(WXHDC hDc);
- wxWindow* GetWindow(void) const { return m_pCanvas; }
+ wxWindow* GetWindow() const { return m_pCanvas; }
void SetWindow(wxWindow* pWin) { m_pCanvas = pWin; }
- WXHDC GetHDC(void) const { return m_hDC; }
+ WXHDC GetHDC() const { return m_hDC; }
void SetHDC( WXHDC hDc
,bool bOwnsDC = FALSE
)
m_bOwnsDC = bOwnsDC;
}
- HPS GetHPS(void) const { return m_hPS; }
+ HPS GetHPS() const { return m_hPS; }
void SetHPS(HPS hPS)
{
- HDC hDC = ::GpiQueryDevice(hPS);
m_hPS = hPS;
}
- const wxBitmap& GetSelectedBitmap(void) const { return m_vSelectedBitmap; }
- wxBitmap& GetSelectedBitmap(void) { return m_vSelectedBitmap; }
+ const wxBitmap& GetSelectedBitmap() const { return m_vSelectedBitmap; }
+ wxBitmap& GetSelectedBitmap() { return m_vSelectedBitmap; }
+
+ void UpdateClipBox();
+
+#if wxUSE_DC_CACHEING
+ static wxDCCacheEntry* FindBitmapInCache( HPS hPS
+ ,int nWidth
+ ,int nHeight
+ );
+ static wxDCCacheEntry* FindDCInCache( wxDCCacheEntry* pNotThis
+ ,HPS hPS
+ );
+
+ static void AddToBitmapCache(wxDCCacheEntry* pEntry);
+ static void AddToDCCache(wxDCCacheEntry* pEntry);
+ static void ClearCache();
+#endif
protected:
- virtual void DoFloodFill( wxCoord vX
- ,wxCoord vY
- ,const wxColour& rCol
- ,int nStyle = wxFLOOD_SURFACE
+ void Init()
+ {
+ m_pCanvas = NULL;
+ m_hOldBitmap = 0;
+ m_hOldPen = 0;
+ m_hOldBrush = 0;
+ m_hOldFont = 0;
+#if wxUSE_PALETTE
+ m_hOldPalette = 0;
+#endif // wxUSE_PALETTE
+
+ m_bOwnsDC = false;
+ m_hDC = 0;
+ m_hOldPS = NULL;
+ m_hPS = NULL;
+ m_bIsPaintTime = false; // True at Paint Time
+
+ m_pen.SetColour(*wxBLACK);
+ m_brush.SetColour(*wxWHITE);
+ }
+
+ // create an uninitialized DC: this should be only used by the derived
+ // classes
+ wxPMDCImpl( wxDC *owner ) : wxDCImpl( owner ) { Init(); }
+
+public:
+ virtual void DoGetTextExtent( const wxString& rsString
+ ,wxCoord* pX
+ ,wxCoord* pY
+ ,wxCoord* pDescent = NULL
+ ,wxCoord* pExternalLeading = NULL
+ ,const wxFont* pTheFont = NULL
+ ) const;
+ virtual bool DoFloodFill( wxCoord vX
+ ,wxCoord vY
+ ,const wxColour& rCol
+ ,wxFloodFillStyle nStyle = wxFLOOD_SURFACE
);
virtual bool DoGetPixel( wxCoord vX
,wxDC* pSource
,wxCoord vXsrc
,wxCoord vYsrc
- ,int nRop = wxCOPY
+ ,wxRasterOperationMode nRop = wxCOPY
,bool bUseMask = FALSE
+ ,wxCoord vXsrcMask = -1
+ ,wxCoord vYsrcMask = -1
);
- virtual void DoSetClippingRegionAsRegion(const wxRegion& rRegion);
virtual void DoSetClippingRegion( wxCoord vX
,wxCoord vY
,wxCoord vWidth
,wxCoord vHeight
);
- virtual void DoGetClippingRegion( wxCoord* pX
- ,wxCoord* pY
- ,wxCoord* pWidth
- ,wxCoord* pHeight)
- {
- GetClippingBox( pX
- ,pY
- ,pWidth
- ,pHeight
- );
- }
+ virtual void DoSetDeviceClippingRegion(const wxRegion& rRegion);
virtual void DoGetSize( int* pWidth
,int* pHeight
,wxPoint vaPoints[]
,wxCoord vXoffset
,wxCoord vYoffset
- ,int nFillStyle = wxODDEVEN_RULE
+ ,wxPolygonFillMode nFillStyle = wxODDEVEN_RULE
);
+#if wxUSE_PALETTE
+ void DoSelectPalette(bool bRealize = FALSE);
+ void InitializePalette();
+#endif // wxUSE_PALETTE
+protected:
//
// common part of DoDrawText() and DoDrawRotatedText()
//
bool m_bOwnsDC:1;
//
- // our HDC and its usage count: we only free it when the usage count drops
- // to 0
+ // our HDC
//
WXHDC m_hDC;
- int m_nDCCount;
//
// Store all old GDI objects when do a SelectObject, so we can select them
WXHBRUSH m_hOldBrush;
WXHFONT m_hOldFont;
WXHPALETTE m_hOldPalette;
-};
+
+#if wxUSE_DC_CACHEING
+ static wxList m_svBitmapCache;
+ static wxList m_svDCCache;
+#endif
+}; // end of CLASS wxDC
#endif
// _WX_DC_H_