#include "pch.h" #include "Direct3DContentProvider.h" using namespace PhoneXamlDirect3DApp1Comp; Direct3DContentProvider::Direct3DContentProvider(Direct3DInterop^ controller) : m_controller(controller) { m_controller->RequestAdditionalFrame += ref new RequestAdditionalFrameHandler([=] () { if (m_host) { m_host->RequestAdditionalFrame(); } }); m_controller->RecreateSynchronizedTexture += ref new RecreateSynchronizedTextureHandler([=] () { if (m_host) { m_host->CreateSynchronizedTexture(m_controller->GetTexture(), &m_synchronizedTexture); } }); } // IDrawingSurfaceContentProviderNative interface HRESULT Direct3DContentProvider::Connect(_In_ IDrawingSurfaceRuntimeHostNative* host) { m_host = host; return m_controller->Connect(host); } void Direct3DContentProvider::Disconnect() { m_controller->Disconnect(); m_host = nullptr; m_synchronizedTexture = nullptr; } HRESULT Direct3DContentProvider::PrepareResources(_In_ const LARGE_INTEGER* presentTargetTime, _Out_ BOOL* contentDirty) { return m_controller->PrepareResources(presentTargetTime, contentDirty); } HRESULT Direct3DContentProvider::GetTexture(_In_ const DrawingSurfaceSizeF* size, _Out_ IDrawingSurfaceSynchronizedTextureNative** synchronizedTexture, _Out_ DrawingSurfaceRectF* textureSubRectangle) { HRESULT hr = S_OK; if (!m_synchronizedTexture) { hr = m_host->CreateSynchronizedTexture(m_controller->GetTexture(), &m_synchronizedTexture); } // Set output parameters. textureSubRectangle->left = 0.0f; textureSubRectangle->top = 0.0f; textureSubRectangle->right = static_cast(size->width); textureSubRectangle->bottom = static_cast(size->height); m_synchronizedTexture.CopyTo(synchronizedTexture); // Draw to the texture. if (SUCCEEDED(hr)) { hr = m_synchronizedTexture->BeginDraw(); if (SUCCEEDED(hr)) { hr = m_controller->GetTexture(size, synchronizedTexture, textureSubRectangle); } m_synchronizedTexture->EndDraw(); } return hr; }