diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs index 514249a2d..6ca4f147a 100644 --- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs +++ b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs @@ -139,9 +139,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Drawing { for (float x = scanStart; x < startX + 1; x += subpixelFraction) { - scanline[startX] += subpixelFractionPoint; - scanlineDirty = true; - } + scanline[startX] += subpixelFractionPoint; + scanlineDirty = true; + } + + if (scanline[startX] > 1) { scanline[startX] = 1; } } if (endX >= 0 && endX < scanline.Length) @@ -149,8 +151,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Drawing for (float x = endX; x < scanEnd; x += subpixelFraction) { scanline[endX] += subpixelFractionPoint; - scanlineDirty = true; - } + scanlineDirty = true; + } + + if (scanline[endX] > 1) { scanline[endX] = 1; } } int nextX = startX + 1; @@ -158,8 +162,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Drawing nextX = Math.Max(nextX, 0); for (int x = nextX; x < endX; x++) { - scanline[x] += subpixelFraction; - scanlineDirty = true; + scanline[x] += subpixelFraction; + scanlineDirty = true; + + if (scanline[x] > 1) { scanline[x] = 1; } } } } diff --git a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs index 1095de325..5f42dc3e5 100644 --- a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs +++ b/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs @@ -386,7 +386,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Text { scanline[startX] += subpixelFractionPoint; scanlineDirty = true; - } + } + + if (scanline[startX] > 1) { scanline[startX] = 1; } } if (endX >= 0 && endX < scanline.Length) @@ -395,7 +397,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Text { scanline[endX] += subpixelFractionPoint; scanlineDirty = true; - } + } + + if (scanline[endX] > 1) { scanline[endX] = 1; } } int nextX = startX + 1; @@ -404,7 +408,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Text for (int x = nextX; x < endX; x++) { scanline[x] += subpixelFraction; - scanlineDirty = true; + scanlineDirty = true; + + if (scanline[x] > 1) { scanline[x] = 1; } } } } diff --git a/src/ImageSharp.Drawing/Processing/SolidBrush{TPixel}.cs b/src/ImageSharp.Drawing/Processing/SolidBrush{TPixel}.cs index 6b69c33f0..7e724572a 100644 --- a/src/ImageSharp.Drawing/Processing/SolidBrush{TPixel}.cs +++ b/src/ImageSharp.Drawing/Processing/SolidBrush{TPixel}.cs @@ -91,9 +91,18 @@ namespace SixLabors.ImageSharp.Processing { Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length); - MemoryAllocator memoryAllocator = this.Target.MemoryAllocator; + MemoryAllocator memoryAllocator = this.Target.MemoryAllocator; + +#if DEBUG + for (int i = 0; i < scanline.Length; i++) + { + Guard.MustBeBetweenOrEqualTo(scanline[i], 0, 1, nameof(scanline)); + } +#endif + + float opacity = this.Options.BlendPercentage.Clamp(0, 1); - if (this.Options.BlendPercentage == 1f) + if (opacity == 1f) { this.Blender.Blend(memoryAllocator, destinationRow, destinationRow, this.Colors.GetSpan(), scanline); } @@ -105,7 +114,7 @@ namespace SixLabors.ImageSharp.Processing for (int i = 0; i < scanline.Length; i++) { - amountSpan[i] = scanline[i] * this.Options.BlendPercentage; + amountSpan[i] = scanline[i] * opacity; } this.Blender.Blend(memoryAllocator, destinationRow, destinationRow, this.Colors.GetSpan(), amountSpan);