]> Creatis software - CreaPhase.git/blob - octave_packages/m/plot/whitebg.m
update packages
[CreaPhase.git] / octave_packages / m / plot / whitebg.m
1 ## Copyright (C) 2010-2012 David Bateman
2 ##
3 ## This file is part of Octave.
4 ##
5 ## Octave is free software; you can redistribute it and/or modify it
6 ## under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation; either version 3 of the License, or (at
8 ## your option) any later version.
9 ##
10 ## Octave is distributed in the hope that it will be useful, but
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 ## General Public License for more details.
14 ##
15 ## You should have received a copy of the GNU General Public License
16 ## along with Octave; see the file COPYING.  If not, see
17 ## <http://www.gnu.org/licenses/>.
18
19 ## -*- texinfo -*-
20 ## @deftypefn  {Function File} {} whitebg ()
21 ## @deftypefnx {Function File} {} whitebg (@var{color})
22 ## @deftypefnx {Function File} {} whitebg ("none")
23 ## @deftypefnx {Function File} {} whitebg (@var{fig})
24 ## @deftypefnx {Function File} {} whitebg (@var{fig}, @var{color})
25 ## @deftypefnx {Function File} {} whitebg (@var{fig}, "none")
26 ## Invert the colors in the current color scheme.  The root properties are
27 ## also inverted such that all subsequent plot use the new color scheme.
28 ##
29 ## If defined, @var{fig} is the handle to the figure to be inverted.  In
30 ## this case only the specified figure has its color properties changed.
31 ##
32 ## If the optional argument @var{color} is present then the background color
33 ## is set to @var{color} rather than inverted.  @var{color} may be a string
34 ## representing one of the eight known colors or an RGB triplet.  The special
35 ## string argument "none" restores the plot to the default colors.
36 ## @seealso{reset}
37 ## @end deftypefn
38
39 function whitebg (varargin)
40   h = 0;
41   color = NaN;
42
43   if (nargin > 0 && nargin < 3)
44     if (ishandle (varargin{1}))
45       h = varargin{1};
46       if (nargin == 2)
47         color = varargin{2};
48       endif
49     elseif (nargin == 1)
50       color = varargin{1};
51     else
52       print_usage ();
53     endif
54   elseif (nargin != 0)
55     print_usage ();
56   endif
57
58   typ = get (h, "type");
59
60   if (strcmp (typ, "root"))
61     isroot = true;
62     fig = gcf ();
63   elseif (strcmp (typ, "figure"))
64     isroot = false;
65     fig = h;
66   else
67     error ("expecting a figure handle");
68   endif
69
70   axes = findall (fig, "type", "axes");
71   if (isnan (color))
72     ## Root figure. Set the default axes and figure properties so that
73     ## subsequent plots have the new color scheme
74     if (isroot)
75       fac = get (0, "factory");
76       fields = fieldnames (fac);
77       fieldindex = intersect (find (!cellfun ("isempty", regexp(fields, 'color'))), union (find (!cellfun ("isempty", regexp(fields, 'factoryaxes.*'))), find (!cellfun ("isempty", regexp(fields, 'factoryfigure.*')))));
78
79       ## Check whether the factory value has been replaced
80       for nf = 1 : numel (fieldindex);
81         defaultfield = strrep (fields {fieldindex (nf)}, "factory", "default");
82         try
83           defaultvalue = 1 - get (0, defaultfield {n});
84         catch
85           field = fields {fieldindex (nf)};
86           defaultvalue = 1 - subsref (fac, struct ("type", ".", "subs", field));
87         end_try_catch
88         set (0, defaultfield, defaultvalue);
89       endfor
90     endif
91
92     ## Load all objects which qualify for being searched.
93     handles = fig;
94     h = fig;
95     while (numel (handles))
96       children = [];
97       for n = 1 : numel (handles)
98         children = union (children, get(handles(n), "children"));
99       endfor
100       handles = children;
101       h = union (h, children);
102     endwhile
103
104     for nh = 1 : numel(h)
105       p = get (h (nh));
106       fields = fieldnames (p);
107       fieldindex = find (!cellfun ("isempty", regexp(fields, 'color')));
108       if (numel (fieldindex))
109         for nf = 1 : numel (fieldindex);
110           field = fields {fieldindex (nf)};
111           c = subsref (p, struct ("type", ".", "subs", field));
112           if (! ischar(c) && columns(c) == 3)
113             set (h (nh), field, 1 - c);
114           endif
115         endfor
116       endif
117
118       ## If h(nh) is a figure or axes invert default color properties
119       typ = subsref (p, struct ("type", ".", "subs", "type"));
120       if (strcmp (typ, "axes") || strcmp (typ, "figure"))
121         def = get (h (nh), "default");
122         fields = fieldnames (def);
123         if (! isempty (fields))
124           fieldindex = find (!cellfun ("isempty", regexp(fields, 'color')));
125           for nf = 1 : numel (fieldindex)
126             defaultfield = fields {fieldindex (nf)};
127             defaultvalue = 1 - subsref (def, struct ("type", ".", "subs", defaultfield));
128             set (h (nh), defaultfield, defaultvalue);
129           endfor
130         endif
131       endif
132     endfor
133   else
134     ## FIXME
135     ## Is this the right thing to do in this case?
136     set (findall (fig, "type", "axes"), "color", color);
137     if (isroot)
138       defs = get (0, "default");
139       if (isfield (defs, "defaultaxescolor")
140           && strcmp (defs.defaultaxescolor, "none"))
141         set (0, "defaultaxescolor", color);
142       endif
143     endif
144   endif
145 endfunction
146
147 %!test
148 %! dac = get (0, "defaultaxescolor");
149 %! dfc = get (0, "defaultfigurecolor");
150 %! hf = figure ("visible", "off");
151 %! unwind_protect
152 %!   l = line;
153 %!   assert (get (hf, "color"), dfc);
154 %!   assert (get (gca, "color"), dac);
155 %!   whitebg (hf);
156 %!   assert (get (hf, "color"), 1 - dfc);
157 %!   assert (get (gca, "color"), 1 - dac);
158 %!   c = [0.2 0.2 0.2];
159 %!   whitebg (hf, c);
160 %!   assert (get (hf, "color"), 1 - dfc);
161 %!   assert (get (gca, "color"), c);
162 %! unwind_protect_cleanup
163 %!   close (hf);
164 %! end_unwind_protect