calculator/src/GraphControl/DirectX/NearestPointRenderer.cpp

70 lines
1.7 KiB
C++

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include "pch.h"
#include "NearestPointRenderer.h"
#include "DirectXHelper.h"
using namespace D2D1;
using namespace GraphControl::DX;
using namespace std;
using namespace Windows::Foundation;
namespace
{
const ColorF c_DefaultPointColor = ColorF::Black;
constexpr float c_NearestPointRadius = 3;
}
NearestPointRenderer::NearestPointRenderer(DeviceResources* deviceResources)
: m_deviceResources{ deviceResources }
, m_color{ c_DefaultPointColor }
, m_ellipse{ D2D1_POINT_2F{ 0, 0 }, c_NearestPointRadius, c_NearestPointRadius }
{
CreateDeviceDependentResources();
}
void NearestPointRenderer::CreateDeviceDependentResources()
{
CreateBrush();
}
void NearestPointRenderer::ReleaseDeviceDependentResources()
{
m_brush.Reset();
}
void NearestPointRenderer::Render(const Point& location)
{
if (ID2D1DeviceContext* context = m_deviceResources->GetD2DDeviceContext())
{
m_ellipse.point.x = location.X;
m_ellipse.point.y = location.Y;
context->BeginDraw();
context->FillEllipse(m_ellipse, m_brush.Get());
// Ignore D2DERR_RECREATE_TARGET here. This error indicates that the device
// is lost. It will be handled during the next call to Present.
HRESULT hr = context->EndDraw();
if (hr != D2DERR_RECREATE_TARGET)
{
ThrowIfFailed(hr);
}
}
}
void NearestPointRenderer::SetColor(const ColorF& color)
{
m_color = color;
CreateBrush();
}
void NearestPointRenderer::CreateBrush()
{
m_brush.Reset();
ThrowIfFailed(
m_deviceResources->GetD2DDeviceContext()->CreateSolidColorBrush(m_color, &m_brush)
);
}