Browse Source

refactor effects.

tmp-winuicomp_with_manual_fbo
Dan Walmsley 6 years ago
parent
commit
7f9b675efb
  1. 18
      src/Windows/Avalonia.Win32/Composition/CompositionHost.cs
  2. 45
      src/Windows/Avalonia.Win32/Composition/EffectBase.cs
  3. 42
      src/Windows/Avalonia.Win32/Composition/GaussianBlurEffect.cs
  4. 35
      src/Windows/Avalonia.Win32/Composition/SaturationEffect.cs

18
src/Windows/Avalonia.Win32/Composition/CompositionHost.cs

@ -121,18 +121,28 @@ namespace Avalonia.Win32
public SpriteVisual CreateBlur()
{
var effect = new GaussianBlurEffect();
var effectFactory = _compositor.CreateEffectFactory(effect);
var blurBrush = effectFactory.CreateBrush();
var blurEffect = new GaussianBlurEffect(new CompositionEffectSourceParameter ("backdrop"));
var blurEffectFactory = _compositor.CreateEffectFactory(blurEffect);
var blurBrush = blurEffectFactory.CreateBrush();
var backDropBrush = _compositor.CreateBackdropBrush();
blurBrush.SetSourceParameter("backdrop", backDropBrush);
var saturateEffect = new SaturationEffect(blurEffect);
var satEffectFactory = _compositor.CreateEffectFactory(saturateEffect);
var satBrush = satEffectFactory.CreateBrush();
satBrush.SetSourceParameter("backdrop", backDropBrush);
var visual = _compositor.CreateSpriteVisual();
visual.RelativeSizeAdjustment = new System.Numerics.Vector2(1.0f, 1.0f);
visual.Brush = blurBrush;
visual.Brush = satBrush;
return visual;
}

45
src/Windows/Avalonia.Win32/Composition/EffectBase.cs

@ -0,0 +1,45 @@
using System;
using Windows.Graphics.Effects;
using Windows.Graphics.Effects.Interop;
namespace Avalonia.Win32
{
abstract class EffectBase : IGraphicsEffect, IGraphicsEffectSource, global::Windows.Graphics.Effects.Interop.IGraphicsEffectD2D1Interop
{
private IGraphicsEffectSource[] _sources;
public EffectBase(params IGraphicsEffectSource[] sources)
{
_sources = sources;
}
private IGraphicsEffectSource _source;
public virtual string Name { get; set; }
public abstract Guid EffectId { get; }
public abstract uint PropertyCount { get; }
public uint SourceCount => (uint)_sources.Length;
public IGraphicsEffectSource GetSource(uint index)
{
if(index < _sources.Length)
{
return _sources[index];
}
return null;
}
public uint GetNamedPropertyMapping(string name, out GRAPHICS_EFFECT_PROPERTY_MAPPING mapping)
{
throw new NotImplementedException();
}
public abstract object GetProperty(uint index);
}
}

42
src/Windows/Avalonia.Win32/Composition/GaussianBlurEffect.cs

@ -1,13 +1,14 @@
using System;
using Windows.Graphics.Effects;
using Windows.Graphics.Effects.Interop;
using Windows.UI.Composition;
namespace Avalonia.Win32
{
class GaussianBlurEffect : IGraphicsEffect, IGraphicsEffectSource, global::Windows.Graphics.Effects.Interop.IGraphicsEffectD2D1Interop
class GaussianBlurEffect : EffectBase
{
public GaussianBlurEffect(IGraphicsEffectSource source) : base(source)
{
}
enum D2D1_GAUSSIANBLUR_OPTIMIZATION
{
D2D1_GAUSSIANBLUR_OPTIMIZATION_SPEED,
@ -31,20 +32,11 @@ namespace Avalonia.Win32
D2D1_GAUSSIANBLUR_PROP_FORCE_DWORD
};
public string Name { get; set; }
public Guid EffectId => D2DEffects.CLSID_D2D1GaussianBlur;
public override Guid EffectId => D2DEffects.CLSID_D2D1GaussianBlur;
public uint PropertyCount => 3;
public uint SourceCount => 1;
public uint GetNamedPropertyMapping(string name, out GRAPHICS_EFFECT_PROPERTY_MAPPING mapping)
{
throw new NotImplementedException();
}
public override uint PropertyCount => 3;
public object GetProperty(uint index)
public override object GetProperty(uint index)
{
switch ((D2D1GaussianBlurProp)index)
{
@ -52,28 +44,14 @@ namespace Avalonia.Win32
return 30.0f;
case D2D1GaussianBlurProp.D2D1_GAUSSIANBLUR_PROP_OPTIMIZATION:
return (UInt32)D2D1_GAUSSIANBLUR_OPTIMIZATION.D2D1_GAUSSIANBLUR_OPTIMIZATION_BALANCED;
return (uint)D2D1_GAUSSIANBLUR_OPTIMIZATION.D2D1_GAUSSIANBLUR_OPTIMIZATION_BALANCED;
case D2D1GaussianBlurProp.D2D1_GAUSSIANBLUR_PROP_BORDER_MODE:
return (UInt32)D2D1_BORDER_MODE.D2D1_BORDER_MODE_HARD;
return (uint)D2D1_BORDER_MODE.D2D1_BORDER_MODE_HARD;
}
return null;
}
private IGraphicsEffectSource _source = new CompositionEffectSourceParameter("backdrop");
public IGraphicsEffectSource GetSource(uint index)
{
if (index == 0)
{
return _source;
}
else
{
return null;
}
}
}
}

35
src/Windows/Avalonia.Win32/Composition/SaturationEffect.cs

@ -0,0 +1,35 @@
using System;
using Windows.Graphics.Effects;
namespace Avalonia.Win32
{
class SaturationEffect : EffectBase
{
public SaturationEffect(IGraphicsEffect source) : base(source)
{
}
enum D2D1_SATURATION_PROP
{
D2D1_SATURATION_PROP_SATURATION,
D2D1_SATURATION_PROP_FORCE_DWORD
};
public override Guid EffectId => D2DEffects.CLSID_D2D1Saturation;
public override uint PropertyCount => 1;
public override object GetProperty(uint index)
{
switch ((D2D1_SATURATION_PROP)index)
{
case D2D1_SATURATION_PROP.D2D1_SATURATION_PROP_SATURATION:
return 2.0f;
}
return null;
}
}
}
Loading…
Cancel
Save