mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
56 lines
1.7 KiB
C#
56 lines
1.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Artemis.Core.Extensions;
|
|
using RGB.NET.Core;
|
|
using SkiaSharp;
|
|
|
|
namespace Artemis.Core.RGB.NET
|
|
{
|
|
public class GraphicsDecorator : AbstractDecorator, IBrushDecorator, IDisposable
|
|
{
|
|
private readonly double _scale;
|
|
|
|
public GraphicsDecorator(ILedGroup ledGroup, double scale)
|
|
{
|
|
_scale = scale;
|
|
|
|
var leds = ledGroup.GetLeds().ToList();
|
|
if (!leds.Any())
|
|
return;
|
|
|
|
var width = Math.Min(leds.Max(l => l.AbsoluteLedRectangle.Location.X + l.AbsoluteLedRectangle.Size.Width) * scale, 4096);
|
|
var height = Math.Min(leds.Max(l => l.AbsoluteLedRectangle.Location.Y + l.AbsoluteLedRectangle.Size.Height) * scale, 4096);
|
|
Bitmap = new SKBitmap(new SKImageInfo(width.RoundToInt(), height.RoundToInt()));
|
|
}
|
|
|
|
public SKBitmap Bitmap { get; private set; }
|
|
|
|
public Color ManipulateColor(Rectangle rectangle, BrushRenderTarget renderTarget, Color color)
|
|
{
|
|
if (Bitmap == null)
|
|
return new Color(0, 0, 0);
|
|
|
|
var x = renderTarget.Led.AbsoluteLedRectangle.Center.X * _scale;
|
|
var y = renderTarget.Led.AbsoluteLedRectangle.Center.Y * _scale;
|
|
|
|
var pixel = Bitmap.GetPixel(RoundToInt(x), RoundToInt(y));
|
|
return new Color(pixel.Alpha, pixel.Red, pixel.Green, pixel.Blue);
|
|
}
|
|
|
|
public override void OnDetached(IDecoratable decoratable)
|
|
{
|
|
Dispose();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Bitmap?.Dispose();
|
|
Bitmap = null;
|
|
}
|
|
|
|
private int RoundToInt(double number)
|
|
{
|
|
return (int) Math.Round(number, MidpointRounding.AwayFromZero);
|
|
}
|
|
}
|
|
} |