diff --git a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.v2.ncrunchproject b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.v2.ncrunchproject
index f744eecae0..1f00ab7c74 100644
--- a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.v2.ncrunchproject
+++ b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.v2.ncrunchproject
@@ -7,7 +7,7 @@
true
false
false
- true
+ false
false
false
true
diff --git a/src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs b/src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs
index 9ec37d5514..08c97867cb 100644
--- a/src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs
+++ b/src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs
@@ -12,6 +12,7 @@ using Avalonia.Media;
namespace Avalonia.Cairo.Media
{
using Avalonia.Media.Imaging;
+ using Platform;
using Cairo = global::Cairo;
///
@@ -75,9 +76,9 @@ namespace Avalonia.Cairo.Media
/// The opacity to draw with.
/// The rect in the image to draw.
/// The rect in the output to draw to.
- public void DrawImage(IBitmap bitmap, double opacity, Rect sourceRect, Rect destRect)
+ public void DrawImage(IBitmapImpl bitmap, double opacity, Rect sourceRect, Rect destRect)
{
- var impl = bitmap.PlatformImpl as BitmapImpl;
+ var impl = bitmap as BitmapImpl;
var size = new Size(impl.PixelWidth, impl.PixelHeight);
var scale = new Vector(destRect.Width / sourceRect.Width, destRect.Height / sourceRect.Height);
@@ -137,9 +138,9 @@ namespace Avalonia.Cairo.Media
/// The fill brush.
/// The stroke pen.
/// The geometry.
- public void DrawGeometry(IBrush brush, Pen pen, Geometry geometry)
+ public void DrawGeometry(IBrush brush, Pen pen, IGeometryImpl geometry)
{
- var impl = geometry.PlatformImpl as StreamGeometryImpl;
+ var impl = geometry as StreamGeometryImpl;
var oldMatrix = Transform;
Transform = impl.Transform * Transform;
@@ -192,9 +193,9 @@ namespace Avalonia.Cairo.Media
/// The foreground brush.
/// The upper-left corner of the text.
/// The text.
- public void DrawText(IBrush foreground, Point origin, FormattedText text)
+ public void DrawText(IBrush foreground, Point origin, IFormattedTextImpl text)
{
- var layout = ((FormattedTextImpl)text.PlatformImpl).Layout;
+ var layout = ((FormattedTextImpl)text).Layout;
_context.MoveTo(origin.X, origin.Y);
using (var b = SetBrush(foreground, new Size(0, 0)))
diff --git a/src/Gtk/Avalonia.Cairo/Media/FormattedTextImpl.cs b/src/Gtk/Avalonia.Cairo/Media/FormattedTextImpl.cs
index e9d092559d..506773aaa0 100644
--- a/src/Gtk/Avalonia.Cairo/Media/FormattedTextImpl.cs
+++ b/src/Gtk/Avalonia.Cairo/Media/FormattedTextImpl.cs
@@ -13,7 +13,6 @@ namespace Avalonia.Cairo.Media
public class FormattedTextImpl : IFormattedTextImpl
{
private Size _size;
- private readonly string _text;
static double CorrectScale(double input)
{
@@ -32,7 +31,7 @@ namespace Avalonia.Cairo.Media
Contract.Requires(context != null);
Contract.Requires(text != null);
Layout = new Pango.Layout(context);
- _text = text;
+ Text = text;
Layout.SetText(text);
Layout.FontDescription = new Pango.FontDescription
{
@@ -46,6 +45,8 @@ namespace Avalonia.Cairo.Media
Layout.Attributes = new Pango.AttrList();
}
+ public string Text { get; }
+
public Size Constraint
{
get
@@ -99,7 +100,7 @@ namespace Avalonia.Cairo.Media
int PangoIndexToTextIndex(int pangoIndex)
{
- return Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(_text), 0, Math.Min(pangoIndex, _text.Length)).Length;
+ return Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(Text), 0, Math.Min(pangoIndex, Text.Length)).Length;
}
public Rect HitTestTextPosition(int index)
@@ -109,7 +110,7 @@ namespace Avalonia.Cairo.Media
int TextIndexToPangoIndex(int textIndex)
{
- return Encoding.UTF8.GetByteCount(textIndex < _text.Length ? _text.Remove(textIndex) : _text);
+ return Encoding.UTF8.GetByteCount(textIndex < Text.Length ? Text.Remove(textIndex) : Text);
}
public IEnumerable HitTestTextRange(int index, int length)
diff --git a/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs
index db0aa082cc..10ddd680e7 100644
--- a/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs
+++ b/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs
@@ -40,7 +40,7 @@ namespace Avalonia.Cairo.Media.Imaging
Surface.WriteToPng(fileName);
}
- public Avalonia.Media.DrawingContext CreateDrawingContext()
+ public IDrawingContextImpl CreateDrawingContext()
{
return _renderTarget.CreateDrawingContext();
}
diff --git a/src/Gtk/Avalonia.Cairo/Media/TileBrushes.cs b/src/Gtk/Avalonia.Cairo/Media/TileBrushes.cs
index b533210749..e5aa022913 100644
--- a/src/Gtk/Avalonia.Cairo/Media/TileBrushes.cs
+++ b/src/Gtk/Avalonia.Cairo/Media/TileBrushes.cs
@@ -23,7 +23,7 @@ namespace Avalonia.Cairo.Media
using (var intermediate = new ImageSurface(Format.ARGB32, (int)helper.IntermediateSize.Width, (int)helper.IntermediateSize.Height))
using (var ctx = new RenderTarget(intermediate).CreateDrawingContext())
{
- helper.DrawIntermediate(ctx);
+ helper.DrawIntermediate(new Avalonia.Media.DrawingContext(ctx));
var result = new SurfacePattern(intermediate);
diff --git a/src/Gtk/Avalonia.Cairo/RenderTarget.cs b/src/Gtk/Avalonia.Cairo/RenderTarget.cs
index d285986762..a4a41cb22d 100644
--- a/src/Gtk/Avalonia.Cairo/RenderTarget.cs
+++ b/src/Gtk/Avalonia.Cairo/RenderTarget.cs
@@ -48,9 +48,7 @@ namespace Avalonia.Cairo
/// Creates a cairo surface that targets a platform-specific resource.
///
/// A surface wrapped in an .
- public DrawingContext CreateDrawingContext() => new DrawingContext(CreateMediaDrawingContext());
-
- public IDrawingContextImpl CreateMediaDrawingContext()
+ public IDrawingContextImpl CreateDrawingContext()
{
if (_window != null)
return new Media.DrawingContext(_window.GdkWindow);
diff --git a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.v2.ncrunchproject b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.v2.ncrunchproject
index 30815b1937..f744eecae0 100644
--- a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.v2.ncrunchproject
+++ b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.v2.ncrunchproject
@@ -7,7 +7,7 @@
true
false
false
- false
+ true
false
false
true
@@ -17,9 +17,9 @@
true
true
60000
-
-
-
+
+
+
AutoDetect
STA
x86
diff --git a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.v2.ncrunchproject b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.v2.ncrunchproject
index e1b4d7cf28..45b84227ee 100644
--- a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.v2.ncrunchproject
+++ b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.v2.ncrunchproject
@@ -17,9 +17,9 @@
true
true
60000
-
-
-
+
+
+
AutoDetect
STA
x86
diff --git a/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs b/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs
index ef5fb88142..f8f0d633c6 100644
--- a/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs
+++ b/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs
@@ -12,11 +12,9 @@ namespace Avalonia.Skia
{
public SKSurface Surface { get; protected set; }
- public virtual DrawingContext CreateDrawingContext()
+ public virtual IDrawingContextImpl CreateDrawingContext()
{
- return
- new DrawingContext(
- new DrawingContextImpl(Surface.Canvas));
+ return new DrawingContextImpl(Surface.Canvas);
}
public void Dispose()
@@ -102,7 +100,7 @@ namespace Avalonia.Skia
return new Size(96, 96);
}
- public override DrawingContext CreateDrawingContext()
+ public override IDrawingContextImpl CreateDrawingContext()
{
FixSize();
@@ -127,9 +125,8 @@ namespace Avalonia.Skia
}
}
- var result =
- new DrawingContext(
- new WindowDrawingContextImpl(this), Matrix.CreateScale(scale, scale));
+ // TODO: Broken DPI scaling on skia here. Fix this.
+ var result = new WindowDrawingContextImpl(this);
return result;
}
diff --git a/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs b/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs
index 083b611d5c..a2be292bc6 100644
--- a/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs
+++ b/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs
@@ -11,11 +11,9 @@ namespace Avalonia.Skia
{
public SKSurface Surface { get; protected set; }
- public virtual DrawingContext CreateDrawingContext()
+ public virtual IDrawingContextImpl CreateDrawingContext()
{
- return
- new DrawingContext(
- new DrawingContextImpl(Surface.Canvas));
+ return new DrawingContextImpl(Surface.Canvas);
}
public void Dispose()
@@ -90,7 +88,7 @@ namespace Avalonia.Skia
h = (int)bounds.Height;
}
- public override DrawingContext CreateDrawingContext()
+ public override IDrawingContextImpl CreateDrawingContext()
{
FixSize();
@@ -104,9 +102,7 @@ namespace Avalonia.Skia
canvas.Clear(SKColors.Red);
canvas.ResetMatrix();
- return
- new DrawingContext(
- new WindowDrawingContextImpl(this));
+ return new WindowDrawingContextImpl(this);
}
public void Present()
diff --git a/src/Skia/Avalonia.Skia/BitmapImpl.cs b/src/Skia/Avalonia.Skia/BitmapImpl.cs
index 159e585218..ab212e10cf 100644
--- a/src/Skia/Avalonia.Skia/BitmapImpl.cs
+++ b/src/Skia/Avalonia.Skia/BitmapImpl.cs
@@ -74,10 +74,10 @@ namespace Avalonia.Skia
}
}
- public DrawingContext CreateDrawingContext()
+ public IDrawingContextImpl CreateDrawingContext()
{
- return new DrawingContext(new BitmapDrawingContext(Bitmap));
+ return new BitmapDrawingContext(Bitmap);
}
public void Save(Stream stream)
diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
index 7744e15104..c3e7ce9d57 100644
--- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
+++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
@@ -5,6 +5,7 @@ using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Linq;
+using Avalonia.Platform;
namespace Avalonia.Skia
{
@@ -20,9 +21,9 @@ namespace Avalonia.Skia
Canvas.Clear();
}
- public void DrawImage(IBitmap source, double opacity, Rect sourceRect, Rect destRect)
+ public void DrawImage(IBitmapImpl source, double opacity, Rect sourceRect, Rect destRect)
{
- var impl = (BitmapImpl)source.PlatformImpl;
+ var impl = (BitmapImpl)source;
var s = sourceRect.ToSKRect();
var d = destRect.ToSKRect();
using (var paint = new SKPaint()
@@ -40,9 +41,9 @@ namespace Avalonia.Skia
}
}
- public void DrawGeometry(IBrush brush, Pen pen, Geometry geometry)
+ public void DrawGeometry(IBrush brush, Pen pen, IGeometryImpl geometry)
{
- var impl = ((StreamGeometryImpl)geometry.PlatformImpl);
+ var impl = (StreamGeometryImpl)geometry;
var size = geometry.Bounds.Size;
using (var fill = brush != null ? CreatePaint(brush, size) : default(PaintWrapper))
@@ -188,7 +189,7 @@ namespace Avalonia.Skia
var bitmap = new BitmapImpl((int)helper.IntermediateSize.Width, (int)helper.IntermediateSize.Height);
rv.AddDisposable(bitmap);
using (var ctx = bitmap.CreateDrawingContext())
- helper.DrawIntermediate(ctx);
+ helper.DrawIntermediate(new DrawingContext(ctx));
SKMatrix translation = SKMatrix.MakeTranslation(-(float)helper.DestinationRect.X, -(float)helper.DestinationRect.Y);
SKShaderTileMode tileX =
tileBrush.TileMode == TileMode.None
@@ -278,11 +279,11 @@ namespace Avalonia.Skia
}
}
- public void DrawText(IBrush foreground, Point origin, FormattedText text)
+ public void DrawText(IBrush foreground, Point origin, IFormattedTextImpl text)
{
using (var paint = CreatePaint(foreground, text.Measure()))
{
- var textImpl = text.PlatformImpl as FormattedTextImpl;
+ var textImpl = text as FormattedTextImpl;
textImpl.Draw(this, Canvas, origin.ToSKPoint(), paint);
}
}
diff --git a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs
index 51f4b2b724..f0bacb801f 100644
--- a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs
+++ b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs
@@ -15,10 +15,10 @@ namespace Avalonia.Skia
public FormattedTextImpl(string text, string fontFamilyName, double fontSize, FontStyle fontStyle,
TextAlignment textAlignment, FontWeight fontWeight, TextWrapping wrapping)
{
- _text = text ?? string.Empty;
+ Text = text ?? string.Empty;
// Replace 0 characters with zero-width spaces (200B)
- _text = _text.Replace((char)0, (char)0x200B);
+ Text = Text.Replace((char)0, (char)0x200B);
var typeface = TypefaceCache.GetTypeface(fontFamilyName, fontStyle, fontWeight);
@@ -98,7 +98,7 @@ namespace Avalonia.Skia
{
IsInside = false,
TextPosition = line.Start + offset,
- IsTrailing = _text.Length == (line.Start + offset + 1)
+ IsTrailing = Text.Length == (line.Start + offset + 1)
};
}
@@ -108,7 +108,7 @@ namespace Avalonia.Skia
{
IsInside = false,
IsTrailing = end,
- TextPosition = end ? _text.Length - 1 : 0
+ TextPosition = end ? Text.Length - 1 : 0
};
}
@@ -182,7 +182,7 @@ namespace Avalonia.Skia
public override string ToString()
{
- return _text;
+ return Text;
}
internal void Draw(DrawingContextImpl context,
@@ -231,7 +231,7 @@ namespace Avalonia.Skia
if (!hasCusomFGBrushes)
{
- var subString = _text.Substring(line.Start, line.Length);
+ var subString = Text.Substring(line.Start, line.Length);
canvas.DrawText(subString, x, origin.Y + line.Top + _lineOffset, paint);
}
else
@@ -255,7 +255,7 @@ namespace Avalonia.Skia
currentWrapper = foreground;
}
- subStr = _text.Substring(i, len);
+ subStr = Text.Substring(i, len);
if (currFGPaint != currentWrapper.Paint)
{
@@ -284,7 +284,7 @@ namespace Avalonia.Skia
private readonly List _lines = new List();
private readonly SKPaint _paint;
private readonly List _rects = new List();
- private readonly string _text;
+ public string Text { get; }
private readonly TextWrapping _wrapping;
private Size _constraint = new Size(double.PositiveInfinity, double.PositiveInfinity);
private float _lineHeight = 0;
@@ -434,7 +434,7 @@ namespace Avalonia.Skia
for (int i = line.Start; i < line.Start + line.TextLength; i++)
{
- float w = _paint.MeasureText(_text[i].ToString());
+ float w = _paint.MeasureText(Text[i].ToString());
_rects.Add(new Rect(
prevRight,
@@ -490,7 +490,7 @@ namespace Avalonia.Skia
private List GetRects()
{
- if (_text.Length > _rects.Count)
+ if (Text.Length > _rects.Count)
{
BuildRects();
}
@@ -500,7 +500,7 @@ namespace Avalonia.Skia
private void Rebuild()
{
- var length = _text.Length;
+ var length = Text.Length;
_lines.Clear();
_rects.Clear();
@@ -536,7 +536,7 @@ namespace Avalonia.Skia
int measured;
int trailingnumber = 0;
- subString = _text.Substring(curOff);
+ subString = Text.Substring(curOff);
float constraint = -1;
@@ -547,12 +547,12 @@ namespace Avalonia.Skia
constraint = MAX_LINE_WIDTH;
}
- measured = LineBreak(_text, curOff, length, _paint, constraint, out trailingnumber);
+ measured = LineBreak(Text, curOff, length, _paint, constraint, out trailingnumber);
AvaloniaFormattedTextLine line = new AvaloniaFormattedTextLine();
line.TextLength = measured;
- subString = _text.Substring(line.Start, line.TextLength);
+ subString = Text.Substring(line.Start, line.TextLength);
lineWidth = _paint.MeasureText(subString);
line.Start = curOff;
line.Length = measured - trailingnumber;
diff --git a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.v2.ncrunchproject b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.v2.ncrunchproject
index e1b4d7cf28..45b84227ee 100644
--- a/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.v2.ncrunchproject
+++ b/tests/Avalonia.RenderTests/Avalonia.Skia.RenderTests.v2.ncrunchproject
@@ -17,9 +17,9 @@
true
true
60000
-
-
-
+
+
+
AutoDetect
STA
x86