private static PipelineBuilder Start(IPipelineEffect effect) { switch (effect) { case BackdropEffect backdrop when backdrop.Source == AcrylicBackgroundSource.Backdrop: return(PipelineBuilder.FromBackdrop()); case BackdropEffect backdrop when backdrop.Source == AcrylicBackgroundSource.HostBackdrop: return(PipelineBuilder.FromHostBackdrop()); case SolidColorEffect color: return(PipelineBuilder.FromColor(color.Color)); case ImageEffect image: return(PipelineBuilder.FromImage(image.Uri, image.DpiMode, image.CacheMode)); case TileEffect tile: return(PipelineBuilder.FromTiles(tile.Uri, tile.DpiMode, tile.CacheMode)); case AcrylicEffect acrylic when acrylic.Source == AcrylicBackgroundSource.Backdrop: return(PipelineBuilder.FromBackdropAcrylic(acrylic.Tint, (float)acrylic.TintMix, (float)acrylic.BlurAmount, acrylic.TextureUri)); case AcrylicEffect acrylic when acrylic.Source == AcrylicBackgroundSource.HostBackdrop: return(PipelineBuilder.FromHostBackdropAcrylic(acrylic.Tint, (float)acrylic.TintMix, acrylic.TextureUri)); default: throw new ArgumentException($"Invalid initial pipeline effect: {effect.GetType()}"); } }
/// <inheritdoc/> protected override object ProvideValue() { return(BackgroundSource switch { AcrylicBackgroundSource.Backdrop => PipelineBuilder.FromBackdropAcrylic(this.TintColor, (float)this.TintOpacity, (float)BlurAmount, TextureUri), AcrylicBackgroundSource.HostBackdrop => PipelineBuilder.FromHostBackdropAcrylic(this.TintColor, (float)this.TintOpacity, TextureUri), _ => throw new ArgumentException($"Invalid source mode for acrylic effect: {BackgroundSource}") });
/// <inheritdoc/> protected override PipelineBuilder OnBrushRequested() { switch (Source) { case AcrylicBackgroundSource.Backdrop: return(PipelineBuilder.FromBackdropAcrylic(Tint, (float)TintMix, (float)BlurAmount, TextureUri)); case AcrylicBackgroundSource.HostBackdrop: return(PipelineBuilder.FromHostBackdropAcrylic(Tint, (float)TintMix, TextureUri)); default: throw new ArgumentOutOfRangeException(nameof(Source), $"Invalid acrylic source: {Source}"); } }
/// <inheritdoc/> protected override PipelineBuilder OnBrushRequested() { // Starts a new composition pipeline from the given effect PipelineBuilder Start(IPipelineEffect effect) { switch (effect) { case BackdropEffect backdrop when backdrop.Source == AcrylicBackgroundSource.Backdrop: return(PipelineBuilder.FromBackdropBrush()); case BackdropEffect backdrop when backdrop.Source == AcrylicBackgroundSource.HostBackdrop: return(PipelineBuilder.FromHostBackdropBrush()); case SolidColorEffect color: return(PipelineBuilder.FromColor(color.Color)); case ImageEffect image: return(PipelineBuilder.FromImage(image.Uri, image.DPIMode, image.CacheMode)); case TileEffect tile: return(PipelineBuilder.FromTiles(tile.Uri, tile.DPIMode, tile.CacheMode)); case AcrylicEffect acrylic: switch (acrylic.Source) { case AcrylicBackgroundSource.Backdrop: return(PipelineBuilder.FromBackdropAcrylic(acrylic.Tint, (float)acrylic.TintMix, (float)acrylic.BlurAmount, acrylic.TextureUri)); case AcrylicBackgroundSource.HostBackdrop: return(PipelineBuilder.FromHostBackdropAcrylic(acrylic.Tint, (float)acrylic.TintMix, acrylic.TextureUri)); default: throw new ArgumentOutOfRangeException(nameof(acrylic.Source), $"Invalid acrylic source: {acrylic.Source}"); } default: throw new ArgumentException($"Invalid initial pipeline effect: {effect.GetType()}"); } } // Appends an effect to an existing composition pipeline PipelineBuilder Append(IPipelineEffect effect, PipelineBuilder builder) { switch (effect) { case OpacityEffect opacity: return(builder.Opacity((float)opacity.Value)); case LuminanceEffect _: return(builder.Effect(source => new LuminanceToAlphaEffect { Source = source })); case TintEffect tint: return(builder.Tint(tint.Color, (float)tint.Opacity)); case BlurEffect blur: return(builder.Blur((float)blur.Value)); case SaturationEffect saturation: return(builder.Saturation((float)saturation.Value)); case BlendEffect blend: return(builder.Blend(Build(blend.Input), blend.Mode, blend.Placement)); default: throw new ArgumentException($"Invalid pipeline effect: {effect.GetType()}"); } } // Builds a new effects pipeline from the input effects sequence PipelineBuilder Build(IList <IPipelineEffect> effects) { if (effects.Count == 0) { throw new ArgumentException("An effects pipeline can't be empty"); } return(effects.Skip(1).Aggregate(Start(effects[0]), (b, e) => Append(e, b))); } return(Build(Effects)); }