X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..235a997f9aea9d80774e296d314682e99e0c46f1:/include/wx/os2/dc.h diff --git a/include/wx/os2/dc.h b/include/wx/os2/dc.h index d54d3f4488..dfe7c050a5 100644 --- a/include/wx/os2/dc.h +++ b/include/wx/os2/dc.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dc.h +// Name: wx/os2/dc.h // Purpose: wxDC class // Author: David Webster // Modified by: @@ -67,24 +67,54 @@ #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(); - ~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); @@ -93,29 +123,20 @@ public: 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 ); @@ -128,7 +149,7 @@ public: virtual void SetAxisOrientation( bool bXLeftRight ,bool bYBottomUp ); - virtual void SetLogicalFunction(int nFunction); + virtual void SetLogicalFunction(wxRasterOperationMode nFunction); // implementation from now on // -------------------------- @@ -136,10 +157,10 @@ public: 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 ) @@ -148,14 +169,68 @@ public: m_bOwnsDC = bOwnsDC; } - const wxBitmap& GetSelectedBitmap(void) const { return m_vSelectedBitmap; } - wxBitmap& GetSelectedBitmap(void) { return m_vSelectedBitmap; } + HPS GetHPS() const { return m_hPS; } + void SetHPS(HPS hPS) + { + m_hPS = hPS; + } + 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 @@ -240,27 +315,18 @@ protected: ,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 @@ -278,13 +344,15 @@ protected: ,wxPoint vaPoints[] ,wxCoord vXoffset ,wxCoord vYoffset - ,int nFillStyle = wxODDEVEN_RULE + ,wxPolygonFillMode nFillStyle = wxODDEVEN_RULE ); -#if wxUSE_SPLINES - virtual void DoDrawSpline(wxList* pPoints); -#endif // wxUSE_SPLINES +#if wxUSE_PALETTE + void DoSelectPalette(bool bRealize = FALSE); + void InitializePalette(); +#endif // wxUSE_PALETTE +protected: // // common part of DoDrawText() and DoDrawRotatedText() // @@ -303,17 +371,22 @@ protected: wxWindow* m_pCanvas; wxBitmap m_vSelectedBitmap; +public: + // PM specific stuff + HPS m_hPS; + HPS m_hOldPS; // old hPS, if any + bool m_bIsPaintTime;// True at Paint Time + + RECTL m_vRclPaint; // Bounding rectangle at Paint time etc. // // 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 + // our HDC // WXHDC m_hDC; - int m_nDCCount; // // Store all old GDI objects when do a SelectObject, so we can select them @@ -325,6 +398,11 @@ protected: 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_