function BackupCluts(screenIds)
% Backup current clut gamma tables of screens for later restoration via RestoreCluts().
%
% Usage:
%
% BackupCluts([screenIds=all]);
%
% Saves all cluts/gamma tables of all connected display screens by default,
% or of specified vector 'screenIds' to a global variable. The cluts can be
% restored from this backup copy by simply calling "RestoreCluts". This is
% also done automatically if "sca" is executed at the end of a session.
%

% History:
% 28.09.2010   mk   Written.
% 02.09.2019   ia   Fix screen 0 on windows causing an error.

% Store backup copies of clut's for later restoration by RestoreCluts():
global ptb_original_gfx_cluts;

% Create global clut backup cell array if it does not exist yet:
if isempty(ptb_original_gfx_cluts)
    % Create 10 slots for out up to 10 screens:
    ptb_original_gfx_cluts = cell(10,1);
end

% If no specific vector of screenids given, backup all screens:
if nargin < 1
    screenIds = [];
end

if isempty(screenIds)
    screenIds = Screen('Screens');
end
if IsWin && length(screenIds) > 1 %we have more than one screen on windows
    screenIds(screenIds==0) = []; % remove screens with 0 index
end

for screenid = screenIds
    % Do we have already a backed up original clut for 'screenid'?
    % If so, we don't store this clut, as an earlier invocation of a clut
    % manipulation command will have stored the really real original lut:
    if isempty(ptb_original_gfx_cluts{screenid + 1})
        % Nope:

        % Retrieve current clut for screen 'screenid':
        oldClut = Screen('ReadNormalizedGammaTable', screenid);

        % Store backup:
        ptb_original_gfx_cluts{screenid + 1} = oldClut;
    end
end

return;
