From 0257bdf6eddfa63b770c644aab41dc7ed18670c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Pedro?= Date: Sun, 21 Mar 2021 01:37:35 +0000 Subject: [PATCH] Implemented render scaling on Android. --- .../SkiaPlatform/AndroidFramebuffer.cs | 6 ++-- .../SkiaPlatform/FramebufferManager.cs | 2 +- .../Platform/SkiaPlatform/TopLevelImpl.cs | 28 ++++++------------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs index 2afa4e83f1..b115917622 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/AndroidFramebuffer.cs @@ -10,7 +10,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform { private IntPtr _window; - public AndroidFramebuffer(Surface surface) + public AndroidFramebuffer(Surface surface, double scaling) { if(surface == null) throw new ArgumentNullException(nameof(surface)); @@ -31,6 +31,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform RowBytes = buffer.stride * (Format == PixelFormat.Rgb565 ? 2 : 4); Address = buffer.bits; + + Dpi = scaling * new Vector(96, 96); } public void Dispose() @@ -44,7 +46,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform public IntPtr Address { get; set; } public PixelSize Size { get; } public int RowBytes { get; } - public Vector Dpi { get; } = new Vector(96, 96); + public Vector Dpi { get; } public PixelFormat Format { get; } [DllImport("android")] diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/FramebufferManager.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/FramebufferManager.cs index 18c4796fae..56a4eb22d4 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/FramebufferManager.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/FramebufferManager.cs @@ -12,6 +12,6 @@ namespace Avalonia.Android.Platform.SkiaPlatform _topLevel = topLevel; } - public ILockedFramebuffer Lock() => new AndroidFramebuffer(_topLevel.InternalView.Holder.Surface); + public ILockedFramebuffer Lock() => new AndroidFramebuffer(_topLevel.InternalView.Holder.Surface, _topLevel.RenderScaling); } } diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index 4fd9bc040b..fe237a1719 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -39,8 +39,10 @@ namespace Avalonia.Android.Platform.SkiaPlatform _gl = GlPlatformSurface.TryCreate(this); _framebuffer = new FramebufferManager(this); - MaxClientSize = new Size(_view.Resources.DisplayMetrics.WidthPixels, - _view.Resources.DisplayMetrics.HeightPixels); + RenderScaling = (int)_view.Resources.DisplayMetrics.Density; + + MaxClientSize = new PixelSize(_view.Resources.DisplayMetrics.WidthPixels, + _view.Resources.DisplayMetrics.HeightPixels).ToSize(RenderScaling); } private bool _handleEvents; @@ -60,19 +62,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform public IInputRoot InputRoot { get; private set; } - public virtual Size ClientSize - { - get - { - if (_view == null) - return new Size(0, 0); - return new Size(_view.Width, _view.Height); - } - set - { - - } - } + public virtual Size ClientSize => Size.ToSize(RenderScaling); public IMouseDevice MouseDevice { get; } = new MouseDevice(); @@ -113,12 +103,12 @@ namespace Avalonia.Android.Platform.SkiaPlatform public Point PointToClient(PixelPoint point) { - return point.ToPoint(1); + return point.ToPoint(RenderScaling); } public PixelPoint PointToScreen(Point point) { - return PixelPoint.FromPoint(point, 1); + return PixelPoint.FromPoint(point, RenderScaling); } public void SetCursor(ICursorImpl cursor) @@ -136,7 +126,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform _view.Visibility = ViewStates.Visible; } - public double RenderScaling => 1; + public double RenderScaling { get; } void Draw() { @@ -191,7 +181,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform void ISurfaceHolderCallback.SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height) { - var newSize = new Size(width, height); + var newSize = new PixelSize(width, height).ToSize(_tl.RenderScaling); if (newSize != _oldSize) {