Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
}
}
}