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 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); } }