mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
* Gamma Init * Cleanup * Show flicker-free dimming only on supported models * Gamma ramp tweaks * Gamma improvements * Stronger dimming * Added OLED model detection
112 lines
3.4 KiB
C#
112 lines
3.4 KiB
C#
namespace GHelper.Display
|
|
{
|
|
|
|
public class DisplayGammaRamp
|
|
{
|
|
|
|
public DisplayGammaRamp(ushort[] red, ushort[] green, ushort[] blue)
|
|
{
|
|
if (red?.Length != GammaRamp.DataPoints)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(red));
|
|
}
|
|
|
|
if (green?.Length != GammaRamp.DataPoints)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(green));
|
|
}
|
|
|
|
if (blue?.Length != GammaRamp.DataPoints)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(blue));
|
|
}
|
|
|
|
Red = red;
|
|
Green = green;
|
|
Blue = blue;
|
|
}
|
|
|
|
public DisplayGammaRamp(double brightness = 1, double contrast = 1, double gamma = 1)
|
|
: this(
|
|
CalculateLUT(brightness, contrast, gamma),
|
|
CalculateLUT(brightness, contrast, gamma),
|
|
CalculateLUT(brightness, contrast, gamma)
|
|
)
|
|
{
|
|
}
|
|
|
|
public DisplayGammaRamp(
|
|
double redBrightness,
|
|
double redContrast,
|
|
double redGamma,
|
|
double greenBrightness,
|
|
double greenContrast,
|
|
double greenGamma,
|
|
double blueBrightness,
|
|
double blueContrast,
|
|
double blueGamma
|
|
)
|
|
: this(
|
|
CalculateLUT(redBrightness, redContrast, redGamma),
|
|
CalculateLUT(greenBrightness, greenContrast, greenGamma),
|
|
CalculateLUT(blueBrightness, blueContrast, blueGamma)
|
|
)
|
|
{
|
|
}
|
|
|
|
internal DisplayGammaRamp(GammaRamp ramp) :
|
|
this(ramp.Red, ramp.Green, ramp.Blue)
|
|
{
|
|
}
|
|
public ushort[] Blue { get; }
|
|
public ushort[] Green { get; }
|
|
public ushort[] Red { get; }
|
|
private static ushort[] CalculateLUT(double brightness, double contrast, double gamma)
|
|
{
|
|
brightness = 0.5 + brightness / 2;
|
|
var result = new ushort[GammaRamp.DataPoints];
|
|
for (var i = 0; i < result.Length; i++)
|
|
{
|
|
result[i] = (ushort)(brightness * ushort.MaxValue * i / (float)(result.Length - 1));
|
|
}
|
|
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)
|
|
{
|
|
var result = new ushort[GammaRamp.DataPoints];
|
|
for (var i = 0; i < result.Length; i++)
|
|
{
|
|
if (brightness < 0.5)
|
|
result[i] = (ushort)(0.5 * ushort.MaxValue * Math.Pow((float)i/(result.Length - 1), 2 - brightness*2));
|
|
else
|
|
result[i] = (ushort)(data[i] * brightness);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
internal GammaRamp AsBrightnessRamp(double brightness)
|
|
{
|
|
return new GammaRamp(
|
|
Brightness(Red, brightness),
|
|
Brightness(Green, brightness),
|
|
Brightness(Blue, brightness)
|
|
);
|
|
}
|
|
|
|
internal GammaRamp AsRamp()
|
|
{
|
|
return new GammaRamp(Red, Green, Blue);
|
|
}
|
|
|
|
|
|
}
|
|
} |