XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
using AngleSharp.Html.Parser;
using XFESystem.Browser;
using XFESystem.Desktop;

namespace XFESystem.Browser.Tests;

public sealed class RasterRenderYieldTests
{
    [Theory]
    [InlineData("background:white;border-radius:12px")]
    [InlineData("background:linear-gradient(90deg,red,blue);border-radius:12px")]
    [InlineData("background:white;box-shadow:0 4px 12px black")]
    public void BoxRowsYieldWithoutPresentingWhenInteractiveInputBecomesPending(string css)
    {
        var page=new HtmlParser().ParseDocument("<style>body{margin:0}div{width:40px;height:40px;"+css+"}</style><div></div>");
        var list=new BrowserLayoutEngine().Layout(page,new(80,80));var command=Assert.Single(list.Commands,c=>c.Decoration is not null);
        var canvas=new YieldCanvas();
        Assert.Throws<DesktopRenderYieldException>(()=>BrowserBoxRasterPainter.Paint(canvas,command,command.Bounds,new(0,0,80,80)));
        Assert.InRange(canvas.BlendCalls,3,80);Assert.Equal(0,canvas.Presents);
    }
    [Fact]
    public void RoundedClipForwardsPendingYieldToItsGradientDescendant()
    {
        var page=new HtmlParser().ParseDocument("<style>body{margin:0}#A{width:40px;height:40px;border-radius:12px;overflow:hidden}#B{width:40px;height:40px;background:linear-gradient(90deg,red,blue)}</style><div id=A><div id=B></div></div>");
        var list=new BrowserLayoutEngine().Layout(page,new(80,80));var canvas=new YieldCanvas();
        Assert.Throws<DesktopRenderYieldException>(()=>BrowserRasterPainter.Paint(canvas,new(0,0,80,80),list));
        Assert.InRange(canvas.BlendCalls,3,80);Assert.Equal(0,canvas.Presents);
    }
    private sealed class YieldCanvas:IDesktopCoverageCanvas,IDesktopRenderYieldCanvas
    {
        public int Width=>80;public int Height=>80;public int BlendCalls;public int Presents;
        public bool RenderYieldRequested=>BlendCalls>=3;
        public void BlendCoverage(uint rgb,int x,int y,int width,int height,ReadOnlySpan<byte> source){BlendCalls++;}
        public void Fill(uint rgb,int x,int y,int width,int height){}
        public void Line(uint rgb,int x1,int y1,int x2,int y2){}
        public void Text(string text,uint rgb,int x,int y){}
        public void Present(){Presents++;}
    }
}