44 lines
1.3 KiB
C#
44 lines
1.3 KiB
C#
using Minint.Core.Models;
|
|
|
|
namespace Minint.Core.Services.Impl;
|
|
|
|
public sealed class DrawingService : IDrawingService
|
|
{
|
|
public void ApplyBrush(MinintLayer layer, int cx, int cy, int radius, int colorIndex, int width, int height)
|
|
{
|
|
foreach (var (x, y) in GetBrushMask(cx, cy, radius, width, height))
|
|
layer.Pixels[y * width + x] = colorIndex;
|
|
}
|
|
|
|
public void ApplyEraser(MinintLayer layer, int cx, int cy, int radius, int width, int height)
|
|
{
|
|
foreach (var (x, y) in GetBrushMask(cx, cy, radius, width, height))
|
|
layer.Pixels[y * width + x] = 0;
|
|
}
|
|
|
|
public List<(int X, int Y)> GetBrushMask(int cx, int cy, int radius, int width, int height)
|
|
{
|
|
var mask = new List<(int, int)>();
|
|
int r = Math.Max(radius, 0);
|
|
int r2 = r * r;
|
|
|
|
int xMin = Math.Max(0, cx - r);
|
|
int xMax = Math.Min(width - 1, cx + r);
|
|
int yMin = Math.Max(0, cy - r);
|
|
int yMax = Math.Min(height - 1, cy + r);
|
|
|
|
for (int py = yMin; py <= yMax; py++)
|
|
{
|
|
int dy = py - cy;
|
|
for (int px = xMin; px <= xMax; px++)
|
|
{
|
|
int dx = px - cx;
|
|
if (dx * dx + dy * dy <= r2)
|
|
mask.Add((px, py));
|
|
}
|
|
}
|
|
|
|
return mask;
|
|
}
|
|
}
|