1 #include "pch.h"
2 #include "Direct3DContentProvider.h"
3 
4 using namespace PhoneXamlDirect3DApp1Comp;
5 
6 Direct3DContentProvider::Direct3DContentProvider(Direct3DInterop^ controller) :
7     m_controller(controller)
8 {
9     m_controller->RequestAdditionalFrame += ref new RequestAdditionalFrameHandler([=] ()
__anona5caf6510102() 10         {
11             if (m_host)
12             {
13                 m_host->RequestAdditionalFrame();
14             }
15         });
16 
17     m_controller->RecreateSynchronizedTexture += ref new RecreateSynchronizedTextureHandler([=] ()
__anona5caf6510202() 18         {
19             if (m_host)
20             {
21                 m_host->CreateSynchronizedTexture(m_controller->GetTexture(), &m_synchronizedTexture);
22             }
23         });
24 }
25 
26 // IDrawingSurfaceContentProviderNative interface
Connect(_In_ IDrawingSurfaceRuntimeHostNative * host)27 HRESULT Direct3DContentProvider::Connect(_In_ IDrawingSurfaceRuntimeHostNative* host)
28 {
29     m_host = host;
30 
31     return m_controller->Connect(host);
32 }
33 
Disconnect()34 void Direct3DContentProvider::Disconnect()
35 {
36     m_controller->Disconnect();
37     m_host = nullptr;
38     m_synchronizedTexture = nullptr;
39 }
40 
PrepareResources(_In_ const LARGE_INTEGER * presentTargetTime,_Out_ BOOL * contentDirty)41 HRESULT Direct3DContentProvider::PrepareResources(_In_ const LARGE_INTEGER* presentTargetTime, _Out_ BOOL* contentDirty)
42 {
43     return m_controller->PrepareResources(presentTargetTime, contentDirty);
44 }
45 
GetTexture(_In_ const DrawingSurfaceSizeF * size,_Out_ IDrawingSurfaceSynchronizedTextureNative ** synchronizedTexture,_Out_ DrawingSurfaceRectF * textureSubRectangle)46 HRESULT Direct3DContentProvider::GetTexture(_In_ const DrawingSurfaceSizeF* size, _Out_ IDrawingSurfaceSynchronizedTextureNative** synchronizedTexture, _Out_ DrawingSurfaceRectF* textureSubRectangle)
47 {
48     HRESULT hr = S_OK;
49 
50     if (!m_synchronizedTexture)
51     {
52         hr = m_host->CreateSynchronizedTexture(m_controller->GetTexture(), &m_synchronizedTexture);
53     }
54 
55     // Set output parameters.
56     textureSubRectangle->left = 0.0f;
57     textureSubRectangle->top = 0.0f;
58     textureSubRectangle->right = static_cast<FLOAT>(size->width);
59     textureSubRectangle->bottom = static_cast<FLOAT>(size->height);
60 
61     m_synchronizedTexture.CopyTo(synchronizedTexture);
62 
63     // Draw to the texture.
64     if (SUCCEEDED(hr))
65     {
66         hr = m_synchronizedTexture->BeginDraw();
67 
68         if (SUCCEEDED(hr))
69         {
70             hr = m_controller->GetTexture(size, synchronizedTexture, textureSubRectangle);
71         }
72 
73         m_synchronizedTexture->EndDraw();
74     }
75 
76     return hr;
77 }