Krzysztof Krysiński 5 mesiacov pred
rodič
commit
330e26aa65

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit da050628e8cae779f9b31fe43ce58663b98a7c8e
+Subproject commit 753d3ff0fc5164fdb28356299b747dcc4e13412e

+ 16 - 5
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/FilterNodes/SepiaFilterNode.cs

@@ -8,13 +8,22 @@ namespace PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.FilterNodes;
 [NodeInfo("Sepia")]
 [NodeInfo("Sepia")]
 public class SepiaFilterNode : FilterNode
 public class SepiaFilterNode : FilterNode
 {
 {
+    public InputProperty<double> Intensity { get; }
+
     private ColorMatrix srgbSepiaMatrix;
     private ColorMatrix srgbSepiaMatrix;
     private ColorMatrix linearSepiaMatrix;
     private ColorMatrix linearSepiaMatrix;
     private ColorFilter linearSepiaFilter;
     private ColorFilter linearSepiaFilter;
     private ColorFilter sepiaColorFilter;
     private ColorFilter sepiaColorFilter;
 
 
+    protected override bool ExecuteOnlyOnCacheChange => true;
+    protected override CacheTriggerFlags CacheTrigger => CacheTriggerFlags.Inputs;
+
+    private ColorFilter lastFilter;
+
     public SepiaFilterNode()
     public SepiaFilterNode()
     {
     {
+        Intensity = CreateInput("Intensity", "INTENSITY", 1d);
+
         srgbSepiaMatrix = new ColorMatrix(
         srgbSepiaMatrix = new ColorMatrix(
             [
             [
                 0.393f, 0.769f, 0.189f, 0.0f, 0.0f,
                 0.393f, 0.769f, 0.189f, 0.0f, 0.0f,
@@ -32,12 +41,14 @@ public class SepiaFilterNode : FilterNode
 
 
     protected override ColorFilter? GetColorFilter(ColorSpace colorSpace)
     protected override ColorFilter? GetColorFilter(ColorSpace colorSpace)
     {
     {
-        if (colorSpace.IsSrgb)
-        {
-            return sepiaColorFilter;
-        }
+        var targetMatrix = colorSpace.IsSrgb ? srgbSepiaMatrix : linearSepiaMatrix;
+
+        lastFilter?.Dispose();
+
+        var lerped = ColorMatrix.Lerp(ColorMatrix.Identity, targetMatrix, (float)Intensity.Value);
+        lastFilter = ColorFilter.CreateColorMatrix(lerped);
 
 
-        return linearSepiaFilter;
+        return lastFilter;
     }
     }
 
 
     public override Node CreateCopy()
     public override Node CreateCopy()

BIN
src/PixiEditor.UI.Common/Fonts/PixiPerfect.ttf


+ 1 - 0
src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml

@@ -157,6 +157,7 @@
             <system:String x:Key="icon-outline">&#xE99a;</system:String>
             <system:String x:Key="icon-outline">&#xE99a;</system:String>
             <system:String x:Key="icon-terminal">&#xE99b;</system:String>
             <system:String x:Key="icon-terminal">&#xE99b;</system:String>
             <system:String x:Key="icon-cone">&#xE99c;</system:String>
             <system:String x:Key="icon-cone">&#xE99c;</system:String>
+            <system:String x:Key="icon-camera">&#xE99d;</system:String>
 
 
         </ResourceDictionary>
         </ResourceDictionary>
     </Styles.Resources>
     </Styles.Resources>

+ 1 - 0
src/PixiEditor.UI.Common/Fonts/PixiPerfectIcons.axaml.cs

@@ -152,6 +152,7 @@ public static class PixiPerfectIcons
     public const string TextUnderline = "\uE998";
     public const string TextUnderline = "\uE998";
     public const string TextRound = "\uE999";
     public const string TextRound = "\uE999";
     public const string Cone = "\uE99c";
     public const string Cone = "\uE99c";
+    public const string Camera = "\uE99d";
 
 
     public static Stream GetFontStream()
     public static Stream GetFontStream()
     {
     {

+ 3 - 1
src/PixiEditor/Data/Localization/Languages/en.json

@@ -889,5 +889,7 @@
   "UNIT": "Unit",
   "UNIT": "Unit",
   "ANGLE": "Angle",
   "ANGLE": "Angle",
   "DOCUMENT_INFO_NODE": "Document Info",
   "DOCUMENT_INFO_NODE": "Document Info",
-  "MASK_NODE": "Mask"
+  "MASK_NODE": "Mask",
+  "SEPIA_FILTER_NODE": "Sepia Filter",
+  "INTENSITY": "Intensity"
 }
 }

+ 1 - 1
src/PixiEditor/ViewModels/Document/Nodes/FilterNodes/SepiaFilterNodeViewModel.cs

@@ -4,5 +4,5 @@ using PixiEditor.ViewModels.Nodes;
 
 
 namespace PixiEditor.ViewModels.Document.Nodes.FilterNodes;
 namespace PixiEditor.ViewModels.Document.Nodes.FilterNodes;
 
 
-[NodeViewModel("SEPIA_NODE", "FILTERS", "")]
+[NodeViewModel("SEPIA_FILTER_NODE", "FILTERS", PixiPerfectIcons.Camera)]
 internal class SepiaFilterNodeViewModel : NodeViewModel<SepiaFilterNode>;
 internal class SepiaFilterNodeViewModel : NodeViewModel<SepiaFilterNode>;