diff scripts/image/imagesc.m @ 17692:38cf56b77274

Overhaul image, imagesc to use newplot and support low-level invocation form. * scripts/image/image.m: New variable do_new indicates high-level calling form. For high-level invocation, call newplot before __img__. Correct linearity check if vectors are reversed (high-to-low values). Only apply image properties to axes if doing a high-level invocation. * scripts/image/imagesc.m: New variable do_new indicates high-level calling form. Delete subfunction __imagesc__ and incorporate minimal amount of code into imagesc. Only apply climits for high-level invocation.
author Rik <rik@octave.org>
date Fri, 18 Oct 2013 16:27:44 -0700
parents dd8db3f1c1da
children d63878346099
line wrap: on
line diff
--- a/scripts/image/imagesc.m	Fri Oct 18 23:44:44 2013 +0200
+++ b/scripts/image/imagesc.m	Fri Oct 18 16:27:44 2013 -0700
@@ -52,23 +52,66 @@
 
 function h = imagesc (varargin)
 
-  if (nargin < 1 || nargin > 4)
+  [hax, varargin, nargin] = __plt_get_axis_arg__ ("imagesc", varargin{:});
+
+  chararg = find (cellfun ("isclass", varargin, "char"), 1, "first");
+
+  do_new = true;
+  if (nargin == 0)
     print_usage ();
-  elseif (isscalar (varargin{1}) && ishandle (varargin{1}))
-    hax = varargin{1};
-    if (! isaxes (hax))
-      error ("imagesc: HAX argument must be an axes object");
+  elseif (chararg == 1)
+    ## Low-Level syntax
+    do_new = false;
+    img = x = y = climits = [];
+  elseif (nargin == 1 || chararg == 2)
+    img = varargin{1};
+    x = y = climits = [];
+  elseif (nargin == 2 || chararg == 3)
+    img = varargin{1};
+    climits = varargin{2};
+    x = y = [];
+  elseif (nargin == 3 || chararg == 4)
+    x = varargin{1};
+    y = varargin{2};
+    img = varargin{3};
+    climits = [];
+  elseif (nargin == 4 || chararg == 5)
+    x = varargin{1};
+    y = varargin{2};
+    img = varargin{3};
+    climits = varargin{4};
+  endif
+
+  oldfig = [];
+  if (! isempty (hax))
+    oldfig = get (0, "currentfigure");
+  endif
+  unwind_protect
+    if (do_new)
+      hax = newplot (hax);
+    elseif (isempty (hax))
+      hax = gca ();
     endif
-    oldh = gca ();
-    unwind_protect
-      axes (h);
-      htmp = __imagesc__ (hax, varargin{2:end});
-    unwind_protect_cleanup
-      axes (oldh);
-    end_unwind_protect
-  else
-    htmp = __imagesc__ (gca (), varargin{:});
-  endif
+
+    if (do_new)
+      htmp = image (x, y, img, "cdatamapping", "scaled", varargin{chararg:end});
+    else
+      htmp = image ("cdatamapping", "scaled", varargin{:});
+    endif
+
+    if (do_new && ! ishold (hax))
+      ## use given climits or guess them from the matrix
+      if (numel (climits) == 2 && climits(1) <= climits(2))
+        set (hax, "clim", climits);
+      elseif (! isempty (climits))
+        error ("imagesc: CLIMITS must be in form [lo, hi]");
+      endif
+    endif
+  unwind_protect_cleanup
+    if (! isempty (oldfig))
+      set (0, "currentfigure", oldfig);
+    endif
+  end_unwind_protect
 
   if (nargout > 0)
     h = htmp;
@@ -76,31 +119,6 @@
 
 endfunction
 
-function h = __imagesc__ (ax, x, y, img, climits)
-
-  if (nargin == 2)
-    img = x;
-    x = y = climits = [];
-  elseif (nargin == 3)
-    img = x;
-    climits = y;
-    x = y = [];
-  elseif (nargin == 4 && ! isscalar (x) && ! isscalar (y) && ! isscalar (img))
-    climits = [];
-  endif
-
-  h = image (ax, x, y, img);
-  set (h, "cdatamapping", "scaled");
-
-  ## use given climits or guess them from the matrix
-  if (numel (climits) == 2 && climits(1) <= climits(2))
-    set (ax, "clim", climits);
-  elseif (! isempty (climits))
-    error ("imagesc: CLIMITS must be in form [lo, hi]");
-  endif
-
-endfunction
-
 
 %!demo
 %! clf;