* Bug 15342 fixed: 'Reframe to contents' failed on Text objects 97/19597/3
Samuel GOUGEON [Sun, 10 Dec 2017 05:41:55 +0000 (06:41 +0100)]
 http://bugzilla.scilab.org/15342

Change-Id: Idcd4bbc579fbd446972dc94a8051b00ca3d061f2

scilab/CHANGES.md
scilab/modules/graphics/macros/replot.sci
scilab/modules/graphics/tests/nonreg_tests/bug_15342.tst [new file with mode: 0644]

index 1372295..ff355c1 100644 (file)
@@ -502,6 +502,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#15337](http://bugzilla.scilab.org/show_bug.cgi?id=15337): There was a mistake in the definition of the l_p norm of a vector in the `norm` page.
 * [#15339](http://bugzilla.scilab.org/show_bug.cgi?id=15339): `uigetfont()` returned garbage on user cancellation.
 * [#15340](http://bugzilla.scilab.org/show_bug.cgi?id=15340): Scilab did not build against lucene 6.1.0.
+* [#15342](http://bugzilla.scilab.org/show_bug.cgi?id=15342): `replot()` and `Reframe to contents` failed on graphics with xstring objects.
 
 
 ### Bugs fixed in 6.0.0:
index da12f26..d96569e 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
-// Copyright (C) 2013, 2016 - Samuel GOUGEON
 // Copyright (C) 2016 - Clément DAVID - Scilab Enterprises
+// Copyright (C) 2013, 2016, 2017 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
@@ -259,19 +259,25 @@ function bounds = buildEnclosingBounds(e,bounds)
         // ---------------------------------------------------------
         case "Matplot"
             data = e.rect
-            bounds(1,1) = min([data(1) ; bounds(1,1)]);
-            bounds(2,1) = max([data(3) ; bounds(2,1)]);
-            bounds(1,2) = min([data(2) ; bounds(1,2)]);
-            bounds(2,2) = max([data(4) ; bounds(2,2)]);
+            bounds(1,1) = min([data(1) ; bounds(1,1)]); // xmin
+            bounds(2,1) = max([data(3) ; bounds(2,1)]); // xmax
+            bounds(1,2) = min([data(2) ; bounds(1,2)]); // ymin
+            bounds(2,2) = max([data(4) ; bounds(2,2)]); // ymax
 
         // ---------------------------------------------------------
         case "Text"
-            data = e.data
-            bounds(1,1) = min([data(1) ; bounds(1,1)]);
-            bounds(1,2) = min([data(2) ; bounds(1,2)]);
+            bb = stringbox(e.text, e.data(1), e.data(2), e.font_angle, e.font_style, e.font_size)
+            data = e.data;
+            bounds(1,1) = min(bounds(1,1), min(bb(1,:)));
+            bounds(1,2) = min(bounds(1,2), min(bb(2,:)));
             if (size(data,"c") > 2) then
                 bounds(1,3) = min([data(3) ; bounds(1,3)]);
             end
+            bounds(2,1) = max(bounds(2,1), max(bb(1,:)));
+            bounds(2,2) = max(bounds(2,2), max(bb(2,:)));
+            if (size(data,"c") > 2) then
+                bounds(2,3) = max([data(3) ; bounds(2,3)]);
+            end
         // ---------------------------------------------------------
         case "Legend"
             // Nothing to do: a legend is located in window relative coordinates,
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_15342.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_15342.tst
new file mode 100644 (file)
index 0000000..8f3d791
--- /dev/null
@@ -0,0 +1,41 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+// <-- INTERACTIVE TEST -->
+
+// <-- Non-regression test for bug 15342 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15342
+//
+// <-- Short Description -->
+// replot() and hence "Reframe to contents" action did not take into account
+// the sizes of Text blocks.
+
+scf();
+plot(1)
+xarc(0.8,1.2,0.4,0.4,0,360*64)
+replot([0 0 2 2])
+for a = 0:45:359
+    s = msprintf("angle %d°\n",a);
+    x = 1+0.2*cosd(-a+30);
+    y = 1+0.2*sind(-a+30);
+    xstring(x,y,s,a);
+end
+gca().children(1:8).box = "on";
+gca().children(1:8).foreground = color("grey70");
+isoview
+// => Watch at this reference result
+replot()
+replot()
+replot()
+// => See the result. It should look like the bottom left plot of
+// http://bugzilla.scilab.org/attachment.cgi?id=4608
+// Several replot() or "Reframe to contents" actions may be needed to converge
+// to this optimal reframing. This is because Text objects are not zoomable.
+// Their data sizes depend on data bounds.