Почему SetDeviceGammaRamp дает сбой при настройке значений ниже 50%? - PullRequest
0 голосов
/ 27 января 2019

Я использую 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 случайными значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...