dc.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: wx/os2/dc.h
  3. // Purpose: wxDC class
  4. // Author: David Webster
  5. // Modified by:
  6. // Created: 08/26/99
  7. // Copyright: (c) David Webster
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. #ifndef _WX_DC_H_
  11. #define _WX_DC_H_
  12. #include "wx/defs.h"
  13. #include "wx/dc.h"
  14. // ---------------------------------------------------------------------------
  15. // macros
  16. // ---------------------------------------------------------------------------
  17. // Logical to device
  18. // Absolute
  19. #define XLOG2DEV(x) (x)
  20. #define YLOG2DEV(y) (y)
  21. // Relative
  22. #define XLOG2DEVREL(x) (x)
  23. #define YLOG2DEVREL(y) (y)
  24. // Device to logical
  25. // Absolute
  26. #define XDEV2LOG(x) (x)
  27. #define YDEV2LOG(y) (y)
  28. // Relative
  29. #define XDEV2LOGREL(x) (x)
  30. #define YDEV2LOGREL(y) (y)
  31. /*
  32. * Have the same macros as for XView but not for every operation:
  33. * just for calculating window/viewport extent (a better way of scaling).
  34. */
  35. // Logical to device
  36. // Absolute
  37. #define MS_XLOG2DEV(x) LogicalToDevice(x)
  38. #define MS_YLOG2DEV(y) LogicalToDevice(y)
  39. // Relative
  40. #define MS_XLOG2DEVREL(x) LogicalToDeviceXRel(x)
  41. #define MS_YLOG2DEVREL(y) LogicalToDeviceYRel(y)
  42. // Device to logical
  43. // Absolute
  44. #define MS_XDEV2LOG(x) DeviceToLogicalX(x)
  45. #define MS_YDEV2LOG(y) DeviceToLogicalY(y)
  46. // Relative
  47. #define MS_XDEV2LOGREL(x) DeviceToLogicalXRel(x)
  48. #define MS_YDEV2LOGREL(y) DeviceToLogicalYRel(y)
  49. #define YSCALE(y) (yorigin - (y))
  50. #define wx_round(a) (int)((a)+.5)
  51. #if wxUSE_DC_CACHEING
  52. /*
  53. * Cached blitting, maintaining a cache
  54. * of bitmaps required for transparent blitting
  55. * instead of constant creation/deletion
  56. */
  57. class wxDCCacheEntry : public wxObject
  58. {
  59. public:
  60. wxDCCacheEntry( WXHBITMAP hBitmap
  61. ,int nWidth
  62. ,int nHeight
  63. ,int nDepth
  64. );
  65. wxDCCacheEntry( HPS hPS
  66. ,int nDepth
  67. );
  68. virtual ~wxDCCacheEntry();
  69. WXHBITMAP m_hBitmap;
  70. HPS m_hPS;
  71. int m_nWidth;
  72. int m_nHeight;
  73. int m_nDepth;
  74. }; // end of CLASS wxDCCacheEntry
  75. #endif
  76. // this is an ABC: use one of the derived classes to create a DC associated
  77. // with a window, screen, printer and so on
  78. class WXDLLIMPEXP_CORE wxPMDCImpl : public wxDCImpl
  79. {
  80. DECLARE_DYNAMIC_CLASS(wxDC)
  81. public:
  82. wxPMDCImpl(wxDC *owner, WXHDC hDC);
  83. virtual ~wxPMDCImpl();
  84. // implement base class pure virtuals
  85. // ----------------------------------
  86. virtual void Clear();
  87. virtual bool StartDoc(const wxString& rsMessage);
  88. virtual void EndDoc();
  89. virtual void StartPage();
  90. virtual void EndPage();
  91. virtual void SetFont(const wxFont& rFont);
  92. virtual void SetPen(const wxPen& rPen);
  93. virtual void SetBrush(const wxBrush& rBrush);
  94. virtual void SetBackground(const wxBrush& rBrush);
  95. virtual void SetBackgroundMode(int nMode);
  96. virtual void SetPalette(const wxPalette& rPalette);
  97. virtual void DestroyClippingRegion();
  98. virtual wxCoord GetCharHeight() const;
  99. virtual wxCoord GetCharWidth() const;
  100. virtual bool CanDrawBitmap() const;
  101. virtual bool CanGetTextExtent() const;
  102. virtual int GetDepth() const;
  103. virtual wxSize GetPPI() const;
  104. virtual void SetMapMode(wxMappingMode nMode);
  105. virtual void SetUserScale( double dX
  106. ,double dY
  107. );
  108. virtual void SetLogicalScale( double dX
  109. ,double dY
  110. );
  111. virtual void SetLogicalOrigin( wxCoord vX
  112. ,wxCoord vY
  113. );
  114. virtual void SetDeviceOrigin( wxCoord vX
  115. ,wxCoord vY
  116. );
  117. virtual void SetAxisOrientation( bool bXLeftRight
  118. ,bool bYBottomUp
  119. );
  120. virtual void SetLogicalFunction(wxRasterOperationMode nFunction);
  121. // implementation from now on
  122. // --------------------------
  123. virtual void SetRop(WXHDC hCdc);
  124. virtual void SelectOldObjects(WXHDC hDc);
  125. wxWindow* GetWindow() const { return m_pCanvas; }
  126. void SetWindow(wxWindow* pWin) { m_pCanvas = pWin; }
  127. WXHDC GetHDC() const { return m_hDC; }
  128. void SetHDC( WXHDC hDc
  129. ,bool bOwnsDC = FALSE
  130. )
  131. {
  132. m_hDC = hDc;
  133. m_bOwnsDC = bOwnsDC;
  134. }
  135. HPS GetHPS() const { return m_hPS; }
  136. void SetHPS(HPS hPS)
  137. {
  138. m_hPS = hPS;
  139. }
  140. const wxBitmap& GetSelectedBitmap() const { return m_vSelectedBitmap; }
  141. wxBitmap& GetSelectedBitmap() { return m_vSelectedBitmap; }
  142. void UpdateClipBox();
  143. #if wxUSE_DC_CACHEING
  144. static wxDCCacheEntry* FindBitmapInCache( HPS hPS
  145. ,int nWidth
  146. ,int nHeight
  147. );
  148. static wxDCCacheEntry* FindDCInCache( wxDCCacheEntry* pNotThis
  149. ,HPS hPS
  150. );
  151. static void AddToBitmapCache(wxDCCacheEntry* pEntry);
  152. static void AddToDCCache(wxDCCacheEntry* pEntry);
  153. static void ClearCache();
  154. #endif
  155. protected:
  156. void Init()
  157. {
  158. m_pCanvas = NULL;
  159. m_hOldBitmap = 0;
  160. m_hOldPen = 0;
  161. m_hOldBrush = 0;
  162. m_hOldFont = 0;
  163. #if wxUSE_PALETTE
  164. m_hOldPalette = 0;
  165. #endif // wxUSE_PALETTE
  166. m_bOwnsDC = false;
  167. m_hDC = 0;
  168. m_hOldPS = NULL;
  169. m_hPS = NULL;
  170. m_bIsPaintTime = false; // True at Paint Time
  171. m_pen.SetColour(*wxBLACK);
  172. m_brush.SetColour(*wxWHITE);
  173. }
  174. // create an uninitialized DC: this should be only used by the derived
  175. // classes
  176. wxPMDCImpl( wxDC *owner ) : wxDCImpl( owner ) { Init(); }
  177. public:
  178. virtual void DoGetTextExtent( const wxString& rsString
  179. ,wxCoord* pX
  180. ,wxCoord* pY
  181. ,wxCoord* pDescent = NULL
  182. ,wxCoord* pExternalLeading = NULL
  183. ,const wxFont* pTheFont = NULL
  184. ) const;
  185. virtual bool DoFloodFill( wxCoord vX
  186. ,wxCoord vY
  187. ,const wxColour& rCol
  188. ,wxFloodFillStyle nStyle = wxFLOOD_SURFACE
  189. );
  190. virtual bool DoGetPixel( wxCoord vX
  191. ,wxCoord vY
  192. ,wxColour* pCol
  193. ) const;
  194. virtual void DoDrawPoint( wxCoord vX
  195. ,wxCoord vY
  196. );
  197. virtual void DoDrawLine( wxCoord vX1
  198. ,wxCoord vY1
  199. ,wxCoord vX2
  200. ,wxCoord vY2
  201. );
  202. virtual void DoDrawArc( wxCoord vX1
  203. ,wxCoord vY1
  204. ,wxCoord vX2
  205. ,wxCoord vY2
  206. ,wxCoord vXc
  207. ,wxCoord vYc
  208. );
  209. virtual void DoDrawCheckMark( wxCoord vX
  210. ,wxCoord vY
  211. ,wxCoord vWidth
  212. ,wxCoord vHeight
  213. );
  214. virtual void DoDrawEllipticArc( wxCoord vX
  215. ,wxCoord vY
  216. ,wxCoord vW
  217. ,wxCoord vH
  218. ,double dSa
  219. ,double dEa
  220. );
  221. virtual void DoDrawRectangle( wxCoord vX
  222. ,wxCoord vY
  223. ,wxCoord vWidth
  224. ,wxCoord vHeight
  225. );
  226. virtual void DoDrawRoundedRectangle( wxCoord vX
  227. ,wxCoord vY
  228. ,wxCoord vWidth
  229. ,wxCoord vHeight
  230. ,double dRadius
  231. );
  232. virtual void DoDrawEllipse( wxCoord vX
  233. ,wxCoord vY
  234. ,wxCoord vWidth
  235. ,wxCoord vHeight
  236. );
  237. virtual void DoCrossHair( wxCoord vX
  238. ,wxCoord vY
  239. );
  240. virtual void DoDrawIcon( const wxIcon& rIcon
  241. ,wxCoord vX
  242. ,wxCoord vY
  243. );
  244. virtual void DoDrawBitmap( const wxBitmap& rBmp
  245. ,wxCoord vX
  246. ,wxCoord vY
  247. ,bool bUseMask = FALSE
  248. );
  249. virtual void DoDrawText( const wxString& rsText
  250. ,wxCoord vX
  251. ,wxCoord vY
  252. );
  253. virtual void DoDrawRotatedText( const wxString& rsText
  254. ,wxCoord vX
  255. ,wxCoord vY
  256. ,double dAngle
  257. );
  258. virtual bool DoBlit( wxCoord vXdest
  259. ,wxCoord vYdest
  260. ,wxCoord vWidth
  261. ,wxCoord vHeight
  262. ,wxDC* pSource
  263. ,wxCoord vXsrc
  264. ,wxCoord vYsrc
  265. ,wxRasterOperationMode nRop = wxCOPY
  266. ,bool bUseMask = FALSE
  267. ,wxCoord vXsrcMask = -1
  268. ,wxCoord vYsrcMask = -1
  269. );
  270. virtual void DoSetClippingRegion( wxCoord vX
  271. ,wxCoord vY
  272. ,wxCoord vWidth
  273. ,wxCoord vHeight
  274. );
  275. virtual void DoSetDeviceClippingRegion(const wxRegion& rRegion);
  276. virtual void DoGetSize( int* pWidth
  277. ,int* pHeight
  278. ) const;
  279. virtual void DoGetSizeMM( int* pWidth
  280. ,int* pHeight
  281. ) const;
  282. virtual void DoDrawLines( int n
  283. ,const wxPoint vaPoints[]
  284. ,wxCoord vXoffset
  285. ,wxCoord yYoffset
  286. );
  287. virtual void DoDrawPolygon( int n
  288. ,const wxPoint vaPoints[]
  289. ,wxCoord vXoffset
  290. ,wxCoord vYoffset
  291. ,wxPolygonFillMode nFillStyle = wxODDEVEN_RULE
  292. );
  293. #if wxUSE_PALETTE
  294. void DoSelectPalette(bool bRealize = FALSE);
  295. void InitializePalette();
  296. #endif // wxUSE_PALETTE
  297. protected:
  298. //
  299. // common part of DoDrawText() and DoDrawRotatedText()
  300. //
  301. void DrawAnyText( const wxString& rsText
  302. ,wxCoord vX
  303. ,wxCoord vY
  304. );
  305. // OS2-specific member variables ?? do we even need this under OS/2?
  306. int m_nWindowExtX;
  307. int m_nWindowExtY;
  308. //
  309. // the window associated with this DC (may be NULL)
  310. //
  311. wxWindow* m_pCanvas;
  312. wxBitmap m_vSelectedBitmap;
  313. public:
  314. // PM specific stuff
  315. HPS m_hPS;
  316. HPS m_hOldPS; // old hPS, if any
  317. bool m_bIsPaintTime;// True at Paint Time
  318. RECTL m_vRclPaint; // Bounding rectangle at Paint time etc.
  319. //
  320. // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it
  321. //
  322. bool m_bOwnsDC:1;
  323. //
  324. // our HDC
  325. //
  326. WXHDC m_hDC;
  327. //
  328. // Store all old GDI objects when do a SelectObject, so we can select them
  329. // back in (this unselecting user's objects) so we can safely delete the
  330. // DC.
  331. //
  332. WXHBITMAP m_hOldBitmap;
  333. WXHPEN m_hOldPen;
  334. WXHBRUSH m_hOldBrush;
  335. WXHFONT m_hOldFont;
  336. WXHPALETTE m_hOldPalette;
  337. #if wxUSE_DC_CACHEING
  338. static wxList m_svBitmapCache;
  339. static wxList m_svDCCache;
  340. #endif
  341. }; // end of CLASS wxDC
  342. #endif
  343. // _WX_DC_H_