Правильное использование SetDeviceGammaRamp

Я бы хотел добавить возможность настраивать гамму экрана при запуске приложения и сбрасывать ее при выходе. Хотя это спорно, стоит ли вообще вмешиваться в гамму (лично я считаю это бесполезным и вредным), но эй, некоторые люди ожидают возможности делать такие вещи.

Это всего лишь один простой вызов API, так что все просто, верно?

В MSDN сказано: "Гамма рампа задается в трех массивах по 256 элементов WORD каждый [...] значения должны храниться в старших битах каждого WORD для увеличения независимости ЦАП.". Это означает, в моем понимании, что-то вроде слово_значение = байт_значение<<8, что звучит довольно странно, но именно так я это прочитал.

Исходный код Doom3 содержит функцию, которая принимает три массива значений char и преобразует их в массив значений uint16_t, которые имеют одинаковое значение байта оба в верхней и нижней половине. Другими словами, что-то вроде слово_значение = (байт_значение<<8)|байт_значение. Это не менее странно, но что еще хуже, это не то же самое, что и выше.

Также в интернете есть несколько фрагментов кода на различных сайтах программистов-любителей (очевидно, один украден у другого, потому что они идентичны до буквы), которые делают какую-то непонятную математику, умножая линейный индекс на значение, смещая на 128 и зажимая до 65535. Я не совсем понимаю, о чем идет речь, но для меня это выглядит как полная чушь, и опять же это не то же самое, что и два вышеупомянутых.

Что дает? Должно быть четко определено - без догадок - как должны выглядеть данные, которые вы предоставляете? В конце концов, что можно сделать, так это прочитать исходные значения и позволить пользователю подкрутить некоторые ползунки в любом случае (и опционально сохранить этот блоб на диск с пользовательским конфигом), но все же... для того, чтобы изменить эти значения, нужно знать, что это такое и что ожидается.

Кто-нибудь делал (и тестировал!) это раньше и знает, какой вариант правильный?

8
задан Damon 2 December 2011 в 16:41
поделиться