DisplayGamma
导航: 使用 ADLX 进行编程 → ADLX 示例 → C 示例 → Display
演示了如何使用 ADLX 编程获取显示 gamma 并执行相关操作。
命令提示符
| 命令提示符 | 描述 |
|---|---|
| 1 | 显示 gamma 支持。 |
| 2 | 显示当前 gamma 信息。 |
| 3 | 使用预定义的系数设置 ReGammaSRGB。 |
| 4 | 使用自定义系数设置 ReGamma。 |
| 5 | 使用文件中的 ramp 设置 ReGamma[文件路径: output-night-light.txt]。 |
| 6 | 使用内存中的 ramp 进行 ReGamma。 |
| 7 | 重置 gamma ramp。 |
| M/m | 显示命令提示符菜单。 |
| Q/q | 终止应用程序。 |
示例路径
/Samples/C/Display/DisplayGamma
C
代码
C
//// Copyright Advanced Micro Devices, Inc. All rights reserved.////-------------------------------------------------------------------------------------------------
/// \file mainDisplayGamma.c/// \brief Demonstrates how to obtain the display gamma when programming with ADLX and perform related operations.
#include "SDK/ADLXHelper/Windows/C/ADLXHelper.h"#include "SDK/Include/IDisplayGamma.h"#include "SDK/Include/IDisplays.h"#include <math.h>
// Print gamma rampstatic void ShowGammaRamp(ADLX_GammaRamp gammaRamp){ for (int j = 0; j < 3; j++) { printf("\nGetGammaRamp [%c]:\n", (j == 0) ? 'R' : ((j == 1) ? 'G' : (j == 2) ? 'B' : 'E')); for (int i = 0; i < 256; i++) { printf("%05d ", gammaRamp.gamma[i + j * 256]); if (i % 10 == 9) printf("\n"); } } printf("\n");}
// Create regamma rampADLX_GammaRamp CreateReGammaRamp(const float fGamma){ ADLX_GammaRamp ramp; double g_fGammaRemapRGB[3] = { 1,1,0.5 }; for (int j = 0; j < 3; j++) { for (int i = 0; i < 256; i++) {
float nAdj = i / 255.0f; if (nAdj < 0.0031308f) { nAdj = nAdj * 12.92f; } else { nAdj = (1 + 0.055f) * powf(nAdj, 1 / fGamma) - 0.055f; if (nAdj < 0.0f) nAdj = 0.0f; } ramp.gamma[i + j * 256] = (unsigned short)(1 * g_fGammaRemapRGB[j] * (int)(nAdj * 0xFFFF)); } } return ramp;}
// Display gamma supportvoid ShowDisplayGammaSupport(IADLXDisplayServices* displayService, IADLXDisplay* display){ // Get display gamma IADLXDisplayGamma* displayGamma = NULL; ADLX_RESULT res = displayService->pVtbl->GetGamma(displayService, display, &displayGamma); adlx_bool support = false; if (ADLX_SUCCEEDED(res)) { printf(" === Re-Gamma supported status ===\n"); res = displayGamma->pVtbl->IsSupportedReGammaSRGB(displayGamma, &support); if (ADLX_SUCCEEDED(res)) printf("\tIs sRGB re-gamma supported on this display: %d\n", support); res = displayGamma->pVtbl->IsSupportedReGammaBT709(displayGamma, &support); if (ADLX_SUCCEEDED(res)) printf("\tIs BT709 re-gamma supported on this display: %d\n", support); res = displayGamma->pVtbl->IsSupportedReGammaPQ(displayGamma, &support); if (ADLX_SUCCEEDED(res)) printf("\tIs PQ re-gamma supported on this display: %d\n", support); res = displayGamma->pVtbl->IsSupportedReGammaPQ2084Interim(displayGamma, &support); if (ADLX_SUCCEEDED(res)) printf("\tIs PQ2084Interim re-gamma supported on this display: %d\n", support); res = displayGamma->pVtbl->IsSupportedReGamma36(displayGamma, &support); if (ADLX_SUCCEEDED(res)) printf("\tIs 3.6 re-gamma supported on this display:%d\n", support); }
// Release the displayGamma interface if (NULL != displayGamma) { displayGamma->pVtbl->Release(displayGamma); displayGamma = NULL; }}
// Get current gamma statevoid GetCurrentGammaState(IADLXDisplayServices* displayService, IADLXDisplay* display){ // Get display gamma IADLXDisplayGamma* displayGamma; ADLX_RESULT res = displayService->pVtbl->GetGamma(displayService, display, &displayGamma); if (ADLX_SUCCEEDED(res)) { printf(" === Current gamma state ===\n"); adlx_bool applied = false; ADLX_RESULT res = ADLX_FAIL; ADLX_GammaRamp ramp; ADLX_RegammaCoeff coeff;
res = displayGamma->pVtbl->IsCurrentReGammaSRGB(displayGamma, &applied); if (ADLX_SUCCEEDED(res)) printf("\t Is sRGB re-gamma used by this display: %d\n", applied); res = displayGamma->pVtbl->IsCurrentReGammaBT709(displayGamma, &applied); if (ADLX_SUCCEEDED(res)) printf("\tIs BT709 re-gamma used by this display: %d\n", applied); res = displayGamma->pVtbl->IsCurrentReGammaPQ(displayGamma, &applied); if (ADLX_SUCCEEDED(res)) printf("\tIs PQ re-gamma used by this display: %d\n", applied); res = displayGamma->pVtbl->IsCurrentReGammaPQ2084Interim(displayGamma, &applied); if (ADLX_SUCCEEDED(res)) printf("\tIs PQ2084Interim re-gamma used by this display %d\n", applied); res = displayGamma->pVtbl->IsCurrentReGamma36(displayGamma, &applied); if (ADLX_SUCCEEDED(res)) printf("\tIs 3.6 re-gamma used by this display %d\n", applied);
adlx_bool curCoeff; res = displayGamma->pVtbl->IsCurrentRegammaCoefficient(displayGamma, &curCoeff); if (ADLX_SUCCEEDED(res)) printf("\tIs re-gamma coefficient used by this display %d\n", curCoeff);
adlx_bool reGammaRamp = false; adlx_bool deGammaRamp = false; displayGamma->pVtbl->IsCurrentReGammaRamp(displayGamma, &reGammaRamp); displayGamma->pVtbl->IsCurrentDeGammaRamp(displayGamma, &deGammaRamp); if (reGammaRamp) { displayGamma->pVtbl->GetGammaRamp(displayGamma, &ramp); printf("\tCurrent regamma ramp"); ShowGammaRamp(ramp); } else if (deGammaRamp) { displayGamma->pVtbl->GetGammaRamp(displayGamma, &ramp); printf("\tCurrent degamma ramp"); ShowGammaRamp(ramp); } else if (curCoeff) { displayGamma->pVtbl->GetGammaCoefficient(displayGamma, &coeff); printf("\tCurrent gamma coefficent"); printf("\tGet gamma coefficient:\n" "\tA0 %d, A1 %d, A2 %d, A3 %d, Gamma %d\n", coeff.coefficientA0, coeff.coefficientA1, coeff.coefficientA2, coeff.coefficientA3, coeff.gamma); } }
// Release the displayGamma interface if (NULL != displayGamma) { displayGamma->pVtbl->Release(displayGamma); displayGamma = NULL; }}
// If 0 is retuned SetGammaWithCustomcoeffient is succesfully set else an error occured.ADLX_RESULT SetGammaWithCustomCoeffs(IADLXDisplayServices* displayService, IADLXDisplay* display){ // Get displayGamma IADLXDisplayGamma* displayGamma; ADLX_RESULT res = displayService->pVtbl->GetGamma(displayService, display, &displayGamma); if (ADLX_SUCCEEDED(res)) { printf("\t\tPlease enter five integer numbers, separated by spaces(eg: 31308 12920 55 55 2400): \n ");
ADLX_RESULT res = ADLX_OK; ADLX_RegammaCoeff coeff = {0}; int userKey = 0; int coeffs[5] = {31308, 12920, 55, 55, 2400};
for (int i = 0; i < 5; i++) { scanf_s("%d", &coeffs[i]); } coeff.coefficientA0 = coeffs[0]; coeff.coefficientA1 = coeffs[1]; coeff.coefficientA2 = coeffs[2]; coeff.coefficientA3 = coeffs[3]; coeff.gamma = coeffs[4]; res = displayGamma->pVtbl->SetReGammaCoefficient(displayGamma, coeff); }
// Release the displayGamma interface if (NULL != displayGamma) { displayGamma->pVtbl->Release(displayGamma); displayGamma = NULL; }
return res;}
// Set Gammavoid SetGamma(IADLXDisplayServices* displayService, IADLXDisplay* display, int key){ // Get displayGamma IADLXDisplayGamma* displayGamma = NULL; ADLX_RESULT res = displayService->pVtbl->GetGamma(displayService, display, &displayGamma); if (ADLX_SUCCEEDED(res)) { printf(" === Set gamma ===\n"); ADLX_RESULT res = ADLX_OK;
switch (key) { // Use preset coefficients for ReGammaSRGB case 0: res = displayGamma->pVtbl->SetReGammaSRGB(displayGamma); break;
// Use custom coefficients case 1: res = SetGammaWithCustomCoeffs(displayService, display); break;
// Use ramp form file, file path: output-night-light.txt case 2: res = displayGamma->pVtbl->SetReGammaRamp_File(displayGamma, "output-night-light.txt"); break;
// Use ramp from memory case 3: { const float reGammaF = 2.4f; ADLX_GammaRamp ramp = CreateReGammaRamp(reGammaF); res = displayGamma->pVtbl->SetReGammaRamp_Memory(displayGamma, ramp); } break;
// Reset gamma ramp case 4: res = displayGamma->pVtbl->ResetGammaRamp(displayGamma); break;
default: break; } printf("\treturn is: %d (0 means Success)\n", res); }
// Release the displayGamma interface if (NULL != displayGamma) { displayGamma->pVtbl->Release(displayGamma); displayGamma = NULL; }}
// Main menuvoid MainMenu(){ printf("\tChoose from following options\n");
printf("\t->Press 1 to show display gamma support\n");
printf("\t->Press 2 to display current gamma info\n");
printf("\t->Press 3 to set ReGammaSRGB using predefined coefficients\n"); printf("\t->Press 4 to set ReGamma using custom coefficients\n"); printf("\t->Press 5 to set ReGamma using ramp from file[file path: ../output-night-light.txt]\n"); printf("\t->Press 6 to set ReGamma using ramp from memory\n"); printf("\t->Press 7 to reset gamma ramp\n");
printf("\t->Press Q/q to terminate the application\n"); printf("\t->Press M/m to display the main menu options\n");}
// Menu action controlvoid MenuControl(IADLXDisplayServices* displayService, IADLXDisplay* display){ int num = 0; while ((num = getchar()) != 'q' && num != 'Q') { switch (num) { // Display gamma support case '1': ShowDisplayGammaSupport(displayService, display); break;
// Get current gamma state case '2': GetCurrentGammaState(displayService, display); break;
// Set gamma case '3': case '4': case '5': case '6': case '7': case '8': SetGamma(displayService, display, num - '3'); break;
// Display main menu options case 'm': case 'M': MainMenu(); break;
default: break; } }}
// Wait for exit with error messageint WaitAndExit(const char* msg, const int retCode){ // Printout the message and pause to see it before returning the desired code if (NULL != msg) printf("%s\n", msg);
system("pause"); return retCode;}
int main(){ // Define return code ADLX_RESULT res = ADLX_FAIL;
// Initialize ADLX res = ADLXHelper_Initialize(); if (ADLX_SUCCEEDED(res)) { // Get system services IADLXSystem* sys = ADLXHelper_GetSystemServices();
// Get display services IADLXDisplayServices* displayService = NULL; res = sys->pVtbl->GetDisplaysServices(sys, &displayService); if (ADLX_SUCCEEDED(res)) { // Get display list IADLXDisplayList* displayList = NULL; res = displayService->pVtbl->GetDisplays(displayService, &displayList); if (ADLX_SUCCEEDED(res)) { // Inspect for the first display in the list adlx_uint it = 0; IADLXDisplay* display = NULL; res = displayList->pVtbl->At_DisplayList(displayList, it, &display); if (ADLX_SUCCEEDED(res)) { // Display main menu options MainMenu(); // Get and execute the choice MenuControl(displayService, display); }
// Release the display interface if (NULL != display) { display->pVtbl->Release(display); display = NULL; } }
// Release the displayList interface if (NULL != displayList) { displayList->pVtbl->Release(displayList); displayList = NULL; } }
// Release the displayService inetrface if (NULL != displayService) { displayService->pVtbl->Release(displayService); displayService = NULL; } } else { return WaitAndExit("ADLX initialization failed", 0); }
// Destroy ADLX res = ADLXHelper_Terminate(); printf("Destroy ADLX res: %d\n", res);
// Pause to see the print out system("pause");
return 0;}