Magpie/Runtime/SimpleScaleTransform.h
2021-03-09 12:46:17 +08:00

92 lines
2.4 KiB
C++

#pragma once
#include "pch.h"
#include "GUIDs.h"
#include "SimpleDrawTransform.h"
#include "Utils.h"
// 通用的 scale transform
// 只支持 scale 属性,默认值为 1.0
class SimpleScaleTransform : public SimpleDrawTransform {
protected:
SimpleScaleTransform(const GUID& shaderID) : SimpleDrawTransform(shaderID) {}
public:
virtual ~SimpleScaleTransform() {}
static HRESULT Create(
_In_ ID2D1EffectContext* d2dEC,
_Outptr_ SimpleScaleTransform** ppOutput,
_In_ const wchar_t* shaderPath,
const GUID& shaderID
) {
if (!ppOutput) {
return E_INVALIDARG;
}
HRESULT hr = DrawTransformBase::LoadShader(d2dEC, shaderPath, shaderID);
if (FAILED(hr)) {
return hr;
}
*ppOutput = new SimpleScaleTransform(shaderID);
return S_OK;
}
void SetScale(const D2D1_VECTOR_2F& scale) {
assert(scale.x > 0 && scale.y > 0);
_scale = scale;
}
D2D1_VECTOR_2F GetScale() const {
return _scale;
}
IFACEMETHODIMP MapInputRectsToOutputRect(
_In_reads_(inputRectCount) const D2D1_RECT_L* pInputRects,
_In_reads_(inputRectCount) const D2D1_RECT_L* pInputOpaqueSubRects,
UINT32 inputRectCount,
_Out_ D2D1_RECT_L* pOutputRect,
_Out_ D2D1_RECT_L* pOutputOpaqueSubRect
) override {
if (inputRectCount != 1) {
return E_INVALIDARG;
}
_inputRect = pInputRects[0];
const auto& srcSize = Utils::GetSize(_inputRect);
SIZE destSize = {
lroundf(srcSize.cx * _scale.x),
lroundf(srcSize.cy * _scale.y)
};
*pOutputRect = { 0, 0, destSize.cx, destSize.cy };
*pOutputOpaqueSubRect = {};
_SetShaderContantBuffer(srcSize, destSize);
return S_OK;
}
protected:
// 继承的类可以覆盖此方法向着色器传递参数
virtual void _SetShaderContantBuffer(const SIZE& srcSize, const SIZE& destSize) {
struct {
INT32 srcWidth;
INT32 srcHeight;
INT32 destWidth;
INT32 destHeight;
} shaderConstants{
srcSize.cx,
srcSize.cy,
destSize.cx,
destSize.cy
};
_drawInfo->SetPixelShaderConstantBuffer((BYTE*)&shaderConstants, sizeof(shaderConstants));
}
private:
// 缩放倍数
D2D1_VECTOR_2F _scale{ 1,1 };
};