function [cmap, warnstr] = pr_getcmap(acmapname)
% Get colormap of name acmapname
% FORMAT [cmap, warnstr] = pr_getcmap(acmapname)
%
% Inputs
% acmapname   - string.  Can be (in order of precedence)
%               - matrix name in base workspace
%               - colour name; one of 'red','green','blue','cyan',
%                 'magenta', 'yellow', 'black', 'white'
%               - filename of .mat or .lut file.  If filename has no
%                 extension, assumes '.mat' extension
%
% Outputs
% cmap        - Nx3 colormap matrix
%               or empty if fails
% warnstr     - warning message if fails
%__________________________________________________________________________

% Copyright (C) 2005-2022 Matthew Brett


cmap = []; warnstr = [];
if nargin < 1
    acmapname = '';
end
if isempty(acmapname)
    warnstr = 'No colormap name passed';
    return
end
% try a matrix first
cmap = evalin('base',acmapname,'[]');
if ~isempty(cmap)
    if size(cmap, 2)~=3
        warnstr = ['Colormap matrix ' acmapname ' was not N by 3'];
        cmap = [];
    end
    return
end
% not a matrix, is it...
% a colour name?
tmp = strcmpi(acmapname, {'red','green','blue','cyan', 'magenta', ...
    'yellow', 'black', 'white'});
coldefs = [1 0 0;
    0 1 0;
    0 0 1;
    0 1 1;
    1 0 1;
    1 1 0;
    0 0 0;
    1 1 1];

if any(tmp)
    coldef = coldefs(tmp, :);
    if ~any(diff(coldef))
        cmap = coldef;
    else
        cmap = (0:63)' * coldef / 63;
    end
    return
end
% is it a file?
oname = acmapname;
[p,f,e] = fileparts(acmapname);
% if no extension, add .mat
if isempty(e)
    e = '.mat';
    acmapname = fullfile(p, [f e]);
end
ef = exist(acmapname, 'file');
% file doesn't exist? Try home directory of this mfile
if ~ef
    mfp = fileparts(which(mfilename));
    acmapname = fullfile(mfp, [f e]);
    ef = exist(acmapname, 'file');
end
if ~ef
    warnstr = ['No matrix or file ''' oname ''''];
    return
end
% found file, get cmap
switch lower(e)
    case '.mat'
        % try for matrix of same name
        s = load(acmapname);
        if isfield(s, f)
            cmap = getfield(s, f);
        else % get first matrix in mat file
            s = struct2cell(s);
            cmap = s{1};
        end
        if size(cmap, 2)~=3
            warnstr = ['Colormap from ' acmapname ' was not an N by 3 matrix'];
            cmap = [];
        end
    case '.lut'
        fid = fopen(acmapname, 'rb');
        if fid~=-1
            cmap = fread(fid, Inf);
            l = length(cmap);
            if ~rem(l,3)
                cmap = reshape(cmap, l/3, 3) / 255;
            else
                warnstr = ['LUT map ' acmapname ' was wrong size'];
            end
            fclose(fid);
        else
            warnstr = ['Cannot open LUT colormap file ' acmapname];
        end
    otherwise
        warnstr = ['Unrecognized file extension ' e ' for ' acmapname];
end
