Я использую SetDeviceGammaRamp
для регулировки цветовой температуры моего дисплея (аналогично утилите, подобной f.lux.) В основном это работает, за исключением случаев, когда я пытаюсь настроить яркость любого канала ниже 50%, в этом случаефункция завершается ошибкой и GetLastError
возвращает ERROR_INVALID_WINDOW_HANDLE
.
Возможно ли, что мой графический драйвер просто отказывается от поставляемого LUT, если он пытается отрегулировать что-либо выше 50% яркости?
#include <windows.h>
int AdjustBrightness(float multiplier)
{
unsigned short LUT[3][256];
for (int i = 0; i < 256; i++)
{
LUT[0][i] = i * 256 * multiplier;
LUT[1][i] = i * 256 * multiplier;
LUT[2][i] = i * 256 * multiplier;
}
return SetDeviceGammaRamp(GetDC(0), LUT);
}
int main()
{
if (!AdjustBrightness(0.5f))
MessageBox(0, "0.5 was not a good value.", "Error", 0);
if (!AdjustBrightness(0.45f))
MessageBox(0, "0.45 was not a good value.", "Error", 0);
//I'm getting one message box telling me 0.45 is a bad value
}
Редактировать: теперь это кажется еще более странным, поскольку следующий код работает нормально, несмотря на то, что значения LUT ниже 50% от их первоначального значения.
#include <math.h>
#include <windows.h>
int AdjustGamma()
{
unsigned short LUT[3][256];
for (int i = 0; i < 256; i++)
{
//squaring will produce LUT values much smaller than 50% of their original value
int value = pow(i / 255.0f, 2.0f) * 255.0f;
LUT[0][i] = value * 256;
LUT[1][i] = value * 256;
LUT[2][i] = value * 256;
}
return SetDeviceGammaRamp(GetDC(0), LUT);
}
int main()
{
AdjustGamma(); //no complaints
}
Возможно, драйвер использует какую-то эвристику для проверкиLUT как особый тип корректировки, а затем проверка, чтобы увидеть, находится ли она в каких-то пределах?Для них не кажется таким безумным делать это, как вы можете представить себе резню, которая случится, если, например, заполнить LUT случайными значениями.