Browse Source

Added support for opacity mask

pull/8105/head
Nikita Tsukanov 4 years ago
parent
commit
92a20ee26f
  1. 1
      src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs
  2. 9
      src/Avalonia.Base/Rendering/Composition/Server/ServerVisual.cs
  3. 13
      src/Avalonia.Base/Rendering/Composition/Visual.cs
  4. 5
      src/Avalonia.Base/composition-schema.xml

1
src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs

@ -189,6 +189,7 @@ public class CompositingRenderer : RendererBase, IRendererWithCompositor
comp.Opacity = (float)visual.Opacity; comp.Opacity = (float)visual.Opacity;
comp.ClipToBounds = visual.ClipToBounds; comp.ClipToBounds = visual.ClipToBounds;
comp.Clip = visual.Clip?.PlatformImpl; comp.Clip = visual.Clip?.PlatformImpl;
comp.OpacityMask = visual.OpacityMask;
var renderTransform = Matrix.Identity; var renderTransform = Matrix.Identity;

9
src/Avalonia.Base/Rendering/Composition/Server/ServerVisual.cs

@ -24,10 +24,13 @@ namespace Avalonia.Rendering.Composition.Server
canvas.Transform = Matrix.Identity; canvas.Transform = Matrix.Identity;
if (Opacity != 1) if (Opacity != 1)
canvas.PushOpacity(Opacity); canvas.PushOpacity(Opacity);
var boundsRect = new Rect(new Size(Size.X, Size.Y));
if(ClipToBounds) if(ClipToBounds)
canvas.PushClip(new Rect(new Size(Size.X, Size.Y))); canvas.PushClip(boundsRect);
if (Clip != null) if (Clip != null)
canvas.PushGeometryClip(Clip); canvas.PushGeometryClip(Clip);
if(OpacityMaskBrush != null)
canvas.PushOpacityMask(OpacityMaskBrush, boundsRect);
//TODO: Check clip //TODO: Check clip
RenderCore(canvas); RenderCore(canvas);
@ -35,7 +38,9 @@ namespace Avalonia.Rendering.Composition.Server
// Hack to force invalidation of SKMatrix // Hack to force invalidation of SKMatrix
canvas.PreTransform = MatrixUtils.ToMatrix(transform); canvas.PreTransform = MatrixUtils.ToMatrix(transform);
canvas.Transform = Matrix.Identity; canvas.Transform = Matrix.Identity;
if (OpacityMaskBrush != null)
canvas.PopOpacityMask();
if (Clip != null) if (Clip != null)
canvas.PopGeometryClip(); canvas.PopGeometryClip();
if (ClipToBounds) if (ClipToBounds)

13
src/Avalonia.Base/Rendering/Composition/Visual.cs

@ -1,11 +1,14 @@
using System; using System;
using System.Numerics; using System.Numerics;
using Avalonia.Media;
using Avalonia.VisualTree; using Avalonia.VisualTree;
namespace Avalonia.Rendering.Composition namespace Avalonia.Rendering.Composition
{ {
public abstract partial class CompositionVisual public abstract partial class CompositionVisual
{ {
private IBrush? _opacityMask;
private protected virtual void OnRootChangedCore() private protected virtual void OnRootChangedCore()
{ {
} }
@ -14,6 +17,16 @@ namespace Avalonia.Rendering.Composition
partial void OnParentChanged() => Root = Parent?.Root; partial void OnParentChanged() => Root = Parent?.Root;
public IBrush? OpacityMask
{
get => _opacityMask;
set
{
if (_opacityMask == value)
return;
OpacityMaskBrush = (_opacityMask = value)?.ToImmutable();
}
}
internal Matrix4x4? TryGetServerTransform() internal Matrix4x4? TryGetServerTransform()
{ {

5
src/Avalonia.Base/composition-schema.xml

@ -6,13 +6,15 @@
<Using>Avalonia.Rendering.Composition.Animations</Using> <Using>Avalonia.Rendering.Composition.Animations</Using>
<Manual Name="Avalonia.Platform.IGeometryImpl" Passthrough="true"/> <Manual Name="Avalonia.Platform.IGeometryImpl" Passthrough="true"/>
<Manual Name="Avalonia.Media.IBrush" Passthrough="true"/>
<Manual Name="ICompositionSurface" ServerName="ServerCompositionSurface" /> <Manual Name="ICompositionSurface" ServerName="ServerCompositionSurface" />
<Object Name="CompositionVisual" Abstract="true"> <Object Name="CompositionVisual" Abstract="true">
<Property Name="Root" Type="CompositionTarget?" InternalSet="true" /> <Property Name="Root" Type="CompositionTarget?" InternalSet="true" />
<Property Name="Parent" Type="CompositionVisual?" InternalSet="true" /> <Property Name="Parent" Type="CompositionVisual?" InternalSet="true" />
<Property Name="Visible" Type="bool" Animated="true" DefaultValue="true"/> <Property Name="Visible" Type="bool" Animated="true" DefaultValue="true"/>
<Property Name="Opacity" Type="float" Animated="true" DefaultValue="1"/> <Property Name="Opacity" Type="float" Animated="true" DefaultValue="1"/>
<Property Name="Clip" Type="Avalonia.Platform.IGeometryImpl?" />
<Property Name="Clip" Type="Avalonia.Platform.IGeometryImpl?" Internal="true" />
<Property Name="ClipToBounds" Type="bool" Animated="true" DefaultValue="true"/> <Property Name="ClipToBounds" Type="bool" Animated="true" DefaultValue="true"/>
<Property Name="Offset" Type="Vector3" Animated="true"/> <Property Name="Offset" Type="Vector3" Animated="true"/>
<Property Name="Size" Type="Vector2" Animated="true"/> <Property Name="Size" Type="Vector2" Animated="true"/>
@ -23,6 +25,7 @@
<Property Name="Scale" Type="Vector3" DefaultValue="new Vector3(1, 1, 1)" Animated="true"/> <Property Name="Scale" Type="Vector3" DefaultValue="new Vector3(1, 1, 1)" Animated="true"/>
<Property Name="TransformMatrix" Type="Matrix4x4" DefaultValue="Matrix4x4.Identity" Animated="true"/> <Property Name="TransformMatrix" Type="Matrix4x4" DefaultValue="Matrix4x4.Identity" Animated="true"/>
<Property Name="AdornedVisual" Type="CompositionVisual?" Internal="true" /> <Property Name="AdornedVisual" Type="CompositionVisual?" Internal="true" />
<Property Name="OpacityMaskBrush" Type="Avalonia.Media.IBrush?" Internal="true" />
</Object> </Object>
<Object Name="CompositionContainerVisual" Inherits="CompositionVisual"/> <Object Name="CompositionContainerVisual" Inherits="CompositionVisual"/>
<List Name="CompositionVisualCollection" ItemType="CompositionVisual" CustomCtor="true"/> <List Name="CompositionVisualCollection" ItemType="CompositionVisual" CustomCtor="true"/>

Loading…
Cancel
Save