summaryrefslogtreecommitdiff
path: root/Models/PipelineStep.cs
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2020-01-01 22:50:08 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2020-01-01 22:50:08 +0100
commit2481d1857b08879a3d15e679a302667c7d8976f7 (patch)
treec8ae66b72a3469e65239c94d1d52795fb75700b2 /Models/PipelineStep.cs
parentfbe866f7b26c10bb54d72c029f8c628988a90be2 (diff)
downloadavalar-2481d1857b08879a3d15e679a302667c7d8976f7.tar.gz
avalar-2481d1857b08879a3d15e679a302667c7d8976f7.tar.bz2
avalar-2481d1857b08879a3d15e679a302667c7d8976f7.zip
Adds a working but slightly buggy pipeline implementation.
Diffstat (limited to 'Models/PipelineStep.cs')
-rw-r--r--Models/PipelineStep.cs65
1 files changed, 65 insertions, 0 deletions
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<T> : 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<IBitmap> 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<T> Create<T>(T processor) where T : INotifyPropertyChanged, IProcessor
+ {
+ return new PipelineStep<T>(processor);
+ }
+
+ public static PipelineStep<T> AsPipelineStep<T>(this T processor) where T : INotifyPropertyChanged, IProcessor
+ {
+ return Create(processor);
+ }
+ }
+}