wxWidgets/include/wx/os2/dc.h

409 lines
13 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: dc.h
// Purpose: wxDC class
// Author: David Webster
// Modified by:
// Created: 08/26/99
// RCS-ID: $Id$
// Copyright: (c) David Webster
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_DC_H_
#define _WX_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
);
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:
wxPMDCImpl(wxDC *owner, WXHDC hDC);
virtual ~wxPMDCImpl();
// implement base class pure virtuals
// ----------------------------------
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 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 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 hCdc);
virtual void SelectOldObjects(WXHDC hDc);
wxWindow* GetWindow(void) const { return m_pCanvas; }
void SetWindow(wxWindow* pWin) { m_pCanvas = pWin; }
WXHDC GetHDC(void) const { return m_hDC; }
void SetHDC( WXHDC hDc
,bool bOwnsDC = FALSE
)
{
m_hDC = hDc;
m_bOwnsDC = bOwnsDC;
}
HPS GetHPS(void) const { return m_hPS; }
void SetHPS(HPS 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
protected:
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
,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 DoSetClippingRegion( wxCoord vX
,wxCoord vY
,wxCoord vWidth
,wxCoord vHeight
);
virtual void DoSetDeviceClippingRegion(const wxRegion& rRegion);
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
);
#if wxUSE_PALETTE
void DoSelectPalette(bool bRealize = FALSE);
void InitializePalette(void);
#endif // wxUSE_PALETTE
protected:
//
// 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_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
//
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_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_