Browse Source

some hacks to test hdr

temp/implement-hdr
Dan Walmsley 3 years ago
parent
commit
5326fda7ec
  1. 3
      samples/ControlCatalog/ControlCatalog.csproj
  2. 229
      samples/ControlCatalog/MainView.xaml
  3. 92
      samples/ControlCatalog/MainView.xaml.cs
  4. 1
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  5. 1
      src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs
  6. 6
      src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaGpu.cs
  7. 4
      src/Windows/Avalonia.Win32/WinRT/Composition/WinUiCompositedWindowSurface.cs

3
samples/ControlCatalog/ControlCatalog.csproj

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
<TargetFrameworks>net6.0</TargetFrameworks>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Nullable>enable</Nullable>
</PropertyGroup>
@ -30,6 +30,7 @@
<ProjectReference Include="..\..\src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj" />
<ProjectReference Include="..\MiniMvvm\MiniMvvm.csproj" />
<ProjectReference Include="..\SampleControls\ControlSamples.csproj" />
<PackageReference Include="CommunityToolkit.HighPerformance" Version="8.0.0" />
</ItemGroup>
<Import Project="..\..\build\BuildTargets.targets" />

229
samples/ControlCatalog/MainView.xaml

@ -6,232 +6,5 @@
xmlns:pages="using:ControlCatalog.Pages"
xmlns:viewModels="using:ControlCatalog.ViewModels"
x:DataType="viewModels:MainWindowViewModel">
<Grid>
<Grid.Styles>
<Style Selector="TextBlock.h2">
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="MaxWidth" Value="400" />
<Setter Property="HorizontalAlignment" Value="Left" />
</Style>
</Grid.Styles>
<controls:HamburgerMenu Name="Sidebar">
<TabItem Header="Composition">
<pages:CompositionPage/>
</TabItem>
<TabItem Header="Acrylic">
<pages:AcrylicPage />
</TabItem>
<TabItem Header="AdornerLayer">
<pages:AdornerLayerPage />
</TabItem>
<TabItem Header="AutoCompleteBox">
<pages:AutoCompleteBoxPage />
</TabItem>
<TabItem Header="Border">
<pages:BorderPage />
</TabItem>
<TabItem Header="Buttons">
<pages:ButtonsPage />
</TabItem>
<TabItem Header="ButtonSpinner">
<pages:ButtonSpinnerPage />
</TabItem>
<TabItem Header="Calendar">
<pages:CalendarPage />
</TabItem>
<TabItem Header="Canvas">
<pages:CanvasPage />
</TabItem>
<TabItem Header="Carousel">
<pages:CarouselPage />
</TabItem>
<TabItem Header="CheckBox">
<pages:CheckBoxPage />
</TabItem>
<TabItem Header="Clipboard">
<pages:ClipboardPage />
</TabItem>
<TabItem Header="ColorPicker">
<pages:ColorPickerPage />
</TabItem>
<TabItem Header="ComboBox">
<pages:ComboBoxPage />
</TabItem>
<TabItem Header="ContextFlyout">
<pages:ContextFlyoutPage />
</TabItem>
<TabItem Header="ContextMenu">
<pages:ContextMenuPage />
</TabItem>
<TabItem Header="Cursor" ScrollViewer.VerticalScrollBarVisibility="Disabled">
<pages:CursorPage />
</TabItem>
<TabItem Header="Custom Drawing" ScrollViewer.VerticalScrollBarVisibility="Disabled">
<pages:CustomDrawing/>
</TabItem>
<TabItem Header="DataGrid"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled">
<pages:DataGridPage />
</TabItem>
<TabItem Header="Date/Time Picker">
<pages:DateTimePickerPage />
</TabItem>
<TabItem Header="CalendarDatePicker">
<pages:CalendarDatePickerPage />
</TabItem>
<TabItem Header="Dialogs">
<pages:DialogsPage />
</TabItem>
<TabItem Header="Drag+Drop">
<pages:DragAndDropPage />
</TabItem>
<TabItem Header="Expander">
<pages:ExpanderPage />
</TabItem>
<TabItem Header="Flyouts">
<pages:FlyoutsPage />
</TabItem>
<TabItem Header="Gestures">
<pages:GesturePage />
</TabItem>
<TabItem Header="Image"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled">
<pages:ImagePage />
</TabItem>
<TabItem Header="ItemsRepeater"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled">
<pages:ItemsRepeaterPage />
</TabItem>
<TabItem Header="Label">
<pages:LabelsPage />
</TabItem>
<TabItem Header="LayoutTransformControl">
<pages:LayoutTransformControlPage />
</TabItem>
<TabItem Header="ListBox" ScrollViewer.VerticalScrollBarVisibility="Disabled">
<pages:ListBoxPage />
</TabItem>
<TabItem Header="Menu">
<pages:MenuPage />
</TabItem>
<TabItem Header="Notifications">
<pages:NotificationsPage />
</TabItem>
<TabItem Header="NumericUpDown">
<pages:NumericUpDownPage />
</TabItem>
<TabItem Header="OpenGL">
<pages:OpenGlPage />
</TabItem>
<TabItem Header="Platform Information">
<pages:PlatformInfoPage />
</TabItem>
<TabItem Header="Pointers">
<pages:PointersPage />
</TabItem>
<TabItem Header="ProgressBar">
<pages:ProgressBarPage />
</TabItem>
<TabItem Header="RadioButton">
<pages:RadioButtonPage />
</TabItem>
<TabItem Header="RefreshContainer">
<pages:RefreshContainerPage />
</TabItem>
<TabItem Header="RelativePanel">
<pages:RelativePanelPage />
</TabItem>
<TabItem Header="ScrollViewer">
<pages:ScrollViewerPage />
</TabItem>
<TabItem Header="Slider">
<pages:SliderPage />
</TabItem>
<TabItem Header="SplitView">
<pages:SplitViewPage />
</TabItem>
<TabItem Header="TabControl">
<pages:TabControlPage />
</TabItem>
<TabItem Header="TabStrip">
<pages:TabStripPage />
</TabItem>
<TabItem Header="TextBox">
<pages:TextBoxPage />
</TabItem>
<TabItem Header="TextBlock">
<pages:TextBlockPage />
</TabItem>
<TabItem Header="ToggleSwitch">
<pages:ToggleSwitchPage />
</TabItem>
<TabItem Header="ToolTip">
<pages:ToolTipPage />
</TabItem>
<TabItem Header="TransitioningContentControl">
<pages:TransitioningContentControlPage />
</TabItem>
<TabItem Header="TreeView">
<pages:TreeViewPage />
</TabItem>
<TabItem Header="Viewbox">
<pages:ViewboxPage />
</TabItem>
<TabItem Header="Native Embed">
<pages:NativeEmbedPage />
</TabItem>
<TabItem Header="Window Customizations">
<pages:WindowCustomizationsPage />
</TabItem>
<FlyoutBase.AttachedFlyout>
<Flyout>
<StackPanel Width="152" Spacing="8">
<ComboBox x:Name="Decorations"
HorizontalAlignment="Stretch"
SelectedIndex="0">
<ComboBox.Items>
<SystemDecorations>None</SystemDecorations>
<SystemDecorations>BorderOnly</SystemDecorations>
<SystemDecorations>Full</SystemDecorations>
</ComboBox.Items>
</ComboBox>
<ComboBox x:Name="Themes"
HorizontalAlignment="Stretch"
SelectedIndex="0">
<ComboBox.Items>
<models:CatalogTheme>FluentLight</models:CatalogTheme>
<models:CatalogTheme>FluentDark</models:CatalogTheme>
<models:CatalogTheme>SimpleLight</models:CatalogTheme>
<models:CatalogTheme>SimpleDark</models:CatalogTheme>
</ComboBox.Items>
</ComboBox>
<ComboBox x:Name="TransparencyLevels"
HorizontalAlignment="Stretch">
<ComboBox.Items>
<WindowTransparencyLevel>None</WindowTransparencyLevel>
<WindowTransparencyLevel>Transparent</WindowTransparencyLevel>
<WindowTransparencyLevel>Blur</WindowTransparencyLevel>
<WindowTransparencyLevel>AcrylicBlur</WindowTransparencyLevel>
<WindowTransparencyLevel>Mica</WindowTransparencyLevel>
</ComboBox.Items>
</ComboBox>
<ComboBox x:Name="FlowDirection"
HorizontalAlignment="Stretch"
SelectedIndex="0">
<ComboBox.Items>
<FlowDirection>LeftToRight</FlowDirection>
<FlowDirection>RightToLeft</FlowDirection>
</ComboBox.Items>
</ComboBox>
<ComboBox HorizontalAlignment="Stretch"
Items="{Binding WindowStates}"
SelectedItem="{Binding WindowState}" />
</StackPanel>
</Flyout>
</FlyoutBase.AttachedFlyout>
</controls:HamburgerMenu>
</Grid>
<Image x:Name="PART_Image" />
</UserControl>

92
samples/ControlCatalog/MainView.xaml.cs

@ -1,12 +1,17 @@
using System;
using System.Collections;
using System.Runtime.InteropServices;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Controls.Documents;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Media.Immutable;
using Avalonia.Platform;
using Avalonia.VisualTree;
using CommunityToolkit.HighPerformance;
using ControlCatalog.Models;
using ControlCatalog.Pages;
@ -18,77 +23,40 @@ namespace ControlCatalog
{
AvaloniaXamlLoader.Load(this);
var sideBar = this.Get<TabControl>("Sidebar");
}
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
{
var tabItems = (sideBar.Items as IList);
tabItems?.Add(new TabItem()
{
Header = "Screens",
Content = new ScreenPage()
});
}
[StructLayout(LayoutKind.Sequential)]
struct FPixel
{
public Half R { get; set; }
public Half G { get; set; }
public Half B { get; set; }
public Half A { get; set; }
}
var themes = this.Get<ComboBox>("Themes");
themes.SelectedItem = App.CurrentTheme;
themes.SelectionChanged += (sender, e) =>
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
unsafe
{
if (themes.SelectedItem is CatalogTheme theme)
{
App.SetThemeVariant(theme);
}
};
base.OnAttachedToVisualTree(e);
var flowDirections = this.Get<ComboBox>("FlowDirection");
flowDirections.SelectionChanged += (sender, e) =>
{
if (flowDirections.SelectedItem is FlowDirection flowDirection)
{
this.FlowDirection = flowDirection;
}
};
var image = this.Find<Image>("PART_Image");
var decorations = this.Get<ComboBox>("Decorations");
decorations.SelectionChanged += (sender, e) =>
{
if (VisualRoot is Window window
&& decorations.SelectedItem is SystemDecorations systemDecorations)
{
window.SystemDecorations = systemDecorations;
}
};
var bmp = new WriteableBitmap(new PixelSize(100, 100), new Vector(96, 96), PixelFormat.RgbaF16);
var transparencyLevels = this.Get<ComboBox>("TransparencyLevels");
IDisposable? topLevelBackgroundSideSetter = null, sideBarBackgroundSetter = null, paneBackgroundSetter = null;
transparencyLevels.SelectionChanged += (sender, e) =>
{
topLevelBackgroundSideSetter?.Dispose();
sideBarBackgroundSetter?.Dispose();
paneBackgroundSetter?.Dispose();
if (transparencyLevels.SelectedItem is WindowTransparencyLevel selected)
{
var topLevel = (TopLevel)this.GetVisualRoot()!;
topLevel.TransparencyLevelHint = selected;
using var framebuffer = bmp.Lock();
if (selected != WindowTransparencyLevel.None)
{
var transparentBrush = new ImmutableSolidColorBrush(Colors.White, 0);
var semiTransparentBrush = new ImmutableSolidColorBrush(Colors.Gray, 0.2);
topLevelBackgroundSideSetter = topLevel.SetValue(BackgroundProperty, transparentBrush, Avalonia.Data.BindingPriority.Style);
sideBarBackgroundSetter = sideBar.SetValue(BackgroundProperty, semiTransparentBrush, Avalonia.Data.BindingPriority.Style);
paneBackgroundSetter = sideBar.SetValue(SplitView.PaneBackgroundProperty, semiTransparentBrush, Avalonia.Data.BindingPriority.Style);
}
var span = new Span<FPixel>(framebuffer.Address.ToPointer(), 100 * 100);
for (int i = 0; i < (100 * 100); i++)
{
span[i].R = (Half)1.0f;
span[i].A = (Half)1.0f;
}
};
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnAttachedToVisualTree(e);
var decorations = this.Get<ComboBox>("Decorations");
if (VisualRoot is Window window)
decorations.SelectedIndex = (int)window.SystemDecorations;
image.Source = bmp;
}
}
}
}

1
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -1168,6 +1168,7 @@ namespace Avalonia.Skia
private SurfaceRenderTarget CreateRenderTarget(Size size, bool isLayer, PixelFormat? format = null)
{
var pixelSize = PixelSize.FromSizeWithDpi(size, _dpi);
format = PixelFormat.RgbaF16;
var createInfo = new SurfaceRenderTarget.CreateInfo
{
Width = pixelSize.Width,

1
src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs

@ -45,6 +45,7 @@ namespace Avalonia.Skia
}
public void Dispose()
{
_surface.Canvas.Clear(new SKColorF(1,1,1,1));
_surface.Canvas.Flush();
_surface.Dispose();
_backendRenderTarget.Dispose();

6
src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaGpu.cs

@ -75,8 +75,10 @@ namespace Avalonia.Skia
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
return null;
return null;
// Blit feature requires glBlitFramebuffer
if (!_glContext.GlInterface.IsBlitFramebufferAvailable)
/*if (!_glContext.GlInterface.IsBlitFramebufferAvailable)
return null;
size = new PixelSize(Math.Max(size.Width, 1), Math.Max(size.Height, 1));
@ -95,7 +97,7 @@ namespace Avalonia.Skia
?.Log(this, "Unable to create a Skia-compatible FBO manually");
_canCreateSurfaces ??= false;
return null;
}
}*/
}
public bool CanCreateSharedContext => _glContext.CanCreateSharedContext;

4
src/Windows/Avalonia.Win32/WinRT/Composition/WinUiCompositedWindowSurface.cs

@ -79,7 +79,7 @@ namespace Avalonia.Win32.WinRT.Composition
_compositionDevice = _interop.CreateGraphicsDevice(_d3dDevice);
_compositionDevice2 = _compositionDevice.QueryInterface<ICompositionGraphicsDevice2>();
_drawingSurface = _compositionDevice2.CreateDrawingSurface2(new UnmanagedMethods.SIZE(),
DirectXPixelFormat.B8G8R8A8UIntNormalized, DirectXAlphaMode.Premultiplied);
DirectXPixelFormat.R16G16B16A16Float, DirectXAlphaMode.Premultiplied);
_surface = _drawingSurface.QueryInterface<ICompositionSurface>();
_surfaceInterop = _drawingSurface.QueryInterface<ICompositionDrawingSurfaceInterop>();
}
@ -200,4 +200,4 @@ namespace Avalonia.Win32.WinRT.Composition
public double Scaling => _scaling;
}
}
}
}

Loading…
Cancel
Save