mirror of https://github.com/SixLabors/ImageSharp
3 changed files with 27 additions and 165 deletions
@ -1,138 +0,0 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.Text; |
|
||||
using SixLabors.Fonts; |
|
||||
using SixLabors.ImageSharp.PixelFormats; |
|
||||
using SixLabors.ImageSharp.Primitives; |
|
||||
using SixLabors.ImageSharp.Processing.Drawing.Brushes; |
|
||||
using SixLabors.ImageSharp.Processing.Drawing.Pens; |
|
||||
using SixLabors.ImageSharp.Processing.Drawing.Processors; |
|
||||
using SixLabors.ImageSharp.Processing.Processors; |
|
||||
using SixLabors.ImageSharp.Processing.Text; |
|
||||
using SixLabors.Primitives; |
|
||||
using SixLabors.Shapes; |
|
||||
|
|
||||
namespace SixLabors.ImageSharp.Benchmarks.Drawing.OldProcessors |
|
||||
{ |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Using the brush as a source of pixels colors blends the brush color with source.
|
|
||||
/// </summary>
|
|
||||
/// <typeparam name="TPixel">The pixel format.</typeparam>
|
|
||||
internal class DrawTextProcessor<TPixel> : ImageProcessor<TPixel> |
|
||||
where TPixel : struct, IPixel<TPixel> |
|
||||
{ |
|
||||
private FillRegionProcessor<TPixel> fillRegionProcessor = null; |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Initializes a new instance of the <see cref="DrawTextProcessor{TPixel}"/> class.
|
|
||||
/// </summary>
|
|
||||
/// <param name="options">The options</param>
|
|
||||
/// <param name="text">The text we want to render</param>
|
|
||||
/// <param name="font">The font we want to render with</param>
|
|
||||
/// <param name="brush">The brush to source pixel colors from.</param>
|
|
||||
/// <param name="pen">The pen to outline text with.</param>
|
|
||||
/// <param name="location">The location on the image to start drawign the text from.</param>
|
|
||||
public DrawTextProcessor(TextGraphicsOptions options, string text, Font font, IBrush<TPixel> brush, IPen<TPixel> pen, PointF location) |
|
||||
{ |
|
||||
this.Brush = brush; |
|
||||
this.Options = options; |
|
||||
this.Text = text; |
|
||||
this.Pen = pen; |
|
||||
this.Font = font; |
|
||||
this.Location = location; |
|
||||
} |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Gets or sets the brush.
|
|
||||
/// </summary>
|
|
||||
public IBrush<TPixel> Brush { get; set; } |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Gets or sets the options
|
|
||||
/// </summary>
|
|
||||
public TextGraphicsOptions Options { get; set; } |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Gets or sets the text
|
|
||||
/// </summary>
|
|
||||
public string Text { get; set; } |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Gets or sets the pen used for outlining the text, if Null then we will not outline
|
|
||||
/// </summary>
|
|
||||
public IPen<TPixel> Pen { get; set; } |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Gets or sets the font used to render the text.
|
|
||||
/// </summary>
|
|
||||
public Font Font { get; set; } |
|
||||
|
|
||||
/// <summary>
|
|
||||
/// Gets or sets the location to draw the text at.
|
|
||||
/// </summary>
|
|
||||
public PointF Location { get; set; } |
|
||||
|
|
||||
protected override void BeforeImageApply(Image<TPixel> source, Rectangle sourceRectangle) |
|
||||
{ |
|
||||
base.BeforeImageApply(source, sourceRectangle); |
|
||||
|
|
||||
// do everythign at the image level as we are deligating the processing down to other processors
|
|
||||
var style = new RendererOptions(this.Font, this.Options.DpiX, this.Options.DpiY, this.Location) |
|
||||
{ |
|
||||
ApplyKerning = this.Options.ApplyKerning, |
|
||||
TabWidth = this.Options.TabWidth, |
|
||||
WrappingWidth = this.Options.WrapTextWidth, |
|
||||
HorizontalAlignment = this.Options.HorizontalAlignment, |
|
||||
VerticalAlignment = this.Options.VerticalAlignment |
|
||||
}; |
|
||||
|
|
||||
IPathCollection glyphs = TextBuilder.GenerateGlyphs(this.Text, style); |
|
||||
|
|
||||
var pathOptions = (GraphicsOptions)this.Options; |
|
||||
if (this.Brush != null) |
|
||||
{ |
|
||||
// we will reuse the processor for all fill operations to reduce allocations
|
|
||||
if (this.fillRegionProcessor == null) |
|
||||
{ |
|
||||
this.fillRegionProcessor = new FillRegionProcessor<TPixel>() |
|
||||
{ |
|
||||
Brush = this.Brush, |
|
||||
Options = pathOptions |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
foreach (IPath p in glyphs) |
|
||||
{ |
|
||||
this.fillRegionProcessor.Region = new ShapeRegion(p); |
|
||||
this.fillRegionProcessor.Apply(source, sourceRectangle); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
if (this.Pen != null) |
|
||||
{ |
|
||||
// we will reuse the processor for all fill operations to reduce allocations
|
|
||||
if (this.fillRegionProcessor == null) |
|
||||
{ |
|
||||
this.fillRegionProcessor = new FillRegionProcessor<TPixel>() |
|
||||
{ |
|
||||
Brush = this.Brush, |
|
||||
Options = pathOptions |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
foreach (IPath p in glyphs) |
|
||||
{ |
|
||||
this.fillRegionProcessor.Region = new ShapePath(p, this.Pen); |
|
||||
this.fillRegionProcessor.Apply(source, sourceRectangle); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
/// <inheritdoc/>
|
|
||||
protected override void OnFrameApply(ImageFrame<TPixel> source, Rectangle sourceRectangle, Configuration configuration) |
|
||||
{ |
|
||||
// this is a no-op as we have processes all as an image, we should be able to pass out of before email apply a skip frames outcome
|
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
Loading…
Reference in new issue