Browse Source

[DirectFB] Added configurable scaling support

pull/2828/head
Nikita Tsukanov 7 years ago
parent
commit
62bc60bee3
  1. 14
      samples/ControlCatalog.NetCore/Program.cs
  2. 2
      src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs
  3. 9
      src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs
  4. 6
      src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs
  5. 7
      src/Linux/Avalonia.LinuxFramebuffer/Output/FbdevOutput.cs
  6. 1
      src/Linux/Avalonia.LinuxFramebuffer/Output/IOutputBackend.cs

14
samples/ControlCatalog.NetCore/Program.cs

@ -1,5 +1,6 @@
using System;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Threading;
using Avalonia;
@ -28,15 +29,24 @@ namespace ControlCatalog.NetCore
}
var builder = BuildAvaloniaApp();
double GetScaling()
{
var idx = Array.IndexOf(args, "--scaling");
if (idx != 0 && args.Length > idx + 1 &&
double.TryParse(args[idx + 1], NumberStyles.Any, CultureInfo.InvariantCulture, out var scaling))
return scaling;
return 1;
}
if (args.Contains("--fbdev"))
{
SilenceConsole();
return builder.StartLinuxFbDev(args);
return builder.StartLinuxFbDev(args, scaling: GetScaling());
}
else if (args.Contains("--drm"))
{
SilenceConsole();
return builder.StartLinuxDrm(args);
return builder.StartLinuxDrm(args, scaling: GetScaling());
}
else
return builder.StartWithClassicDesktopLifetime(args);

2
src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs

@ -61,7 +61,7 @@ namespace Avalonia.LinuxFramebuffer
public IMouseDevice MouseDevice => new MouseDevice();
public IPopupImpl CreatePopup() => null;
public double Scaling => 1;
public double Scaling => _outputBackend.Scaling;
public IEnumerable<object> Surfaces => new object[] {_outputBackend};
public Action<RawInputEventArgs> Input { get; set; }
public Action<Rect> Paint { get; set; }

9
src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs

@ -107,11 +107,12 @@ namespace Avalonia.LinuxFramebuffer
public static class LinuxFramebufferPlatformExtensions
{
public static int StartLinuxFbDev<T>(this T builder, string[] args, string fbdev = null)
where T : AppBuilderBase<T>, new() => StartLinuxDirect(builder, args, new FbdevOutput(fbdev));
public static int StartLinuxFbDev<T>(this T builder, string[] args, string fbdev = null, double scaling = 1)
where T : AppBuilderBase<T>, new() =>
StartLinuxDirect(builder, args, new FbdevOutput(fbdev) {Scaling = scaling});
public static int StartLinuxDrm<T>(this T builder, string[] args, string card = null)
where T : AppBuilderBase<T>, new() => StartLinuxDirect(builder, args, new DrmOutput(card));
public static int StartLinuxDrm<T>(this T builder, string[] args, string card = null, double scaling = 1)
where T : AppBuilderBase<T>, new() => StartLinuxDirect(builder, args, new DrmOutput(card) {Scaling = scaling});
public static int StartLinuxDirect<T>(this T builder, string[] args, IOutputBackend backend)
where T : AppBuilderBase<T>, new()

6
src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs

@ -14,7 +14,7 @@ namespace Avalonia.LinuxFramebuffer.Output
private DrmCard _card;
private readonly EglGlPlatformSurface _eglPlatformSurface;
public PixelSize PixelSize => _mode.Resolution;
public double Scaling { get; set; }
public DrmOutput(string path = null)
{
var card = new DrmCard(path);
@ -233,7 +233,7 @@ namespace Avalonia.LinuxFramebuffer.Output
public PixelSize Size => _parent._mode.Resolution;
public double Scaling => 1;
public double Scaling => _parent.Scaling;
}
public IGlPlatformSurfaceRenderingSession BeginDraw()
@ -241,6 +241,8 @@ namespace Avalonia.LinuxFramebuffer.Output
_parent._deferredContext.MakeCurrent(_parent._eglSurface);
return new RenderSession(_parent);
}
}
IGlContext IWindowingPlatformGlFeature.ImmediateContext => _immediateContext;

7
src/Linux/Avalonia.LinuxFramebuffer/Output/FbdevOutput.cs

@ -9,16 +9,15 @@ namespace Avalonia.LinuxFramebuffer
{
public sealed unsafe class FbdevOutput : IFramebufferPlatformSurface, IDisposable, IOutputBackend
{
private readonly Vector _dpi;
private int _fd;
private fb_fix_screeninfo _fixedInfo;
private fb_var_screeninfo _varInfo;
private IntPtr _mappedLength;
private IntPtr _mappedAddress;
public double Scaling { get; set; }
public FbdevOutput(string fileName = null, Vector? dpi = null)
public FbdevOutput(string fileName = null)
{
_dpi = dpi ?? new Vector(96, 96);
fileName = fileName ?? Environment.GetEnvironmentVariable("FRAMEBUFFER") ?? "/dev/fb0";
_fd = NativeUnsafeMethods.open(fileName, 2, 0);
if (_fd <= 0)
@ -101,7 +100,7 @@ namespace Avalonia.LinuxFramebuffer
{
if (_fd <= 0)
throw new ObjectDisposedException("LinuxFramebuffer");
return new LockedFramebuffer(_fd, _fixedInfo, _varInfo, _mappedAddress, _dpi);
return new LockedFramebuffer(_fd, _fixedInfo, _varInfo, _mappedAddress, new Vector(96, 96) * Scaling);
}

1
src/Linux/Avalonia.LinuxFramebuffer/Output/IOutputBackend.cs

@ -3,5 +3,6 @@ namespace Avalonia.LinuxFramebuffer.Output
public interface IOutputBackend
{
PixelSize PixelSize { get; }
double Scaling { get; set; }
}
}

Loading…
Cancel
Save