X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..6c3422e90992d1330a8b412206d3381f63d2d29e:/include/wx/os2/dc.h diff --git a/include/wx/os2/dc.h b/include/wx/os2/dc.h index 8851693235..89377fd23c 100644 --- a/include/wx/os2/dc.h +++ b/include/wx/os2/dc.h @@ -1,19 +1,98 @@ ///////////////////////////////////////////////////////////////////////////// // Name: dc.h // Purpose: wxDC class -// Author: Julian Smart +// Author: David Webster // Modified by: -// Created: 01/02/97 +// Created: 08/26/99 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart +// Copyright: (c) David Webster // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_DC_H_ #define _WX_DC_H_ -#ifdef __GNUG__ - #pragma interface "dc.h" +#include "wx/defs.h" +//#include "wx/dc.h" + +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +// Logical to device +// Absolute +#define XLOG2DEV(x) (x) +#define YLOG2DEV(y) (y) + +// Relative +#define XLOG2DEVREL(x) (x) +#define YLOG2DEVREL(y) (y) + +// Device to logical +// Absolute +#define XDEV2LOG(x) (x) + +#define YDEV2LOG(y) (y) + +// Relative +#define XDEV2LOGREL(x) (x) +#define YDEV2LOGREL(y) (y) + +/* + * Have the same macros as for XView but not for every operation: + * just for calculating window/viewport extent (a better way of scaling). + */ + +// Logical to device +// Absolute +#define MS_XLOG2DEV(x) LogicalToDevice(x) + +#define MS_YLOG2DEV(y) LogicalToDevice(y) + +// Relative +#define MS_XLOG2DEVREL(x) LogicalToDeviceXRel(x) +#define MS_YLOG2DEVREL(y) LogicalToDeviceYRel(y) + +// Device to logical +// Absolute +#define MS_XDEV2LOG(x) DeviceToLogicalX(x) + +#define MS_YDEV2LOG(y) DeviceToLogicalY(y) + +// Relative +#define MS_XDEV2LOGREL(x) DeviceToLogicalXRel(x) +#define MS_YDEV2LOGREL(y) DeviceToLogicalYRel(y) + +#define YSCALE(y) (yorigin - (y)) + +#define wx_round(a) (int)((a)+.5) + +#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 + ); + ~wxDCCacheEntry(); + + WXHBITMAP m_hBitmap; + HPS m_hPS; + int m_nWidth; + int m_nHeight; + int m_nDepth; +}; // end of CLASS wxDCCacheEntry #endif class WXDLLEXPORT wxDC : public wxDCBase @@ -21,151 +100,290 @@ class WXDLLEXPORT wxDC : public wxDCBase DECLARE_DYNAMIC_CLASS(wxDC) public: - wxDC(); + wxDC(void); ~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); + virtual void Clear(void); + + virtual bool StartDoc(const wxString& rsMessage); + virtual void EndDoc(void); + + virtual void StartPage(void); + virtual void EndPage(void); + + virtual void SetFont(const wxFont& rFont); + virtual void SetPen(const wxPen& rPen); + virtual void SetBrush(const wxBrush& rBrush); + virtual void SetBackground(const wxBrush& rBrush); + virtual void SetBackgroundMode(int nMode); + virtual void SetPalette(const wxPalette& rPalette); + + virtual void DestroyClippingRegion(void); + + 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 void SetMapMode(int nMode); + virtual void SetUserScale( double dX + ,double dY + ); + virtual void SetSystemScale( double dX + ,double dY + ); + virtual void SetLogicalScale( double dX + ,double dY + ); + virtual void SetLogicalOrigin( wxCoord vX + ,wxCoord vY + ); + virtual void SetDeviceOrigin( wxCoord vX + ,wxCoord vY + ); + virtual void SetAxisOrientation( bool bXLeftRight + ,bool bYBottomUp + ); + virtual void SetLogicalFunction(int nFunction); // implementation from now on // -------------------------- - virtual void SetRop(WXHDC cdc); - virtual void DoClipping(WXHDC cdc); - virtual void SelectOldObjects(WXHDC dc); + virtual void SetRop(WXHDC hCdc); + virtual void SelectOldObjects(WXHDC hDc); - wxWindow *GetWindow() const { return m_canvas; } - void SetWindow(wxWindow *win) { m_canvas = win; } + wxWindow* GetWindow(void) const { return m_pCanvas; } + void SetWindow(wxWindow* pWin) { m_pCanvas = pWin; } - WXHDC GetHDC() const { return m_hDC; } - void SetHDC(WXHDC dc, bool bOwnsDC = FALSE) + WXHDC GetHDC(void) const { return m_hDC; } + void SetHDC( WXHDC hDc + ,bool bOwnsDC = FALSE + ) { - m_hDC = dc; + m_hDC = hDc; 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) + HPS GetHPS(void) const { return m_hPS; } + void SetHPS(HPS hPS) { - GetClippingBox(x, y, width, height); + HDC hDC = ::GpiQueryDevice(hPS); + m_hPS = hPS; } + const wxBitmap& GetSelectedBitmap(void) const { return m_vSelectedBitmap; } + wxBitmap& GetSelectedBitmap(void) { 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(void); +#endif - 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; +protected: + virtual void DoFloodFill( wxCoord vX + ,wxCoord vY + ,const wxColour& rCol + ,int nStyle = wxFLOOD_SURFACE + ); + + virtual bool DoGetPixel( wxCoord vX + ,wxCoord vY + ,wxColour* pCol + ) const; + + virtual void DoDrawPoint( wxCoord vX + ,wxCoord vY + ); + virtual void DoDrawLine( wxCoord vX1 + ,wxCoord vY1 + ,wxCoord vX2 + ,wxCoord vY2 + ); + + virtual void DoDrawArc( wxCoord vX1 + ,wxCoord vY1 + ,wxCoord vX2 + ,wxCoord vY2 + ,wxCoord vXc + ,wxCoord vYc + ); + virtual void DoDrawCheckMark( wxCoord vX + ,wxCoord vY + ,wxCoord vWidth + ,wxCoord vHeight + ); + virtual void DoDrawEllipticArc( wxCoord vX + ,wxCoord vY + ,wxCoord vW + ,wxCoord vH + ,double dSa + ,double dEa + ); + + virtual void DoDrawRectangle( wxCoord vX + ,wxCoord vY + ,wxCoord vWidth + ,wxCoord vHeight + ); + virtual void DoDrawRoundedRectangle( wxCoord vX + ,wxCoord vY + ,wxCoord vWidth + ,wxCoord vHeight + ,double dRadius + ); + virtual void DoDrawEllipse( wxCoord vX + ,wxCoord vY + ,wxCoord vWidth + ,wxCoord vHeight + ); + + virtual void DoCrossHair( wxCoord vX + ,wxCoord vY + ); + + virtual void DoDrawIcon( const wxIcon& rIcon + ,wxCoord vX + ,wxCoord vY + ); + virtual void DoDrawBitmap( const wxBitmap& rBmp + ,wxCoord vX + ,wxCoord vY + ,bool bUseMask = FALSE + ); + + virtual void DoDrawText( const wxString& rsText + ,wxCoord vX + ,wxCoord vY + ); + virtual void DoDrawRotatedText( const wxString& rsText + ,wxCoord vX + ,wxCoord vY + ,double dAngle + ); + + virtual bool DoBlit( wxCoord vXdest + ,wxCoord vYdest + ,wxCoord vWidth + ,wxCoord vHeight + ,wxDC* pSource + ,wxCoord vXsrc + ,wxCoord vYsrc + ,int 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 DoGetSize( int* pWidth + ,int* pHeight + ) const; + virtual void DoGetSizeMM( int* pWidth + ,int* pHeight + ) const; + + virtual void DoDrawLines( int n + ,wxPoint vaPoints[] + ,wxCoord vXoffset + ,wxCoord yYoffset + ); + virtual void DoDrawPolygon( int n + ,wxPoint vaPoints[] + ,wxCoord vXoffset + ,wxCoord vYoffset + ,int nFillStyle = wxODDEVEN_RULE + ); + + + // + // common part of DoDrawText() and DoDrawRotatedText() + // + void DrawAnyText( const wxString& rsText + ,wxCoord vX + ,wxCoord vY + ); + + // OS2-specific member variables ?? do we even need this under OS/2? + int m_nWindowExtX; + int m_nWindowExtY; + + // // the window associated with this DC (may be NULL) - wxWindow *m_canvas; + // + wxWindow* m_pCanvas; + wxBitmap m_vSelectedBitmap; - wxBitmap m_selectedBitmap; +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; + // + 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; + // + // our HDC + // + WXHDC m_hDC; + // // 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; -}; - + // + WXHBITMAP m_hOldBitmap; + WXHPEN m_hOldPen; + 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_