Fixed drawing with wxGraphicsContext and Direct2D renderer.
When render target to draw to a DC (created with ID2D1Factory::CreateDCRenderTarget method) is bound to the device context with ID2D1DCRenderTarget::BindDC method then the size of the area of drawing has to be a logical size of a DC (with its scaling factor taken int account). This can be determined directly using GetClipBox API and there is no need to pass it as a parameter of wxD2DDCRenderTargetResourceHolder ctor. Closes #17504.
This commit is contained in:
@@ -2688,13 +2688,9 @@ private:
|
|||||||
class wxD2DDCRenderTargetResourceHolder : public wxD2DRenderTargetResourceHolder
|
class wxD2DDCRenderTargetResourceHolder : public wxD2DRenderTargetResourceHolder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxD2DDCRenderTargetResourceHolder(ID2D1Factory* factory, HDC hdc, const wxSize dcSize, D2D1_ALPHA_MODE alphaMode) :
|
wxD2DDCRenderTargetResourceHolder(ID2D1Factory* factory, HDC hdc, D2D1_ALPHA_MODE alphaMode) :
|
||||||
m_factory(factory), m_hdc(hdc), m_alphaMode(alphaMode)
|
m_factory(factory), m_hdc(hdc), m_alphaMode(alphaMode)
|
||||||
{
|
{
|
||||||
m_dcSize.left = 0;
|
|
||||||
m_dcSize.top = 0;
|
|
||||||
m_dcSize.right = dcSize.GetWidth();
|
|
||||||
m_dcSize.bottom = dcSize.GetHeight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -2710,7 +2706,14 @@ protected:
|
|||||||
&renderTarget);
|
&renderTarget);
|
||||||
wxCHECK_HRESULT_RET(hr);
|
wxCHECK_HRESULT_RET(hr);
|
||||||
|
|
||||||
hr = renderTarget->BindDC(m_hdc, &m_dcSize);
|
// We want draw on the entire device area.
|
||||||
|
// GetClipBox() retrieves logical size of DC
|
||||||
|
// what is what we need to pass to BindDC.
|
||||||
|
RECT r;
|
||||||
|
int status = ::GetClipBox(m_hdc, &r);
|
||||||
|
wxCHECK_RET( status != ERROR, wxS("Error retrieving DC dimensions") );
|
||||||
|
|
||||||
|
hr = renderTarget->BindDC(m_hdc, &r);
|
||||||
wxCHECK_HRESULT_RET(hr);
|
wxCHECK_HRESULT_RET(hr);
|
||||||
|
|
||||||
m_nativeResource = renderTarget;
|
m_nativeResource = renderTarget;
|
||||||
@@ -2719,7 +2722,6 @@ protected:
|
|||||||
private:
|
private:
|
||||||
ID2D1Factory* m_factory;
|
ID2D1Factory* m_factory;
|
||||||
HDC m_hdc;
|
HDC m_hdc;
|
||||||
RECT m_dcSize;
|
|
||||||
D2D1_ALPHA_MODE m_alphaMode;
|
D2D1_ALPHA_MODE m_alphaMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2973,7 +2975,7 @@ wxD2DContext::wxD2DContext(wxGraphicsRenderer* renderer, ID2D1Factory* direct2dF
|
|||||||
wxD2DContext::wxD2DContext(wxGraphicsRenderer* renderer, ID2D1Factory* direct2dFactory, HDC hdc,
|
wxD2DContext::wxD2DContext(wxGraphicsRenderer* renderer, ID2D1Factory* direct2dFactory, HDC hdc,
|
||||||
const wxSize& dcSize, D2D1_ALPHA_MODE alphaMode) :
|
const wxSize& dcSize, D2D1_ALPHA_MODE alphaMode) :
|
||||||
wxGraphicsContext(renderer), m_direct2dFactory(direct2dFactory),
|
wxGraphicsContext(renderer), m_direct2dFactory(direct2dFactory),
|
||||||
m_renderTargetHolder(new wxD2DDCRenderTargetResourceHolder(direct2dFactory, hdc, dcSize, alphaMode))
|
m_renderTargetHolder(new wxD2DDCRenderTargetResourceHolder(direct2dFactory, hdc, alphaMode))
|
||||||
{
|
{
|
||||||
m_width = dcSize.GetWidth();
|
m_width = dcSize.GetWidth();
|
||||||
m_height = dcSize.GetHeight();
|
m_height = dcSize.GetHeight();
|
||||||
|
Reference in New Issue
Block a user