Adjust the white point, gamma or make your XDR display darker without losing HDR peak luminance or the ability to adjust display brightness
Project: https://github.com/supercurio/xdr-tuner
On the 2021 MacBook Pro M1 Pro & M1 Max running macOS Monterey 12.0.1, the "Apple XDR Display (P3-1600 nits)" and "Apple Display (P3-500 nits)" presets calibration cannot be "fine-tuned" in the display settings.
At the same time, calibrating the display using a sensor with X-Rite i1Profiler clips all the colors above SDR levels to SDR maximums, preventing the system to show HDR content.
However, there is a variation in the factory calibration between units, and the white point on yours might not perceptually matching the D65 spec, nor your other calibrated displays.
XDR Tuner lifts all the restrictions of the display presets by leveraging
the support of full dynamic range max and gamma parameters for
red/green/blue channels in ColorSync ICC profiles vcgt
tag.
This allows to change the display's white point freely without limiting losing HDR support, limiting HDR peak brightness to full-screen luminance, losing the ability to adjust brightness or introducing banding artifacts.
This is script, it will need to be launched in a terminal like
in the Terminal application.
Once your command shell is in this directory,
you will be able to launch the script with the following commands.
./xdr-tuner.py
This will create a custom profile based on your system-generated one for your display, and apply it immediately.
./xdr-tuner.py --re-apply
Useful after changing display preset in Display Preferences.
./xdr-tuner.py --auto-apply
Creates a LaunchAgents plist file to automatically load the custom profile
set currently after user login.
It will call XDR Tuner from its current directory.
Use ./xdr-tuner.py --remove-auto-apply
command to disable auto-apply.
./xdr-tuner.py --loop
Then modify configs/default.json in any text editor until you get
the desired color presentation.
Typically, you can open a white page or image and color-match
the white point of the XDR display visually with a reference monitor.
Once finished, interrupt xdr-tuner with ctrl-c.
./xdr-tuner.py --config configs/dim.json
If you find the display still too bright at the minimum brightness
allowed by the system, applying the dark config will allow to make it
darker. By changing the values for red, green and blue in the max
section, you can make the display as dark as you'd like.
Changing the gamma to values lower than 1 might help with legibility when the screen is very dim.
./xdr-tuner.py --factory
./xdr-tuner.py -a path/to/your-profile.icc
./xdr-tuner.py --help
Both functionalities will work as expected, using your tuned display profile as reference, with no difference compared to factory calibration.
- This utility was not tested yet with multiple displays connected.
Support will be added in a future version. - Switching between presets in Display Preferences resets the tuning,
which needs to be re-applied manually. It looks like a bug in macOS
color management, which should re-apply the current profile by itself.
I recommend using the command./xdr-tuner.py --r
to re-apply the custom profile. - No GUI: someone experienced with macOS gui app development is welcome to contribute a gui for this, or use this script as a mean to generate and apply the profiles. The license is liberal so maybe you will create your own utility inspired by this. Would appreciate a mention and shout out!
- Ultimately, I think Apple should provide this capability out of the box in a system update. Hopefully, various display calibration software will gain full HDR support. This is still very new.
- Better error management needs to be implemented
Please report any issue encountered in the dedicated section on Github.
This will help me or contributors to improve this software.
After recently receiving my 2021 MacBook Pro 16.2, I was happy with the device overall but really bummed that its display had too much blue and green, giving a greyish-green tint to all content displays.
Exploring the tuning option offered and trying i1Profiler led to unsatisfactory results as I didn't want to give up on 1600-nits HDR peak brightness nor the ability to adjust display brightness, including automatically with the light sensor.
My options were to return it, wait 2 months for a new custom order to be fulfilled and hope for the best on the new factory calibration, or give it for repair, giving up the ability to return it later and with unknown results.
So I decided to use all this frustration as motivation and leveraged my experience with display calibration and development.
And I'm very happy with the results :D
This solves all the problems I had with color matching displays.
Tuning is also a lot easier than by setting Yxy coordinates in
Apple's solution, which is currently not very useful as the
popular colorimeter sensors are lacking corrections matrices for the
new type of phosphors the Liquid Retina XDR display are using.
Very few people can access a high resolution spectrophotometer that
which is required to do a real D65 and colorspace calibration on this
panel otherwise.
I tested my old i1Pro, its results are worthless with all the illuminant observer
types known.
Thanks to Timothy Sutton with customdisplayprofiles and Chromium authors with color_profile_manager_mac.py for the inspiration and sample code.
François Simond (supercurio)
https://twitter.com/supercurio