Skip to content

Commit

Permalink
IsAntialias should also control the Edging (#1802)
Browse files Browse the repository at this point in the history
  • Loading branch information
mattleibow authored Sep 8, 2021
1 parent 8b060e6 commit 5ab62b5
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 4 deletions.
26 changes: 23 additions & 3 deletions binding/Binding/SKPaint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum SKPaintHinting
public unsafe class SKPaint : SKObject, ISKSkipObjectRegistration
{
private SKFont font;
private bool lcdRenderText;

internal SKPaint (IntPtr handle, bool owns)
: base (handle, owns)
Expand All @@ -38,6 +39,8 @@ public SKPaint (SKFont font)

if (Handle == IntPtr.Zero)
throw new InvalidOperationException ("Unable to create a new SKPaint instance.");

LcdRenderText = font.Edging == SKFontEdging.SubpixelAntialias;
}

protected override void Dispose (bool disposing) =>
Expand All @@ -55,7 +58,10 @@ public void Reset () =>

public bool IsAntialias {
get => SkiaApi.sk_paint_is_antialias (Handle);
set => SkiaApi.sk_paint_set_antialias (Handle, value);
set {
SkiaApi.sk_paint_set_antialias (Handle, value);
UpdateFontEdging (value);
}
}

public bool IsDither {
Expand All @@ -81,8 +87,11 @@ public bool SubpixelText {
}

public bool LcdRenderText {
get => GetFont ().Edging == SKFontEdging.SubpixelAntialias;
set => GetFont ().Edging = value ? SKFontEdging.SubpixelAntialias : SKFontEdging.Antialias;
get => lcdRenderText;
set {
lcdRenderText = value;
UpdateFontEdging (IsAntialias);
}
}

public bool IsEmbeddedBitmapText {
Expand Down Expand Up @@ -701,6 +710,17 @@ public SKFont ToFont () =>
internal SKFont GetFont () =>
font ??= OwnedBy (SKFont.GetObject (SkiaApi.sk_compatpaint_get_font (Handle), false), this);

private void UpdateFontEdging (bool antialias)
{
var edging = SKFontEdging.Alias;
if (antialias) {
edging = lcdRenderText
? SKFontEdging.SubpixelAntialias
: SKFontEdging.Antialias;
}
GetFont ().Edging = edging;
}

//

internal static SKPaint GetObject (IntPtr handle) =>
Expand Down
2 changes: 1 addition & 1 deletion externals/skia
87 changes: 87 additions & 0 deletions tests/Tests/SKPaintTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -554,5 +554,92 @@ public void GetTextPathSucceedsForEmtptyString()

Assert.NotNull(paint.GetTextPath("", 0, 0));
}

[SkippableTheory]
[InlineData(true, true, SKFontEdging.SubpixelAntialias)]
[InlineData(false, true, SKFontEdging.Alias)]
[InlineData(true, false, SKFontEdging.Antialias)]
[InlineData(false, false, SKFontEdging.Alias)]
public void UpdatingPropertiesIsAntialiasLcdRenderText(bool isAntialias, bool lcd, SKFontEdging newEdging)
{
var paint = new SKPaint();

paint.IsAntialias = isAntialias;
paint.LcdRenderText = lcd;

Assert.Equal(newEdging, paint.GetFont().Edging);
}

[SkippableTheory]
[InlineData(true, true, SKFontEdging.SubpixelAntialias)]
[InlineData(false, true, SKFontEdging.Alias)]
[InlineData(true, false, SKFontEdging.Antialias)]
[InlineData(false, false, SKFontEdging.Alias)]
public void UpdatingPropertiesLcdRenderTextIsAntialias(bool isAntialias, bool lcd, SKFontEdging newEdging)
{
var paint = new SKPaint();

paint.LcdRenderText = lcd;
paint.IsAntialias = isAntialias;

Assert.Equal(newEdging, paint.GetFont().Edging);
}

[SkippableFact]
public void PaintWithSubpixelEdgingIsPreserved()
{
var font = new SKFont();
font.Edging = SKFontEdging.SubpixelAntialias;

var paint = new SKPaint(font);

Assert.True(paint.LcdRenderText);
Assert.False(paint.IsAntialias);
Assert.Equal(SKFontEdging.Alias, paint.GetFont().Edging);

paint.IsAntialias = true;

Assert.True(paint.LcdRenderText);
Assert.True(paint.IsAntialias);
Assert.Equal(SKFontEdging.SubpixelAntialias, paint.GetFont().Edging);
}

[SkippableFact]
public void PaintWithAntialiasEdgingIsPreserved()
{
var font = new SKFont();
font.Edging = SKFontEdging.Antialias;

var paint = new SKPaint(font);

Assert.False(paint.LcdRenderText);
Assert.False(paint.IsAntialias);
Assert.Equal(SKFontEdging.Alias, paint.GetFont().Edging);

paint.IsAntialias = true;

Assert.False(paint.LcdRenderText);
Assert.True(paint.IsAntialias);
Assert.Equal(SKFontEdging.Antialias, paint.GetFont().Edging);
}

[SkippableFact]
public void PaintWithAliasEdgingIsPreserved()
{
var font = new SKFont();
font.Edging = SKFontEdging.Alias;

var paint = new SKPaint(font);

Assert.False(paint.LcdRenderText);
Assert.False(paint.IsAntialias);
Assert.Equal(SKFontEdging.Alias, paint.GetFont().Edging);

paint.IsAntialias = true;

Assert.False(paint.LcdRenderText);
Assert.True(paint.IsAntialias);
Assert.Equal(SKFontEdging.Antialias, paint.GetFont().Edging);
}
}
}

0 comments on commit 5ab62b5

Please sign in to comment.