home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / src / os2 / dcmemory.cpp < prev    next >
C/C++ Source or Header  |  2002-05-10  |  6KB  |  205 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        dcmemory.cpp
  3. // Purpose:     wxMemoryDC class
  4. // Author:      David Webster
  5. // Modified by:
  6. // Created:     10/14/99
  7. // RCS-ID:      $Id: DCMEMORY.CPP,v 1.18 2002/05/10 04:09:27 DW Exp $
  8. // Copyright:   (c) David Webster
  9. // Licence:     wxWindows licence
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. // For compilers that support precompilation, includes "wx.h".
  13. #include "wx/wxprec.h"
  14.  
  15. #ifndef WX_PRECOMP
  16. #include "wx/utils.h"
  17. #include "wx/app.h"
  18. #include "wx/log.h"
  19. #endif
  20.  
  21. #include "wx/os2/private.h"
  22.  
  23. #include "wx/dcmemory.h"
  24.  
  25. IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC)
  26.  
  27. /////////////////////////////////////////////////////////////////////////////
  28. // Memory DC
  29. /////////////////////////////////////////////////////////////////////////////
  30.  
  31. wxMemoryDC::wxMemoryDC(void)
  32. {
  33.     CreateCompatible(NULL);
  34.     Init();
  35. } // end of wxMemoryDC::wxMemoryDC
  36.  
  37. wxMemoryDC::wxMemoryDC(
  38.   wxDC*                             pOldDC
  39. )
  40. {
  41.     pOldDC->BeginDrawing();
  42.     CreateCompatible(pOldDC);
  43.     pOldDC->EndDrawing();
  44.     Init();
  45. } // end of wxMemoryDC::wxMemoryDC
  46.  
  47. void wxMemoryDC::Init()
  48. {
  49.     if (m_ok)
  50.     {
  51.         SetBrush(*wxWHITE_BRUSH);
  52.         SetPen(*wxBLACK_PEN);
  53.  
  54.         // the background mode is only used for text background and is set in
  55.         // DrawText() to OPAQUE as required, otherwise always TRANSPARENT
  56.         ::GpiSetBackMix( GetHPS(), BM_LEAVEALONE );
  57.     }
  58.     memset(&m_vRclPaint, 0, sizeof(m_vRclPaint));
  59. } // end of wxMemoryDC::Init
  60.  
  61. bool wxMemoryDC::CreateCompatible(
  62.   wxDC*                             pDC
  63. )
  64. {
  65.     HDC                             hDC;
  66.     HPS                             hPS;
  67.     DEVOPENSTRUC                    vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
  68.     SIZEL                           vSize = {0, 0};
  69.  
  70.     //
  71.     // Create a memory device context
  72.     //
  73.     hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, NULLHANDLE);
  74.     if (hDC != DEV_ERROR)
  75.     {
  76.         hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
  77.         if (hPS != GPI_ERROR)
  78.         {
  79.             m_hPS = hPS;
  80.             m_hDC = hDC;
  81.             m_ok = TRUE;
  82.             m_bOwnsDC = TRUE;
  83.             //
  84.             // Set the wxWindows color table
  85.             //
  86.             ::GpiCreateLogColorTable( m_hPS
  87.                                      ,0L
  88.                                      ,LCOLF_CONSECRGB
  89.                                      ,0L
  90.                                      ,(LONG)wxTheColourDatabase->m_nSize
  91.                                      ,(PLONG)wxTheColourDatabase->m_palTable
  92.                                     );
  93.             ::GpiCreateLogColorTable( m_hPS
  94.                                      ,0L
  95.                                      ,LCOLF_RGB
  96.                                      ,0L
  97.                                      ,0L
  98.                                      ,NULL
  99.                                     );
  100.         }
  101.         else
  102.         {
  103.             m_hPS = NULLHANDLE;
  104.             m_hDC = NULLHANDLE;
  105.             m_ok  = FALSE;
  106.             m_bOwnsDC = FALSE;
  107.         }
  108.     }
  109.     else
  110.     {
  111.         m_hPS = NULLHANDLE;
  112.         m_hDC = NULLHANDLE;
  113.         m_ok  = FALSE;
  114.         m_bOwnsDC = FALSE;
  115.     }
  116.  
  117.     //
  118.     // As we created the DC, we must delete it in the dtor
  119.     //
  120.     m_bOwnsDC = TRUE;
  121.     m_ok = m_hDC != 0;
  122.     return m_ok;
  123. } // end of wxMemoryDC::CreateCompatible
  124.  
  125. void wxMemoryDC::SelectObject(
  126.   const wxBitmap&                   rBitmap
  127. )
  128. {
  129.     //
  130.     // Select old bitmap out of the device context
  131.     //
  132.     if (m_hOldBitmap)
  133.     {
  134.         ::GpiSetBitmap(m_hPS, NULLHANDLE);
  135.         if (m_vSelectedBitmap.Ok())
  136.         {
  137.             m_vSelectedBitmap.SetSelectedInto(NULL);
  138.             m_vSelectedBitmap = wxNullBitmap;
  139.         }
  140.     }
  141.  
  142.     //
  143.     // Check for whether the bitmap is already selected into a device context
  144.     //
  145.     wxCHECK_RET( !rBitmap.GetSelectedInto() ||
  146.                  (rBitmap.GetSelectedInto() == this),
  147.                  wxT("Bitmap is selected in another wxMemoryDC, delete the first wxMemoryDC or use SelectObject(NULL)") );
  148.  
  149.     WXHBITMAP                       hBmp = rBitmap.GetHBITMAP();
  150.  
  151.     if (!hBmp)
  152.     {
  153.         //
  154.         // Bmps drawn to are upside down, so flip it before committing
  155.         //
  156.         POINTL                      vPoint[4] = { 0, m_vSelectedBitmap.GetHeight(),
  157.                                                   m_vSelectedBitmap.GetWidth(), 0,
  158.                                                   0, 0, m_vSelectedBitmap.GetWidth(), m_vSelectedBitmap.GetHeight()
  159.                                                 };
  160.  
  161.  
  162.         ::GpiBitBlt( m_hPS
  163.                     ,m_hPS
  164.                     ,4
  165.                     ,vPoint
  166.                     ,ROP_SRCCOPY
  167.                     ,BBO_IGNORE
  168.                    );
  169.         m_vSelectedBitmap.SetSelectedInto(NULL);
  170.     }
  171.     m_vSelectedBitmap = rBitmap;
  172.  
  173.  
  174.     if (!hBmp)
  175.     {
  176.  
  177.         m_hOldBitmap = (WXHBITMAP)::GpiSetBitmap(m_hPS, NULLHANDLE);
  178.         return;
  179.     }
  180.     m_vSelectedBitmap.SetSelectedInto(this);
  181.     m_hOldBitmap = (WXHBITMAP)::GpiSetBitmap(m_hPS, (HBITMAP)hBmp);
  182.  
  183.     if (m_hOldBitmap == HBM_ERROR)
  184.     {
  185.         wxLogLastError(wxT("SelectObject(memDC, bitmap)"));
  186.         wxFAIL_MSG(wxT("Couldn't select a bitmap into wxMemoryDC"));
  187.     }
  188. } // end of wxMemoryDC::SelectObject
  189.  
  190. void wxMemoryDC::DoGetSize(
  191.   int*                              pWidth
  192. , int*                              pHeight
  193. ) const
  194. {
  195.     if (!m_vSelectedBitmap.Ok())
  196.     {
  197.         *pWidth  = 0;
  198.         *pHeight = 0;
  199.         return;
  200.     }
  201.     *pWidth = m_vSelectedBitmap.GetWidth();
  202.     *pHeight = m_vSelectedBitmap.GetHeight();
  203. } // end of wxMemoryDC::DoGetSize
  204.  
  205.