csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
4.2 KiB
203 lines
4.2 KiB
// ReSharper disable RedundantNameQualifier
|
|
|
|
#nullable enable
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using Avalonia.Media;
|
|
using Avalonia;
|
|
|
|
namespace CrossUI;
|
|
|
|
public class CrossBrush
|
|
{
|
|
public double Opacity = 1;
|
|
public Avalonia.Matrix? Transform;
|
|
public Avalonia.Matrix? RelativeTransform;
|
|
}
|
|
|
|
public class CrossSolidColorBrush : CrossBrush
|
|
{
|
|
public Avalonia.Media.Color Color = Avalonia.Media.Colors.Black;
|
|
|
|
public CrossSolidColorBrush()
|
|
{
|
|
|
|
}
|
|
|
|
public CrossSolidColorBrush(Avalonia.Media.Color color)
|
|
{
|
|
Color = color;
|
|
}
|
|
}
|
|
|
|
public class CrossGradientBrush : CrossBrush
|
|
{
|
|
public List<GradientStop> GradientStops = new();
|
|
public Avalonia.Media.GradientSpreadMethod SpreadMethod;
|
|
public BrushMappingMode MappingMode;
|
|
}
|
|
|
|
public class CrossRadialGradientBrush : CrossGradientBrush
|
|
{
|
|
public Avalonia.Point Center;
|
|
public Avalonia.Point GradientOrigin;
|
|
public double RadiusX, RadiusY;
|
|
}
|
|
|
|
public class CrossTileBrush : CrossBrush
|
|
{
|
|
public Avalonia.Media.AlignmentX AlignmentX = AlignmentX.Center;
|
|
public Avalonia.Media.AlignmentY AlignmentY = AlignmentY.Center;
|
|
public Avalonia.Media.Stretch Stretch = Stretch.Fill;
|
|
public Avalonia.Media.TileMode TileMode = TileMode.None;
|
|
public Rect Viewbox = new Rect(0, 0, 1, 1);
|
|
public Avalonia.Media.BrushMappingMode ViewboxUnits = BrushMappingMode.RelativeToBoundingBox;
|
|
public Rect Viewport = new Rect(0, 0, 1, 1);
|
|
public Avalonia.Media.BrushMappingMode ViewportUnits = BrushMappingMode.RelativeToBoundingBox;
|
|
}
|
|
|
|
|
|
public abstract class CrossDrawing
|
|
{
|
|
}
|
|
|
|
|
|
public class CrossGeometryDrawing : CrossDrawing
|
|
{
|
|
public CrossGeometry Geometry;
|
|
public CrossBrush? Brush;
|
|
public CrossPen? Pen;
|
|
public CrossGeometryDrawing(CrossGeometry geometry)
|
|
{
|
|
Geometry = geometry;
|
|
}
|
|
}
|
|
|
|
public class CrossDrawingGroup : CrossDrawing
|
|
{
|
|
public List<CrossDrawing> Children = new();
|
|
}
|
|
|
|
public abstract class CrossGeometry
|
|
{
|
|
|
|
}
|
|
|
|
public class CrossSvgGeometry : CrossGeometry
|
|
{
|
|
public string Path;
|
|
|
|
public CrossSvgGeometry(string path)
|
|
{
|
|
Path = path;
|
|
}
|
|
}
|
|
|
|
public class CrossEllipseGeometry : CrossGeometry
|
|
{
|
|
public CrossEllipseGeometry(Rect rect)
|
|
{
|
|
Rect = rect;
|
|
}
|
|
|
|
public CrossEllipseGeometry()
|
|
{
|
|
|
|
}
|
|
|
|
public Rect Rect { get; set; }
|
|
}
|
|
|
|
public class CrossRectangleGeometry : CrossGeometry
|
|
{
|
|
public Rect Rect;
|
|
|
|
public CrossRectangleGeometry(Rect rect)
|
|
{
|
|
Rect = rect;
|
|
}
|
|
}
|
|
|
|
public class CrossDrawingBrush : CrossTileBrush
|
|
{
|
|
public CrossDrawing Drawing;
|
|
}
|
|
|
|
public class CrossPen
|
|
{
|
|
public CrossBrush Brush;
|
|
public double Thickness = 1;
|
|
}
|
|
|
|
public interface ICrossDrawingContext
|
|
{
|
|
void DrawRectangle(CrossBrush? brush, CrossPen? pen, Rect rc);
|
|
void DrawGeometry(CrossBrush? brush, CrossPen? pen, CrossGeometry geometry);
|
|
void DrawImage(CrossImage image, Rect rc);
|
|
}
|
|
|
|
public abstract class CrossImage
|
|
{
|
|
|
|
}
|
|
|
|
public class CrossBitmapImage : CrossImage
|
|
{
|
|
public string Path;
|
|
public CrossBitmapImage(string path)
|
|
{
|
|
Path = path;
|
|
}
|
|
}
|
|
|
|
public class CrossDrawingImage : CrossImage
|
|
{
|
|
public CrossDrawing Drawing;
|
|
}
|
|
|
|
|
|
public class CrossControl
|
|
{
|
|
public Rect Bounds => new Rect(Left, Top, Width, Height);
|
|
public double Left, Top, Width, Height;
|
|
public CrossBrush? Background;
|
|
public CrossPen? Outline;
|
|
public List<CrossControl> Children = new();
|
|
public Matrix RenderTransform = Matrix.Identity;
|
|
|
|
public virtual void Render(ICrossDrawingContext ctx)
|
|
{
|
|
var rc = new Rect(Bounds.Size);
|
|
if (Background != null || Outline != null)
|
|
ctx.DrawRectangle(Background, Outline, rc);
|
|
}
|
|
}
|
|
|
|
public class CrossFuncControl : CrossControl
|
|
{
|
|
private readonly Action<ICrossDrawingContext> _render;
|
|
|
|
public CrossFuncControl(Action<ICrossDrawingContext> render)
|
|
{
|
|
_render = render;
|
|
}
|
|
|
|
public override void Render(ICrossDrawingContext ctx)
|
|
{
|
|
base.Render(ctx);
|
|
_render(ctx);
|
|
}
|
|
}
|
|
|
|
public class CrossImageControl : CrossControl
|
|
{
|
|
public CrossImage Image;
|
|
public override void Render(ICrossDrawingContext ctx)
|
|
{
|
|
base.Render(ctx);
|
|
var rc = new Rect(Bounds.Size);
|
|
ctx.DrawImage(Image, rc);
|
|
}
|
|
}
|
|
|
|
|
|
|