DisplayGamut
Demonstrates how to obtain the display Gamut when programming with ADLX and perform related tests.
Command Prompts
Command Prompt | Description |
---|---|
1 | Display gamut support. |
2 | Get current display gamut information. |
3 | Set predefined white point and predefined gamut space. |
4 | Set custom white point and predefined gamut space. |
5 | Set predefined white point and custom gamut space. |
6 | Set custom white point and custom gamut space. |
M/m | Display the command prompt menu. |
Q/q | Terminate the application. |
Sample Path
/Samples/CPP/Display/DisplayGamut
Code
//
// Copyright (c) 2021 - 2024 Advanced Micro Devices, Inc. All rights reserved.
//
//-------------------------------------------------------------------------------------------------
#include "SDK/ADLXHelper/Windows/Cpp/ADLXHelper.h"
#include "SDK/Include/IDisplayGamut.h"
#include "SDK/Include/IDisplays.h"
#include <iostream>
#include <string>
// Use adlx namespace
using namespace adlx;
// ADLXHelper instance
// No outstanding interfaces from ADLX must exist when ADLX is destroyed.
// Use global variables to ensure validity of the interface.
static ADLXHelper g_ADLXHelp;
// Show display gamut support
void ShowDisplayGamutSupport(const IADLXDisplayServicesPtr& displayService, const IADLXDisplayPtr& display);
// Get and display gamut information, it contains white point and color space
void GetCurrentGamutInfo(const IADLXDisplayServicesPtr& displayService, const IADLXDisplayPtr& display);
// Set gamut(white point and color space)
void SetGamut(const IADLXDisplayServicesPtr& displayService, const IADLXDisplayPtr& display, const int key);
// main menu
void MainMenu();
// menu action control
void MenuControl(const IADLXDisplayServicesPtr& displayService, const IADLXDisplayPtr& display);
// Wait for exit with error message
int WaitAndExit(const char* msg, const int retCode);
int main()
{
// Define return code
ADLX_RESULT res = ADLX_FAIL ;
// Initialize ADLX
res = g_ADLXHelp.Initialize();
if (ADLX_SUCCEEDED (res))
{
// Get display service
IADLXDisplayServicesPtr displayService;
res = g_ADLXHelp.GetSystemServices()->GetDisplaysServices(&displayService);
if (ADLX_SUCCEEDED (res))
{
// Get display list
IADLXDisplayListPtr displayList;
res = displayService->GetDisplays(&displayList);
if (ADLX_SUCCEEDED (res))
{
// Inspect for the first display in the list
adlx_uint it = 0;
IADLXDisplayPtr display;
res = displayList->At(it, &display);
if (ADLX_SUCCEEDED (res))
{
// Show a menu with options to chose from
MainMenu();
// Get and execute the choice
MenuControl(displayService, display);
}
}
else
{
std::cout << "Failed to get the Displays list" << std::endl;
}
}
else
{
std::cout << "Failed to get the Display Services" << std::endl;
}
}
else
{
return WaitAndExit("ADLX initialization failed", 0);
}
// Destroy ADLX
res = g_ADLXHelp.Terminate();
std::cout << "Destroy ADLX res: " << res << std::endl;
// Pause for user see the print out
system("pause");
return 0;
}
// Show display Gamut support
void ShowDisplayGamutSupport(const IADLXDisplayServicesPtr& displayService, const IADLXDisplayPtr& display)
{
// Get displayGamut
IADLXDisplayGamutPtr displayGamut;
ADLX_RESULT res = displayService->GetGamut(display, &displayGamut);
if (ADLX_SUCCEEDED (res))
{
adlx_bool supported = false;
std::cout << " === Gamut Space supported status ===" << std::endl;
res = displayGamut->IsSupportedCCIR709ColorSpace(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedGamut_CCIR_709: " << supported << std::endl;
res = displayGamut->IsSupportedCCIR601ColorSpace(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedGamut_CCIR_601: " << supported << std::endl;
res = displayGamut->IsSupportedAdobeRgbColorSpace(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedGamut_Adobe_RGB: " << supported << std::endl;
res = displayGamut->IsSupportedCIERgbColorSpace(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedGamut_CIE_RGB: " << supported << std::endl;
res = displayGamut->IsSupportedCCIR2020ColorSpace(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedCCIR2020ColorSpace: " << supported << std::endl;
res = displayGamut->IsSupportedCustomColorSpace(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedGamut_Custom: " << supported << std::endl;
std::cout << " === White point supported status ===" << std::endl;
res = displayGamut->IsSupported5000kWhitePoint(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedWhitePoint_5000k: " << supported << std::endl;
res = displayGamut->IsSupported6500kWhitePoint(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedWhitePoint_6500k: " << supported << std::endl;
res = displayGamut->IsSupported7500kWhitePoint(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedWhitePoint_7500k: " << supported << std::endl;
res = displayGamut->IsSupported9300kWhitePoint(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedWhitePoint_9300k: " << supported << std::endl;
res = displayGamut->IsSupportedCustomWhitePoint(&supported);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsSupportedWhitePoint_Custom: " << supported << std::endl;
}
}
// Get and show Gamut information, it contains white point and color space
void GetCurrentGamutInfo(const IADLXDisplayServicesPtr& displayService, const IADLXDisplayPtr& display)
{
// Get displayGamut
IADLXDisplayGamutPtr displayGamut;
ADLX_RESULT res = displayService->GetGamut(display, &displayGamut);
if (ADLX_SUCCEEDED (res))
{
adlx_bool applied = false;
ADLX_RESULT res = ADLX_FAIL ;
std::cout << " === Currnt White point status ===" << std::endl;
res = displayGamut->IsCurrent5000kWhitePoint(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentWhitePoint_5000k: " << applied << std::endl;
res = displayGamut->IsCurrent6500kWhitePoint(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentWhitePoint_6500k: " << applied << std::endl;
res = displayGamut->IsCurrent7500kWhitePoint(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentWhitePoint_7500k: " << applied << std::endl;
res = displayGamut->IsCurrent9300kWhitePoint(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentWhitePoint_9300k: " << applied << std::endl;
res = displayGamut->IsCurrentCustomWhitePoint(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentWhitePoint_Custom: " << applied << std::endl;
ADLX_Point point = {0};
res = displayGamut->GetWhitePoint(&point);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tGetWhitePoint: ( " << point.x << ", " << point.y << " )" << std::endl;
std::cout << " === Currnt gamut space status ===" << std::endl;
res = displayGamut->IsCurrentCCIR709ColorSpace(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentGamut_CCIR_709: " << applied << std::endl;
res = displayGamut->IsCurrentCCIR601ColorSpace(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentGamut_CCIR_601: " << applied << std::endl;
res = displayGamut->IsCurrentAdobeRgbColorSpace(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentGamut_Adobe_RGB: " << applied << std::endl;
res = displayGamut->IsCurrentCIERgbColorSpace(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentGamut_CIE_RGB: " << applied << std::endl;
res = displayGamut->IsCurrentCCIR2020ColorSpace(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentCCIR2020ColorSpace: " << applied << std::endl;
res = displayGamut->IsCurrentCustomColorSpace(&applied);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tIsCurrentCustomColorSpace: " << applied << std::endl;
ADLX_GamutColorSpace gamutCoordinates = {0};
res = displayGamut->GetGamutColorSpace(&gamutCoordinates);
if (ADLX_SUCCEEDED (res))
std::cout << "\\tGetGamutColorSpace: R( " << gamutCoordinates.red .x << ", " << gamutCoordinates.red .y << " ) "
<< "G(" << gamutCoordinates.green .x << ", " << gamutCoordinates.green .y << ") "
<< "B(" << gamutCoordinates.blue .x << ", " << gamutCoordinates.blue .y << ") " << std::endl;
}
}
// Set Gamut(white point and color space)
void SetGamut(const IADLXDisplayServicesPtr& displayService, const IADLXDisplayPtr& display, const int key)
{
std::cout << " === Set white point and gamut space ===" << std::endl;
ADLX_RESULT res = ADLX_FAIL ;
ADLX_WHITE_POINT predefinedWhitePoint = WHITE_POINT_6500K ;
ADLX_GAMUT_SPACE predefinedGamutSpace = GAMUT_SPACE_ADOBE_RGB ;
ADLX_RGB customWhitePoint = {0.654108, 0.767112, 1};
ADLX_GamutColorSpace customGamutSpace =
{
{6400, 3300}, {3000, 6000}, {1500, 600}
};
// Get displayGamut
IADLXDisplayGamutPtr displayGamut;
res = displayService->GetGamut(display, &displayGamut);
if (ADLX_SUCCEEDED (res))
{
switch (key)
{
case 0:
res = displayGamut->SetGamut(predefinedWhitePoint, predefinedGamutSpace);
break;
case 1:
res = displayGamut->SetGamut(customWhitePoint, predefinedGamutSpace);
break;
case 2:
res = displayGamut->SetGamut(predefinedWhitePoint, customGamutSpace);
break;
case 3:
res = displayGamut->SetGamut(customWhitePoint, customGamutSpace);
break;
default:
break;
}
std::cout << "\\treturn code(0 is Success) is: " << res << std::endl;
}
}
// main menu
void MainMenu()
{
std::cout << "\\tChoose one from the following options" << std::endl;
std::cout << "\\t->Press 1 to show Gamut support" << std::endl;
std::cout << "\\t->Press 2 to get current display Gamut info" << std::endl;
std::cout << "\\t->Press 3 to set predefined white point and predefined Gamut space" << std::endl;
std::cout << "\\t->Press 4 to set custom white point and predefined Gamut space" << std::endl;
std::cout << "\\t->Press 5 to set predefined white point and custom Gamut space" << std::endl;
std::cout << "\\t->Press 6 to set custom white point and custom Gamut space" << std::endl;
std::cout << "\\t->Press Q/q to quit" << std::endl;
std::cout << "\\t->Press M/m to show the options again" << std::endl;
}
// menu action control
void MenuControl(const IADLXDisplayServicesPtr& displayService, const IADLXDisplayPtr& display)
{
int num = 0;
while ((num = getchar()) != 'q' && num != 'Q')
{
switch (num)
{
// Show display Gamut support
case '1':
ShowDisplayGamutSupport(displayService, display);
break;
// Get Gamut information(white point and color space)
case '2':
GetCurrentGamutInfo(displayService, display);
break;
// Set Gamut(white point and color space)
case '3':
case '4':
case '5':
case '6':
SetGamut(displayService, display, num - '3');
break;
// Show options again
case 'm':
case 'M':
MainMenu();
break;
default:
break;
}
}
}
// Wait for exit with error message
int WaitAndExit(const char* msg, const int retCode)
{
// Printout the message and pause for user to see it then return the desired code
if (nullptr != msg)
std::cout << msg << std::endl;
system("pause");
return retCode;
}