changeset 21801:4acfe6a99a9f

Improve parsing of input arguments in __patch__.m (bug #48038). * __patch__.m: Improve recognition of color spec in input parameters. Let "set" check the rest of the input parameters.
author mmuetzel <markus.muetzel@gmx.de>
date Tue, 31 May 2016 16:49:46 +0200
parents 0eefa882bcc7
children 66972e1679df
files scripts/plot/draw/private/__patch__.m
diffstat 1 files changed, 24 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/plot/draw/private/__patch__.m	Wed Jun 01 18:24:52 2016 -0500
+++ b/scripts/plot/draw/private/__patch__.m	Tue May 31 16:49:46 2016 +0200
@@ -36,16 +36,6 @@
 
   if (isempty (varargin))
     args = varargin;
-  elseif (isstruct (varargin{1}))
-    if (isfield (varargin{1}, "vertices") && isfield (varargin{1}, "faces"))
-      fvs = varargin{1};
-      fvc = cell (1, 2*numfields (fvs));
-      fvc(1:2:end) = fieldnames (fvs);
-      fvc(2:2:end) = struct2cell (fvs);
-      args = [fvc(:)', varargin(2:end)];
-    else
-      failed = true;
-    endif
   elseif (is_numeric_arg(1))
     if (nargin < 3 || ! is_numeric_arg(2))
       failed = true;
@@ -59,25 +49,25 @@
       elseif (nargin > 3 && all (is_numeric_arg(1:3)))
         x = varargin{1};
         y = varargin{2};
-        iarg = 4;
-        if (rem (nargin - iarg, 2) == 1)
-          c = varargin{iarg};
+        if (nargin > 4 && iscolorspec (varargin{4}))
           z = varargin{3};
+          c = varargin{4};
           iarg = 5;
         else
           z = [];
           c = varargin{3};
+          iarg = 4;
         endif
       elseif (nargin > 2 && all (is_numeric_arg(1:2)))
         x = varargin{1};
         y = varargin{2};
         z = [];
-        iarg = 3;
-        if (rem (nargin - iarg, 2) == 1)
-          c = varargin{iarg};
-          iarg += 1;
+        if (iscolorspec (varargin{3}))
+          c = varargin{3};
+          iarg = 4;
         else
           c = [];
+          iarg = 3;
         endif
       endif
 
@@ -159,8 +149,7 @@
             error ("patch: size of X, Y, and C must be equal");
           endif
         endif
-      elseif (ischar (c) && rem (nargin - iarg, 2) == 0)
-        ## Assume any additional argument over an even number is a color string.
+      elseif (iscolorspec (c))
         args{7} = "facecolor";
         args{8} = tolower (c);
         args{9} = "cdata";
@@ -172,7 +161,11 @@
         args{10} = [];
       endif
 
-      args = [args, varargin(iarg:end)];
+      if (mod (numel (varargin) - iarg + 1, 2) != 0)
+        failed = true;
+      else
+        args = [args, varargin(iarg:end)];
+      endif
     endif
   else
     args = varargin;
@@ -184,3 +177,14 @@
 
 endfunction
 
+function retval = iscolorspec (arg)
+  retval = false;
+  if (ischar (arg))
+    persistent colors = {"y", "yellow", "r", "red", "m", "magenta", ...
+                         "c", "cyan", "g", "green", "b", "blue", ...
+                         "w", "white", "k", "black"};
+    if (any (strcmpi (arg, colors)))
+      retval = true;
+    endif
+  endif
+endfunction