Windows::UI::Xaml::Media::Imaging::VirtualSurfaceImageSource^ SceneComposer::Initialize(
    Windows::Foundation::Size sizeContent, Windows::Foundation::Size sizeViewPort)
{
    _deviceResources = std::make_unique<DX::DeviceResources>(sizeContent, sizeViewPort);
    _shapeRenderer = std::make_unique<ShapeRenderer>();
    _inkRenderer = std::make_unique<InkRenderer>();

    assert(_deviceResources != nullptr);
    assert(_shapeRenderer != nullptr);
    assert(_inkRenderer != nullptr);

    _shapeRenderer->RefreshSize(sizeViewPort);

    // Register image source's update callback so update can be made to it.
    Microsoft::WRL::ComPtr<IVirtualSurfaceImageSourceNative> imageSourceNative = _deviceResources->GetImageSourceNative();
    DX::ThrowIfFailed(imageSourceNative->RegisterForUpdatesNeeded(this));

    _refCount = 0;
    _EndDryPending = false;
    _inLassoSelection = false;

    return _deviceResources->GetImageSource();
}