Browse Source

[SKIA] Fixed text opacity issue with layers in deferred rendeing mode

pull/1173/head
Nikita Tsukanov 9 years ago
parent
commit
ead7b3bea3
  1. 2
      src/Skia/Avalonia.Skia/BitmapImpl.cs
  2. 4
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  3. 13
      src/Skia/Avalonia.Skia/FormattedTextImpl.cs

2
src/Skia/Avalonia.Skia/BitmapImpl.cs

@ -48,7 +48,7 @@ namespace Avalonia.Skia
public BitmapDrawingContext(SKBitmap bitmap, Vector dpi, IVisualBrushRenderer visualBrushRenderer)
: this(CreateSurface(bitmap), dpi, visualBrushRenderer)
{
CanUseLcdRendering = false;
}
private static SKSurface CreateSurface(SKBitmap bitmap)

4
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -16,7 +16,7 @@ namespace Avalonia.Skia
private readonly IDisposable[] _disposables;
private readonly IVisualBrushRenderer _visualBrushRenderer;
private Stack<PaintWrapper> maskStack = new Stack<PaintWrapper>();
protected bool CanUseLcdRendering = true;
public SKCanvas Canvas { get; private set; }
public DrawingContextImpl(
@ -345,7 +345,7 @@ namespace Avalonia.Skia
using (var paint = CreatePaint(foreground, text.Size))
{
var textImpl = (FormattedTextImpl)text;
textImpl.Draw(this, Canvas, origin.ToSKPoint(), paint);
textImpl.Draw(this, Canvas, origin.ToSKPoint(), paint, CanUseLcdRendering);
}
}

13
src/Skia/Avalonia.Skia/FormattedTextImpl.cs

@ -171,8 +171,10 @@ namespace Avalonia.Skia
}
internal void Draw(DrawingContextImpl context,
SKCanvas canvas, SKPoint origin,
DrawingContextImpl.PaintWrapper foreground)
SKCanvas canvas,
SKPoint origin,
DrawingContextImpl.PaintWrapper foreground,
bool canUseLcdRendering)
{
/* TODO: This originated from Native code, it might be useful for debugging character positions as
* we improve the FormattedText support. Will need to port this to C# obviously. Rmove when
@ -206,7 +208,7 @@ namespace Avalonia.Skia
SKPaint currentPaint = null;
try
{
ApplyWrapperTo(ref currentPaint, foreground, ref currd, paint);
ApplyWrapperTo(ref currentPaint, foreground, ref currd, paint, canUseLcdRendering);
bool hasCusomFGBrushes = _foregroundBrushes.Any();
for (int c = 0; c < _skiaLines.Count; c++)
@ -243,7 +245,7 @@ namespace Avalonia.Skia
subStr = Text.Substring(i, len);
ApplyWrapperTo(ref currentPaint, currentWrapper, ref currd, paint);
ApplyWrapperTo(ref currentPaint, currentWrapper, ref currd, paint, canUseLcdRendering);
canvas.DrawText(subStr, currX, origin.Y + line.Top + _lineOffset, paint);
@ -277,12 +279,13 @@ namespace Avalonia.Skia
private List<AvaloniaFormattedTextLine> _skiaLines;
private static void ApplyWrapperTo(ref SKPaint current, DrawingContextImpl.PaintWrapper wrapper,
ref IDisposable curr, SKPaint paint)
ref IDisposable curr, SKPaint paint, bool canUseLcdRendering)
{
if (current == wrapper.Paint)
return;
curr?.Dispose();
curr = wrapper.ApplyTo(paint);
paint.LcdRenderText = canUseLcdRendering && paint.Color.Alpha == 255;
}
private static bool IsBreakChar(char c)

Loading…
Cancel
Save