* Bug #10411 fixed - Pivoting blocks drew out of bounds icons. 85/20485/3
Clément DAVID [Mon, 3 Sep 2018 15:43:23 +0000 (17:43 +0200)]
Change-Id: I19e418f56bc7e27c94b1324a5675478967448c7c

scilab/CHANGES.md
scilab/modules/graph/src/java/org/scilab/modules/graph/shape/SvgShape.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/BlockPositioning.java

index 3318784..d60bf61 100644 (file)
@@ -448,6 +448,7 @@ Known issues
 * [#10171](http://bugzilla.scilab.org/show_bug.cgi?id=10171): `loadmatfile()` did not load files containing a matlab cell structure.
 * [#10190](http://bugzilla.scilab.org/show_bug.cgi?id=10190): Xcos blocks and labels positioning were not aligned to the grid on creation.
 * [#10197](http://bugzilla.scilab.org/show_bug.cgi?id=10197): creating implicit vector of integers could fail.
+* [#10411](http://bugzilla.scilab.org/show_bug.cgi?id=10411): Pivoting blocks drew out of bounds icons.
 * [#10639](http://bugzilla.scilab.org/show_bug.cgi?id=10639): The page of `intersect` poorly described the arguments. Examples were not illustrated.
 * [#10668](http://bugzilla.scilab.org/show_bug.cgi?id=10668): Some words in the `bloc2ss` page were inaccurate or misleading.
 * [#10918](http://bugzilla.scilab.org/show_bug.cgi?id=10918): After `a=5`, `a([%t ; %f])` returned `[5 ; 2.1e-314]` instead of `5`.
index 5b0b541..344b382 100644 (file)
@@ -42,8 +42,25 @@ public class SvgShape extends mxLabelShape {
      */
     @Override
     public void paintShape(mxGraphics2DCanvas canvas, mxCellState state) {
-        // paint previously set background
-        super.paintShape(canvas, state);
+        // paint previously set background without the rotation applied
+        if (mxUtils.getDouble(state.getStyle(), mxConstants.STYLE_ROTATION, 0) != 0) {
+            mxCellState nonRotatedState = (mxCellState) state.clone();
+
+            double tmp = nonRotatedState.getCenterY() - nonRotatedState.getWidth() / 2;
+            nonRotatedState.setX(nonRotatedState.getCenterX() - nonRotatedState.getHeight() / 2);
+            nonRotatedState.setY(tmp);
+
+
+            tmp = nonRotatedState.getWidth();
+            nonRotatedState.setWidth(nonRotatedState.getHeight());
+            nonRotatedState.setHeight(tmp);
+
+            Rectangle rect = nonRotatedState.getRectangle();
+            canvas.getGraphics().clipRect(rect.x, rect.y, rect.width, rect.height);
+            super.paintShape(canvas, nonRotatedState);
+        } else {
+            super.paintShape(canvas, state);
+        }
 
         final String image = getImageForStyle(canvas, state);
         if (image != null && image.endsWith(".svg")) {
index 4eb7e43..f99243d 100644 (file)
@@ -481,37 +481,48 @@ public final class BlockPositioning {
      */
     public static void toggleAntiClockwiseRotation(final XcosDiagram diag, BasicBlock block) {
         StyleMap styleMap = new StyleMap(block.getStyle());
-        styleMap.put(XcosConstants.STYLE_ROTATION, Integer.toString(getNextAntiClockwiseAngle(styleMap)));
+        computeNextAntiClockwiseAngle(styleMap);
 
+        mxGeometry old = block.getGeometry();
+        mxGeometry rotated = new mxGeometry(old.getCenterX() - old.getHeight() / 2,
+                                            old.getCenterY() - old.getWidth() / 2, old.getHeight(), old.getWidth());
+        diag.getModel().setGeometry(block, rotated);
         diag.getModel().setStyle(block, styleMap.toString());
         updateBlockView(diag, block);
     }
 
     /**
-     * Get the next anti-clockwise rotation value
-     *
+     * Compute and set some properties to rotate the element style
      * @param styleMap
      *            the data to parse
-     * @return The angle value
      */
-    public static int getNextAntiClockwiseAngle(StyleMap styleMap) {
-        final int intRotation = Double.valueOf(styleMap.getOrDefault(XcosConstants.STYLE_ROTATION, "0")).intValue();
-
-        int angle = (intRotation - ROTATION_STEP + MAX_ROTATION) % MAX_ROTATION;
-        return angle;
-    }
+    private static void computeNextAntiClockwiseAngle(StyleMap styleMap) {
+        final int rotation = Double.valueOf(styleMap.getOrDefault(XcosConstants.STYLE_ROTATION, "0")).intValue();
+        boolean flip = Boolean.TRUE.toString().equals(styleMap.get(XcosConstants.STYLE_FLIP));
+        boolean mirror = Boolean.TRUE.toString().equals(styleMap.get(XcosConstants.STYLE_MIRROR));
+
+        int angle = (rotation - ROTATION_STEP + MAX_ROTATION) % MAX_ROTATION;
+        if (angle > 90) {
+            angle = angle - 180;
+            flip = !flip;
+            mirror = !mirror;
+        }
 
-    /**
-     * Get the next clockwise rotation value
-     *
-     * @param styleMap
-     *            the data to parse
-     * @return The angle value
-     */
-    public static int getNextClockwiseAngle(StyleMap styleMap) {
-        final int intRotation = Double.valueOf(styleMap.getOrDefault(XcosConstants.STYLE_ROTATION, "0")).intValue();
-        int angle = (intRotation + ROTATION_STEP) % MAX_ROTATION;
-        return angle;
+        if (angle == 0) {
+            styleMap.remove(XcosConstants.STYLE_ROTATION);
+        } else {
+            styleMap.put(XcosConstants.STYLE_ROTATION, Integer.toString(angle));
+        }
+        if (!flip) {
+            styleMap.remove(XcosConstants.STYLE_FLIP);
+        } else {
+            styleMap.put(XcosConstants.STYLE_FLIP, Boolean.toString(flip));
+        }
+        if (!mirror) {
+            styleMap.remove(XcosConstants.STYLE_MIRROR);
+        } else {
+            styleMap.put(XcosConstants.STYLE_MIRROR, Boolean.toString(mirror));
+        }
     }
 
     /**