@ -16,16 +16,33 @@ namespace Avalonia.LinuxFramebuffer
private IntPtr _ mappedAddress ;
public double Scaling { get ; set ; }
public FbdevOutput ( string fileName = null )
/// <summary>
/// Create a Linux frame buffer device output
/// </summary>
/// <param name="fileName">The frame buffer device name.
/// Defaults to the value in environment variable FRAMEBUFFER or /dev/fb0 when FRAMEBUFFER is not set</param>
public FbdevOutput ( string fileName = null ) : this ( null , null )
{
fileName = fileName ? ? Environment . GetEnvironmentVariable ( "FRAMEBUFFER" ) ? ? "/dev/fb0" ;
}
/// <summary>
/// Create a Linux frame buffer device output
/// </summary>
/// <param name="fileName">The frame buffer device name.
/// Defaults to the value in environment variable FRAMEBUFFER or /dev/fb0 when FRAMEBUFFER is not set</param>
/// <param name="format">The required pixel format for the frame buffer.
/// A null value will leave the frame buffer in the current pixel format.
/// Otherwise sets the frame buffer to the required format</param>
public FbdevOutput ( string fileName , PixelFormat ? format )
{
fileName ? ? = Environment . GetEnvironmentVariable ( "FRAMEBUFFER" ) ? ? "/dev/fb0" ;
_f d = NativeUnsafeMethods . open ( fileName , 2 , 0 ) ;
if ( _f d < = 0 )
throw new Exception ( "Error: " + Marshal . GetLastWin32Error ( ) ) ;
try
{
Init ( ) ;
Init ( format ) ;
}
catch
{
@ -34,25 +51,28 @@ namespace Avalonia.LinuxFramebuffer
}
}
void Init ( )
void Init ( PixelFormat ? format )
{
fixed ( void * pnfo = & _ varInfo )
{
if ( - 1 = = NativeUnsafeMethods . ioctl ( _f d , FbIoCtl . FBIOGET_VSCREENINFO , pnfo ) )
throw new Exception ( "FBIOGET_VSCREENINFO error: " + Marshal . GetLastWin32Error ( ) ) ;
SetBpp ( ) ;
if ( format . HasValue )
{
SetBpp ( format . Value ) ;
if ( - 1 = = NativeUnsafeMethods . ioctl ( _f d , FbIoCtl . FBIOPUT_VSCREENINFO , pnfo ) )
_ varInfo . transp = new fb_bitfield ( ) ;
if ( - 1 = = NativeUnsafeMethods . ioctl ( _f d , FbIoCtl . FBIOPUT_VSCREENINFO , pnfo ) )
_ varInfo . transp = new fb_bitfield ( ) ;
NativeUnsafeMethods . ioctl ( _f d , FbIoCtl . FBIOPUT_VSCREENINFO , pnfo ) ;
NativeUnsafeMethods . ioctl ( _f d , FbIoCtl . FBIOPUT_VSCREENINFO , pnfo ) ;
if ( - 1 = = NativeUnsafeMethods . ioctl ( _f d , FbIoCtl . FBIOGET_VSCREENINFO , pnfo ) )
throw new Exception ( "FBIOGET_VSCREENINFO error: " + Marshal . GetLastWin32Error ( ) ) ;
if ( - 1 = = NativeUnsafeMethods . ioctl ( _f d , FbIoCtl . FBIOGET_VSCREENINFO , pnfo ) )
throw new Exception ( "FBIOGET_VSCREENINFO error: " + Marshal . GetLastWin32Error ( ) ) ;
if ( _ varInfo . bits_per_pixel ! = 3 2 )
throw new Exception ( "Unable to set 32-bit display mode" ) ;
if ( _ varInfo . bits_per_pixel ! = 3 2 )
throw new Exception ( "Unable to set 32-bit display mode" ) ;
}
}
fixed ( void * pnfo = & _f ixedInfo )
if ( - 1 = = NativeUnsafeMethods . ioctl ( _f d , FbIoCtl . FBIOGET_FSCREENINFO , pnfo ) )
@ -70,17 +90,43 @@ namespace Avalonia.LinuxFramebuffer
}
}
void SetBpp ( )
void SetBpp ( PixelFormat format )
{
_ varInfo . bits_per_pixel = 3 2 ;
_ varInfo . grayscale = 0 ;
_ varInfo . red = _ varInfo . blue = _ varInfo . green = _ varInfo . transp = new fb_bitfield
switch ( format )
{
length = 8
} ;
_ varInfo . green . offset = 8 ;
_ varInfo . blue . offset = 1 6 ;
_ varInfo . transp . offset = 2 4 ;
case PixelFormat . Rgba8888 :
_ varInfo . bits_per_pixel = 3 2 ;
_ varInfo . grayscale = 0 ;
_ varInfo . red = _ varInfo . blue = _ varInfo . green = _ varInfo . transp = new fb_bitfield
{
length = 8
} ;
_ varInfo . green . offset = 8 ;
_ varInfo . blue . offset = 1 6 ;
_ varInfo . transp . offset = 2 4 ;
break ;
case PixelFormat . Bgra8888 :
_ varInfo . bits_per_pixel = 3 2 ;
_ varInfo . grayscale = 0 ;
_ varInfo . red = _ varInfo . blue = _ varInfo . green = _ varInfo . transp = new fb_bitfield
{
length = 8
} ;
_ varInfo . green . offset = 8 ;
_ varInfo . red . offset = 1 6 ;
_ varInfo . transp . offset = 2 4 ;
break ;
case PixelFormat . Rgb565 :
_ varInfo . bits_per_pixel = 1 6 ;
_ varInfo . grayscale = 0 ;
_ varInfo . red = _ varInfo . blue = _ varInfo . green = _ varInfo . transp = new fb_bitfield ( ) ;
_ varInfo . red . length = 5 ;
_ varInfo . green . offset = 5 ;
_ varInfo . green . length = 6 ;
_ varInfo . blue . offset = 1 1 ;
_ varInfo . blue . length = 5 ;
break ;
}
}
public string Id { get ; private set ; }