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

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

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

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

@ -6,13 +6,15 @@
<Using>Avalonia.Rendering.Composition.Animations</Using>
<Manual Name="Avalonia.Platform.IGeometryImpl" Passthrough="true"/>
<Manual Name="Avalonia.Media.IBrush" Passthrough="true"/>
<Manual Name="ICompositionSurface" ServerName="ServerCompositionSurface" />
<Object Name="CompositionVisual" Abstract="true">
<Property Name="Root" Type="CompositionTarget?" InternalSet="true" />
<Property Name="Parent" Type="CompositionVisual?" InternalSet="true" />
<Property Name="Visible" Type="bool" Animated="true" DefaultValue="true"/>
<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="Offset" Type="Vector3" 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="TransformMatrix" Type="Matrix4x4" DefaultValue="Matrix4x4.Identity" Animated="true"/>
<Property Name="AdornedVisual" Type="CompositionVisual?" Internal="true" />
<Property Name="OpacityMaskBrush" Type="Avalonia.Media.IBrush?" Internal="true" />
</Object>
<Object Name="CompositionContainerVisual" Inherits="CompositionVisual"/>
<List Name="CompositionVisualCollection" ItemType="CompositionVisual" CustomCtor="true"/>

Loading…
Cancel
Save