mirror of
https://github.com/ShareX/ShareX.git
synced 2024-09-28 23:42:13 +12:00
Fix WavyEdges effect glitchy corners
At least kind of, it still ends up ugly when given extreme parameters, especially depth>range/2, but there isn't an easy way to solve that.
This commit is contained in:
parent
35cd09d1e6
commit
ca3f1cfda0
1 changed files with 53 additions and 47 deletions
|
@ -1672,82 +1672,88 @@ public static Bitmap WavyEdges(Bitmap bmp, int waveDepth, int waveRange, AnchorS
|
||||||
|
|
||||||
int horizontalWaveCount = Math.Max(2, (bmp.Width / waveRange + 1) / 2 * 2) - 1;
|
int horizontalWaveCount = Math.Max(2, (bmp.Width / waveRange + 1) / 2 * 2) - 1;
|
||||||
int verticalWaveCount = Math.Max(2, (bmp.Height / waveRange + 1) / 2 * 2) - 1;
|
int verticalWaveCount = Math.Max(2, (bmp.Height / waveRange + 1) / 2 * 2) - 1;
|
||||||
|
int horizontalWaveRange = bmp.Width / horizontalWaveCount;
|
||||||
|
int verticalWaveRange = bmp.Height / verticalWaveCount;
|
||||||
|
|
||||||
int step = Math.Min(Math.Max(1, waveRange / waveDepth), 10);
|
int step = Math.Min(Math.Max(1, waveRange / waveDepth), 10);
|
||||||
|
|
||||||
Bitmap updateResult(Bitmap bmpIn, Point[] path)
|
|
||||||
{
|
|
||||||
Bitmap bmpResult = bmpIn.CreateEmptyBitmap();
|
|
||||||
using (bmpIn)
|
|
||||||
using (Graphics g = Graphics.FromImage(bmpResult))
|
|
||||||
using (TextureBrush brush = new TextureBrush(bmpIn))
|
|
||||||
{
|
|
||||||
g.SetHighQuality();
|
|
||||||
g.PixelOffsetMode = PixelOffsetMode.Half;
|
|
||||||
g.FillPolygon(brush, path);
|
|
||||||
}
|
|
||||||
return bmpResult;
|
|
||||||
};
|
|
||||||
|
|
||||||
int waveFunction(int t, int max, int depth) => (int)((1 - Math.Cos(t * Math.PI / max)) * depth / 2);
|
int waveFunction(int t, int max, int depth) => (int)((1 - Math.Cos(t * Math.PI / max)) * depth / 2);
|
||||||
|
|
||||||
if (sides.HasFlag(AnchorStyles.Top))
|
if (sides.HasFlag(AnchorStyles.Top))
|
||||||
{
|
{
|
||||||
waveRange = bmp.Width / horizontalWaveCount;
|
int startX = sides.HasFlag(AnchorStyles.Left) ? waveDepth : 0;
|
||||||
points.Clear();
|
int endX = sides.HasFlag(AnchorStyles.Right) ? bmp.Width - waveDepth : bmp.Width;
|
||||||
for (int x = 0; x < bmp.Width; x += step)
|
for (int x = startX; x < endX; x += step)
|
||||||
{
|
{
|
||||||
points.Add(new Point(x, waveFunction(x, waveRange, waveDepth)));
|
points.Add(new Point(x, waveFunction(x, horizontalWaveRange, waveDepth)));
|
||||||
}
|
}
|
||||||
points.Add(new Point(bmp.Width, waveFunction(bmp.Width, waveRange, waveDepth)));
|
points.Add(new Point(endX, waveFunction(endX, horizontalWaveRange, waveDepth)));
|
||||||
points.Add(new Point(bmp.Width, bmp.Height));
|
}
|
||||||
points.Add(new Point(0, bmp.Height));
|
else
|
||||||
bmp = updateResult(bmp, points.ToArray());
|
{
|
||||||
|
points.Add(new Point(0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sides.HasFlag(AnchorStyles.Right))
|
if (sides.HasFlag(AnchorStyles.Right))
|
||||||
{
|
{
|
||||||
waveRange = bmp.Height / verticalWaveCount;
|
int startY = sides.HasFlag(AnchorStyles.Top) ? waveDepth : 0;
|
||||||
points.Clear();
|
int endY = sides.HasFlag(AnchorStyles.Bottom) ? bmp.Height - waveDepth : bmp.Height;
|
||||||
points.Add(new Point(0, 0));
|
for (int y = startY; y < endY; y += step)
|
||||||
for (int y = 0; y < bmp.Height; y += step)
|
|
||||||
{
|
{
|
||||||
points.Add(new Point(bmp.Width - waveDepth + waveFunction(y, waveRange, waveDepth), y));
|
points.Add(new Point(bmp.Width - waveDepth + waveFunction(y, verticalWaveRange, waveDepth), y));
|
||||||
}
|
}
|
||||||
points.Add(new Point(bmp.Width - waveDepth + waveFunction(bmp.Height, waveRange, waveDepth), bmp.Height));
|
points.Add(new Point(bmp.Width - waveDepth + waveFunction(endY, verticalWaveRange, waveDepth), endY));
|
||||||
points.Add(new Point(0, bmp.Height));
|
}
|
||||||
bmp = updateResult(bmp, points.ToArray());
|
else
|
||||||
|
{
|
||||||
|
points.Add(new Point(bmp.Width, points[points.Count - 1].Y));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sides.HasFlag(AnchorStyles.Bottom))
|
if (sides.HasFlag(AnchorStyles.Bottom))
|
||||||
{
|
{
|
||||||
waveRange = bmp.Width / horizontalWaveCount;
|
int startX = sides.HasFlag(AnchorStyles.Right) ? bmp.Width - waveDepth : bmp.Width;
|
||||||
points.Clear();
|
int endX = sides.HasFlag(AnchorStyles.Left) ? waveDepth : 0;
|
||||||
points.Add(new Point(0, 0));
|
for (int x = startX; x >= endX; x -= step)
|
||||||
points.Add(new Point(bmp.Width, 0));
|
|
||||||
for (int x = bmp.Width; x >= 0; x -= step)
|
|
||||||
{
|
{
|
||||||
points.Add(new Point(x, bmp.Height - waveDepth + waveFunction(x, waveRange, waveDepth)));
|
points.Add(new Point(x, bmp.Height - waveDepth + waveFunction(x, horizontalWaveRange, waveDepth)));
|
||||||
}
|
}
|
||||||
points.Add(new Point(0, bmp.Height - waveDepth + waveFunction(0, waveRange, waveDepth)));
|
points.Add(new Point(endX, bmp.Height - waveDepth + waveFunction(endX, horizontalWaveRange, waveDepth)));
|
||||||
bmp = updateResult(bmp, points.ToArray());
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
points.Add(new Point(points[points.Count - 1].X, bmp.Height));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sides.HasFlag(AnchorStyles.Left))
|
if (sides.HasFlag(AnchorStyles.Left))
|
||||||
{
|
{
|
||||||
waveRange = bmp.Height / verticalWaveCount;
|
int startY = sides.HasFlag(AnchorStyles.Bottom) ? bmp.Height - waveDepth : bmp.Height;
|
||||||
points.Clear();
|
int endY = sides.HasFlag(AnchorStyles.Top) ? waveDepth : 0;
|
||||||
points.Add(new Point(0, 0));
|
for (int y = startY; y >= endY; y -= step)
|
||||||
points.Add(new Point(bmp.Width, 0));
|
|
||||||
points.Add(new Point(bmp.Width, bmp.Height));
|
|
||||||
for (int y = bmp.Height; y >= 0; y -= step)
|
|
||||||
{
|
{
|
||||||
points.Add(new Point(waveFunction(y, waveRange, waveDepth), y));
|
points.Add(new Point(waveFunction(y, verticalWaveRange, waveDepth), y));
|
||||||
}
|
}
|
||||||
bmp = updateResult(bmp, points.ToArray());
|
points.Add(new Point(waveFunction(endY, verticalWaveRange, waveDepth), endY));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
points.Add(new Point(0, points[points.Count - 1].Y));
|
||||||
}
|
}
|
||||||
|
|
||||||
return bmp;
|
if (!sides.HasFlag(AnchorStyles.Top))
|
||||||
|
{
|
||||||
|
points[0] = new Point(points[points.Count - 1].X, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Bitmap bmpResult = bmp.CreateEmptyBitmap();
|
||||||
|
using (bmp)
|
||||||
|
using (Graphics g = Graphics.FromImage(bmpResult))
|
||||||
|
using (TextureBrush brush = new TextureBrush(bmp))
|
||||||
|
{
|
||||||
|
g.SetHighQuality();
|
||||||
|
g.PixelOffsetMode = PixelOffsetMode.Half;
|
||||||
|
g.FillPolygon(brush, points.ToArray());
|
||||||
|
}
|
||||||
|
return bmpResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap TornEdges(Bitmap bmp, int tornDepth, int tornRange, AnchorStyles sides, bool curvedEdges, bool random)
|
public static Bitmap TornEdges(Bitmap bmp, int tornDepth, int tornRange, AnchorStyles sides, bool curvedEdges, bool random)
|
||||||
|
|
Loading…
Reference in a new issue