Browse Source

Fixed text opacity for Skia backend

pull/916/merge
Nikita Tsukanov 9 years ago
parent
commit
df61044d50
  1. 12
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  2. 101
      src/Skia/Avalonia.Skia/FormattedTextImpl.cs

12
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -141,23 +141,17 @@ namespace Avalonia.Skia
var rv = new PaintWrapper(paint); var rv = new PaintWrapper(paint);
paint.IsStroke = false; paint.IsStroke = false;
// TODO: SkiaSharp does not contain alpha yet!
double opacity = brush.Opacity * _currentOpacity; double opacity = brush.Opacity * _currentOpacity;
//paint.SetAlpha(paint.GetAlpha() * opacity);
paint.IsAntialias = true; paint.IsAntialias = true;
SKColor color = new SKColor(255, 255, 255, 255);
var solid = brush as ISolidColorBrush; var solid = brush as ISolidColorBrush;
if (solid != null)
color = solid.Color.ToSKColor();
paint.Color = (new SKColor(color.Red, color.Green, color.Blue, (byte)(color.Alpha * opacity)));
if (solid != null) if (solid != null)
{ {
paint.Color = new SKColor(solid.Color.R, solid.Color.G, solid.Color.B, (byte) (solid.Color.A * opacity));
return rv; return rv;
} }
paint.Color = (new SKColor(255, 255, 255, (byte)(255 * opacity)));
var gradient = brush as IGradientBrush; var gradient = brush as IGradientBrush;
if (gradient != null) if (gradient != null)

101
src/Skia/Avalonia.Skia/FormattedTextImpl.cs

@ -42,7 +42,6 @@ namespace Avalonia.Skia
_paint.Typeface = skiaTypeface; _paint.Typeface = skiaTypeface;
_paint.TextSize = (float)(typeface?.FontSize ?? 12); _paint.TextSize = (float)(typeface?.FontSize ?? 12);
_paint.TextAlign = textAlignment.ToSKTextAlign(); _paint.TextAlign = textAlignment.ToSKTextAlign();
_paint.BlendMode = SKBlendMode.Src;
_wrapping = wrapping; _wrapping = wrapping;
_constraint = constraint; _constraint = constraint;
@ -200,66 +199,65 @@ namespace Avalonia.Skia
} }
ctx->Canvas->restore(); ctx->Canvas->restore();
*/ */
SKPaint paint = _paint; using (var paint = _paint.Clone())
IDisposable currd = null;
var currentWrapper = foreground;
try
{ {
SKPaint currFGPaint = ApplyWrapperTo(ref foreground, ref currd, paint); IDisposable currd = null;
bool hasCusomFGBrushes = _foregroundBrushes.Any(); var currentWrapper = foreground;
SKPaint currentPaint = null;
for (int c = 0; c < _skiaLines.Count; c++) try
{ {
AvaloniaFormattedTextLine line = _skiaLines[c]; ApplyWrapperTo(ref currentPaint, foreground, ref currd, paint);
bool hasCusomFGBrushes = _foregroundBrushes.Any();
float x = TransformX(origin.X, 0, paint.TextAlign);
if (!hasCusomFGBrushes) for (int c = 0; c < _skiaLines.Count; c++)
{
var subString = Text.Substring(line.Start, line.Length);
canvas.DrawText(subString, x, origin.Y + line.Top + _lineOffset, paint);
}
else
{ {
float currX = x; AvaloniaFormattedTextLine line = _skiaLines[c];
string subStr;
int len;
for (int i = line.Start; i < line.Start + line.Length;) float x = TransformX(origin.X, 0, paint.TextAlign);
{
var fb = GetNextForegroundBrush(ref line, i, out len);
if (fb != null)
{
//TODO: figure out how to get the brush size
currentWrapper = context.CreatePaint(fb, new Size());
}
else
{
if (!currentWrapper.Equals(foreground)) currentWrapper.Dispose();
currentWrapper = foreground;
}
subStr = Text.Substring(i, len); if (!hasCusomFGBrushes)
{
var subString = Text.Substring(line.Start, line.Length);
canvas.DrawText(subString, x, origin.Y + line.Top + _lineOffset, paint);
}
else
{
float currX = x;
string subStr;
int len;
if (currFGPaint != currentWrapper.Paint) for (int i = line.Start; i < line.Start + line.Length;)
{ {
currFGPaint = ApplyWrapperTo(ref currentWrapper, ref currd, paint); var fb = GetNextForegroundBrush(ref line, i, out len);
if (fb != null)
{
//TODO: figure out how to get the brush size
currentWrapper = context.CreatePaint(fb, new Size());
}
else
{
if (!currentWrapper.Equals(foreground)) currentWrapper.Dispose();
currentWrapper = foreground;
}
subStr = Text.Substring(i, len);
ApplyWrapperTo(ref currentPaint, currentWrapper, ref currd, paint);
canvas.DrawText(subStr, currX, origin.Y + line.Top + _lineOffset, paint);
i += len;
currX += paint.MeasureText(subStr);
} }
canvas.DrawText(subStr, currX, origin.Y + line.Top + _lineOffset, paint);
i += len;
currX += paint.MeasureText(subStr);
} }
} }
} }
} finally
finally {
{ if (!currentWrapper.Equals(foreground)) currentWrapper.Dispose();
if (!currentWrapper.Equals(foreground)) currentWrapper.Dispose(); currd?.Dispose();
currd?.Dispose(); }
} }
} }
@ -278,12 +276,13 @@ namespace Avalonia.Skia
private Size _size; private Size _size;
private List<AvaloniaFormattedTextLine> _skiaLines; private List<AvaloniaFormattedTextLine> _skiaLines;
private static SKPaint ApplyWrapperTo(ref DrawingContextImpl.PaintWrapper wrapper, private static void ApplyWrapperTo(ref SKPaint current, DrawingContextImpl.PaintWrapper wrapper,
ref IDisposable curr, SKPaint paint) ref IDisposable curr, SKPaint paint)
{ {
if (current == wrapper.Paint)
return;
curr?.Dispose(); curr?.Dispose();
curr = wrapper.ApplyTo(paint); curr = wrapper.ApplyTo(paint);
return wrapper.Paint;
} }
private static bool IsBreakChar(char c) private static bool IsBreakChar(char c)

Loading…
Cancel
Save