From be959ce3f3a6e0cc983f7829b602aad14422dcc5 Mon Sep 17 00:00:00 2001 From: Erlend Hamnaberg Date: Tue, 20 Apr 2010 12:51:06 +0200 Subject: [PATCH] Rule Of thirds: - enable with system property - extracted AreaOfInterest into a separate class. Conflicts: servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java --- .../image/ImageServletResponseImpl.java | 91 +--- .../ImageServletResponseImplTestCase.java | 333 --------------- .../servlet/image/AreaOfInterest.java | 126 ++++++ .../servlet/image/AreaOfInterestTestCase.java | 404 ++++++++++++++++++ 4 files changed, 532 insertions(+), 422 deletions(-) create mode 100644 twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/AreaOfInterest.java create mode 100644 twelvemonkeys-servlet/src/test/java/com/twelvemonkeys/servlet/image/AreaOfInterestTestCase.java diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java index c4c013b5..946e31b1 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java @@ -582,7 +582,8 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima boolean aoiUniform = b != null && b; // default: false if (aoiX >= 0 || aoiY >= 0 || aoiW >= 0 || aoiH >= 0) { - aoi = getAOI(pDefaultWidth, pDefaultHeight, aoiX, aoiY, aoiW, aoiH, aoiPercent, aoiUniform); + + aoi = new AreaOfInterest(pDefaultWidth, pDefaultHeight, aoiPercent, aoiUniform).getAOI(aoiX, aoiY, aoiW, aoiH); return aoi; } @@ -693,92 +694,4 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima // Create new Dimension object and return return new Dimension(pWidth, pHeight); } - - static Rectangle getAOI(int pOriginalWidth, int pOriginalHeight, - int pX, int pY, int pWidth, int pHeight, - boolean pPercent, boolean pMaximizeToAspect) { - // Algorithm: - // Try to get x and y (default 0,0). - // Try to get width and height (default width-x, height-y) - // - // If percent, get ratio - // - // If uniform - // - - float ratio; - - if (pPercent) { - if (pWidth >= 0 && pHeight >= 0) { - // Non-uniform - pWidth = Math.round((float) pOriginalWidth * (float) pWidth / 100f); - pHeight = Math.round((float) pOriginalHeight * (float) pHeight / 100f); - } - else if (pWidth >= 0) { - // Find ratio from pWidth - ratio = (float) pWidth / 100f; - pWidth = Math.round((float) pOriginalWidth * ratio); - pHeight = Math.round((float) pOriginalHeight * ratio); - } - else if (pHeight >= 0) { - // Find ratio from pHeight - ratio = (float) pHeight / 100f; - pWidth = Math.round((float) pOriginalWidth * ratio); - pHeight = Math.round((float) pOriginalHeight * ratio); - } - // Else: No crop - } - else { - // Uniform - if (pMaximizeToAspect) { - if (pWidth >= 0 && pHeight >= 0) { - // Compute both ratios - ratio = (float) pWidth / (float) pHeight; - float originalRatio = (float) pOriginalWidth / (float) pOriginalHeight; - if (ratio > originalRatio) { - pWidth = pOriginalWidth; - pHeight = Math.round((float) pOriginalWidth / ratio); - } - else { - pHeight = pOriginalHeight; - pWidth = Math.round((float) pOriginalHeight * ratio); - } - } - else if (pWidth >= 0) { - // Find ratio from pWidth - ratio = (float) pWidth / (float) pOriginalWidth; - pHeight = Math.round((float) pOriginalHeight * ratio); - } - else if (pHeight >= 0) { - // Find ratio from pHeight - ratio = (float) pHeight / (float) pOriginalHeight; - pWidth = Math.round((float) pOriginalWidth * ratio); - } - // Else: No crop - } - } - - // Not specified, or outside bounds: Use original dimensions - if (pWidth < 0 || (pX < 0 && pWidth > pOriginalWidth) - || (pX >= 0 && (pX + pWidth) > pOriginalWidth)) { - pWidth = (pX >= 0 ? pOriginalWidth - pX : pOriginalWidth); - } - if (pHeight < 0 || (pY < 0 && pHeight > pOriginalHeight) - || (pY >= 0 && (pY + pHeight) > pOriginalHeight)) { - pHeight = (pY >= 0 ? pOriginalHeight - pY : pOriginalHeight); - } - - // Center - if (pX < 0) { - pX = (pOriginalWidth - pWidth) / 2; - } - if (pY < 0) { - pY = (pOriginalHeight - pHeight) / 2; - } - -// System.out.println("x: " + pX + " y: " + pY -// + " w: " + pWidth + " h " + pHeight); - - return new Rectangle(pX, pY, pWidth, pHeight); - } } \ No newline at end of file diff --git a/servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java b/servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java index 5210151d..fc3a7803 100755 --- a/servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java +++ b/servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java @@ -1078,337 +1078,4 @@ public class ImageServletResponseImplTestCase { verify(response).getOutputStream(); verify(response).setContentType(CONTENT_TYPE_PNG); } - - // ----------------------------------------------------------------------------------------------------------------- - // Absolute AOI - // ----------------------------------------------------------------------------------------------------------------- - - @Test - public void testGetAOIAbsolute() { - assertEquals(new Rectangle(10, 10, 100, 100), ImageServletResponseImpl.getAOI(200, 200, 10, 10, 100, 100, false, false)); - } - - @Test - public void testGetAOIAbsoluteOverflowX() { - assertEquals(new Rectangle(10, 10, 90, 100), ImageServletResponseImpl.getAOI(100, 200, 10, 10, 100, 100, false, false)); - } - - @Test - public void testGetAOIAbsoluteOverflowW() { - assertEquals(new Rectangle(0, 10, 100, 100), ImageServletResponseImpl.getAOI(100, 200, 0, 10, 110, 100, false, false)); - } - - @Test - public void testGetAOIAbsoluteOverflowY() { - assertEquals(new Rectangle(10, 10, 100, 90), ImageServletResponseImpl.getAOI(200, 100, 10, 10, 100, 100, false, false)); - } - - @Test - public void testGetAOIAbsoluteOverflowH() { - assertEquals(new Rectangle(10, 0, 100, 100), ImageServletResponseImpl.getAOI(200, 100, 10, 0, 100, 110, false, false)); - } - - // ----------------------------------------------------------------------------------------------------------------- - // Uniform AOI centered - // ----------------------------------------------------------------------------------------------------------------- - - @Test - public void testGetAOIUniformCenteredS2SUp() { - assertEquals(new Rectangle(0, 0, 100, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 333, 333, false, true)); - } - - @Test - public void testGetAOIUniformCenteredS2SDown() { - assertEquals(new Rectangle(0, 0, 100, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 33, 33, false, true)); - } - - @Test - public void testGetAOIUniformCenteredS2SNormalized() { - assertEquals(new Rectangle(0, 0, 100, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 100, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredS2W() { - assertEquals(new Rectangle(0, 25, 100, 50), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 200, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredS2WNormalized() { - assertEquals(new Rectangle(0, 25, 100, 50), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 100, 50, false, true)); - } - - @Test - public void testGetAOIUniformCenteredS2N() { - assertEquals(new Rectangle(25, 0, 50, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 100, 200, false, true)); - } - - @Test - public void testGetAOIUniformCenteredS2NNormalized() { - assertEquals(new Rectangle(25, 0, 50, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 50, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2S() { - assertEquals(new Rectangle(50, 0, 100, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 333, 333, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2SNormalized() { - assertEquals(new Rectangle(50, 0, 100, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 100, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2W() { - assertEquals(new Rectangle(0, 0, 200, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 100, 50, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2WW() { - assertEquals(new Rectangle(0, 25, 200, 50), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 200, 50, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2WN() { - assertEquals(new Rectangle(25, 0, 150, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 75, 50, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2WNNormalized() { - assertEquals(new Rectangle(25, 0, 150, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 150, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2WNormalized() { - assertEquals(new Rectangle(0, 0, 200, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 200, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2N() { - assertEquals(new Rectangle(75, 0, 50, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 100, 200, false, true)); - } - - @Test - public void testGetAOIUniformCenteredW2NNormalized() { - assertEquals(new Rectangle(75, 0, 50, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 50, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2S() { - assertEquals(new Rectangle(0, 50, 100, 100), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 333, 333, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2SNormalized() { - assertEquals(new Rectangle(0, 50, 100, 100), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2W() { - assertEquals(new Rectangle(0, 75, 100, 50), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 200, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2WNormalized() { - assertEquals(new Rectangle(0, 75, 100, 50), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 50, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2N() { - assertEquals(new Rectangle(0, 0, 100, 200), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 50, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2NN() { - assertEquals(new Rectangle(25, 0, 50, 200), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 25, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2NW() { - assertEquals(new Rectangle(0, 33, 100, 133), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 75, 100, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2NWNormalized() { - assertEquals(new Rectangle(0, 37, 100, 125), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 125, false, true)); - } - - @Test - public void testGetAOIUniformCenteredN2NNormalized() { - assertEquals(new Rectangle(0, 0, 100, 200), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 200, false, true)); - } - - // ----------------------------------------------------------------------------------------------------------------- - // Absolute AOI centered - // ----------------------------------------------------------------------------------------------------------------- - - @Test - public void testGetAOICenteredS2SUp() { - assertEquals(new Rectangle(0, 0, 100, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 333, 333, false, false)); - } - - @Test - public void testGetAOICenteredS2SDown() { - assertEquals(new Rectangle(33, 33, 33, 33), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 33, 33, false, false)); - } - - @Test - public void testGetAOICenteredS2SSame() { - assertEquals(new Rectangle(0, 0, 100, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 100, 100, false, false)); - } - - @Test - public void testGetAOICenteredS2WOverflow() { - assertEquals(new Rectangle(0, 0, 100, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 200, 100, false, false)); - } - - @Test - public void testGetAOICenteredS2W() { - assertEquals(new Rectangle(40, 45, 20, 10), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 20, 10, false, false)); - } - - @Test - public void testGetAOICenteredS2WMax() { - assertEquals(new Rectangle(0, 25, 100, 50), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 100, 50, false, false)); - } - - @Test - public void testGetAOICenteredS2NOverflow() { - assertEquals(new Rectangle(0, 0, 100, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 100, 200, false, false)); - } - - @Test - public void testGetAOICenteredS2N() { - assertEquals(new Rectangle(45, 40, 10, 20), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 10, 20, false, false)); - } - - @Test - public void testGetAOICenteredS2NMax() { - assertEquals(new Rectangle(25, 0, 50, 100), ImageServletResponseImpl.getAOI(100, 100, -1, -1, 50, 100, false, false)); - } - - @Test - public void testGetAOICenteredW2SOverflow() { - assertEquals(new Rectangle(0, 0, 200, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 333, 333, false, false)); - } - - @Test - public void testGetAOICenteredW2S() { - assertEquals(new Rectangle(75, 25, 50, 50), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 50, 50, false, false)); - } - - @Test - public void testGetAOICenteredW2SMax() { - assertEquals(new Rectangle(50, 0, 100, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 100, 100, false, false)); - } - - @Test - public void testGetAOICenteredW2WOverflow() { - assertEquals(new Rectangle(0, 0, 200, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 300, 200, false, false)); - } - - @Test - public void testGetAOICenteredW2W() { - assertEquals(new Rectangle(50, 25, 100, 50), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 100, 50, false, false)); - } - - @Test - public void testGetAOICenteredW2WW() { - assertEquals(new Rectangle(10, 40, 180, 20), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 180, 20, false, false)); - } - - @Test - public void testGetAOICenteredW2WN() { - assertEquals(new Rectangle(62, 25, 75, 50), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 75, 50, false, false)); - } - - @Test - public void testGetAOICenteredW2WSame() { - assertEquals(new Rectangle(0, 0, 200, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 200, 100, false, false)); - } - - @Test - public void testGetAOICenteredW2NOverflow() { - assertEquals(new Rectangle(50, 0, 100, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 100, 200, false, false)); - } - - @Test - public void testGetAOICenteredW2N() { - assertEquals(new Rectangle(83, 25, 33, 50), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 33, 50, false, false)); - } - - @Test - public void testGetAOICenteredW2NMax() { - assertEquals(new Rectangle(75, 0, 50, 100), ImageServletResponseImpl.getAOI(200, 100, -1, -1, 50, 100, false, false)); - } - - @Test - public void testGetAOICenteredN2S() { - assertEquals(new Rectangle(33, 83, 33, 33), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 33, 33, false, false)); - } - - @Test - public void testGetAOICenteredN2SMax() { - assertEquals(new Rectangle(0, 50, 100, 100), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 100, false, false)); - } - - @Test - public void testGetAOICenteredN2WOverflow() { - assertEquals(new Rectangle(0, 50, 100, 100), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 200, 100, false, false)); - } - - @Test - public void testGetAOICenteredN2W() { - assertEquals(new Rectangle(40, 95, 20, 10), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 20, 10, false, false)); - } - - @Test - public void testGetAOICenteredN2WMax() { - assertEquals(new Rectangle(0, 75, 100, 50), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 50, false, false)); - } - - @Test - public void testGetAOICenteredN2N() { - assertEquals(new Rectangle(45, 90, 10, 20), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 10, 20, false, false)); - } - - @Test - public void testGetAOICenteredN2NSame() { - assertEquals(new Rectangle(0, 0, 100, 200), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 200, false, false)); - } - - @Test - public void testGetAOICenteredN2NN() { - assertEquals(new Rectangle(37, 50, 25, 100), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 25, 100, false, false)); - } - - @Test - public void testGetAOICenteredN2NW() { - assertEquals(new Rectangle(12, 50, 75, 100), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 75, 100, false, false)); - } - - @Test - public void testGetAOICenteredN2NWMax() { - assertEquals(new Rectangle(0, 37, 100, 125), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 125, false, false)); - } - - @Test - public void testGetAOICenteredN2NMax() { - assertEquals(new Rectangle(0, 0, 100, 200), ImageServletResponseImpl.getAOI(100, 200, -1, -1, 100, 200, false, false)); - } - - // TODO: Test percent - - // TODO: Test getSize()... - - private static class BlackLabel extends JLabel { - public BlackLabel(final String text, final BufferedImage outImage) { - super(text, new BufferedImageIcon(outImage), JLabel.CENTER); - setOpaque(true); - setBackground(Color.BLACK); - setForeground(Color.WHITE); - setVerticalAlignment(JLabel.CENTER); - setVerticalTextPosition(JLabel.BOTTOM); - setHorizontalTextPosition(JLabel.CENTER); - } - } } diff --git a/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/AreaOfInterest.java b/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/AreaOfInterest.java new file mode 100644 index 00000000..f0305110 --- /dev/null +++ b/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/AreaOfInterest.java @@ -0,0 +1,126 @@ +package com.twelvemonkeys.servlet.image; + +import java.awt.*; + +/** + * @author Erlend Hamnaberg + * @version $Revision: $ + */ +class AreaOfInterest { + private final int mOriginalWidth; + private final int mOriginalHeight; + private final boolean mPercent; + private final boolean pUniform; + + AreaOfInterest(int pOriginalWidth, int pOriginalHeight, boolean pPercent, boolean pUniform) { + this.mOriginalWidth = pOriginalWidth; + this.mOriginalHeight = pOriginalHeight; + this.mPercent = pPercent; + this.pUniform = pUniform; + } + + Rectangle getAOI(int pX, int pY, int pWidth, int pHeight) { + // Algoritm: + // Try to get x and y (default 0,0). + // Try to get width and height (default width-x, height-y) + // + // If percent, get ratio + // + // If uniform + // + + float ratio; + + if (mPercent) { + if (pWidth >= 0 && pHeight >= 0) { + // Non-uniform + pWidth = Math.round((float) mOriginalWidth * (float) pWidth / 100f); + pHeight = Math.round((float) mOriginalHeight * (float) pHeight / 100f); + } + else if (pWidth >= 0) { + // Find ratio from pWidth + ratio = (float) pWidth / 100f; + pWidth = Math.round((float) mOriginalWidth * ratio); + pHeight = Math.round((float) mOriginalHeight * ratio); + + } + else if (pHeight >= 0) { + // Find ratio from pHeight + ratio = (float) pHeight / 100f; + pWidth = Math.round((float) mOriginalWidth * ratio); + pHeight = Math.round((float) mOriginalHeight * ratio); + } + // Else: No crop + } + else { + // Uniform + if (pUniform) { + if (pWidth >= 0 && pHeight >= 0) { + // Compute both ratios + ratio = (float) pWidth / (float) pHeight; + float originalRatio = (float) mOriginalWidth / (float) mOriginalHeight; + if (ratio > originalRatio) { + pWidth = mOriginalWidth; + pHeight = Math.round((float) mOriginalWidth / ratio); + } + else { + pHeight = mOriginalHeight; + pWidth = Math.round((float) mOriginalHeight * ratio); + } + } + else if (pWidth >= 0) { + // Find ratio from pWidth + ratio = (float) pWidth / (float) mOriginalWidth; + pHeight = Math.round((float) mOriginalHeight * ratio); + } + else if (pHeight >= 0) { + // Find ratio from pHeight + ratio = (float) pHeight / (float) mOriginalHeight; + pWidth = Math.round((float) mOriginalWidth * ratio); + } + // Else: No crop + } + } + + // Not specified, or outside bounds: Use original dimensions + if (pWidth < 0 || (pX < 0 && pWidth > mOriginalWidth) + || (pX >= 0 && (pX + pWidth) > mOriginalWidth)) { + pWidth = (pX >= 0 ? mOriginalWidth - pX : mOriginalWidth); + } + if (pHeight < 0 || (pY < 0 && pHeight > mOriginalHeight) + || (pY >= 0 && (pY + pHeight) > mOriginalHeight)) { + pHeight = (pY >= 0 ? mOriginalHeight - pY : mOriginalHeight); + } + if (Boolean.getBoolean("rule-of-thirds")) { + pY = calculateRuleOfThirds(pY, pWidth, pHeight); + } + // Center + if (pY < 0) { + pY = (mOriginalHeight - pHeight) / 2; + } + + if (pX < 0) { + pX = (mOriginalWidth - pWidth) / 2; + } + +// System.out.println("x: " + pX + " y: " + pY +// + " w: " + pWidth + " h " + pHeight); + + return new Rectangle(pX, pY, pWidth, pHeight); + } + + private int calculateRuleOfThirds(final int pY, final int pWidth, final int pHeight) { + int y = pY; + if (y < 0) { + float origRatio = (float) mOriginalWidth / (float) mOriginalHeight; + float cropRatio = (float) pWidth / (float) pHeight; + if (cropRatio > origRatio && origRatio < 1) { + y = (int) ((mOriginalHeight * 0.33f) - (pHeight / 2)); + if (y < 0) { + y = 0; + } + } + } + return y; + } +} diff --git a/twelvemonkeys-servlet/src/test/java/com/twelvemonkeys/servlet/image/AreaOfInterestTestCase.java b/twelvemonkeys-servlet/src/test/java/com/twelvemonkeys/servlet/image/AreaOfInterestTestCase.java new file mode 100644 index 00000000..a0f3480d --- /dev/null +++ b/twelvemonkeys-servlet/src/test/java/com/twelvemonkeys/servlet/image/AreaOfInterestTestCase.java @@ -0,0 +1,404 @@ +package com.twelvemonkeys.servlet.image; + +import org.junit.Test; + +import java.awt.*; + +import static org.junit.Assert.assertEquals; + +/** + * @author Erlend Hamnaberg + * @version $Revision: $ + */ +public class AreaOfInterestTestCase { + // ----------------------------------------------------------------------------------------------------------------- + // Absolute AOI + // ----------------------------------------------------------------------------------------------------------------- + + @Test + public void testGetAOIAbsolute() { + assertEquals(new Rectangle(10, 10, 100, 100), new AreaOfInterest(200, 200, false, false).getAOI(10, 10, 100, 100)); + } + + @Test + public void testGetAOIAbsoluteOverflowX() { + + assertEquals(new Rectangle(10, 10, 90, 100), new AreaOfInterest(100, 200, false, false).getAOI(10, 10, 100, 100)); + } + + @Test + public void testGetAOIAbsoluteOverflowW() { + + assertEquals(new Rectangle(0, 10, 100, 100), new AreaOfInterest(100, 200, false, false).getAOI(0, 10, 110, 100)); + } + + @Test + public void testGetAOIAbsoluteOverflowY() { + + assertEquals(new Rectangle(10, 10, 100, 90), new AreaOfInterest(200, 100, false, false).getAOI(10, 10, 100, 100)); + } + + @Test + public void testGetAOIAbsoluteOverflowH() { + + assertEquals(new Rectangle(10, 0, 100, 100), new AreaOfInterest(200, 100, false, false).getAOI(10, 0, 100, 110)); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Uniform AOI centered + // ----------------------------------------------------------------------------------------------------------------- + + @Test + public void testGetAOIUniformCenteredS2SUp() { + assertEquals(new Rectangle(0, 0, 100, 100), new AreaOfInterest(100, 100, false, true).getAOI(-1, -1, 333, 333)); + } + + @Test + public void testGetAOIUniformCenteredS2SDown() { + assertEquals(new Rectangle(0, 0, 100, 100), new AreaOfInterest(100, 100, false, true).getAOI(-1, -1, 33, 33)); + } + + @Test + public void testGetAOIUniformCenteredS2SNormalized() { + assertEquals(new Rectangle(0, 0, 100, 100), new AreaOfInterest(100, 100, false, true).getAOI(-1, -1, 100, 100)); + } + + @Test + public void testGetAOIUniformCenteredS2W() { + assertEquals(new Rectangle(0, 25, 100, 50), new AreaOfInterest(100, 100, false, true).getAOI(-1, -1, 200, 100)); + } + + @Test + public void testGetAOIUniformCenteredS2WNormalized() { + assertEquals(new Rectangle(0, 25, 100, 50), new AreaOfInterest(100, 100, false, true).getAOI(-1, -1, 100, 50)); + } + + @Test + public void testGetAOIUniformCenteredS2N() { + assertEquals(new Rectangle(25, 0, 50, 100), new AreaOfInterest(100, 100, false, true).getAOI(-1, -1, 100, 200)); + } + + @Test + public void testGetAOIUniformCenteredS2NNormalized() { + assertEquals(new Rectangle(25, 0, 50, 100), new AreaOfInterest(100, 100, false, true).getAOI(-1, -1, 50, 100)); + } + + @Test + public void testGetAOIUniformCenteredW2S() { + assertEquals(new Rectangle(50, 0, 100, 100), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 333, 333)); + } + + @Test + public void testGetAOIUniformCenteredW2SNormalized() { + assertEquals(new Rectangle(50, 0, 100, 100), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 100, 100)); + } + + @Test + public void testGetAOIUniformCenteredW2W() { + assertEquals(new Rectangle(0, 0, 200, 100), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 100, 50)); + } + + @Test + public void testGetAOIUniformCenteredW2WW() { + assertEquals(new Rectangle(0, 25, 200, 50), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 200, 50)); + } + + @Test + public void testGetAOIUniformCenteredW2WN() { + assertEquals(new Rectangle(25, 0, 150, 100), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 75, 50)); + } + + @Test + public void testGetAOIUniformCenteredW2WNNormalized() { + assertEquals(new Rectangle(25, 0, 150, 100), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 150, 100)); + } + + @Test + public void testGetAOIUniformCenteredW2WNormalized() { + assertEquals(new Rectangle(0, 0, 200, 100), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 200, 100)); + } + + @Test + public void testGetAOIUniformCenteredW2N() { + assertEquals(new Rectangle(75, 0, 50, 100), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 100, 200)); + } + + @Test + public void testGetAOIUniformCenteredW2NNormalized() { + assertEquals(new Rectangle(75, 0, 50, 100), new AreaOfInterest(200, 100, false, true).getAOI(-1, -1, 50, 100)); + } + + @Test + public void testGetAOIUniformCenteredN2S() { + assertEquals(new Rectangle(0, 50, 100, 100), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 333, 333)); + } + + @Test + public void testGetAOIUniformCenteredN2SNormalized() { + assertEquals(new Rectangle(0, 50, 100, 100), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 100, 100)); + } + + @Test + public void testGetAOIUniformCenteredN2W() { + assertEquals(new Rectangle(0, 75, 100, 50), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 200, 100)); + } + + @Test + public void testGetAOIUniformCenteredN2WNormalized() { + assertEquals(new Rectangle(0, 75, 100, 50), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 100, 50)); + } + + @Test + public void testGetAOIUniformCenteredN2N() { + assertEquals(new Rectangle(0, 0, 100, 200), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 50, 100)); + } + + @Test + public void testGetAOIUniformCenteredN2NN() { + assertEquals(new Rectangle(25, 0, 50, 200), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 25, 100)); + } + + @Test + public void testGetAOIUniformCenteredN2NW() { + assertEquals(new Rectangle(0, 33, 100, 133), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 75, 100)); + } + + @Test + public void testGetAOIUniformCenteredN2NWNormalized() { + assertEquals(new Rectangle(0, 37, 100, 125), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 100, 125)); + } + + @Test + public void testGetAOIUniformCenteredN2NNormalized() { + assertEquals(new Rectangle(0, 0, 100, 200), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 100, 200)); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Absolute AOI centered + // ----------------------------------------------------------------------------------------------------------------- + + @Test + public void testGetAOICenteredS2SUp() { + assertEquals(new Rectangle(0, 0, 100, 100), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 333, 333)); + } + + @Test + public void testGetAOICenteredS2SDown() { + assertEquals(new Rectangle(33, 33, 33, 33), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 33, 33)); + } + + @Test + public void testGetAOICenteredS2SSame() { + assertEquals(new Rectangle(0, 0, 100, 100), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 100, 100)); + } + + @Test + public void testGetAOICenteredS2WOverflow() { + assertEquals(new Rectangle(0, 0, 100, 100), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 200, 100)); + } + + @Test + public void testGetAOICenteredS2W() { + assertEquals(new Rectangle(40, 45, 20, 10), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 20, 10)); + } + + @Test + public void testGetAOICenteredS2WMax() { + assertEquals(new Rectangle(0, 25, 100, 50), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 100, 50)); + } + + @Test + public void testGetAOICenteredS2NOverflow() { + assertEquals(new Rectangle(0, 0, 100, 100), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 100, 200)); + } + + @Test + public void testGetAOICenteredS2N() { + assertEquals(new Rectangle(45, 40, 10, 20), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 10, 20)); + } + + @Test + public void testGetAOICenteredS2NMax() { + assertEquals(new Rectangle(25, 0, 50, 100), new AreaOfInterest(100, 100, false, false).getAOI(-1, -1, 50, 100)); + } + + @Test + public void testGetAOICenteredW2SOverflow() { + assertEquals(new Rectangle(0, 0, 200, 100), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 333, 333)); + } + + @Test + public void testGetAOICenteredW2S() { + assertEquals(new Rectangle(75, 25, 50, 50), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 50, 50)); + } + + @Test + public void testGetAOICenteredW2SMax() { + assertEquals(new Rectangle(50, 0, 100, 100), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 100, 100)); + } + + @Test + public void testGetAOICenteredW2WOverflow() { + assertEquals(new Rectangle(0, 0, 200, 100), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 300, 200)); + } + + @Test + public void testGetAOICenteredW2W() { + assertEquals(new Rectangle(50, 25, 100, 50), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 100, 50)); + } + + @Test + public void testGetAOICenteredW2WW() { + assertEquals(new Rectangle(10, 40, 180, 20), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 180, 20)); + } + + @Test + public void testGetAOICenteredW2WN() { + assertEquals(new Rectangle(62, 25, 75, 50), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 75, 50)); + } + + @Test + public void testGetAOICenteredW2WSame() { + assertEquals(new Rectangle(0, 0, 200, 100), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 200, 100)); + } + + @Test + public void testGetAOICenteredW2NOverflow() { + assertEquals(new Rectangle(50, 0, 100, 100), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 100, 200)); + } + + @Test + public void testGetAOICenteredW2N() { + assertEquals(new Rectangle(83, 25, 33, 50), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 33, 50)); + } + + @Test + public void testGetAOICenteredW2NMax() { + assertEquals(new Rectangle(75, 0, 50, 100), new AreaOfInterest(200, 100, false, false).getAOI(-1, -1, 50, 100)); + } + + @Test + public void testGetAOICenteredN2S() { + assertEquals(new Rectangle(33, 83, 33, 33), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 33, 33)); + } + + @Test + public void testGetAOICenteredN2SMax() { + assertEquals(new Rectangle(0, 50, 100, 100), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 100, 100)); + } + + @Test + public void testGetAOICenteredN2WOverflow() { + assertEquals(new Rectangle(0, 50, 100, 100), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 200, 100)); + } + + @Test + public void testGetAOICenteredN2W() { + assertEquals(new Rectangle(40, 95, 20, 10), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 20, 10)); + } + + @Test + public void testGetAOICenteredN2WMax() { + assertEquals(new Rectangle(0, 75, 100, 50), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 100, 50)); + } + + @Test + public void testGetAOICenteredN2N() { + assertEquals(new Rectangle(45, 90, 10, 20), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 10, 20)); + } + + @Test + public void testGetAOICenteredN2NSame() { + assertEquals(new Rectangle(0, 0, 100, 200), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 100, 200)); + } + + @Test + public void testGetAOICenteredN2NN() { + assertEquals(new Rectangle(37, 50, 25, 100), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 25, 100)); + } + + @Test + public void testGetAOICenteredN2NW() { + assertEquals(new Rectangle(12, 50, 75, 100), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 75, 100)); + } + + @Test + public void testGetAOICenteredN2NWMax() { + assertEquals(new Rectangle(0, 37, 100, 125), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 100, 125)); + } + + @Test + public void testGetAOICenteredN2NMax() { + assertEquals(new Rectangle(0, 0, 100, 200), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 100, 200)); + } + + @Test + public void testGetAOIRuleOfThirdsN2N() { + enableRuleOfThirds(); + assertEquals(new Rectangle(45, 90, 10, 20), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 10, 20)); + } + + @Test + public void testGetAOIRuleOfThirdsN2NMax() { + enableRuleOfThirds(); + assertEquals(new Rectangle(0, 0, 100, 200), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 100, 200)); + } + + @Test + public void testGetAOIUniformRuleOfThirdsN2S() { + enableRuleOfThirds(); + assertEquals(new Rectangle(0, 16, 100, 100), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 333, 333)); + } + + @Test + public void testGetAOIUniformRuleOfThirdsN2SNormalized() { + enableRuleOfThirds(); + assertEquals(new Rectangle(0, 16, 100, 100), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 100, 100)); + } + + @Test + public void testGetAOIUniformRuleOfThirdsN2W() { + enableRuleOfThirds(); + assertEquals(new Rectangle(0, 41, 100, 50), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 200, 100)); + } + + @Test + public void testGetAOIUniformRuleOfThirdsN2WNormalized() { + enableRuleOfThirds(); + assertEquals(new Rectangle(0, 41, 100, 50), new AreaOfInterest(100, 200, false, true).getAOI(-1, -1, 100, 50)); + } + + @Test + public void testGetAOIRuleOfThirdsN2S() { + enableRuleOfThirds(); + assertEquals(new Rectangle(33, 50, 33, 33), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 33, 33)); + } + + @Test + public void testGetAOIRuleOfThirdsN2SMax() { + enableRuleOfThirds(); + assertEquals(new Rectangle(0, 16, 100, 100), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 100, 100)); + } + + @Test + public void testGetAOIRuleOfThirdsN2WOverflow() { + enableRuleOfThirds(); + assertEquals(new Rectangle(0, 16, 100, 100), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 200, 100)); + } + + @Test + public void testGetAOIRuleOfThirdsN2W() { + enableRuleOfThirds(); + assertEquals(new Rectangle(40, 61, 20, 10), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 20, 10)); + } + + @Test + public void testGetAOIRuleOfThirdsN2WMax() { + enableRuleOfThirds(); + assertEquals(new Rectangle(0, 41, 100, 50), new AreaOfInterest(100, 200, false, false).getAOI(-1, -1, 100, 50)); + } + + private void enableRuleOfThirds() { + System.setProperty("rule-of-thirds", "true"); + } +}