Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 26th, 2012  |  syntax: None  |  size: 3.65 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1.  
  2. #include <windows.h>
  3. #include <d2d1.h>
  4. #include <d2d1helper.h>
  5. #include "atlbase.h"
  6. #include "cvideo.h"
  7. #include <stdint.h>
  8.  
  9. template <typename T>
  10. inline void SafeRelease(T& p)
  11. {
  12.         if (NULL != p)
  13.         {
  14.                 p.Release();
  15.                 p = NULL;
  16.         }
  17. }
  18.  
  19.  
  20.  
  21. class CD2D : public cvideo
  22. {
  23. protected:
  24.  
  25.         HWND window_hwnd;
  26.         int scwidth;
  27.         int scheight;
  28.         int prevwidth;
  29.         int prevheight;
  30.  
  31.         ID2D1Factory * m_d2dFactory;
  32.         HMODULE m_hD2D1Lib;
  33.         CComPtr<ID2D1HwndRenderTarget>  m_hWndTarget;
  34.         CComPtr<ID2D1Bitmap>            m_bitmap;
  35.         BITMAPINFOHEADER m_pBitmapInfo;
  36.  
  37.         int createrendbmp(int width, int height)
  38.         {
  39.                 if (prevwidth == width && prevheight == height)
  40.                         return 0;
  41.  
  42.                 D2D1_PIXEL_FORMAT pixelFormat =
  43.                 {
  44.                         DXGI_FORMAT_B8G8R8A8_UNORM ,
  45.                         D2D1_ALPHA_MODE_IGNORE
  46.                 };
  47.                 D2D1_RENDER_TARGET_PROPERTIES renderTargetProps =
  48.                 {
  49.                         D2D1_RENDER_TARGET_TYPE_DEFAULT,
  50.                         pixelFormat,
  51.                         0,
  52.                         0,
  53.                         D2D1_RENDER_TARGET_USAGE_NONE,
  54.                         D2D1_FEATURE_LEVEL_DEFAULT
  55.                 };
  56.  
  57.                 RECT rect;
  58.                 GetClientRect(window_hwnd, &rect);
  59.                 HRESULT hr;
  60.                 D2D1_SIZE_U windowSize =
  61.                 {
  62.                         rect.right - rect.left,
  63.                         rect.bottom - rect.top
  64.                 };
  65.  
  66.                 D2D1_HWND_RENDER_TARGET_PROPERTIES hWndRenderTargetProps =
  67.                 {
  68.                         window_hwnd,
  69.                         windowSize,
  70.                         D2D1_PRESENT_OPTIONS_IMMEDIATELY
  71.                 };
  72.                 hr = m_d2dFactory->CreateHwndRenderTarget(renderTargetProps, hWndRenderTargetProps, &m_hWndTarget);
  73.                 if (hr != S_OK) return -1;
  74.                 FLOAT dpiX, dpiY;
  75.                 m_d2dFactory->GetDesktopDpi(&dpiX, &dpiY);
  76.                 D2D1_BITMAP_PROPERTIES bitmapProps =
  77.                 {
  78.                         pixelFormat,
  79.                         dpiX,
  80.                         dpiY
  81.                 };
  82.  
  83.                 D2D1_SIZE_U bitmapSize =
  84.                 {
  85.                         width,
  86.                         height
  87.                 };
  88.                 prevwidth=width;
  89.                 prevheight=height;
  90.                 hr = m_hWndTarget->CreateBitmap(bitmapSize, bitmapProps, &m_bitmap);
  91.                 if (hr != S_OK) return -1;
  92.                 return 0;
  93.         }
  94.  
  95. public:
  96.         CD2D()
  97.         {
  98.  
  99.         }
  100.  
  101.         virtual ~CD2D()
  102.         {
  103.                 kill();
  104.         }
  105.  
  106.         virtual bool init (int width, int height, HWND hwnd)
  107.         {
  108.                 m_bitmap = NULL, m_d2dFactory = NULL, m_hWndTarget = NULL, m_hD2D1Lib = NULL;
  109.                 m_hD2D1Lib = LoadLibrary(L"D2D1.DLL");
  110.                 if (m_hD2D1Lib)
  111.                 {
  112.                         typedef HRESULT(STDAPICALLTYPE* FPCF)(D2D1_FACTORY_TYPE, REFIID, CONST D2D1_FACTORY_OPTIONS *, void**);
  113.                         FPCF pfn = (FPCF) GetProcAddress(m_hD2D1Lib, "D2D1CreateFactory");
  114.                         if (pfn == NULL || FAILED(pfn(D2D1_FACTORY_TYPE_SINGLE_THREADED,IID_ID2D1Factory, NULL, (void**)&m_d2dFactory)))
  115.                         {
  116.                                 return false;
  117.                         }
  118.                 }
  119.                 else
  120.                 {
  121.                         return false;
  122.                 }
  123.  
  124.                 window_hwnd = hwnd;
  125.                 scwidth = width, scheight = height;
  126.                 prevheight = prevwidth = 0;
  127.                 return true;
  128.         }
  129.        
  130.         virtual int blit(int width,int height,void *buffer)
  131.         {
  132.                 HRESULT hr;
  133.                 if (createrendbmp(scwidth, scheight) == -1)
  134.                         return -1;
  135.                 hr = m_bitmap->CopyFromMemory(NULL, buffer, width*4);
  136.                 if (hr != S_OK) return -1;
  137.  
  138.                 if (!(m_hWndTarget->CheckWindowState() & D2D1_WINDOW_STATE_OCCLUDED))
  139.                 {
  140.                         RECT rect;
  141.                         GetClientRect(window_hwnd, &rect);
  142.                         D2D1_SIZE_U newSize = { rect.right, rect.bottom };
  143.                         D2D1_SIZE_U size = m_hWndTarget->GetPixelSize();
  144.  
  145.                         if(newSize.height != size.height || newSize.width != size.width)
  146.                         {
  147.                                 m_hWndTarget->Resize(newSize);
  148.                         }
  149.                         D2D1_RECT_F rectangle = D2D1::RectF(0, 0, newSize.width, newSize.height);
  150.                         m_hWndTarget->BeginDraw();
  151.                         m_hWndTarget->Clear(D2D1::ColorF(D2D1::ColorF::Black));
  152.                         m_hWndTarget->DrawBitmap(m_bitmap, rectangle,1.0f,D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR);
  153.                         hr = m_hWndTarget->EndDraw();
  154.                         ValidateRect(window_hwnd,NULL);
  155.                 }
  156.         }
  157.        
  158.         virtual void kill()
  159.         {
  160.                 SafeRelease(m_bitmap);
  161.                 SafeRelease(m_hWndTarget);
  162.                 if (m_d2dFactory)
  163.                 m_d2dFactory->Release();
  164.                 FreeLibrary(m_hD2D1Lib);
  165.         }
  166. };
  167.  
  168. cvideo * create_video_d2d()
  169. {
  170.         return new CD2D;
  171. }