From 2481d1857b08879a3d15e679a302667c7d8976f7 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Wed, 1 Jan 2020 22:50:08 +0100 Subject: Adds a working but slightly buggy pipeline implementation. --- Models/PipelineStep.cs | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Models/PipelineStep.cs (limited to 'Models/PipelineStep.cs') diff --git a/Models/PipelineStep.cs b/Models/PipelineStep.cs new file mode 100644 index 0000000..e8a4bf1 --- /dev/null +++ b/Models/PipelineStep.cs @@ -0,0 +1,65 @@ +using Avalar.Services; +using Avalonia.Media.Imaging; +using ReactiveUI; +using System; +using System.ComponentModel; +using System.Threading; +using System.Threading.Tasks; + +namespace Avalar.Models +{ + public class PipelineStep : IPipelineStep where T : INotifyPropertyChanged, IProcessor + { + public PipelineStep(T processor) + { + m_Processor = processor ?? throw new ArgumentNullException(nameof(processor)); + m_Processor.PropertyChanged += OnPropertyChanged; + } + + private void OnPropertyChanged(object sender, PropertyChangedEventArgs e) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Result))); + } + + public void InvalidateResult() + { + Result = null; + } + + private T m_Processor; + + public event PropertyChangedEventHandler PropertyChanged; + + private IBitmap Result { get; set; } + + public Task Run(IBitmap bitmap, CancellationToken token) + { + if (Result != null) + { + return Task.FromResult(Result); + } + else + { + return Task.Run(() => + { + Result = m_Processor.Process(bitmap, token); + token.ThrowIfCancellationRequested(); + return Result; + }); + } + } + } + + public static class PipelineStep + { + public static PipelineStep Create(T processor) where T : INotifyPropertyChanged, IProcessor + { + return new PipelineStep(processor); + } + + public static PipelineStep AsPipelineStep(this T processor) where T : INotifyPropertyChanged, IProcessor + { + return Create(processor); + } + } +} -- cgit v1.2.3-70-g09d2