소스 검색

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

Nikita Tsukanov 8 년 전
부모
커밋
ead7b3bea3
3개의 변경된 파일11개의 추가작업 그리고 8개의 파일을 삭제
  1. 1 1
      src/Skia/Avalonia.Skia/BitmapImpl.cs
  2. 2 2
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  3. 8 5
      src/Skia/Avalonia.Skia/FormattedTextImpl.cs

+ 1 - 1
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)

+ 2 - 2
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);
             }
         }
 

+ 8 - 5
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)