* Bugs 15638 15805 15806 fixed: colorbar() improved 49/20549/8
Samuel GOUGEON [Sat, 13 Oct 2018 23:34:31 +0000 (01:34 +0200)]
  http://bugzilla.scilab.org/15638 : unequal color spans
  http://bugzilla.scilab.org/15805 : bad tickings
  http://bugzilla.scilab.org/15806 : syntaxes with defaults umin, umax..

  Illustration: http://bugzilla.scilab.org/attachment.cgi?id=4817

  colorbar() help page to be updated & overhauled: will be done when
  processing http://bugzilla.scilab.org/4808

Other tests about colorbar() are OK:
test_run graphics bug_1126 show_error
test_run graphics bug_13733 show_error
test_run graphics bug_14711 show_error
test_run graphics bug_3184 show_error
test_run graphics bug_4658 show_error

  This commit may be split if it is preferable.

Change-Id: I88cd8dd2d4b9756549e396e58935b1f08e7f7290

scilab/CHANGES.md
scilab/modules/graphics/macros/Sfgrayplot.sci
scilab/modules/graphics/macros/Sgrayplot.sci
scilab/modules/graphics/macros/colorbar.sci
scilab/modules/graphics/tests/nonreg_tests/bug_15638.tst [new file with mode: 0644]
scilab/modules/graphics/tests/unit_tests/colorbar.tst [new file with mode: 0644]

index f53ce06..f4da239 100644 (file)
@@ -604,8 +604,13 @@ Known issues
 * [#15632](http://bugzilla.scilab.org/show_bug.cgi?id=15632): `x=[];x()=1` crashed Scilab.
 * [#15635](http://bugzilla.scilab.org/show_bug.cgi?id=15635): `dellip(1,4)` terminated with neither output nor error (regression)
 * [#15636](http://bugzilla.scilab.org/show_bug.cgi?id=15636): Clicking on its icon did not always give focus to Help browser
+<<<<<<< HEAD
 * [#15645](http://bugzilla.scilab.org/show_bug.cgi?id=15645): `deff('y=f(x)','z=x^2'),fsolve(1,f)` crashed scilab
 * [#15642](http://bugzilla.scilab.org/show_bug.cgi?id=15642):A(:) gave incorrect display when A is sparse boolean (regression)
+=======
+* [#15638](http://bugzilla.scilab.org/show_bug.cgi?id=15638): `colorbar()`: Both colors on the bar tips spanned an interval twice smaller than for other colors. This made almost impossible to choose a convenient number of colors to share the whole values interval in a simple way.
+* [#15648](http://bugzilla.scilab.org/show_bug.cgi?id=15648): `sparse([1 1],1,[-1 -1])` crashed scilab
+>>>>>>> 04860748d5d... * Bugs 15638 15805 15806 fixed: colorbar() improved
 * [#15647](http://bugzilla.scilab.org/show_bug.cgi?id=15647): `spzeros(-1,-1)` yielded a corrupted result
 * [#15648](http://bugzilla.scilab.org/show_bug.cgi?id=15648): `sparse([1 1],1,[-1 -1])` crashed scilab
 * [#15652](http://bugzilla.scilab.org/show_bug.cgi?id=15652): An appended comment // after a comma in an multiline literal array now generates an error (regression).
@@ -643,6 +648,8 @@ Known issues
 * [#15779](http://bugzilla.scilab.org/show_bug.cgi?id=15779): `test_run` did not accept the wildcard * in tests names.
 * [#15796](http://bugzilla.scilab.org/show_bug.cgi?id=15796): Display after `mprintf("")` crashed Scilab (regression)
 * [#15799](http://bugzilla.scilab.org/show_bug.cgi?id=15799): `ifftshift()` could not invert `fftshift(x, along)` directional actions.
+* [#15805](http://bugzilla.scilab.org/show_bug.cgi?id=15805): `colorbar()` ticking was poor and most often irrelevant or puzzling, set to not simple values, with useless unreadable minor ticks.
+* [#15806](http://bugzilla.scilab.org/show_bug.cgi?id=15806): `colorbar(..)` missed some simple syntaxes with default umin, umax and colminmax values, such as `colorbar()`.
 * [#15808](http://bugzilla.scilab.org/show_bug.cgi?id=15808): `[5i]` was parsed as `[5,i]`
 * [#15809](http://bugzilla.scilab.org/show_bug.cgi?id=15809): HDF5 load/save was super slow for nested lists.
 * [#15813](http://bugzilla.scilab.org/show_bug.cgi?id=15813): In polarplot mode, datatips displayed irrelevant cartesian coordinates instead of polar ones.
index 7f3d394..ff50706 100644 (file)
@@ -1,4 +1,16 @@
-function []=Sfgrayplot(x, y, f, strf, rect, nax, zminmax, colminmax, mesh, colout)
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) Bruno Pincon
+// Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function Sfgrayplot(x, y, f, strf, rect, nax, zminmax, colminmax, mesh, colout)
 
     // PURPOSE
     //    Like fgrayplot but the function fec is used to smooth the
@@ -39,7 +51,20 @@ function []=Sfgrayplot(x, y, f, strf, rect, nax, zminmax, colminmax, mesh, colou
         error(msprintf(gettext("%s: Wrong type for input argument #%d: function expected.\n"), "Sfgrayplot", 3));
     end
 
-    p = length(x); q = length(y);
+    p = length(x);
+    q = length(y);
+    z = feval(x,y,f);
+
+    // http://bugzilla.scilab.org/15638 :
+    if ~isdef("colminmax","l")
+        colminmax = [1, size(gcf().color_map,1)]
+    end
+    nbc = colminmax(2)-colminmax(1)+1
+    if ~isdef("zminmax","l") then
+        zminmax = [min(z), max(z)]
+    end
+    dz = (zminmax(2) - zminmax(1))/nbc/2
+    zminmax = zminmax + [dz -dz]
 
     // parsing the optional args
     opt_arg_list = ["strf", "rect","nax","zminmax", "colminmax", "mesh", "colout"];
@@ -51,7 +76,6 @@ function []=Sfgrayplot(x, y, f, strf, rect, nax, zminmax, colminmax, mesh, colou
     end
 
     // build the data for fec
-    z = feval(x,y,f);
     [noe_x,noe_y] = ndgrid(x,y)
     nbtri = 2*(p-1)*(q-1)
     num = (1:p*(q-1))'; num(p*(1:q-1)) = []; num1 = num+1
index fa31139..faa59ea 100644 (file)
@@ -1,8 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
 // Copyright (C) Bruno Pincon
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -11,7 +11,7 @@
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function []=Sgrayplot(x,y,z, strf, rect, nax, zminmax, colminmax, mesh, colout)
+function Sgrayplot(x,y,z, strf, rect, nax, zminmax, colminmax, mesh, colout)
     //
     // PURPOSE
     //    Like grayplot but the function fec is used to smooth the
@@ -44,19 +44,34 @@ function []=Sgrayplot(x,y,z, strf, rect, nax, zminmax, colminmax, mesh, colout)
         return
 
     elseif rhs < 3 then
-        error(msprintf(gettext("%s: Wrong number of input arguments: At least %d expected.\n"),"Sgrayplot",3));
+        msg = gettext("%s: Wrong number of input arguments: At least %d expected.\n")
+        error(msprintf(msg, "Sgrayplot", 3));
     end
 
     // some checks
     if ~(type(x)==1 & isreal(x) & type(y)==1 & isreal(y) & type(z)==1 & isreal(z)) then
-        error(msprintf(gettext("%s: Wrong type for input argument(s): Arguments #%d, #%d and #%d must be real.\n"), "Sgrayplot",1,2,3));
+        msg = gettext("%s: Wrong type for input argument(s): Arguments #%d, #%d and #%d must be real.\n")
+        error(msprintf(msg, "Sgrayplot", 1, 2, 3));
     end
     nx = length(x); ny = length(y); [p,q] = size(z)
     if p ~= nx then
-        error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n"),"Sgrayplot", 1, 3, 3, 1));
+        msg = gettext("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n")
+        error(msprintf(msg, "Sgrayplot", 1, 3, 3, 1));
     elseif q~=ny then
-        error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: The number of columns of argument #%d must be equal to the size of argument #%d.\n"),"Sgrayplot", 2, 3, 3, 2));
+        msg = gettext("%s: Wrong size for input arguments #%d and #%d: The number of columns of argument #%d must be equal to the size of argument #%d.\n")
+        error(msprintf(msg, "Sgrayplot", 2, 3, 3, 2));
+    end
+
+    // http://bugzilla.scilab.org/15638 :
+    if ~isdef("colminmax","l")
+        colminmax = [1, size(gcf().color_map,1)]
+    end
+    nbc = colminmax(2)-colminmax(1)+1
+    if ~isdef("zminmax","l") then
+        zminmax = [min(z), max(z)]
     end
+    dz = (zminmax(2) - zminmax(1))/nbc/2
+    zminmax = zminmax + [dz -dz]
 
     // parsing the optional args
     opt_arg_list = ["strf", "rect","nax","zminmax", "colminmax", "mesh", "colout"]
index 91cc802..a932179 100644 (file)
@@ -1,9 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) Bruno Pincon
 // Copyright (C) Serge Steer (adaptation to new graphic system)
-// Copyright (C) 2017 - Samuel GOUGEON : http://bugzilla.scilab.org/14711
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2017 - 2018 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -37,37 +36,231 @@ function colorbar(umin, umax, colminmax, fmt)
     //     the "associated" plot and so is not modified by a zoom or
     //     a rotation of the plot.
     //
-    //
     //  EXAMPLES
     //     see the help page
+    //
+    //  HISTORY
+    // 2017 : http://bugzilla.scilab.org/14711 : in uicontrol frame
+    // 2018 : http://bugzilla.scilab.org/15638 : unequal color spans
+    //        http://bugzilla.scilab.org/15805 : poor ticking
+    //        http://bugzilla.scilab.org/15806 : syntaxes with default umin, umax..
 
     // Check number of input argument
     [lhs, rhs] = argn();
-    if rhs < 2 then
-        error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"), "colorbar", 2, 4));
+    if rhs > 4 then
+        msg = gettext("%s: Wrong number of input arguments: %d to %d expected.\n")
+        error(msprintf(msg, "colorbar", 0, 4));
     end
-    nb_grad = 5
-    if ~exists("fmt","local") then
-        fmt="%-5.2g";
+
+    // TYPE OF THE ASSOCIATED PLOT
+    // ===========================
+    Type = []
+    f = gcf();
+    nColorsCM = size(f.color_map,1);
+    for h = gca().children'
+        if or(h.type==["Matplot" "Fec" "Fac3d" "Plot3d" "Grayplot"])
+            Type = h.type
+            break
+        end
+        for g = h.children'
+            if or(g.type==["Matplot" "Fec" "Fac3d" "Plot3d" "Grayplot"])
+                Type = g.type
+                h = g
+                break
+            end
+        end
+        if Type~=[] then
+            break
+        end
+    end
+    if Type=="Matplot" & h.image_type~="index" then
+        Type = []
+    //elseif Type=="Fac3d" & h.cdata_mapping=="direct"
+    //    Type = "Matplot"      // done later
+    end
+
+    // PARSING INPUT ARGUMENTS
+    // =======================
+    // colminmax
+    if isdef("colminmax","l") & type(colminmax)~=0 & colminmax~=[] & colminmax(1)~=-1
+        msg = _("%s: Argument #%d: Decimal number(s) expected.\n")
+        if type(colminmax)~=1 | ~isreal(colminmax)
+            error(msprintf(msg, "colorbar", 3))
+        end
+        if length(colminmax)~=2
+            msg = _("%s: Argument #%d: Vector with %d elements expected.\n")
+            error(msprintf(msg, "colorbar", 3, 2))
+        end
+        colminmax = gsort(colminmax,"g","i");
+        if and(colminmax>=0 & colminmax<=1) // fractions of the whole colormap range
+            colminmax = round(1 + colminmax*(nColorsCM-1))
+        end
+        colminmax = [max(colminmax(1),1) min(colminmax(2), nColorsCM)];
+    elseif ~isdef("colminmax","l") | type(colminmax)==0 | colminmax==[]
+        if ~isdef("umin","l") | type(umin)==0 | umin==[] then
+            colminmax = -1
+        else
+            colminmax = [1, nColorsCM]
+        end
     else
-        if type(fmt)<>10|size(fmt,"*")<>1 then
-            error(msprintf(gettext("%s: Wrong type for input argument #%d: %s data structure expected.\n"), "colorbar", 4, "string (containing a C format)"));
+        colminmax = -1
+    end
+
+    // Default umin, umax, colminmax
+    if Type=="Fec"
+        u = h.data(:,3);
+    elseif Type=="Plot3d"
+        u = h.data.z
+    elseif Type=="Fac3d"
+        u = h.data.z;
+        c = h.data.color;
+        colorsAreZ = ~isvector(c)
+        //if colorsAreZ
+        //    // c = U*a+b
+        //    c2 = c-mean(c);
+        //    u2 = u-mean(u);
+        //    k = u~=0;
+        //    colorsAreZ = colorsAreZ & stdev(c(k)./u(k))==0 // Improvement to explore
+        //end
+        if colorsAreZ
+            select h.color_flag
+            case 0
+                u = []
+            case 1
+                u = mean(u,"r")
+            case 2
+                u = mean(u,"r")
+            case 3  // keep u as is
+            case 4
+                u = u(1,:)
+            end
+        else
+            u = []  // no Z-colors mapping possible
         end
+
+    elseif Type=="Grayplot"
+        u = h.data.z
+        u = (u(1:$-1,1:$-1)+u(2:$,1:$-1)+u(2:$,2:$)+u(1:$-1,2:$))/4;
+        if h.data_mapping=="direct"
+            Type = "Matplot"
+        end
+    elseif Type=="Matplot"
+        u = h.data
+    else
+        u = []
     end
+    k = ~isinf(u) & ~isnan(u)
+    uminmax = [min(u(k)) max(u(k))]
+    clear k
 
-    f=gcf();
-    if ~exists("colminmax","local") then
-        nb_colors = size(f.color_map,1)
-        colminmax = [1 nb_colors]
+    // umin
+    if ~isdef("umin","l") | type(umin)==0 | umin==[] then
+        if u~=[]
+            if colminmax~=[] & (length(colminmax)>1 | colminmax~=-1)
+                if Type=="Matplot"
+                    umin = colminmax(1)
+                else
+                    if argn(2)<2
+                        c = colminmax // raw bounds (not integers)
+                        nc = max(1,floor(colminmax(1)))
+                        // recomputing umin matching the rounded colminmax(1)
+                        umin = uminmax(1) + (uminmax(2)-uminmax(1)) * ..
+                                        (colminmax(1)-nc)/(c(2)-c(1))
+                    else
+                        umin = uminmax(1) + (uminmax(2)-uminmax(1)) * ..
+                                        (colminmax(1)-0)/nColorsCM
+                    end
+                end
+            else
+                umin = uminmax(1)
+            end
+        else
+            msg =_("%s: Argument #%d: Can''t retrieve a default value: Decimal number expected.\n")
+            error(msprintf(msg, "colorbar", 1))
+        end
     else
-        nb_colors = colminmax(2) - colminmax(1) + 1
+        msg = _("%s: Argument #%d: Decimal number(s) expected.\n")
+        if type(umin)~=1 | ~isreal(umin)
+            error(msprintf(msg, "colorbar", 1))
+        end
+        if length(umin)>1
+            msg = _("%s: Argument #%d: Scalar (1 element) expected.\n")
+            error(msprintf(msg, "colorbar", 1))
+        end
+        if umin==-%inf
+            umin = uminmax(1)  // umin=-%inf means umin=min(u)
+        end
     end
 
+    // umax
+    if ~isdef("umax","l") | type(umax)==0 | umax==[] then
+        if u~=[]
+            if colminmax~=[] & colminmax~=-1
+                if Type=="Matplot"
+                    umax = colminmax(2)
+                else
+                    if argn(2)<2
+                        c = colminmax // raw bounds (not integers)
+                        nc = min(nColorsCM,ceil(colminmax(2)))
+                        // recomputing umax matching the rounded colminmax(1)
+                        umax = uminmax(2) + (uminmax(2)-uminmax(1)) * ..
+                                        (nc-c(2))/(c(2)-c(1))
+                    else
+                        umax = uminmax(1) + (uminmax(2)-uminmax(1)) * ..
+                                            (colminmax(2)-0)/nColorsCM
+                    end
+                end
+            else
+                umax = uminmax(2)
+            end
+        else
+            msg =_("%s: Argument #%d: Can''t retrieve a default value: Decimal number expected.\n")
+            error(msprintf(msg, "colorbar", 1))
+        end
+    else
+        msg = _("%s: Argument #%d: Decimal number(s) expected.\n")
+        if type(umax)~=1 | ~isreal(umax)
+            error(msprintf(msg, "colorbar", 2))
+        end
+        if length(umax)>1
+            msg = _("%s: Argument #%d: Scalar (1 element) expected.\n")
+            error(msprintf(msg, "colorbar", 2))
+        end
+        if umax==%inf
+            umax = uminmax(2)  // umax=%inf means umax=max(u)
+        end
+    end
+
+    // colminmax
+    if colminmax(1)==-1  // => relative color range matches relative u range
+        if Type=="Matplot"
+            colminmax = [umin umax]
+        else
+            colminmax = 1 + (nColorsCM-1) * ..
+                       ([umin umax]-uminmax(1)) / (uminmax(2)-uminmax(1))
+        end
+    end
+    if Type~="Matplot"
+        colminmax = [max(1,round(colminmax(1))) min(nColorsCM,round(colminmax(2)))]
+    end
+
+    // fmt
+    if isdef("fmt","l") then
+        if type(fmt)<>10 | size(fmt,"*")<>1 then
+            msg = gettext("%s: Wrong type for input argument #%d: %s expected.\n")
+            error(msprintf(msg, "colorbar", argn(2), "string (containing a C format)"));
+        end
+    else
+        fmt = ""
+    end
+
+    // DRAWING
+    // =======
     //defer the drawing to avoid binking
-    id=f.immediate_drawing=="on";
-    if id then f.immediate_drawing=="off",end
+    idMem = f.immediate_drawing;
+    f.immediate_drawing = "off";
     // get current axes and properties
-    a=gca();
+    a = gca();
     fg_color=a.foreground
     wr=a.axes_bounds; //get the rectangle of the current axes
 
@@ -75,37 +268,40 @@ function colorbar(umin, umax, colminmax, fmt)
     a_pl=a;
     a_pl.axes_bounds=[wr(1) , wr(2) , 0.85*wr(3) , wr(4)]
 
+
     // create a new axes for the colorbar et set its properties
     a_cb = newaxes(a.parent);
     a_cb.axes_bounds=[wr(1)+0.83*wr(3) , wr(2)+wr(4)*0.2 , 0.2*wr(3) , wr(4)*0.6];
-    a_cb.data_bounds=[0 umin;1 umax];
-    a_cb.foreground=a.foreground;
-    a_cb.background=f.background;
-    a_cb.axes_visible="on";
-    a_cb.y_location = "right";
-    a_cb.tight_limits ="on";
+    a_cb.foreground = a.foreground;
+    a_cb.background = f.background;
+    a_cb.axes_visible = "on";
+    a_cb.y_location   = "right";
+    a_cb.tight_limits = "on";
 
     //It is not possible to set no ticks for x (should be fixed)
     a_cb.x_ticks=tlist(["ticks","locations","labels"],-1,"");
-    ytics = linspace(umin, umax, nb_grad);
-    a_cb.y_ticks=tlist(["ticks","locations","labels"],ytics', " "+msprintf(fmt+"\n",ytics'));
-    a_cb.auto_ticks = ["off","off","on"];
+    a_cb.auto_ticks = ["off","on","off"];
+    a_cb.ticks_format(2) = fmt;
     a_cb.box = "on";
     a_cb.margins=[0 0.75 0 0];
 
     //draw the colorbar
-    y = linspace(umin,umax,nb_colors)
-    col=[colminmax(1):colminmax(2)]
-    Sgrayplot([0 1],y,[col;col],colminmax=colminmax)
+    Matplot((colminmax(2):-1:colminmax(1))')
+    a_cb.y_location = "right";
+    a_cb.tight_limits = "on";
+    if Type~="Matplot" then
+        du = (umax-umin)
+        gce().rect = [0.5 umin 1.5 umax];
+        a_cb.data_bounds  = [0.5, 1.5, umin-du/500, umax+du/500];
+    else
+        s = ((umax-umin)==(colminmax(2)-colminmax(1)))*0.5
+        gce().rect = [0.5 umin-s 1.5 umax+s];
+        a_cb.data_bounds  = [0.5 1.5 umin-s umax+s];
+    end
 
     //reset the initial values
     sca(a_pl) //current axes
-    if id then f.immediate_drawing="on",end //drawing mode
 
+    // Restoring input drawing mode
+    f.immediate_drawing = idMem;
 endfunction
-
-
-
-
-
-
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_15638.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_15638.tst
new file mode 100644 (file)
index 0000000..586bd7b
--- /dev/null
@@ -0,0 +1,52 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- INTERACTIVE TEST -->
+// <-- TEST WITH GRAPHIC -->
+// <-- NO CHECK REF -->
+
+// <-- Non-regression test for bug 15638 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15638
+//
+// <-- Short Description -->
+// colorbar() displayed tips colors twice smaller than for other ones
+
+x = linspace(0,1,81);
+z = cos(2*%pi*x)'*sin(2*%pi*x);
+clf()
+gcf().color_map = jetcolormap(4);
+Sgrayplot(x, x, z);
+colorbar(min(z), max(z));
+contour(x,x,z,[-0.5 0 0.5]);
+gce().children.children(1:2:$-1).foreground=-1; // contours in black
+
+// CHECKING:
+// * The bar must have graduations from -1 to 1
+// * The 4 colors must all span over 0.25
+// * On the plot,
+//   the 0.5 contour must be exactly at the red/yellow limit, as on the bar
+//   the 0.0 contour must be exactly at the cyan/yellow limit, as on the bar
+//   the -0.5 contour must be exactly at the blue/cyan limit, as on the bar
+
+
+function z = f(x,y)
+    z = cos(2*%pi*x)*sin(2*%pi*y);
+endfunction
+clf()
+gcf().color_map = jetcolormap(4);
+x = linspace(0,1,81);
+Sfgrayplot(x, x, f);
+z = f(x,x);
+colorbar(min(z), max(z));
+contour(x,x,z,[-0.5 0 0.5]);
+gce().children.children(1:2:$-1).foreground=-1; // contours in black
+
+// CHECKING: AS ABOVE
+
+
diff --git a/scilab/modules/graphics/tests/unit_tests/colorbar.tst b/scilab/modules/graphics/tests/unit_tests/colorbar.tst
new file mode 100644 (file)
index 0000000..8422ebe
--- /dev/null
@@ -0,0 +1,187 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- INTERACTIVE TEST -->
+// <-- TEST WITH GRAPHIC -->
+// <-- NO CHECK REF -->
+
+// unitary tests of colorbar()
+// =============================================================================
+
+// ORGANIZATION of TESTS
+// * Open figures 0 and 10
+// * Dock them somewhere in the desk in order to make them always visible
+// * Execute each block of lines and see results and comments
+
+// CHECKING COLORS SPLITTING AND TICKING + SKIPPED ARGUMENTS
+// =========================================================
+
+// 1) Matplot
+//    =======
+// 1.0) Matplot: implicit minU, maxU, colminmax = [umin umax]
+scf(0);
+clf reset
+Matplot([1 2 3;4 5 7]);
+colorbar   // [1 7] graduations covered by colors #[1 7].
+           // Ticks on middles of colored blocks
+
+// 1.1) Matplot: colminmax = [umin umax] accordingly
+clf
+Matplot([1 2 3;4 5 7]);
+colorbar(1,7,-1)  // [1 7] graduations covered by colors #[1 7].
+                  // Ticks on middles of colored blocks
+
+// 1.2)
+clf
+Matplot([1 2 3;4 5 7]);
+colorbar(,,-1,"%6.1f")                // http://bugzilla.scilab.org/14790
+assert_checkequal(gcf().children(1).ticks_format(2), "%6.1f");
+// Same as above
+
+// 1.3) Matplot: Default colminmax = [1 Nc]
+clf
+Matplot([1 2 3;4 5 7]);
+colorbar(1,7)   // [1 7] covered with the whole colormap.
+                // "1" at the very bottom. "7" at the very top.
+
+// 1.4) Matplot: another colors range, with explicit colminmax
+clf
+Matplot([1 2 3;4 5 7])
+colorbar(3,7, [3 7])
+// Ticks 2.5-7.5 expected:
+//  - integer values ticked at the middle of colors blocks
+//  - other .5 values ticked at the blocks separations
+
+
+// 2) Sgrayplot (Fec)
+//    ==============
+
+// Sgrayplot (Fec) : all colors used
+// ---------------------------------
+x = linspace(0,1,81);
+z = cos(2*%pi*x)'*sin(2*%pi*x);
+// 2.0) Default umin = minU, umax = maxU, colminmax = [1 Nc]
+n = 4;
+clf
+gcf().color_map = jetcolormap(n);
+Sgrayplot(x, x, z);
+contour(x,x,z,[-0.5 0 0.5]);
+gce().children.children(1:2:$-1).foreground=-1; // contours in black
+colorbar;
+// * 4 colors of equal spans
+// * "-1" tick at the very bottom of the scale
+// * "1" tick at the very top
+// * Nice subticks
+// * The contours levels must be at the right levels on the color bar
+
+// 2.1) Default umin = minU, umax = maxU, colminmax = [1 Nc] (same as above)
+n = 10;
+clf
+gcf().color_map = jetcolormap(n);
+Sgrayplot(x, x, z);
+contour(x,x,z,[-0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8]);
+gce().children.children(1:2:$-1).foreground=-1; // contours in black
+colorbar;  // Same as above, with n = 10
+           // Nice subticks, at blocks middles & blocks limits
+
+// Sgrayplot (Fec) : partial colors range: 8 colors used over 20
+// -------------------------------------------------------------
+// 2.2) umin=minU and umax=maxU, covered by a subrange of colors
+n = 8;
+clf
+gcf().color_map = jetcolormap(20);
+Sgrayplot(x, x, z,colminmax=[3 n+2]);
+contour(x,x,z,[-0.75 -0.5 -0.25 0 0.25 0.5 0.75]);
+colorbar(-%inf,%inf,[3 n+2]);
+// * The contours levels must be at the right levels on the color bar
+
+// 2.3) Explicit umin and umax, with saturation for z values out of [umin, umax]:
+clf
+gcf().color_map = jetcolormap(20);
+Sgrayplot(x, x, z, zminmax = [-0.6 0.8], colminmax = [5 11]);
+contour(x,x,z,[-0.6 -0.4 -0.2 0.2 0.4 0.6]);
+colorbar(-0.6, 0.8,[5 11]);
+// Sgrayplot zminmax & colminmax matches the colorbar() ones
+// The bar is correct, wrt contours levels
+
+
+// 3) Fac3d
+//    =====
+function [zz, zz1] = plotSphere()
+    r = 0.3;
+    orig = [1.5 0 0];
+    deff("[x,y,z]=sph(alp,tet)",["x=r*cos(alp).*cos(tet)+orig(1)*ones(tet)";..
+         "y=r*cos(alp).*sin(tet)+orig(2)*ones(tet)";..
+         "z=r*sin(alp)+orig(3)*ones(tet)"]);
+    [xx,yy,zz] = eval3dp(sph,linspace(-%pi/2,%pi/2,40),linspace(0,%pi*2,20));
+    [xx1,yy1,zz1] = eval3dp(sph,linspace(-%pi/2,%pi/2,40),linspace(0,%pi*2,20));
+    cc  = (xx+zz+2)*32;
+    cc1 = (xx1-orig(1)+zz1/r+2)*32;
+    clf
+    plot3d1([xx xx1],[yy yy1],list([zz,zz1],[cc cc1]),theta=70,alpha=80,flag=[5,6,3])
+    gcf().color_map = hotcolormap(128);
+endfunction
+
+// 3.0) Implicit min(u), max(u), on the whole color map
+scf(10);
+z = plotSphere();
+colorbar;   // colorbar [black orange white] on u=[min(u)=-0.3, max(u)=0.3]
+
+// 3.1) Implicit partial colors range, according to u-range
+scf(0);
+z = plotSphere();
+colorbar(0.0, 0.15, -1);  // [cmin cmax]/Nc matches the U relative range
+                          // Colors/Values should match on figures 0 and 10
+
+// 3.2) umin & umax such that the relative ranges [umin, umax] and colminmax match
+z = plotSphere();
+colorbar(,,[64 128]);  // graduations on [0 , 0.3]
+                       // Colors/Values should match on figures 0 and 10
+
+// 3.3) umin & umax set according to partial colormap as fraction / whole u-range
+z = plotSphere();
+colorbar(,,[2.97 5]/6);   // ticks on [9, 0.2]
+                          // colors in [orange, yellow] must match figure #10 ones
+
+// 4) Plot3d
+//    ======
+function plotSample()
+    t=[-4:0.04:4];
+    clf
+    gcf().color_map = jetcolormap(200);
+    plot3d(t,t,sin(t)'*cos(t));
+    e = gce();
+    e.color_flag = 1;
+    e.color_mode = -2;
+endfunction
+
+// 4.0) Bar graduated from minU=-1 to maxU=1 with the full colormap
+scf(10);
+plotSample();
+colorbar;
+
+// 4.1) Bar graduated from umin=1 to umax=2 with the full colormap
+scf(0);
+plotSample();
+colorbar(1,2);
+
+// 4.2) Bar graduated from -0.3 to 0.5 with the corresponding relative colors range
+plotSample();
+colorbar(-0.3,0.5, -1); // Colors/Values should match on figures 0 and 10
+
+// 4.3) Bar graduated from minU=-1 to maxU=1, with colors #101 to #200
+plotSample();
+colorbar(-%inf,%inf,[101 200]); // [0 1] => [-1 1]
+
+// 4.4) umin & umax range set to match the relative colors one
+plotSample();
+colorbar(,,[100 200]);  // graduations from 0 to 1
+                        // Colors/Values should match on figures 0 and 10
+
+// 4.5) Same as above, with colors given as fractions inside the whole colormap
+plotSample();
+colorbar(,,[0.6 0.8]);  // values from 0.2 to 0.6