Make3.Renderer/Make3.RenderServer/Layers/TestLayer.cs
2025-04-28 21:30:59 +03:00

62 lines
2.2 KiB
C#

using Domain;
using Domain.Interfaces;
using Google.Protobuf;
using LayerClients;
using SkiaSharp;
namespace Make3.RenderServer.Layers;
public class TestLayer(LayerClients.TestLayer.TestLayerClient grpcClient) : ILayer
{
public uint Order { get; init; }
public OpticalSchema OpticalSchema { get; init; }
public SKBitmap? Mask { get; init; }
public required SKBitmap Image { get; init; }
public bool InvertMask { get; init; }
private readonly LayerClients.TestLayer.TestLayerClient _grpcClient = grpcClient;
public async Task Prerender()
{
using var imageData = Image.Encode(SKEncodedImageFormat.Png, 100);
using var maskData = Mask?.Encode(SKEncodedImageFormat.Png, 100);
var request = new PrerenderRequest
{
OpticalSchemaData = OpticalSchema.ToString(),
Image = ByteString.CopyFrom(imageData.Span),
};
if (maskData != null)
{
request.Mask = ByteString.CopyFrom(maskData.Span);
request.InvertMask = InvertMask;
}
var response = await _grpcClient.PrerenderAsync(request);
}
public async Task<SKBitmap> Render(uint x, uint y, uint frameWidth, uint frameHeight, SKBitmap? automask)
{
//здесь надо кусок изображения взять
using var imageData = Image.Encode(SKEncodedImageFormat.Png, 100);
using var maskData = Mask?.Encode(SKEncodedImageFormat.Png, 100);
using var automaskData = automask?.Encode(SKEncodedImageFormat.Png, 100);
var request = new RenderRequest
{
X = x,
Y = y,
FrameWidth = frameWidth,
FrameHeight = frameHeight,
Image = ByteString.CopyFrom(imageData.Span),
// Automask = ByteString.CopyFrom(imageData.Span),
};
if (maskData != null)
{
request.Mask = ByteString.CopyFrom(maskData.Span);
request.InvertMask = InvertMask;
}
request.Automask = automaskData == null ? null : ByteString.CopyFrom(automaskData.Span);
var response = await _grpcClient.RenderAsync(request);
var byteArray = response.RenderedImage.ToByteArray();
return SKBitmap.Decode(byteArray);
}
}