Revision: 668
Author: heuermh
Date: Thu Aug 20 13:59:03 2009
Log: Issue 64 ; adding ShadowUtils, PShadow to extras, ShadowExample to
examples
http://code.google.com/p/piccolo2d/source/detail?r=668
Added:
/piccolo2d.java/trunk/examples/src/main/java/edu/umd/cs/piccolo/examples/ShadowExample.java
/piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/nodes/PShadow.java
/piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java
/piccolo2d.java/trunk/extras/src/test/java/edu/umd/cs/piccolox/nodes
/piccolo2d.java/trunk/extras/src/test/java/edu/umd/cs/piccolox/nodes/PShadowTest.java
/piccolo2d.java/trunk/extras/src/test/java/edu/umd/cs/piccolox/util/ShadowUtilsTest.java
Modified:
/piccolo2d.java/trunk/examples/src/main/java/edu/umd/cs/piccolo/examples/ExampleRunner.java
=======================================
--- /dev/null
+++
/piccolo2d.java/trunk/examples/src/main/java/edu/umd/cs/piccolo/examples/ShadowExample.java
Thu Aug 20 13:59:03 2009
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2008-2009, Piccolo2D project, http://piccolo2d.org
+ * Copyright (c) 1998-2008, University of Maryland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
this list of conditions
+ * and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
notice, this list of conditions
+ * and the following disclaimer in the documentation and/or other
materials provided with the
+ * distribution.
+ *
+ * None of the name of the University of Maryland, the name of the
Piccolo2D project, or the names of its
+ * contributors may be used to endorse or promote products derived from
this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package edu.umd.cs.piccolo.examples;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Paint;
+
+import java.awt.image.BufferedImage;
+
+import edu.umd.cs.piccolo.PCanvas;
+
+import edu.umd.cs.piccolo.nodes.PImage;
+import edu.umd.cs.piccolo.nodes.PPath;
+import edu.umd.cs.piccolo.nodes.PText;
+
+import edu.umd.cs.piccolox.PFrame;
+
+import edu.umd.cs.piccolox.nodes.PShadow;
+
+/**
+ * Shadow example.
+ */
+public final class ShadowExample extends PFrame {
+
+ /**
+ * Create a new shadow example.
+ */
+ public ShadowExample() {
+ this(null);
+ }
+
+ /**
+ * Create a new shadow example with the specified canvas.
+ *
+ * @param canvas canvas for this shadow example
+ */
+ public ShadowExample(final PCanvas canvas) {
+ super("ShadowExample", false, canvas);
+ }
+
+
+ /** {...@inheritdoc} */
+ public void initialize() {
+ BufferedImage src = new BufferedImage(75, 75,
BufferedImage.TYPE_INT_ARGB);
+ Paint shadowPaint = new Color(20, 20, 20, 200);
+ Graphics2D g = src.createGraphics();
+ g.setPaint(Color.RED);
+ g.fillRect(0, 0, 75, 75);
+ g.dispose();
+
+ PText header1 = new PText("Shadow nodes drawn from an image, with
increasing blur radius:");
+ getCanvas().getLayer().addChild(header1);
+
+ double x = 25.0d;
+ double y = 25.0d;
+
+ for (int blurRadius = 4; blurRadius < 28; blurRadius += 4) {
+ PImage node = new PImage(src);
+ PShadow shadowNode = new PShadow(src, shadowPaint, blurRadius);
+
+ node.setOffset(x, y);
+ // offset the shadow to account for blur radius offset and
light direction
+ shadowNode.setOffset(x - (2 * blurRadius) + 5.0d, y - (2 *
blurRadius) + 5.0d);
+
+ // add shadow node before node, or set Z explicitly (e.g.
sendToBack())
+ getCanvas().getLayer().addChild(shadowNode);
+ getCanvas().getLayer().addChild(node);
+
+ x += 125.0d;
+ if (x > 300.0d) {
+ y += 125.0d;
+ x = 25.0d;
+ }
+ }
+
+ PText header2 = new PText("Shadow nodes drawn from
node.toImage():");
+ header2.setOffset(0.0d, 300.0d);
+ getCanvas().getLayer().addChild(header2);
+
+ PPath rectNode = PPath.createRectangle(0.0f, 0.0f, 75.0f, 75.0f);
+ rectNode.setPaint(Color.RED);
+ rectNode.setStroke(null);
+ rectNode.setOffset(25.0d, 325.0d);
+
+ PShadow rectShadow = new PShadow(rectNode.toImage(), shadowPaint,
8);
+ rectShadow.setOffset(25.0d - (2 * 8) + 5.0d, 325.0d - (2 * 8) +
5.0d);
+
+ getCanvas().getLayer().addChild(rectShadow);
+ getCanvas().getLayer().addChild(rectNode);
+
+ PText textNode = new PText("Shadow Text");
+ textNode.setTextPaint(Color.RED);
+ textNode.setFont(textNode.getFont().deriveFont(36.0f));
+ textNode.setOffset(125.0d, 325.0d);
+
+ PShadow textShadow = new PShadow(textNode.toImage(), shadowPaint,
8);
+ textShadow.setOffset(125.0d - (2 * 8) + 2.5d, 325.0d - (2 * 8) +
2.5d);
+
+ getCanvas().getLayer().addChild(textShadow);
+ getCanvas().getLayer().addChild(textNode);
+ }
+
+ /**
+ * Main.
+ *
+ * @param args command line arguments, ignored
+ */
+ public static void main(final String[] args) {
+ new ShadowExample();
+ }
+}
=======================================
--- /dev/null
+++
/piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/nodes/PShadow.java
Thu Aug 20 13:59:03 2009
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2008-2009, Piccolo2D project, http://piccolo2d.org
+ * Copyright (c) 1998-2008, University of Maryland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
this list of conditions
+ * and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
notice, this list of conditions
+ * and the following disclaimer in the documentation and/or other
materials provided with the
+ * distribution.
+ *
+ * None of the name of the University of Maryland, the name of the
Piccolo2D project, or the names of its
+ * contributors may be used to endorse or promote products derived from
this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package edu.umd.cs.piccolox.nodes;
+
+import java.awt.Image;
+import java.awt.Paint;
+
+import java.awt.image.BufferedImage;
+
+import edu.umd.cs.piccolo.nodes.PImage;
+
+import edu.umd.cs.piccolox.util.ShadowUtils;
+
+/**
+ * Shadow node.
+ */
+public final class PShadow extends PImage {
+
+ /**
+ * Create a new shadow node containing a shadow of the specified
source image using the
+ * specified shadow paint and gaussian blur radius. The dimensions of
this node will be
+ * <code>src.getWidth() + 4 * blurRadius</code> x
<code>src.getHeight() + 4 * blurRadius</code>
+ * to account for blurring beyond the bounds of the source image.
Thus the source image
+ * will appear to be be offset by (<code>2 * blurRadius</code>,
<code>2 * blurRadius</code>)
+ * in this node.
+ *
+ * @param src source image, must not be null
+ * @param shadowPaint shadow paint
+ * @param blurRadius gaussian blur radius, must be <code>> 0</code>
+ */
+ public PShadow(final Image src, final Paint shadowPaint, final int
blurRadius) {
+ super(ShadowUtils.createShadow(src, shadowPaint, blurRadius));
+ }
+}
=======================================
--- /dev/null
+++
/piccolo2d.java/trunk/extras/src/main/java/edu/umd/cs/piccolox/util/ShadowUtils.java
Thu Aug 20 13:59:03 2009
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2008-2009, Piccolo2D project, http://piccolo2d.org
+ * Copyright (c) 1998-2008, University of Maryland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
this list of conditions
+ * and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
notice, this list of conditions
+ * and the following disclaimer in the documentation and/or other
materials provided with the
+ * distribution.
+ *
+ * None of the name of the University of Maryland, the name of the
Piccolo2D project, or the names of its
+ * contributors may be used to endorse or promote products derived from
this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package edu.umd.cs.piccolox.util;
+
+import java.awt.AlphaComposite;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Paint;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.ConvolveOp;
+import java.awt.image.Kernel;
+
+/**
+ * Static utility methods for creating shadows.
+ */
+public final class ShadowUtils {
+
+ /**
+ * Private no-arg constructor.
+ */
+ private ShadowUtils() {
+ // empty
+ }
+
+
+ /**
+ * Create and return a new buffered image containing a shadow of the
specified source image
+ * using the specifed shadow paint and gaussian blur radius. The
dimensions of the returned image will be
+ * <code>src.getWidth() + 4 * blurRadius</code> x
<code>src.getHeight() + 4 * blurRadius</code>
+ * to account for blurring beyond the bounds of the source image.
Thus the source image
+ * will appear to be be offset by (<code>2 * blurRadius</code>,
<code>2 * blurRadius</code>)
+ * in the returned image.
+ *
+ * @param src source image, must not be null
+ * @param shadowPaint shadow paint
+ * @param blurRadius gaussian blur radius, must be <code>> 0</code>
+ * @return a new buffered image containing a shadow of the specified
source image
+ * using the specifed shadow paint and gaussian blur radius
+ */
+ public static BufferedImage createShadow(final Image src, final Paint
shadowPaint, final int blurRadius) {
+ if (src == null) {
+ throw new IllegalArgumentException("src image must not be
null");
+ }
+ if (blurRadius < 1) {
+ throw new IllegalArgumentException("blur radius must be
greater than zero, was " + blurRadius);
+ }
+ int w = src.getWidth(null) + (4 * blurRadius);
+ int h = src.getHeight(null) + (4 * blurRadius);
+
+ // paint src image into mask
+ BufferedImage mask = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
+ Graphics2D g = mask.createGraphics();
+ g.drawImage(src, 2 * blurRadius, 2 * blurRadius, null);
+
+ // composite mask with shadow paint
+ g.setComposite(AlphaComposite.SrcIn);
+ g.setPaint(shadowPaint);
+ g.fillRect(0, 0, w, h);
+ g.dispose();
+
+ // apply convolve op for blur
+ ConvolveOp convolveOp = new ConvolveOp(new
GaussianKernel(blurRadius));
+ BufferedImage shadow = convolveOp.filter(mask, null);
+ return shadow;
+ }
+
+ /**
+ * Gaussian kernel.
+ */
+ private static class GaussianKernel extends Kernel {
+
+ /**
+ * Create a new gaussian kernel with the specified blur radius.
+ *
+ * @param blurRadius blur radius
+ */
+ GaussianKernel(final int blurRadius) {
+ super((2 * blurRadius) + 1, (2 * blurRadius) + 1,
createKernel(blurRadius));
+ }
+
+
+ /**
+ * Create an array of floats representing a gaussian kernel with
the specified radius.
+ *
+ * @param r radius
+ * @return an array of floats representing a gaussian kernel with
the specified radius
+ */
+ private static float[] createKernel(final int r) {
+ int w = (2 * r) + 1;
+ float kernel[] = new float[w * w];
+ double m = 2.0d * Math.pow((r / 3.0d), 2);
+ double n = Math.PI * m;
+
+ double sum = 0.0d;
+ for (int i = 0; i < w; i++) {
+ for (int j = 0; j < w; j++) {
+ kernel[i * w + j] = (float) (Math.pow(Math.E, -((j -
r) * (j - r) + (i - r) * (i - r)) / m) / n);
+ sum += kernel[i * w + j];
+ }
+ }
+ for (int i = 0; i < w; i++) {
+ for (int j = 0; j < w; j++) {
+ kernel[i * w + j] /= sum;
+ }
+ }
+ return kernel;
+ }
+ }
+}
=======================================
--- /dev/null
+++
/piccolo2d.java/trunk/extras/src/test/java/edu/umd/cs/piccolox/nodes/PShadowTest.java
Thu Aug 20 13:59:03 2009
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2008-2009, Piccolo2D project, http://piccolo2d.org
+ * Copyright (c) 1998-2008, University of Maryland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
this list of conditions
+ * and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
notice, this list of conditions
+ * and the following disclaimer in the documentation and/or other
materials provided with the
+ * distribution.
+ *
+ * None of the name of the University of Maryland, the name of the
Piccolo2D project, or the names of its
+ * contributors may be used to endorse or promote products derived from
this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package edu.umd.cs.piccolox.nodes;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Paint;
+
+import java.awt.image.BufferedImage;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit test for PShadow.
+ */
+public final class PShadowTest extends TestCase {
+
+ public void testConstructor() {
+ BufferedImage src = new BufferedImage(100, 100,
BufferedImage.TYPE_INT_ARGB);
+ Paint srcPaint = new Color(255, 0, 0, 200);
+ Paint shadowPaint = new Color(20, 20, 20, 200);
+ Graphics2D g = src.createGraphics();
+ g.setPaint(srcPaint);
+ g.drawRect(25, 25, 50, 50);
+ g.dispose();
+
+ for (int blurRadius = 1; blurRadius < 33; blurRadius += 4) {
+ PShadow shadowNode = new PShadow(src, shadowPaint, blurRadius);
+ assertNotNull(shadowNode);
+ assertEquals(src.getWidth() + 4 * blurRadius,
shadowNode.getWidth(), 0.001d);
+ assertEquals(src.getHeight() + 4 * blurRadius,
shadowNode.getHeight(), 0.001d);
+ }
+
+ try {
+ PShadow shadowNode = new PShadow(null, shadowPaint, 4);
+ fail("ctr(null, ...) expected IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ PShadow shadowNode = new PShadow(src, shadowPaint, 0);
+ fail("ctr(..., -1) expected IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ PShadow shadowNode = new PShadow(src, shadowPaint, -1);
+ fail("ctr(..., -1) expected IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ // expected
+ }
+ }
+}
=======================================
--- /dev/null
+++
/piccolo2d.java/trunk/extras/src/test/java/edu/umd/cs/piccolox/util/ShadowUtilsTest.java
Thu Aug 20 13:59:03 2009
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2008-2009, Piccolo2D project, http://piccolo2d.org
+ * Copyright (c) 1998-2008, University of Maryland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
this list of conditions
+ * and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
notice, this list of conditions
+ * and the following disclaimer in the documentation and/or other
materials provided with the
+ * distribution.
+ *
+ * None of the name of the University of Maryland, the name of the
Piccolo2D project, or the names of its
+ * contributors may be used to endorse or promote products derived from
this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package edu.umd.cs.piccolox.util;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Paint;
+
+import java.awt.image.BufferedImage;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit test for ShadowUtils.
+ */
+public final class ShadowUtilsTest extends TestCase {
+
+ public void testCreateShadow() {
+ BufferedImage src = new BufferedImage(100, 100,
BufferedImage.TYPE_INT_ARGB);
+ Paint srcPaint = new Color(255, 0, 0, 200);
+ Paint shadowPaint = new Color(20, 20, 20, 200);
+ Graphics2D g = src.createGraphics();
+ g.setPaint(srcPaint);
+ g.drawRect(25, 25, 50, 50);
+ g.dispose();
+
+ for (int blurRadius = 1; blurRadius < 33; blurRadius += 4) {
+ BufferedImage dest = ShadowUtils.createShadow(src,
shadowPaint, blurRadius);
+ assertNotNull(dest);
+ assertEquals(src.getWidth() + 4 * blurRadius, dest.getWidth());
+ assertEquals(src.getHeight() + 4 * blurRadius,
dest.getHeight());
+ }
+
+ try {
+ ShadowUtils.createShadow(null, shadowPaint, 4);
+ fail("createShadow(null, ...) expected
IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ ShadowUtils.createShadow(src, shadowPaint, 0);
+ fail("createShadow(..., 0) expected IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ // expected
+ }
+ try {
+ ShadowUtils.createShadow(src, shadowPaint, -1);
+ fail("createShadow(..., -1) expected
IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ // expected
+ }
+ }
+}
=======================================
---
/piccolo2d.java/trunk/examples/src/main/java/edu/umd/cs/piccolo/examples/ExampleRunner.java
Tue Aug 4 07:26:15 2009
+++
/piccolo2d.java/trunk/examples/src/main/java/edu/umd/cs/piccolo/examples/ExampleRunner.java
Thu Aug 20 13:59:03 2009
@@ -111,9 +111,9 @@
KeyEventFocusExample.class, LayoutExample.class,
LensExample.class, NavigationExample.class,
NodeCacheExample.class, NodeEventExample.class,
NodeExample.class, NodeLinkExample.class,
PanToExample.class, PathExample.class,
PositionExample.class, PositionPathActivityExample.class,
- PulseExample.class, ScrollingExample.class,
SelectionExample.class, SquiggleExample.class,
- StickyExample.class, StickyHandleLayerExample.class,
StrokeExample.class, TextExample.class,
- TooltipExample.class, TwoCanvasExample.class,
WaitForActivitiesExample.class });
+ PulseExample.class, ScrollingExample.class,
SelectionExample.class, ShadowExample.class,
+ SquiggleExample.class, StickyExample.class,
StickyHandleLayerExample.class, StrokeExample.class,
+ TextExample.class, TooltipExample.class,
TwoCanvasExample.class, WaitForActivitiesExample.class });
}
private void addExampleButtons(final JPanel panel, final Class[]
exampleClasses) {
--~--~---------~--~----~------------~-------~--~----~
Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en
-~----------~----~----~----~------~----~------~--~---