Gamma improvements

This commit is contained in:
Serge
2024-02-17 13:45:01 +01:00
parent 744b304d4b
commit 062301555c
2 changed files with 23 additions and 12 deletions

View File

@@ -1,13 +1,9 @@
using System.Diagnostics; namespace GHelper.Display
using System.Reflection.Metadata.Ecma335;
using System.Runtime.InteropServices;
namespace GHelper.Display
{ {
public class DisplayGammaRamp public class DisplayGammaRamp
{ {
public DisplayGammaRamp(ushort[] red, ushort[] green, ushort[] blue) public DisplayGammaRamp(ushort[] red, ushort[] green, ushort[] blue)
{ {
if (red?.Length != GammaRamp.DataPoints) if (red?.Length != GammaRamp.DataPoints)
@@ -67,20 +63,30 @@ namespace GHelper.Display
public ushort[] Red { get; } public ushort[] Red { get; }
private static ushort[] CalculateLUT(double brightness, double contrast, double gamma) private static ushort[] CalculateLUT(double brightness, double contrast, double gamma)
{ {
brightness = 0.5 + brightness / 2;
var result = new ushort[GammaRamp.DataPoints]; var result = new ushort[GammaRamp.DataPoints];
for (var i = 0; i < result.Length; i++) for (var i = 0; i < result.Length; i++)
{ {
result[i] = (ushort)((0.5 + brightness / 2) * ushort.MaxValue * i / (float)(result.Length - 1)); result[i] = (ushort)(brightness * ushort.MaxValue * i / (float)(result.Length - 1));
} }
return result; return result;
} }
public bool IsOriginal()
{
int MaxRed = Red[Red.Length - 1];
int MaxGreen = Green[Green.Length - 1];
int MaxBlue = Blue[Blue.Length - 1];
return (Math.Abs((MaxRed + MaxGreen + MaxBlue) / 3 - ushort.MaxValue) < 256);
}
private static ushort[] Brightness(ushort[] data, double brightness) private static ushort[] Brightness(ushort[] data, double brightness)
{ {
brightness = 0.5 + brightness / 2;
var result = new ushort[GammaRamp.DataPoints]; var result = new ushort[GammaRamp.DataPoints];
for (var i = 0; i < result.Length; i++) for (var i = 0; i < result.Length; i++)
{ {
result[i] = (ushort)(data[i]*brightness); result[i] = (ushort)(data[i] * brightness);
} }
return result; return result;
} }

View File

@@ -50,7 +50,6 @@ namespace GHelper.Display
public void SetGamma(int brightness = 100, int contrast = 100) public void SetGamma(int brightness = 100, int contrast = 100)
{ {
var bright = (float)(brightness) / 100; var bright = (float)(brightness) / 100;
Logger.WriteLine("Brightness: " + bright.ToString());
var screenName = ScreenNative.FindLaptopScreen(); var screenName = ScreenNative.FindLaptopScreen();
if (screenName is null) return; if (screenName is null) return;
@@ -70,10 +69,16 @@ namespace GHelper.Display
} }
} }
if (gammaRamp is null) gammaRamp = new DisplayGammaRamp(); if (gammaRamp is null || !gammaRamp.IsOriginal())
{
Logger.WriteLine("Default Gamma");
gammaRamp = new DisplayGammaRamp();
}
var ramp = gammaRamp.AsBrightnessRamp(bright); var ramp = gammaRamp.AsBrightnessRamp(bright);
ScreenNative.SetDeviceGammaRamp(handle, ref ramp); bool result = ScreenNative.SetDeviceGammaRamp(handle, ref ramp);
Logger.WriteLine("Brightness " + bright.ToString() + ": " + result);
} catch (Exception ex) } catch (Exception ex)
{ {