Bug 507856 - [Scaling] Aggregate size looses rounded up pixels

Change-Id: Iad36bf84ace374cb4397b32f5339b761d82a006a
Signed-off-by: Dirk Fauth <dirk.fauth@googlemail.com>
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigScalingTest.java b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigScalingTest.java
index 2711cec..0e38e1a 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigScalingTest.java
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfigScalingTest.java
@@ -149,14 +149,15 @@
         sc.setSize(2, 75);
         assertEquals(525, sc.getAggregateSize(5));
         sc.setDefaultSize(75);
-        assertEquals(450, sc.getAggregateSize(5));
+        assertEquals(451, sc.getAggregateSize(5));
         sc.setSize(2, 100);
-        assertEquals(476, sc.getAggregateSize(5));
+        assertEquals(477, sc.getAggregateSize(5));
     }
 
     @Test
     public void testRounding() {
-        final SizeConfig sc = new SizeConfig(100);
+        // results in 128 upscaled because of rounding
+        final SizeConfig sc = new SizeConfig(102);
         sc.setDpiConverter(new AbstractDpiConverter() {
 
             @Override
@@ -169,6 +170,59 @@
 
         assertEquals(178, sc.downScale(222));
         assertEquals(223, sc.upScale(178));
+
+        assertEquals(128, sc.getSize(0));
+        assertEquals(128, sc.getSize(1));
+        assertEquals(128, sc.getSize(2));
+
+        assertEquals(384, sc.getAggregateSize(3));
+    }
+
+    @Test
+    public void testRoundingAllCustomSize() {
+        final SizeConfig sc = new SizeConfig(100);
+        sc.setDpiConverter(new AbstractDpiConverter() {
+
+            @Override
+            protected void readDpiFromDisplay() {
+                // use dpi of 120 which will result in a dpi factor of 1.25
+                this.dpi = 120;
+            }
+
+        });
+
+        sc.setSize(0, 127);
+        sc.setSize(1, 127);
+        sc.setSize(2, 127);
+
+        assertEquals(128, sc.getSize(0));
+        assertEquals(128, sc.getSize(1));
+        assertEquals(128, sc.getSize(2));
+
+        assertEquals(384, sc.getAggregateSize(3));
+    }
+
+    @Test
+    public void testRoundingMixedSize() {
+        final SizeConfig sc = new SizeConfig(102);
+        sc.setDpiConverter(new AbstractDpiConverter() {
+
+            @Override
+            protected void readDpiFromDisplay() {
+                // use dpi of 120 which will result in a dpi factor of 1.25
+                this.dpi = 120;
+            }
+
+        });
+
+        // results because of scaling in 223
+        sc.setSize(1, 222);
+
+        assertEquals(128, sc.getSize(0));
+        assertEquals(223, sc.getSize(1));
+        assertEquals(128, sc.getSize(2));
+
+        assertEquals(479, sc.getAggregateSize(3));
     }
 
     @Test
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfig.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfig.java
index 4ccfde8..5a03fcd 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfig.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/layer/SizeConfig.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2013, 2014 Original authors and others.
+ * Copyright (c) 2012, 2016 Original authors and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -237,7 +237,7 @@
             // if percentage sizing is used, the sizes in defaultSize are used
             // as percentage values and not as pixel values, therefore another
             // value needs to be considered
-            return upScale(position * this.defaultSize);
+            return position * upScale(this.defaultSize);
         } else {
             // See if the cache is valid, if not clear it.
             if (!this.isAggregatedSizeCacheValid) {
@@ -724,7 +724,8 @@
         for (Integer resizedPosition : mapToUse.keySet()) {
             if (resizedPosition.intValue() < position) {
                 resizedColumns++;
-                resizeAggregate += mapToUse.get(resizedPosition);
+                int size = mapToUse.get(resizedPosition);
+                resizeAggregate += isPercentageSizing() ? size : upScale(size);
             } else {
                 break;
             }
@@ -735,15 +736,17 @@
             if (defaultPosition.intValue() < position) {
                 if (!mapToUse.containsKey(defaultPosition)) {
                     resizedColumns++;
-                    resizeAggregate += this.defaultSizeMap.get(defaultPosition).intValue();
+                    int size = this.defaultSizeMap.get(defaultPosition);
+                    resizeAggregate += isPercentageSizing() ? size : upScale(size);
                 }
             } else {
                 break;
             }
         }
 
-        int result = (position * this.defaultSize) + resizeAggregate - (resizedColumns * this.defaultSize);
-        return isPercentageSizing() ? result : upScale(result);
+        int result = (position - resizedColumns) * (isPercentageSizing() ? this.defaultSize : upScale(this.defaultSize));
+        result += resizeAggregate;
+        return result;
     }
 
     /**