Browse Source

Default text drawing at an image dpi independent size

This changes the default behavour to by defaulting all text to be drawn as 72 dpi as apposed to the images native resolution thus ensuing that the pixel hight per point is consisten across images by defualt.

Can be switched back to image resolution byt setting `UseImageResolution` in `TextGraphicsOptions` to `true`
af/merge-core
Scott Williams 9 years ago
parent
commit
8847f12913
  1. 9
      src/ImageSharp.Drawing/Text/DrawText.cs
  2. 7
      src/ImageSharp.Drawing/Text/TextGraphicsOptions.cs
  3. 27
      tests/ImageSharp.Tests/Drawing/Text/DrawText.cs

9
src/ImageSharp.Drawing/Text/DrawText.cs

@ -18,6 +18,8 @@ namespace ImageSharp
/// </summary>
public static partial class ImageExtensions
{
private static readonly Vector2 DefaultTextDpi = new Vector2(72);
/// <summary>
/// Draws the text onto the the image filled via the brush.
/// </summary>
@ -169,7 +171,12 @@ namespace ImageSharp
TextRenderer renderer = new TextRenderer(glyphBuilder);
Vector2 dpi = new Vector2((float)source.MetaData.HorizontalResolution, (float)source.MetaData.VerticalResolution);
Vector2 dpi = DefaultTextDpi;
if (options.UseImageResolution)
{
dpi = new Vector2((float)source.MetaData.HorizontalResolution, (float)source.MetaData.VerticalResolution);
}
FontSpan style = new FontSpan(font)
{
ApplyKerning = options.ApplyKerning,

7
src/ImageSharp.Drawing/Text/TextGraphicsOptions.cs

@ -35,6 +35,12 @@ namespace ImageSharp.Drawing
/// </summary>
public float TabWidth;
/// <summary>
/// Flag weather to use the current image resultion to for point size scaling.
/// If this is [false] the text renders at 72dpi otherwise it renders at Image resolution
/// </summary>
public bool UseImageResolution;
/// <summary>
/// Initializes a new instance of the <see cref="TextGraphicsOptions" /> struct.
/// </summary>
@ -45,6 +51,7 @@ namespace ImageSharp.Drawing
this.ApplyKerning = true;
this.TabWidth = 4;
this.AntialiasSubpixelDepth = 16;
this.UseImageResolution = false;
}
/// <summary>

27
tests/ImageSharp.Tests/Drawing/Text/DrawText.cs

@ -219,5 +219,32 @@ namespace ImageSharp.Tests.Drawing.Text
Assert.IsType<FillRegionProcessor<Color>>(this.img.ProcessorApplications[0].processor);
Assert.IsType<DrawPathProcessor<Color>>(this.img.ProcessorApplications[1].processor);
}
[Fact]
public void GlyphHeightChangesBasedOnuseImageResolutionFlag()
{
this.img.MetaData.VerticalResolution = 1;
this.img.MetaData.HorizontalResolution = 1;
this.img.DrawText("1", this.Font, Brushes.Solid(Color.Red), Vector2.Zero, new TextGraphicsOptions(true) {
UseImageResolution = false
});
this.img.DrawText("1", this.Font, Brushes.Solid(Color.Red), Vector2.Zero, new TextGraphicsOptions(true)
{
UseImageResolution = true
});
Assert.NotEmpty(this.img.ProcessorApplications);
Assert.Equal(2, this.img.ProcessorApplications.Count);
FillRegionProcessor<Color> ownResolution = Assert.IsType<FillRegionProcessor<Color>>(this.img.ProcessorApplications[0].processor);
FillRegionProcessor<Color> imgResolution = Assert.IsType<FillRegionProcessor<Color>>(this.img.ProcessorApplications[1].processor);
ShapeRegion ownRegion = Assert.IsType<ShapeRegion>(ownResolution.Region);
ShapeRegion imgRegion = Assert.IsType<ShapeRegion>(imgResolution.Region);
// magic numbers based on the font used at well known resolutions
Assert.Equal(7.44, ownRegion.Shape.Bounds.Height, 2);
Assert.Equal(0.1, imgRegion.Shape.Bounds.Height, 2);
}
}
}

Loading…
Cancel
Save