Windows Vista’s Gamma Table Bug

Windows Vista has a new color-management/profiling format called Windows Color Systems. It purports to offer advanced color management and better results than the age-old (and forever dying) ICC/ICM color system. ICC has been buggy the whole way, with both political and technical issues plaguing its colorful history.

Windows Color Systems is a step in the right direction, but it comes at a very heavy price: Windows Vista no longer properly interfaces with ICC/ICM color profiles!

Anyone using the ATi Catalyst Control Center, BasicColor, ColorEye, Spyder, or any of dozen other color-management and gamma-correction programs available will have noticed the bug we’re talking about: once you lock your PC (winkey+L) the gamma LUT on your graphics card is reset.

ICC/ICM profiles have two different “parts” to them. The first is a color-correction section which “maps” the colors produced by the video card to match the correct color output as defined by your monitor. “Blue” on your monitor may be different from the “blue” on your mother’s – that’s what the monitor-calibration and gamma-correction software seeks to fix. Once you “regulate” the colors on your PC, you’re using the “real” blue, one that the color industry has reached a consensus over.

The second section of the ICC regulates the gamma output. In order to make certain colors match up, the gamma (more or less the amount of black/bright your display shows) is modified to tally-up with the correct settings. With properly-calibrated monitors, an image will display (almost) exactly the same – with the same hues, midtones, and shades; with the same brightness; and the same overall effect. Gamma plays a very important part in this, regulating the highly-varying brightness/contrast settings on monitors to produce the same image in the end.

With Windows Vista, when you first load an ICC profile, the correct color and gamma settings are applied. But when you lock the screen, log off, or do a bunch of other things, the gamma LUT is reset. The correct colors are still applied, but depending on your configuration your display might now be a garishly bright hue of green or blue!!

There is no fix, at least none that we can see. We’ve tried to apply the ICC profile to both the local account and the default system settings, we’ve disabled UAC and formatted and reformatted. We’ve tried it on nVidia and ATi, and it always happens: when you lock the PC, your gamma table is reset.

Microsoft has not yet acknowledged this issue (as a quick search for “gamma” or “ICC” in the Microsoft knowledge-base will reveal), but there is a workaround (though a poor one). The freeware DisplayProfile utility (donate to help cover hosting costs!) will show you a list of available ICC profiles and let you switch between them on the fly, but more importantly, it will also apply the gamma table settings as well.

DisplayProfile is a standalone executable. Just run it and select a profile other than the one you want to use, then switch back to the real profile in order to re-apply the gamma LUT settings. Just stick it in your quicklaunch toolbar, and whenever you unlock your PC run it to reset the gamma settings.

Hopefully Microsoft will address this issue with Windows Vista SP1 later this year. Until then, thank God for freeware!

132 thoughts on “Windows Vista’s Gamma Table Bug

  1. What’s really dumb is they now have in the built in equivalent of “Adobe Gamma” and yet on every screen save, UAC flash, or whatever you lose the very gamma setting that THEY set.

    A big duh.

  2. Reading above it seems to be a chipset/driver combination that’s susceptible to this. Still Not Good that this hasn’t been spotted and fixed. :-(

  3. I believe it is a chipset/driver issue from what I’m observing:

    # On a one NS series VAIO laptop with Vista x32 and integrated Intel GMA the problem is persistent. Still there after upgrade to Windows 7 x86

    # Another FW series VAIO laptop with ATI Mobility Radeon HD 4000 was never a problem under both Vista x86 and now Windows 7 x86. Able to have UAC pop up, hibernate, start Office 2007, plug-in and remove USB devices, etc… without having the above issue.

    # A VAIO RS series desktop with ATI X1300 card and Vista x86 has the issue. I cannot see this changing if upgraded to Windows 7 x86.

    # A final VAIO R series desktop with ATI Radeon HD 3000 is OK.

    My feeling on the matter is that it’s poor driver design and a lack of communication and ownership of the issue between M$ and hardware vendors and a lack of willingness for drivers for older and embedded graphics to be updated/corrected.

  4. Well I confirm I’ve got same matter on Windows 7 64 Bits …
    When I use DisplayProfile on a game in windowed mode all is ok , but when i play on fullscreen mod i lost my ICM profile…

    Any suggestions ?

  5. No suggestions unfortunately (I wish I did since I’m still plagued by it). What is curious is that it appear to reboot with the correct ICM/ICC profile and then soon after flips to the non-LUT-loaded version (ie: pre-ICM/ICC loaded version).

    I think John and Andrew may be correct that it’s an interaction between the chipset driver implementation and Windows 7. I base this on some behaviors I get when I play with the Intel Mobile driver settings.

    It’s hard to know if this will be fixed in the shipped version since M$ hasn’t applied a patch to Windows 7 for about a month and I’m sure it has plenty to do so with. This is actually kind of dumb on their part since it makes people, including myself, wonder about the quality of the released product and if they want to wait for a purchase. The general rule of thumb is to wait until the SP1 of any M$ product gets released, but I was hoping not in this case since it does seem to otherwise run pretty well on my netbook.

  6. I have a similar set-up to you Matt – A Toshiba laptop with a Mobile Intel (R) 965 Express Chipset. However I don’t believe this has anything to do with ‘colour mamagement’ problems.
    Around 2 months ago I purchased an X-Rite Eye-One Display2 and carried out the colour profiling of my Dell 2209WA LCD monitor. I soon found out the problen re – the resetting of the ‘colour profile’.
    Having looked through several ‘forums’ I found out that this was a common problem with Vista in particular. The solutions and causes given were endless so I e-mailed X-Rite.
    They replied almost immediately stating they new of this problem and that the only solution that appeared to overcome the problem was by using ‘DISPLAY PROFILE’. They never asked for details of my computer etc. It would therefore appear the actual computer isn’t the cause but it is related to VISTA etc ‘new colour management system’.
    I find that on booting up, my monitor does accept the calibrated profile but within a very short time after, it reverts to VISTA settings. When this happens I reset the profile my means of ‘DISPLAY PROFILE’and this setting remains until such times as there are changes which you have already detailed.
    I check the GAMMA immediately after using ‘DISPLAY PROFILE’ using http://www.logam.nl/lcd-test and find it to be as calibrated ie 2.2. When reset by VISTA the gamma is nearer 1.9
    I now find I can work around this situation when editing digital images but would welcome a more reliable operating system. Just hope MICROSOFT addresses this issue in the near future.
    John D

  7. Interesting John – thanks for the follow up here.

    I guess the only question I would ask is – are you talking about Vista or Windows 7? You say Vista, but from what I understand SP1 supposedly solved the gamma/ICC problem on Vista. I have worked with two Vista SP2 laptops, including the one of which I currently type (my work laptop which uses a NVIDIA GeForce 9600M GS), and neither have had any trouble maintaining the custom color profile.

    Only my Windows 7 netbook (Toshiba NB205 with Intel 945) is having issues.

    If you really are using Vista and having the problem, maybe there is something to the Intel drivers mucking things because that would be the common denominator. Again, as far as I know, with the latest service packs the color management issues have been solved with Vista. The Windows 7 issue is new however.

    Just checking.

    Thanks!

  8. Hi Matt,
    I now find your reply to be very interesting.

    It is VISTA I have and it is updated fully including SP1 but I am still getting the conditions that I stated in my last submission. As you say the Intel, being the common denominator, may be involved in the reseting of the ‘calibrated profiles’.
    However from what I read previously in other forums computer with other graphics were also suffering similar reseting problems.
    If it is the Intel it would appear there isn’t much we can do to rectify the problem then.
    Wii be interesting to see if others follow up on the INTEL relationship.

    John D

  9. Unfortunately, I have begun to experience this as well just like I did with Vista…. Except with only a single DVI monitor plugged into my Windows 7 x64 PC running the latest version of the ATi drivers for my HD3870. :'(

  10. Thank you very much for this interesting thread. I’m runnig Windows 7 Professional on 2 machines here. On both the same issue exists: Profile info gets lost when system resumes from standby, after Windows Media Center was launched etc. pp.

    To get you some more ideas these are my 2 testing configurations:

    – Dell D420 notebook with Intel GMA 900 chipset (945 GMS)
    – Dell XPS M1330 notebook with Intel 965 Express Chipset

    I tried both systems in single and dual display mode, with a Samsung monitor and a Samsung HD TV. Always the same. The info gets lost, but the color management console still has the information about the correct profile as default. I even tried without the original Intel drivers and the error still exists.

    Very poor, MS!

    I put XCalib into a batch file to be able to restore the profiles when needed. This works, but is a lot of overhead because I need some different batch scripts for the different configurations. I thought I’d go to write an AutoIt script that loads the correct profiles depending on the configuration it finds.

    I just wanted to ask if someone here is interested in this. And is there any new information?

  11. Hi Thomas,

    You may have read my earlier comments and since then I haven’t found a solution other than making use of ‘Display Profile’.

    I downloaded ‘Display Profile’ and use it to revert to the monitor profile that I have established with the use of ‘X-Rite Eye-One Display2’ before carrying out digital editing etc.

    ‘Display Profile’ certainly corrects the Microsoft related colour profiling issue and maintains the correct colour profile as calibrated.

    John D

  12. Hello John,

    Of course I’ve read about you and some others using DisplayProfile. I tried that, too. It works, but I find it very uncomfortable because I always have to click on the appropriate profile. And using more than one monitor with different combinations becomes very uncomfortable with DisplayProfile because I have to move the program’s window to the correct monitor …

    That’s why I thought it might be useful to write a script as I mentioned. This script could find out what monitors are connected and which profile has to be assigned to each one of them.

    Thomas

  13. Sorry just trying to help. Seems you’ll have to wait a bit longer for the simple solution that you obviously require.

    John —-

  14. If you guys like, when I get the time, I can write up a quick command-line utility to auto-load display profiles.

    To speed things up: what exact functionality is required?

  15. Got it – at least for me.

    It turns out it wasn’t, and perhaps isn’t, Windows 7’s fault. It looks like some cards, particularly Intels, load their own gamma parameters whether you like it or not. So, in my case what I was seeing was on boot the colors come up correctly via Windows 7’s color management (without having to use “ColorVisionStartup” to load the LUT for my custom profile), however a few seconds later it would get overridden with the uncalibrated profile.

    Well I did some digging and it became clear that the problem seemed to be something starting up *after* Windows 7 loaded the LUT. Moreover if I set the RGB gamma in Intel GMA control panel to bizarro values and rebooted, well low and behold those bizarro gamma values were the ones getting shoved in after the correct custom profile.

    So that pretty much cinched it that Intel’s driver was mangling the LUT. More Googles later and I ran into this:

    > just wanted to tell how I stopped losing the gamma when I restart the computer.
    I learned from this blog to uncheck igfxpers.exe from the autorun.
    > (Start > Run… > msconfig > Startup)
    > http://neosmart.net/blog/2007/windows-vist…amma-table-bug/

    From:

    http://www.neowin.net/forum/index.php?showtopic=808104

    And oddly enough, disabling “igfxpers.exe” via “msconfig” does the trick. This makes sense – Windows 7 loads the LUT at boot, later as you’re logging in “igfxpers.exe” starts up and trashes you LUT.

    Now, for most PCs, disabling “igfxpers.exe” is said to be safe, however been warned for UMPCs it seems to be used to switch Intel GMA “Scheme”s at boot from low to high resolution and can cause problems if you disable it. However normal PCs should be a non-issue (to note, I ran the Intel GMA control panel to look up the “Scheme” info I just wrote and it just trashed my LUT again! – clearly it’s Intel’s stupid control stuff).

    Anyway, now the problem seems to be finding a way to report this bug with Intel (to note some NVidia cards also seem to use “igfxpers.exe” causing similar problems). And if by some miracle I can find a way to report the problem, getting them to care is probably even harder!

  16. > and perhaps isn’t, Windows 7’s fault

    I know what you mean, but how does what now appears to be faulty drivers/processes (igxfpers.exe) make it past MS’s compatibility tests? I would say it *IS* a MS problem for sure. They are allowing/passing software that is incompatible with the way Win 7 operates the LUT table.

  17. @Mahmoud Al-Qudsi:
    Thank you very much for this offer. I think XCalib already has what is needed to activate the correct profile. There’s only one thing missing: A decision which monitor has currently which index. But this might be possible to find out using the AutoIt script language. When I find the time I’ll have a look at this myself. But thank you very much again.

    @Matt Fahrner:
    I understand what you want to say. But I think from a software developer’s point of view I have to agree with Wibbly. MS simply has not done their homework. And Intel hasn’t either.

    BTW, I didn’t mention earlier, but in my case “igfxpers.exe” was disabled already. Only “igfxsrvc.exe” is still running. But this module is needed to recognize a monitor change. So disabling this would be counterproductive somehow.

    Thomas

  18. @Matt Fahrner:
    I agree, it’s definitely Intel’s fault (independent whether MS has ignored it or not). I made the same tests here. But it can’t be “igfxpers.exe” if it’s not loaded. Must be somewhere deeper in the drivers.

    As a workaround it would be in interesting if someone has an idea how to bypass the driver’s behavior or how to disable it.

  19. @Thomas

    Interesting – it definitely solved it for me. Clearly there’s more sauce involved with this goose than meets the eye. Wish I knew what to suggest.

    @All

    I’ll give you you’d think Microsoft and Intel would be joined at the hip and testing this as part of hardware certification. I still think the majority of the blame falls on Intel – clearly its their driver insisting on loading the LUT when it shouldn’t load the LUT (unless you specifically tell it to)(that is, if you haven’t manually adjusted the gammas in GMA, it should just leave the LUT alone). At a minimum they (Intel) should just give you the option to enter the custom profile into the GMA.

    That said, yes, Microsoft should have seen and fixed this given the quantity of systems using Intel based graphics out there. I think part of the issue is honestly there are relatively few people who calibrate their monitors. Moreover a lot that do are Apple users.

    I don’t really care who’s problem it is, I’m going to see if I can get a ticket in somewhere. What’s reprehensible is how hard it is to find a way to give feedback to these companies that has a chance of being viewed…

  20. @Matt All my hardware is standalone GPU units; and I’ve been previously able to reproduce this behavior on machines powered by both ATi & nVidia hardware. So I think there is something wrong on Microsoft’s end as well… or two (or more) different problems manifesting themselves with the same symptoms.

  21. @All: OK, it bothered me too much and I finally ended up with the following little script. You need some utilities to run this:

    – XCalib.exe from http://xcalib.sourceforge.net/
    – AutoIt from http://www.autoitscript.com/autoit3/

    Save the following lines between and in a text file called “ColorProfile.au3”:


    #include
    Opt('MustDeclareVars', 1)

    _Main()

    Func _Main()
    If $CmdLine[0] 3 Then
    MsgBox(0, "Set Color Profile", "Instructions:" & @LF & @LF & _
    """path_to_autoit\AutoIt.exe"" " & _
    """path_to_this_file\ColorProfile.au3"" " & _
    """name_of_monitor"" " & _
    """path_and_name_of_icc_or_icm_file"" " & _
    """path_to_XCalib\XCalib.exe""")
    Exit
    EndIf

    Local $aDevice, $i = 0

    While 1
    $aDevice = _WinAPI_EnumDisplayDevices("", $i) ; get display device data
    If Not $aDevice[0] Then ExitLoop ; done if all devices processed
    If BitAND($aDevice[3], 4) = 0 Then ; we need only real devices
    $aDevice = _WinAPI_EnumDisplayDevices($aDevice[1], 0) ; get the name of the connected monitor
    If StringInStr($aDevice[2], $CmdLine[1]) Then
    ShellExecuteWait($CmdLine[3], "-s " & $i & " -c", "", "", @SW_HIDE)
    ShellExecuteWait($CmdLine[3], "-s " & $i & " """ & $CmdLine[2] & """", "", "", @SW_HIDE)
    ExitLoop
    EndIf
    $i += 1
    EndIf
    WEnd
    EndFunc ;==>_Main

    This script is called the following way. I just give an example with shortened paths.

    “x:\path1\AutoIt3.exe” “y:\path2\ColorProfile.au3” “SyncMaster 226CW” “z:\path3\MyProfile.icc” “n:\path4\XCalib.exe”

    Where

    – path1 is the path to the AutoIt3.exe file.
    – path2 is the path to the script file.
    – “SyncMaster 226CW” is the name of the monitor the profile corresponds to. To make things easier only a significant part is needed here.
    – path3 is the path to the color profile file.
    – path4 is the path to the XCalib program file.

    I hope things became clear this way.

    I put 2 calls like these into a .bat or .cmd file to re-adjust the profiles for both monitors with one click. If you use different monitors at different times (e.g. for a notebook that is used at work and at home) you just place the calls for more monitors into this file. Monitors that cannot be found will be ignored.

    Hope that helps someone.

    Thomas

  22. @All: OK, it bothered me too much and I finally ended up with the following little script. You need some utilities to run this:

    – XCalib.exe from http://xcalib.sourceforge.net/
    – AutoIt from http://www.autoitscript.com/autoit3/

    Save the following lines between -code- and -/code- in a text file called “ColorProfile.au3”:

    #include
    Opt(?MustDeclareVars?, 1)
    
    _Main()
    
    Func _Main()
    If $CmdLine[0] 3 Then
    MsgBox(0, ?Set Color Profile?, ?Instructions:? & @LF & @LF & _
    ??"path_to_autoit\AutoIt.exe?" ? & _
    ??"path_to_this_file\ColorProfile.au3?? ? & _
    ??"name_of_monitor?" ? & _
    ??"path_and_name_of_icc_or_icm_file?" ? & _
    ??"path_to_XCalib\XCalib.exe?"?)
    Exit
    EndIf
    
    Local $aDevice, $i = 0
    
    While 1
    $aDevice = _WinAPI_EnumDisplayDevices(?", $i)	; get display device data
    If Not $aDevice[0] Then ExitLoop	 ; done if all devices processed
    If BitAND($aDevice[3], 4) = 0 Then	 ; we need only real devices
    $aDevice = _WinAPI_EnumDisplayDevices($aDevice[1], 0)	; get the name of the connected monitor
    If StringInStr($aDevice[2], $CmdLine[1]) Then
    ShellExecuteWait($CmdLine[3], ?-s ? & $i & ? -c?, ??, ??, @SW_HIDE)
    ShellExecuteWait($CmdLine[3], ?-s ? & $i & ? ??" & $CmdLine[2] & ??"?, ??, ??, @SW_HIDE)
    ExitLoop
    EndIf
    $i += 1
    EndIf
    WEnd
    EndFunc ;==>_Main
    

    This script is called the following way. I just give an example with shortened paths.

    “x:\path1\AutoIt3.exe” “y:\path2\ColorProfile.au3” “SyncMaster 226CW” “z:\path3\MyProfile.icc” “n:\path4\XCalib.exe”

    Where

    – path1 is the path to the AutoIt3.exe file.
    – path2 is the path to the script file.
    – “SyncMaster 226CW” is the name of the monitor the profile corresponds to. To make things easier only a significant part is needed here.
    – path3 is the path to the color profile file.
    – path4 is the path to the XCalib program file.

    I hope things became clear this way.

    I put 2 calls like these into a .bat or .cmd file to re-adjust the profiles for both monitors with one click. If you use different monitors at different times (e.g. for a notebook that is used at work and at home) you just place the calls for more monitors into this file. Monitors that cannot be found will be ignored.

    Hope that helps someone.

    Thomas

  23. Today I got the usual we brush you off answer from Intel. Of course they don’t or don’t want to understand the real problem. Here it is:

    Hello Thomas,

    Thank you for contacting Intel Technical Support.

    As far as I understand, you would like to disable the Intel(R) Color Correction feature that is present with the Intel(R) Graphics Media Accelerator.

    Intel provides generic versions of the Intel graphics drivers for general purposes through the Intel Download Center. As such, these drivers are designed to take control of the system graphical properties and settings once they are installed. For this reason, it is not possible to disable the Color Correction feature. However, your computer manufacturer may have altered the features, incorporated customizations, or made other changes to the graphics driver software or software packaging that they provide for your computer. Since you need a driver that acts in a more specialized way, I suggest contacting your system manufacturer so that they can provide a tailored driver to fit specific necessities (e.g. being able to disable features).

    Sincerely,

    Ronald M.
    Intel Technical Support

  24. Hmmm not a good response, sounds like passing the buck. hardware vendors are usually very bad or very slow at releasing modified drivers unless it affects mainstream gaming and applications.

  25. With Windows 7, the Color Management is governed by the Scheduler, so modifying the schedules will reinvoke it.

    1. Open the Scheduler, by typing ‘sched’ into the Start search field (bottom of Start panel).

    2. In left hand pane, drill down to: Task Scheduler (local) –> Task Scheduler Library –> Microsoft –> Windows –> WindowsColorSystem.

    3. In the central upper pane, double-click on Calibration Loader to open the Properties dialog box for it.

    4. Click on the Triggers tab to show the panel.

    5. Click on the ‘On connection to user session’ and click Edit…

    6. Check ‘Delay task for’ and edit the ’30 seconds’ option to ’10 seconds’.

    7. Click the OK button on each dialog box to close them.

    I have the following Triggers now:

    1. At log on = no delay, Repeat every 1 minute for 1 minute.

    2. On connection to user session = same as 1.

    3. On connection to user session = Delay 30 seconds, no repeat.

    4. At log on = Delay fo 15 seconds.

    5. On workstation unlock = No delay, no repeat.

  26. Thank you so much guys for the igfxpers.exe trick, I was going mad with my icc profil being dropped every time on my netbook on win 7

  27. Looks like they have a “knowledge” base article on this. They still have the attitude that their drivers color settings are more important than Window’s color settings. http://www.intel.com/support/graphics/sb/CS-031887.htm Maybe if enough people provide feedback that they shouldn’t be doing that they might actually change the driver. I know highly unlikely but you never know.

Leave a Reply

Your email address will not be published. Required fields are marked *