Author: lindner
Date: Tue Mar 16 22:30:16 2010
New Revision: 924031

URL: http://svn.apache.org/viewvc?rev=924031&view=rev
Log:
SHINDIG-1305 | Patch from Jacobo Tarrio | Round instead of truncating the 
dimensions when resizing an image

Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java?rev=924031&r1=924030&r2=924031&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
 Tue Mar 16 22:30:16 2010
@@ -192,10 +192,10 @@ public class BasicImageRewriter implemen
           // If both image dimensions are fixed, the two-step resizing process 
will need to know
           // how much it has to fix up the image.
           double ratio = getResizeRatio(requestedWidth, requestedHeight, 
origWidth, origHeight);
-          int widthAfterStep1 = max(1, (int) (ratio * origWidth));
+          int widthAfterStep1 = max(1, (int) Math.round(ratio * origWidth));
           widthDelta = requestedWidth - widthAfterStep1;
 
-          int heightAfterStep1 = max(1, (int) (ratio * origHeight));
+          int heightAfterStep1 = max(1, (int) Math.round(ratio * origHeight));
           heightDelta = requestedHeight - heightAfterStep1;
           
           if (noExpand) {

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java?rev=924031&r1=924030&r2=924031&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/image/ImageRewriterTest.java
 Tue Mar 16 22:30:16 2010
@@ -56,6 +56,9 @@ public class ImageRewriterTest extends A
   /** A 60 x 30 image whose size in bytes expands when resized to 120 x 60 */
   private static final String EXPAND_IMAGE = 
"org/apache/shindig/gadgets/rewrite/image/expand.gif";
 
+  /** A 600 x 400 image whose size used to cause trouble with rounding when 
resizing to 171 x 171 */
+  private static final String RATIO_IMAGE = 
"org/apache/shindig/gadgets/rewrite/image/ratio.gif";
+  
   /**
    * This image has a huge memory footprint that the rewriter should refuse to 
resize, but not
    * refuse to render.  The response containing this image should not be 
rewritten.
@@ -292,4 +295,12 @@ public class ImageRewriterTest extends A
     assertEquals(HttpResponse.SC_OK, rewrittenResponse.getHttpStatusCode());
     assertTrue(Arrays.equals(imageBytes, 
IOUtils.toByteArray(rewrittenResponse.getResponse())));
   }
+  
+  @Test
+  public void testResize_avoidFloatingPointRoundingProblems() throws Exception 
{
+    BufferedImage image = getResizedHttpResponseContent(
+        CONTENT_TYPE_GIF, CONTENT_TYPE_PNG, RATIO_IMAGE, 171, 171, null, true);
+    assertEquals(171, image.getWidth());
+    assertEquals(114, image.getHeight());    
+  }
 }


Reply via email to