From f6da5e110111d160eb81b67dbfdaf1653722a0ff Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Fri, 21 Feb 2020 23:56:42 +0800 Subject: [PATCH] add MultiplyBlendEffect --- .../HandyControlDemo_Core30.csproj | 6 + .../HandyControl_Core_30.csproj | 3 + .../HandyControlDemo_Net_40.csproj | 6 + .../HandyControl_Net_40.csproj | 3 + .../HandyControlDemo_Net_GE45.csproj | 6 + .../HandyControl_Net_GE45.csproj | 3 + .../Resources/Img/b.png | Bin 0 -> 19277 bytes .../Resources/Img/f.png | Bin 0 -> 20926 bytes .../UserControl/Tools/EffectsDemoCtl.xaml | 426 +++++++++++++++--- .../HandyControl_Shared.projitems | 5 + .../Media/Effects/BlendEffect.cs | 61 +++ .../Media/Effects/BlendEffectMode.cs | 32 ++ .../Resources/Effects/ColorMatrixEffect.fx | 7 +- .../Resources/Effects/MultiplyBlendEffect.fx | 15 + .../Resources/Effects/MultiplyBlendEffect.ps | Bin 0 -> 420 bytes 15 files changed, 502 insertions(+), 71 deletions(-) create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Img/b.png create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Img/f.png create mode 100644 src/Shared/HandyControl_Shared/Media/Effects/BlendEffect.cs create mode 100644 src/Shared/HandyControl_Shared/Media/Effects/BlendEffectMode.cs create mode 100644 src/Shared/HandyControl_Shared/Resources/Effects/MultiplyBlendEffect.fx create mode 100644 src/Shared/HandyControl_Shared/Resources/Effects/MultiplyBlendEffect.ps diff --git a/src/Core_30/HandyControlDemo_Core_30/HandyControlDemo_Core30.csproj b/src/Core_30/HandyControlDemo_Core_30/HandyControlDemo_Core30.csproj index 72bdb306..122ba525 100644 --- a/src/Core_30/HandyControlDemo_Core_30/HandyControlDemo_Core30.csproj +++ b/src/Core_30/HandyControlDemo_Core_30/HandyControlDemo_Core30.csproj @@ -471,6 +471,12 @@ Resources\Img\cloud.png + + Resources\Img\f.png + + + Resources\Img\b.png + diff --git a/src/Core_30/HandyControl_Core_30/HandyControl_Core_30.csproj b/src/Core_30/HandyControl_Core_30/HandyControl_Core_30.csproj index d5a3a94b..1cc60b14 100644 --- a/src/Core_30/HandyControl_Core_30/HandyControl_Core_30.csproj +++ b/src/Core_30/HandyControl_Core_30/HandyControl_Core_30.csproj @@ -76,6 +76,9 @@ Resources\Effects\GrayScaleEffect.ps + + Resources\Effects\MultiplyBlendEffect.ps + diff --git a/src/Net_40/HandyControlDemo_Net_40/HandyControlDemo_Net_40.csproj b/src/Net_40/HandyControlDemo_Net_40/HandyControlDemo_Net_40.csproj index 50bbc0a2..8f01983d 100644 --- a/src/Net_40/HandyControlDemo_Net_40/HandyControlDemo_Net_40.csproj +++ b/src/Net_40/HandyControlDemo_Net_40/HandyControlDemo_Net_40.csproj @@ -547,6 +547,12 @@ Resources\Img\cloud.png + + Resources\Img\f.png + + + Resources\Img\b.png + diff --git a/src/Net_40/HandyControl_Net_40/HandyControl_Net_40.csproj b/src/Net_40/HandyControl_Net_40/HandyControl_Net_40.csproj index c593ae8c..33712056 100644 --- a/src/Net_40/HandyControl_Net_40/HandyControl_Net_40.csproj +++ b/src/Net_40/HandyControl_Net_40/HandyControl_Net_40.csproj @@ -128,6 +128,9 @@ Resources\Effects\GrayScaleEffect.ps + + Resources\Effects\MultiplyBlendEffect.ps + diff --git a/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj b/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj index abe74897..b6cecb03 100644 --- a/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj +++ b/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj @@ -610,6 +610,12 @@ Resources\Img\cloud.png + + Resources\Img\f.png + + + Resources\Img\b.png + diff --git a/src/Net_GE45/HandyControl_Net_GE45/HandyControl_Net_GE45.csproj b/src/Net_GE45/HandyControl_Net_GE45/HandyControl_Net_GE45.csproj index 9e873597..b0eec08e 100644 --- a/src/Net_GE45/HandyControl_Net_GE45/HandyControl_Net_GE45.csproj +++ b/src/Net_GE45/HandyControl_Net_GE45/HandyControl_Net_GE45.csproj @@ -199,6 +199,9 @@ Resources\Effects\GrayScaleEffect.ps + + Resources\Effects\MultiplyBlendEffect.ps + diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/b.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/b.png new file mode 100644 index 0000000000000000000000000000000000000000..a3cf8c178a28cefc6f0935e7c1d6c0e89b2fb5b4 GIT binary patch literal 19277 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 FV1n8zAK?H1 literal 0 HcmV?d00001 diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/f.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/f.png new file mode 100644 index 0000000000000000000000000000000000000000..99597c0c297b58abc3da8ccc2a9ca6f722733951 GIT binary patch literal 20926 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 literal 0 HcmV?d00001 diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Tools/EffectsDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Tools/EffectsDemoCtl.xaml index 9bdf34d7..2bf916b7 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Tools/EffectsDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Tools/EffectsDemoCtl.xaml @@ -25,75 +25,371 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems index 01431223..6da6081b 100644 --- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems +++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems @@ -68,6 +68,8 @@ + + @@ -972,7 +974,10 @@ + + + diff --git a/src/Shared/HandyControl_Shared/Media/Effects/BlendEffect.cs b/src/Shared/HandyControl_Shared/Media/Effects/BlendEffect.cs new file mode 100644 index 00000000..744affcc --- /dev/null +++ b/src/Shared/HandyControl_Shared/Media/Effects/BlendEffect.cs @@ -0,0 +1,61 @@ +//reference doc : https://docs.microsoft.com/en-us/windows/win32/direct2d/blend#blending-examples + +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Effects; + +namespace HandyControl.Media.Effects +{ + public class BlendEffect : ShaderEffect + { + private static readonly Dictionary ShaderDic; + + public static readonly DependencyProperty BackgroundProperty = RegisterPixelShaderSamplerProperty("Background", typeof(BlendEffect), 0); + + public static readonly DependencyProperty ForegroundProperty = RegisterPixelShaderSamplerProperty("Foreground", typeof(BlendEffect), 1); + + static BlendEffect() + { + ShaderDic = new Dictionary(); + } + + public BlendEffect() + { + if (!ShaderDic.ContainsKey(Mode)) + { + ShaderDic[Mode] = new PixelShader + { + UriSource = new Uri($"pack://application:,,,/HandyControl;component/Resources/Effects/{Mode.ToString()}BlendEffect.ps") + }; + } + + PixelShader = ShaderDic[Mode]; + + UpdateShaderValue(BackgroundProperty); + UpdateShaderValue(ForegroundProperty); + } + + public Brush Background + { + get => (Brush)GetValue(BackgroundProperty); + set => SetValue(BackgroundProperty, value); + } + + public Brush Foreground + { + get => (Brush)GetValue(ForegroundProperty); + set => SetValue(ForegroundProperty, value); + } + + public static readonly DependencyProperty ModeProperty = DependencyProperty.Register( + "Mode", typeof(BlendEffectMode), typeof(BlendEffect), new PropertyMetadata(default(BlendEffectMode), PixelShaderConstantCallback(0))); + + public BlendEffectMode Mode + { + get => (BlendEffectMode) GetValue(ModeProperty); + set => SetValue(ModeProperty, value); + } + } +} diff --git a/src/Shared/HandyControl_Shared/Media/Effects/BlendEffectMode.cs b/src/Shared/HandyControl_Shared/Media/Effects/BlendEffectMode.cs new file mode 100644 index 00000000..5c15ad70 --- /dev/null +++ b/src/Shared/HandyControl_Shared/Media/Effects/BlendEffectMode.cs @@ -0,0 +1,32 @@ +namespace HandyControl.Media.Effects +{ + public enum BlendEffectMode + { + Multiply, + Screen, + Darken, + Lighten, + Dissolve, + ColorBurn, + LinearBurn, + DarkerColor, + LighterColor, + ColorDodge, + LinearDodge, + Overlay, + SoftLight, + HardLight, + VividLight, + LinearLight, + PinLight, + HardMix, + Difference, + Exclusion, + Hue, + Saturation, + Color, + Luminosity, + Subtract, + Division + } +} diff --git a/src/Shared/HandyControl_Shared/Resources/Effects/ColorMatrixEffect.fx b/src/Shared/HandyControl_Shared/Resources/Effects/ColorMatrixEffect.fx index 3f5142e4..f7c91008 100644 --- a/src/Shared/HandyControl_Shared/Resources/Effects/ColorMatrixEffect.fx +++ b/src/Shared/HandyControl_Shared/Resources/Effects/ColorMatrixEffect.fx @@ -46,11 +46,6 @@ float4 main(float2 uv : TEXCOORD) : COLOR k, l, m, n, p, q, r, s }; - - float4 matrixA2 = - { - e, j, o, t - }; - return mul(matrixA1, color) + matrixA2; + return mul(matrixA1, color) + float4( e, j, o, t ); } \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Resources/Effects/MultiplyBlendEffect.fx b/src/Shared/HandyControl_Shared/Resources/Effects/MultiplyBlendEffect.fx new file mode 100644 index 00000000..5a83692b --- /dev/null +++ b/src/Shared/HandyControl_Shared/Resources/Effects/MultiplyBlendEffect.fx @@ -0,0 +1,15 @@ +sampler2D background : register(s0); +sampler2D foreground : register(s1); + +float4 main(float2 uv : TEXCOORD) : COLOR +{ + float4 b = tex2D(background, uv); + float4 f = tex2D(foreground, uv); + float4 o = b; + + f.rgb *= f.a; + b.rgb *= b.a; + o.rgb = f.rgb * b.rgb + f.rgb * (1 - b.a) + b.rgb * (1 - f.a); + + return o; +} \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Resources/Effects/MultiplyBlendEffect.ps b/src/Shared/HandyControl_Shared/Resources/Effects/MultiplyBlendEffect.ps new file mode 100644 index 0000000000000000000000000000000000000000..c6b867621d80b6a5da4e612d147546b1b68e4c48 GIT binary patch literal 420 zcmZ{gJx;?w5QX2a195@m3n1YV8Y|ieMX3-81x1hoNgwh{A_5yZ&`~Vn0vy3TO%COA zu)NtgB_oe!zM1E@UPF8T>oatR*PT-UUrcbOS%jg050)Ed6i}njD)GpSC{Q@YS_X{C zc>4U5+xOQQerh-gTUvxz*nIxqZnGVkQ3H3YX>PZ6@s^%HT%@{Qj)vq|_!B@OtjVfk(d(cWt#`r^nR{mGY5*VcD_s=)_A|wq@ZlW(FWM&I H9q)lZd{|FH literal 0 HcmV?d00001