// dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" #include #include "AdaptiveSharpenEffect.h" #include "JincScaleEffect.h" #include "LanczosScaleEffect.h" #include "MitchellNetravaliScaleEffect.h" #include "PixelScaleEffect.h" #pragma comment(lib, "dxguid.lib") API_DECLSPEC HRESULT CreateSharpenEffect( ID2D1Factory1* d2dFactory, ID2D1DeviceContext* d2dDC, const nlohmann::json& props, ComPtr& effect ) { ComPtr result; HRESULT hr = d2dDC->CreateEffect(CLSID_D2D1Sharpen, &result); if (FAILED(hr)) { return hr; } // sharpness 属性 auto it = props.find("sharpness"); if (it != props.end()) { const auto& value = *it; if (!value.is_number()) { return E_INVALIDARG; } float sharpness = value.get(); if (sharpness < 0 || sharpness > 10) { return E_INVALIDARG; } hr = result->SetValue(D2D1_SHARPEN_PROP_SHARPNESS, sharpness); if (FAILED(hr)) { return hr; } } // threshold 属性 it = props.find("threshold"); if (it != props.end()) { const auto& value = *it; if (!value.is_number()) { return E_INVALIDARG; } float threshold = value.get(); if (threshold < 0 || threshold>1) { return E_INVALIDARG; } hr = result->SetValue(D2D1_SHARPEN_PROP_THRESHOLD, threshold); if (FAILED(hr)) { return hr; } } effect = std::move(result); return S_OK; } API_DECLSPEC HRESULT CreateAdaptiveSharpenEffect( ID2D1Factory1* d2dFactory, ID2D1DeviceContext* d2dDC, const nlohmann::json& props, ComPtr& effect ) { bool isRegistered; HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_ADAPTIVE_SHARPEN_EFFECT, isRegistered); if (FAILED(hr)) { return hr; } if (!isRegistered) { hr = AdaptiveSharpenEffect::Register(d2dFactory); if (FAILED(hr)) { return hr; } } ComPtr result; hr = d2dDC->CreateEffect(CLSID_MAGPIE_ADAPTIVE_SHARPEN_EFFECT, &result); if (FAILED(hr)) { return hr; } // curveHeight 属性 auto it = props.find("curveHeight"); if (it != props.end()) { const auto& value = *it; if (!value.is_number()) { return E_INVALIDARG; } float curveHeight = value.get(); if (curveHeight <= 0) { return E_INVALIDARG; } hr = result->SetValue(AdaptiveSharpenEffect::PROP_CURVE_HEIGHT, curveHeight); if (FAILED(hr)) { return hr; } } effect = std::move(result); return S_OK; } API_DECLSPEC HRESULT CreateLanczosEffect( ID2D1Factory1* d2dFactory, ID2D1DeviceContext* d2dDC, const nlohmann::json& props, float fillScale, std::pair& scale, ComPtr& effect ) { bool isRegistered; HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_LANCZOS_SCALE_EFFECT, isRegistered); if (FAILED(hr)) { return hr; } if (!isRegistered) { hr = LanczosScaleEffect::Register(d2dFactory); if (FAILED(hr)) { return hr; } } ComPtr result; hr = d2dDC->CreateEffect(CLSID_MAGPIE_LANCZOS_SCALE_EFFECT, &result); if (FAILED(hr)) { return hr; } std::pair scaleResult(1.0f, 1.0f); // scale 属性 auto it = props.find("scale"); if (it != props.end()) { hr = EffectUtils::ReadScaleProp(*it, fillScale, scale, scaleResult); if (FAILED(hr)) { return hr; } hr = result->SetValue( LanczosScaleEffect::PROP_SCALE, D2D1_VECTOR_2F{ scaleResult.first, scaleResult.second } ); if (FAILED(hr)) { return hr; } } // ARStrength 属性 it = props.find("ARStrength"); if (it != props.end()) { const auto& value = *it; if (!value.is_number()) { return E_INVALIDARG; } float ARStrength = value.get(); if (ARStrength < 0 || ARStrength > 1) { return E_INVALIDARG; } hr = result->SetValue(LanczosScaleEffect::PROP_AR_STRENGTH, ARStrength); if (FAILED(hr)) { return hr; } } effect = std::move(result); scale.first *= scaleResult.first; scale.second *= scaleResult.second; return S_OK; } API_DECLSPEC HRESULT CreateMitchellEffect( ID2D1Factory1* d2dFactory, ID2D1DeviceContext* d2dDC, const nlohmann::json& props, float fillScale, std::pair& scale, ComPtr& effect ) { bool isRegistered; HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_MITCHELL_NETRAVALI_SCALE_EFFECT, isRegistered); if (FAILED(hr)) { return hr; } if (!isRegistered) { hr = MitchellNetravaliScaleEffect::Register(d2dFactory); if (FAILED(hr)) { return hr; } } ComPtr result; hr = d2dDC->CreateEffect(CLSID_MAGPIE_MITCHELL_NETRAVALI_SCALE_EFFECT, &result); if (FAILED(hr)) { return hr; } std::pair scaleResult(1.0f, 1.0f); // scale 属性 auto it = props.find("scale"); if (it != props.end()) { hr = EffectUtils::ReadScaleProp(*it, fillScale, scale, scaleResult); if (FAILED(hr)) { return hr; } hr = result->SetValue( MitchellNetravaliScaleEffect::PROP_SCALE, D2D1_VECTOR_2F{ scaleResult.first, scaleResult.second } ); if (FAILED(hr)) { return hr; } } // variant 属性 it = props.find("variant"); if (it != props.end()) { if (!it->is_string()) { return E_INVALIDARG; } std::string_view variant = *it; int v = 0; if (variant == "mitchell") { v = 0; } else if (variant == "catrom") { v = 1; } else if (variant == "sharper") { v = 2; } else { return E_INVALIDARG; } hr = result->SetValue(MitchellNetravaliScaleEffect::PROP_VARIANT, v); if (FAILED(hr)) { return hr; } } effect = std::move(result); scale.first *= scaleResult.first; scale.second *= scaleResult.second; return S_OK; } API_DECLSPEC HRESULT CreatePixelScaleEffect( ID2D1Factory1* d2dFactory, ID2D1DeviceContext* d2dDC, const nlohmann::json& props, ComPtr& effect, std::pair& scale ) { bool isRegistered; HRESULT hr = EffectUtils::IsEffectRegistered(d2dFactory, CLSID_MAGPIE_PIXEL_SCALE_EFFECT, isRegistered); if (FAILED(hr)) { return hr; } if (!isRegistered) { hr = PixelScaleEffect::Register(d2dFactory); if (FAILED(hr)) { return hr; } } ComPtr result; hr = d2dDC->CreateEffect(CLSID_MAGPIE_PIXEL_SCALE_EFFECT, &result); if (FAILED(hr)) { return hr; } int scaleResult = 1; // scale 属性 auto it = props.find("scale"); if (it != props.end()) { if (!it->is_number()) { return E_INVALIDARG; } scaleResult = *it; if (scaleResult <= 0) { return E_INVALIDARG; } hr = result->SetValue(PixelScaleEffect::PROP_SCALE, scaleResult); if (FAILED(hr)) { return hr; } } effect = std::move(result); scale.first *= scaleResult; scale.second *= scaleResult; return S_OK; } API_DECLSPEC HRESULT CreateEffect( ID2D1Factory1* d2dFactory, ID2D1DeviceContext* d2dDC, IWICImagingFactory2* wicImgFactory, const nlohmann::json& props, float fillScale, std::pair& scale, ComPtr& effect ) { const auto& e = props.value("effect", ""); if (e == "sharpen") { return CreateSharpenEffect(d2dFactory, d2dDC, props, effect); } else if (e == "adaptiveSharpen") { return CreateAdaptiveSharpenEffect(d2dFactory, d2dDC, props, effect); } else if (e == "lanczos") { return CreateLanczosEffect(d2dFactory, d2dDC, props, fillScale, scale, effect); } else if (e == "mitchell") { return CreateMitchellEffect(d2dFactory, d2dDC, props, fillScale, scale, effect); } else if (e == "pixelScale") { return CreatePixelScaleEffect(d2dFactory, d2dDC, props, effect, scale); } else { return E_INVALIDARG; } }