diff options
-rw-r--r-- | ChangeLog | 43 | ||||
-rw-r--r-- | examples/gnu/classpath/examples/java2d/J2dBenchmark.java | 407 | ||||
-rw-r--r-- | examples/gnu/classpath/examples/java2d/J2dBenchmarkGUI.java | 269 |
3 files changed, 667 insertions, 52 deletions
@@ -1,3 +1,46 @@ +2006-06-23 Francis Kung <fkung@redhat.com> + + * examples/gnu/classpath/examples/java2d/J2dBenchmarkGUI.java + (Harness.actionPerformed): Process additional options. + (J2dBenchmarkWrapper): Defer init call until after options are processed. + (J2dBenchmarkWrapper.setAlias): New method. + (J2dBenchmarkWrapper.setComposite): New method. + (J2dBenchmarkWrapper.setFill): New method. + (J2dBenchmarkWrapper.setRotation): New method. + (J2dBenchmarkWrapper.setShear): New method. + (J2dBenchmarkWrapper.setStroke): New method. + (J2dBenchmarkWrapper.setTranslation): New method. + (run): Add additional options to GUI. + * examples/gnu/classpath/examples/java2d/J2dBenchmark.java: + Added protected fields for various options. + (GraphicsTest.runSet_noClipping): Reset graphics settings between tests. + (GraphicsTest.runSet_withClipping): Reset graphics settings between tests. + (GraphicsTest.runSet_zeroClipping): Reset graphics settings between tests. + (getNextColor): Renamed to setRandom. + (init): Load additional image for texturing if needed. + (loadBufferedImage): New method. + (main): Accept additional command-line switches. + (prepareGraphics): New method. + (resetGraphics): New method. + (runTestSuite): Accept additional image-processing options. + (setRandom): Renamed from getNextColor; generate various random options + (test_drawArc): Rename getNextColor to setRandom. + (test_drawCubic): Likewise. + (test_drawEllipse): Likewise. + (test_drawGeneralPath): Likewise. + (test_drawImage): Likewise. + (test_drawLine): Likewise. + (test_drawQuadCurve): Likewise. + (test_drawRectangle): Likewise. + (test_drawRoundRectangle): Likewise. + (test_drawTransparentImage): Likewise. + (test_fillArc): Rename getNextColor to setRandom. + (test_fillEllipse): Likewise. + (test_fillGeneralPath): Likewise. + (test_fillRectangle): Likewise. + (test_fillRoundRectangle): Likewise. + (TestRecorder.getAverage): Round the average time. + 2006-06-23 Tom Tromey <tromey@redhat.com> * java/util/logging/LoggingMXBean.java: New file. diff --git a/examples/gnu/classpath/examples/java2d/J2dBenchmark.java b/examples/gnu/classpath/examples/java2d/J2dBenchmark.java index 149d05a91..118ae2463 100644 --- a/examples/gnu/classpath/examples/java2d/J2dBenchmark.java +++ b/examples/gnu/classpath/examples/java2d/J2dBenchmark.java @@ -19,24 +19,30 @@ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - package gnu.classpath.examples.java2d; +import java.awt.AlphaComposite; +import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Frame; +import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Insets; import java.awt.Label; +import java.awt.MediaTracker; import java.awt.Panel; import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.TexturePaint; import java.awt.Toolkit; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.CubicCurve2D; import java.awt.geom.Ellipse2D; @@ -45,6 +51,7 @@ import java.awt.geom.Line2D; import java.awt.geom.QuadCurve2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; import java.net.URL; import java.util.Iterator; import java.util.Map; @@ -124,6 +131,28 @@ public class J2dBenchmark protected boolean doubleBufferFlag = true; + protected boolean gradientFlag = false; + + protected String texture = null; + + protected boolean strokeFlag = false; + + protected float composite = 1; + + protected int xtranslate = 0; + + protected int ytranslate = 0; + + protected double xshear = 0; + + protected double yshear = 0; + + protected double rotate = 0; + + protected boolean antialiasFlag = false; + + protected AffineTransform affineTransform = null; + protected int awtTests = J2DTEST_ALL; protected int testSize = DEFAULT_TEST_SIZE; @@ -138,17 +167,39 @@ public class J2dBenchmark private Image gifTestImage; + protected BufferedImage textureImage; + protected TestSet testSetMap = new TestSet(); - public void init() + public String init() { + boolean loadError = false; pngTestImage = loadImage("aicas.png"); gifTestImage = loadImage("palme.gif"); + if (texture != null) + { + textureImage = loadBufferedImage(texture); + + if (textureImage == null) + { + logger.logp(Level.WARNING, "J2dGraphicsBenchmark", "init", + "Unable to load texture - defaulting " + + "to solid colours"); + texture = null; + loadError = true; + } + } + setLayout(new BorderLayout()); testLabel = new Label(); add(testLabel, BorderLayout.NORTH); add(new GraphicsTest(), BorderLayout.CENTER); + + if (loadError) + return "Unable to load image"; + else + return null; } void setTestContext(String testName) @@ -195,7 +246,6 @@ public class J2dBenchmark int i; boolean endOfOptionsFlag; J2dBenchmark speed = new J2dBenchmark(); - speed.init(); // Parse arguments. i = 0; @@ -216,7 +266,23 @@ public class J2dBenchmark + DEFAULT_SCREEN_WIDTH); System.out.println(" -h|--height=<n> - screen height; default " + DEFAULT_SCREEN_HEIGHT); - System.out.println(" -n|--noDoubleBuffer - disable double-buffering test"); + System.out.println(" -d|--noDoubleBuffer - disable double-buffering test"); + System.out.println(" -s|--testsize=<n> - size of each test; default " + + DEFAULT_TEST_SIZE); + System.out.println(" -c|--noClipping - disable clipping test"); + System.out.println(" -z|--noZeroClipping - disable clipping to zero test"); + System.out.println(""); + System.out.println("Additional options:"); + System.out.println(" --with-gradients - enable gradients (not compatible with --texture)"); + System.out.println(" --with-stroking - enable random stroking"); + System.out.println(" --texture=<file> - enable texturing with this file (not compatible with --with-gradients)"); + System.out.println(" --composite=<n|-1> - set alpha composite level; -1 for random; default 1.0 (no transparency)"); + System.out.println(" --anti-alias=<on|off> - set anti-aliasing hint (not all implementations respect this); default off"); + System.out.println(" --x-translate=<n> - set x-axis translation; default 0"); + System.out.println(" --y-translate=<n> - set y-axis translation; default 0"); + System.out.println(" --x-shear=<n> - set x-axis shear; default 0"); + System.out.println(" --y-shear=<n> - set y-axis shear; default 0"); + System.out.println(" --rotate=<n|-1> - set rotation (radians); -1 for random; default: 0 (none)"); System.out.println(""); System.out.println("Tests: arc"); System.out.println(" cubiccurve"); @@ -283,12 +349,115 @@ public class J2dBenchmark i += 2; continue; } - else if ((args[i].equals("-n") || args[i].equals("--noDoubleBuffer"))) + else if ((args[i].equals("-d") || args[i].equals("--noDoubleBuffer"))) { speed.doubleBufferFlag = false; i += 1; continue; } + else if ((args[i].startsWith("-s=") || args[i].startsWith("--testsize="))) + { + if ((i + 1) >= args.length) + { + System.err.println("ERROR: No argument given for option '" + + args[i] + "'!"); + System.exit(2); + } + speed.testSize = Integer.parseInt(args[i].substring(args[i].indexOf('=') + 1)); + i += 1; + continue; + } + else if ((args[i].equals("-s") || args[i].equals("--testsize"))) + { + if ((i + 1) >= args.length) + { + System.err.println("ERROR: No argument given for option '" + + args[i] + "'!"); + System.exit(2); + } + speed.testSize = Integer.parseInt(args[i + 1]); + i += 2; + continue; + } + else if ((args[i].equals("-c") || args[i].equals("--noClipping"))) + { + speed.noClippingFlag = false; + i += 1; + continue; + } + else if ((args[i].equals("-z") || args[i].equals("--noZeroClipping"))) + { + speed.zeroClippingFlag = false; + i += 1; + continue; + } + else if (args[i].equals("--with-gradients")) + { + speed.gradientFlag = true; + i += 1; + continue; + } + else if (args[i].equals("--with-stroking")) + { + speed.strokeFlag = true; + i += 1; + continue; + } + else if (args[i].startsWith("--texture=")) + { + speed.texture = args[i].substring(args[i].indexOf('=') + 1); + i += 1; + continue; + } + else if (args[i].startsWith("--composite=")) + { + speed.composite = Float.parseFloat(args[i].substring(args[i].indexOf('=') + 1)); + if (speed.composite != - 1 + && (speed.composite < 0 || speed.composite > 1)) + { + System.err.println("ERROR: Invalid value for composite (must be between 0 and 1, or -1 for random)"); + System.exit(2); + } + i += 1; + continue; + } + else if (args[i].startsWith("--anti-alias=")) + { + speed.antialiasFlag = (args[i].substring(args[i].indexOf('=') + 1).equals("on")); + i += 1; + continue; + } + else if (args[i].startsWith("--x-translate=")) + { + speed.xtranslate = Integer.parseInt(args[i].substring(args[i].indexOf('=') + 1)); + i += 1; + continue; + } + else if (args[i].startsWith("--y-translate=")) + { + speed.ytranslate = Integer.parseInt(args[i].substring(args[i].indexOf('=') + 1)); + i += 1; + continue; + } + else if (args[i].startsWith("--x-shear=")) + { + speed.xshear = Double.parseDouble(args[i].substring(args[i].indexOf('=') + 1)); + i += 1; + continue; + } + else if (args[i].startsWith("--y-shear=")) + { + speed.yshear = Double.parseDouble(args[i].substring(args[i].indexOf('=') + 1)); + i += 1; + continue; + } + else if (args[i].startsWith("--rotate=")) + { + speed.rotate = Double.parseDouble(args[i].substring(args[i].indexOf('=') + 1)); + i += 1; + continue; + } + else if (args[i].equals("--")) { endOfOptionsFlag = true; @@ -335,6 +504,7 @@ public class J2dBenchmark speed.awtTests = awtTests; // Create graphics. + speed.init(); final Frame frame = new Frame("J2dGraphicsBenchmark"); frame.addWindowListener(new WindowAdapter() @@ -377,6 +547,51 @@ public class J2dBenchmark return result; } + private BufferedImage loadBufferedImage(String imageName) + { + BufferedImage result = null; + logger.logp(Level.INFO, "J2dGraphicsBenchmark", "loadImage", + "Loading image: " + imageName); + + // Try to load image out of classpath before trying an absolute filename + URL url = getClass().getResource(imageName); + Image img; + if (url != null) + img = Toolkit.getDefaultToolkit().getImage(url); + else + img = Toolkit.getDefaultToolkit().getImage(imageName); + + if (img != null) + { + // Wait for image to load + try + { + MediaTracker tracker = new MediaTracker(this); + tracker.addImage(img, 1); + tracker.waitForAll(); + + prepareImage(img, this); + result = new BufferedImage(img.getWidth(this), img.getHeight(this), + BufferedImage.TYPE_INT_RGB); + result.createGraphics().drawImage(img, 0, 0, this); + } + catch (InterruptedException e) + { + } + catch (IllegalArgumentException e) + { + } + } + + if (result == null) + { + logger.logp(Level.WARNING, "J2dGraphicsBenchmark", "loadBufferedImage", + "Could not locate image resource in class path: " + + imageName); + } + return result; + } + /** * Executes the test methods. * @@ -385,6 +600,9 @@ public class J2dBenchmark */ void runTestSet(Graphics2D g, Dimension size) { + // Any user-specified options (ie set transforms, rendering hints) + prepareGraphics((Graphics2D) g); + if ((awtTests & J2DTEST_ARC) != 0) { test_drawArc(g, size); @@ -439,15 +657,121 @@ public class J2dBenchmark } /** - * Gets a new random Color. + * Reset all graphics settings to the standard, default values + * + * @param g the object to apply settings to + */ + private void resetGraphics(Graphics2D g) + { + g.setTransform(new AffineTransform()); + g.setStroke(new BasicStroke()); + g.setComposite(AlphaComposite.SrcOut); + } + + /** + * Sets initial user graphics options * - * @returna new random Color + * @param g the object to apply settings to */ - private Color getNextColor() + private void prepareGraphics(Graphics2D g) { - return new Color((int) (Math.random() * 254) + 1, - (int) (Math.random() * 254) + 1, - (int) (Math.random() * 254) + 1); + // Transforms + if (affineTransform != null) + g.setTransform(affineTransform); + + else if (xtranslate != 0 || ytranslate != 0 || xshear != 0 || yshear != 0) + { + g.translate(xtranslate, ytranslate); + g.shear(xshear, yshear); + } + + if (rotate > 0) + g.rotate(rotate * Math.PI, screenWidth / 2, screenHeight / 2); + + // Composite (transparency) + if (composite > 0) + { + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, + composite)); + } + + // Textures + if (texture != null) + g.setPaint(new TexturePaint(textureImage, + new Rectangle(0, 0, textureImage.getWidth(), + textureImage.getHeight()))); + + // Anti-alias setting + if (antialiasFlag) + g.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON)); + else + g.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_OFF)); + } + + /** + * Gets new random settings + * + * @param g the object to set parameters for + * @param size the screen size + */ + private void setRandom(Graphics2D g, Dimension size) + { + // Set colour / paint + if (gradientFlag) + { + Color c1 = new Color((int) (Math.random() * 254) + 1, + (int) (Math.random() * 254) + 1, + (int) (Math.random() * 254) + 1); + + Color c2 = new Color((int) (Math.random() * 254) + 1, + (int) (Math.random() * 254) + 1, + (int) (Math.random() * 254) + 1); + + g.setPaint(new GradientPaint(0, 0, c1, screenWidth / 5, + screenHeight / 5, c2, true)); + } + + else if (texture == null) + g.setPaint(new Color((int) (Math.random() * 254) + 1, + (int) (Math.random() * 254) + 1, + (int) (Math.random() * 254) + 1)); + + // Set stroke width and options + if (strokeFlag) + { + int cap = (int) (Math.random() * 3 + 1); + if (cap == 1) + cap = BasicStroke.CAP_SQUARE; + else if (cap == 2) + cap = BasicStroke.CAP_BUTT; + else + cap = BasicStroke.CAP_ROUND; + + int join = (int) (Math.random() * 3 + 1); + if (join == 1) + join = BasicStroke.JOIN_MITER; + else if (join == 2) + join = BasicStroke.JOIN_BEVEL; + else + join = BasicStroke.JOIN_ROUND; + + float[] dashes = { 10, 10 }; + g.setStroke(new BasicStroke((int) (Math.random() * 10), cap, join, 10f, + dashes, 0)); + } + + // Composite / transparency + if (composite == - 1) + { + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, + (float) Math.random())); + } + + // Transformations + if (rotate == - 1) + g.rotate(Math.random() * Math.PI * 2); } /** @@ -466,7 +790,7 @@ public class J2dBenchmark startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x = (int) (Math.random() * (size.width - minSize + 1)); int y = (int) (Math.random() * (size.height - minSize + 1)); int width = (int) (Math.random() * (size.width - x - minSize) + minSize); @@ -499,7 +823,7 @@ public class J2dBenchmark startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x = (int) (Math.random() * (size.width - minSize + 1)); int y = (int) (Math.random() * (size.height - minSize + 1)); int width = (int) (Math.random() * (size.width - x - minSize) + minSize); @@ -529,7 +853,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x1 = (int) (Math.random() * (size.width - minSize)); int y1 = (int) (Math.random() * (size.height - minSize)); int xc1 = (int) (Math.random() * (size.width - minSize)); @@ -561,7 +885,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x1 = (int) (Math.random() * (size.width - minSize)); int y1 = (int) (Math.random() * (size.height - minSize)); int x2 = (int) (Math.random() * (size.width - minSize)); @@ -587,7 +911,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x1 = (int) (Math.random() * (size.width - minSize)); int y1 = (int) (Math.random() * (size.height - minSize)); int x2 = (int) (Math.random() * (size.width - minSize)); @@ -614,7 +938,7 @@ public class J2dBenchmark for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int points = (int) (Math.random() * 6) + 2; GeneralPath shape = new GeneralPath(); shape.moveTo((float) Math.random() * (size.width), @@ -648,7 +972,7 @@ public class J2dBenchmark for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int points = (int) (Math.random() * 6) + 2; for (int j = 0; j < points; j += 1) { @@ -675,7 +999,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x1 = (int) (Math.random() * (size.width - minSize)); int y1 = (int) (Math.random() * (size.height - minSize)); int x2 = (int) (Math.random() * (size.width - minSize)); @@ -701,7 +1025,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x1 = (int) (Math.random() * (size.width - minSize)); int y1 = (int) (Math.random() * (size.height - minSize)); int xc = (int) (Math.random() * (size.width - minSize)); @@ -730,7 +1054,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x1 = (int) (Math.random() * (size.width - minSize)); int y1 = (int) (Math.random() * (size.height - minSize)); int x2 = (int) (Math.random() * (size.width - minSize)); @@ -756,7 +1080,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x1 = (int) (Math.random() * (size.width - minSize)); int y1 = (int) (Math.random() * (size.height - minSize)); int x2 = (int) (Math.random() * (size.width - minSize)); @@ -785,7 +1109,7 @@ public class J2dBenchmark startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x = (int) (Math.random() * (size.width - minSize + 1)); int y = (int) (Math.random() * (size.height - minSize + 1)); int width = (int) (Math.random() * (size.width - x - minSize) + minSize); @@ -818,7 +1142,7 @@ public class J2dBenchmark startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x = (int) (Math.random() * (size.width - minSize + 1)); int y = (int) (Math.random() * (size.height - minSize + 1)); int width = (int) (Math.random() * (size.width - x - minSize) + minSize); @@ -858,7 +1182,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x = (int) (Math.random() * (size.width - imageWidth + 1)); int y = (int) (Math.random() * (size.height - imageHeight + 1)); g.drawImage(gifTestImage, x, y, this); @@ -878,7 +1202,7 @@ public class J2dBenchmark if (pngTestImage == null) { logger.logp(Level.WARNING, "AicasGraphicsBenchmark", "runTestSet", - "Skipping 'test_drawTransparentImage' due to missing resource."); + "Skipping 'drawTransparentImage' due to missing resource."); return; } @@ -890,7 +1214,7 @@ public class J2dBenchmark long startTime = System.currentTimeMillis(); for (int i = 0; i < maxTests; i += 1) { - g.setColor(getNextColor()); + setRandom(g, size); int x = (int) (Math.random() * (size.width - imageWidth + 1)); int y = (int) (Math.random() * (size.height - imageHeight + 1)); g.drawImage(pngTestImage, x, y, this); @@ -1051,14 +1375,17 @@ public class J2dBenchmark clipped_x = (size.width) / 2; clipped_y = (size.height) / 2; + // Reset any transforms from past tests + resetGraphics(g); + Rectangle fullWindow = new Rectangle(0, 0, size.width, size.height); g.setClip(fullWindow); - g.setColor(Color.BLACK); + g.setPaint(Color.BLACK); g.fill(fullWindow); Rectangle windowBorder = new Rectangle(0, 0, size.width - 1, size.width - 1); - g.setColor(Color.WHITE); + g.setPaint(Color.WHITE); g.draw(windowBorder); Rectangle innerBorder = new Rectangle(clipped_x - 1, clipped_y - 1, @@ -1069,7 +1396,7 @@ public class J2dBenchmark Rectangle innerBox = new Rectangle(clipped_x, clipped_y, clipped_width, clipped_height); g.clip(innerBox); - g.setColor(Color.BLACK); + g.setPaint(Color.BLACK); g.fill(fullWindow); if (context.equals("")) @@ -1093,28 +1420,31 @@ public class J2dBenchmark int clipped_x = (size.width - clipped_width) / 2; int clipped_y = (size.height - clipped_height) / 2; + // Reset any transforms from past tests + resetGraphics(g); + Rectangle fullWindow = new Rectangle(0, 0, size.width, size.height); g.setClip(fullWindow); - g.setColor(Color.BLACK); + g.setPaint(Color.BLACK); g.fill(fullWindow); Rectangle windowBorder = new Rectangle(0, 0, size.width - 1, size.height - 1); - g.setColor(Color.GREEN); + g.setPaint(Color.GREEN); g.draw(windowBorder); Rectangle innerBorder = new Rectangle(clipped_x - 1, clipped_y - 1, clipped_width + 2, clipped_height + 2); - g.setColor(Color.WHITE); + g.setPaint(Color.WHITE); g.fill(innerBorder); Rectangle innerBox = new Rectangle(clipped_x, clipped_y, clipped_width, clipped_height); g.clip(innerBox); - g.setColor(Color.BLACK); + g.setPaint(Color.BLACK); g.fill(fullWindow); if (context.equals("")) @@ -1133,8 +1463,11 @@ public class J2dBenchmark private void runSet_noClipping(Graphics2D g, Dimension size, String context, int runCount) { + // Reset any transforms from past tests + resetGraphics(g); + Rectangle fullWindow = new Rectangle(0, 0, size.width, size.height); - g.setColor(Color.BLACK); + g.setPaint(Color.BLACK); g.fill(fullWindow); if (context.equals("")) @@ -1216,9 +1549,9 @@ class TestRecorder return test; } - public final double getAverage() + public final long getAverage() { - return ((double) totalTime) / ((double) runCount); + return (totalTime / runCount); } public TestRecorder(String testName) diff --git a/examples/gnu/classpath/examples/java2d/J2dBenchmarkGUI.java b/examples/gnu/classpath/examples/java2d/J2dBenchmarkGUI.java index bcd58e2e4..bb583cbdc 100644 --- a/examples/gnu/classpath/examples/java2d/J2dBenchmarkGUI.java +++ b/examples/gnu/classpath/examples/java2d/J2dBenchmarkGUI.java @@ -40,6 +40,8 @@ package gnu.classpath.examples.java2d; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; @@ -55,6 +57,7 @@ import java.util.logging.LogRecord; import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; @@ -62,9 +65,11 @@ import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; +import javax.swing.border.BevelBorder; /** * Extends the J2dBenchmark to provide a GUI for selecting options and tests. @@ -172,6 +177,8 @@ public class J2dBenchmarkGUI // Allow user to select tests to run JPanel tests = new JPanel(); tests.setLayout(new BoxLayout(tests, BoxLayout.PAGE_AXIS)); + tests.setBorder(new BevelBorder(BevelBorder.RAISED)); + tests.add(new JLabel("Shapes to test:")); JCheckBox test_arcDraw = new JCheckBox("Arc", true); tests.add(test_arcDraw); @@ -211,6 +218,130 @@ public class J2dBenchmarkGUI tests.add(test_image); elements.put("test_image", test_image); + // Additional image-processing options + JPanel extras = new JPanel(); + extras.setBorder(new BevelBorder(BevelBorder.LOWERED)); + GridBagLayout layout = new GridBagLayout(); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.insets = new Insets(5, 2, 15, 15); + extras.setLayout(layout); + + // Filling (solid, gradient, or texture) + JPanel opt_Fill = new JPanel(); + opt_Fill.setLayout(new BoxLayout(opt_Fill, BoxLayout.PAGE_AXIS)); + JLabel opt_FillLabel = new JLabel("Filling:"); + opt_FillLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); + opt_Fill.add(opt_FillLabel); + + ButtonGroup opt_FillGroup = new ButtonGroup(); + JRadioButton opt_FillSolid = new JRadioButton("Solid colour", true); + opt_FillSolid.setActionCommand("solid"); + opt_Fill.add(opt_FillSolid); + opt_FillGroup.add(opt_FillSolid); + JRadioButton opt_FillGradient = new JRadioButton("Gradient", false); + opt_FillGradient.setActionCommand("gradient"); + opt_Fill.add(opt_FillGradient); + opt_FillGroup.add(opt_FillGradient); + JRadioButton opt_FillTexture = new JRadioButton("Texture", false); + opt_FillTexture.setActionCommand("texture"); + opt_Fill.add(opt_FillTexture); + opt_FillGroup.add(opt_FillTexture); + JTextField opt_FillTextureFile = new JTextField("texture file"); + opt_FillTextureFile.setAlignmentX(JComponent.LEFT_ALIGNMENT); + opt_Fill.add(opt_FillTextureFile); + elements.put("opt_FillGroup", opt_FillGroup); + elements.put("opt_FillTextureFile", opt_FillTextureFile); + layout.setConstraints(opt_Fill, gbc); + extras.add(opt_Fill); + + // Stroke + JPanel opt_Stroke = new JPanel(); + opt_Stroke.setLayout(new BoxLayout(opt_Stroke, BoxLayout.PAGE_AXIS)); + JLabel opt_StrokeLabel = new JLabel("Stroke:"); + opt_StrokeLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); + opt_Stroke.add(opt_StrokeLabel); + JCheckBox opt_StrokeRandom = new JCheckBox("random", false); + elements.put("opt_StrokeRandom", opt_StrokeRandom); + opt_Stroke.add(opt_StrokeRandom); + gbc.gridwidth = GridBagConstraints.REMAINDER; + layout.setConstraints(opt_Stroke, gbc); + extras.add(opt_Stroke); + + // Anti-Alias + JPanel opt_Alias = new JPanel(); + opt_Alias.setLayout(new BoxLayout(opt_Alias, BoxLayout.PAGE_AXIS)); + JLabel opt_AliasLabel = new JLabel("Anti-Aliasing:"); + opt_AliasLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); + opt_Alias.add(opt_AliasLabel); + JCheckBox opt_AliasOn = new JCheckBox("on", false); + elements.put("opt_AliasOn", opt_AliasOn); + opt_Alias.add(opt_AliasOn); + gbc.gridwidth = 1; + layout.setConstraints(opt_Alias, gbc); + extras.add(opt_Alias); + + // Alpha composite + JPanel opt_Composite = new JPanel(); + opt_Composite.setLayout(new BoxLayout(opt_Composite, BoxLayout.PAGE_AXIS)); + JLabel opt_CompositeLabel = new JLabel("Alpha Composite:"); + opt_CompositeLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); + opt_Composite.add(opt_CompositeLabel); + JTextField opt_CompositeValue = new JTextField("1.0"); + opt_CompositeValue.setAlignmentX(JComponent.LEFT_ALIGNMENT); + elements.put("opt_CompositeValue", opt_CompositeValue); + opt_Composite.add(opt_CompositeValue); + gbc.gridwidth = GridBagConstraints.REMAINDER; + layout.setConstraints(opt_Composite, gbc); + extras.add(opt_Composite); + + // Transformations + // TODO: allow user-defined matrices for AffineTransform + // (backend already has hooks for it, need to create gui) + JLabel opt_TransformLabel = new JLabel("Transformations:"); + opt_TransformLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); + gbc.insets = new Insets(5, 2, 0, 15); + layout.setConstraints(opt_TransformLabel, gbc); + extras.add(opt_TransformLabel); + + JPanel opt_Transform_Translate = new JPanel(new GridLayout(0, 2, 5, 5)); + opt_Transform_Translate.add(new JLabel("x-axis translation ")); + JTextField opt_TransformTranslateX = new JTextField("0"); + opt_TransformTranslateX.setAlignmentX(JComponent.LEFT_ALIGNMENT); + opt_Transform_Translate.add(opt_TransformTranslateX); + elements.put("opt_TransformTranslateX", opt_TransformTranslateX); + opt_Transform_Translate.add(new JLabel("y-axis translation ")); + JTextField opt_TransformTranslateY = new JTextField("0"); + opt_TransformTranslateY.setAlignmentX(JComponent.LEFT_ALIGNMENT); + opt_Transform_Translate.add(opt_TransformTranslateY); + elements.put("opt_TransformTranslateY", opt_TransformTranslateY); + gbc.gridwidth = 1; + gbc.insets = new Insets(0, 2, 5, 15); + layout.setConstraints(opt_Transform_Translate, gbc); + extras.add(opt_Transform_Translate); + + JPanel opt_Transform_Shear = new JPanel(new GridLayout(0, 2, 5, 5)); + opt_Transform_Shear.add(new JLabel("x-axis shear ")); + JTextField opt_TransformShearX = new JTextField("0"); + opt_TransformShearX.setAlignmentX(JComponent.LEFT_ALIGNMENT); + opt_Transform_Shear.add(opt_TransformShearX); + elements.put("opt_TransformShearX", opt_TransformShearX); + opt_Transform_Shear.add(new JLabel("y-axis shear ")); + JTextField opt_TransformShearY = new JTextField("0"); + opt_Transform_Shear.add(opt_TransformShearY); + elements.put("opt_TransformShearY", opt_TransformShearY); + gbc.gridwidth = GridBagConstraints.REMAINDER; + layout.setConstraints(opt_Transform_Shear, gbc); + extras.add(opt_Transform_Shear); + + JPanel opt_Transform_Rotate = new JPanel(new GridLayout(0, 2, 5, 5)); + opt_Transform_Rotate.add(new JLabel("rotation (radians) ")); + JTextField opt_TransformRotate = new JTextField("0"); + opt_Transform_Rotate.add(opt_TransformRotate); + elements.put("opt_TransformRotate", opt_TransformRotate); + layout.setConstraints(opt_Transform_Rotate, gbc); + extras.add(opt_Transform_Rotate); + // Final submit button JPanel submit = new JPanel(); submit.setLayout(new BoxLayout(submit, BoxLayout.PAGE_AXIS)); @@ -236,6 +367,8 @@ public class J2dBenchmarkGUI body.setAlignmentX(JComponent.CENTER_ALIGNMENT); panel.add(body); + extras.setAlignmentX(JComponent.CENTER_ALIGNMENT); + panel.add(extras); submit.setAlignmentX(JComponent.CENTER_ALIGNMENT); panel.add(submit); @@ -324,6 +457,24 @@ public class J2dBenchmarkGUI speed.setBuffers(((JCheckBox) elements.get("singlebuffer")).isSelected(), ((JCheckBox) elements.get("doublebuffer")).isSelected()); + // Set additional processing options + speed.setFill(((ButtonGroup) elements.get("opt_FillGroup")).getSelection().getActionCommand(), + ((JTextField) elements.get("opt_FillTextureFile")).getText()); + + speed.setStroke(((JCheckBox) elements.get("opt_StrokeRandom")).isSelected()); + + speed.setAlias(((JCheckBox) elements.get("opt_AliasOn")).isSelected()); + + speed.setComposite(Float.parseFloat(((JTextField) elements.get("opt_CompositeValue")).getText())); + + speed.setTranslation(Integer.parseInt(((JTextField) elements.get("opt_TransformTranslateX")).getText()), + Integer.parseInt(((JTextField) elements.get("opt_TransformTranslateY")).getText())); + + speed.setRotation(Double.parseDouble(((JTextField) elements.get("opt_TransformRotate")).getText())); + + speed.setShear(Double.parseDouble(((JTextField) elements.get("opt_TransformShearX")).getText()), + Double.parseDouble(((JTextField) elements.get("opt_TransformShearY")).getText())); + // Set tests int testSuite = 0; if (((JCheckBox) elements.get("test_arcDraw")).isSelected()) @@ -349,21 +500,31 @@ public class J2dBenchmarkGUI { speed.setTests(testSuite); - // Create graphics. - frame.add(speed, BorderLayout.CENTER); - frame.setSize(Integer.parseInt(((JTextField) elements.get("width")).getText()), - Integer.parseInt(((JTextField) elements.get("height")).getText())); - frame.setVisible(true); - - // Insets are correctly set only after the native peer was created. - Insets insets = frame.getInsets(); - frame.setSize(frame.getWidth() + insets.right + insets.left, - frame.getHeight() + insets.top + insets.bottom); + String initResult = speed.init(); + + if (initResult == null) + { + // Create graphics. + frame.add(speed, BorderLayout.CENTER); + frame.setSize( + Integer.parseInt(((JTextField) elements.get("width")).getText()), + Integer.parseInt(((JTextField) elements.get("height")).getText())); + frame.setVisible(true); + + // Insets are correctly set only after the native peer was + // created. + Insets insets = frame.getInsets(); + frame.setSize(frame.getWidth() + insets.right + insets.left, + frame.getHeight() + insets.top + insets.bottom); + + // Clear any old error messages + errorLabel.setText(" "); + } + else + errorLabel.setText(initResult); } else - { - errorLabel.setText("Please select at least one test."); - } + errorLabel.setText("Please select at least one test."); } catch (NumberFormatException e) { @@ -397,8 +558,6 @@ public class J2dBenchmarkGUI logger.addHandler(display); myFrame = frame; - - super.init(); } /** @@ -461,6 +620,86 @@ public class J2dBenchmarkGUI } /** + * Set fill options + * + * @param type fill type: "solid", "gradient", or "texture" + * @param file filename to use if texturing + */ + public void setFill(String type, String file) + { + if (type.equals("gradient")) + this.gradientFlag = true; + else if (type.equals("texture")) + { + this.texture = file; + } + } + + /** + * Set stroke options + * + * @param stroke boolean flag to use random stroking or not + */ + public void setStroke(boolean stroke) + { + this.strokeFlag = stroke; + } + + /** + * Set anti-aliasing options + * + * @param alias boolean flag to use anti-aliasing or not + */ + public void setAlias(boolean alias) + { + this.antialiasFlag = alias; + } + + /** + * Set alpha composite + * + * @param alpha alpha composite + */ + public void setComposite(float alpha) + { + this.composite = alpha; + } + + /** + * Set translation values + * + * @param x x-axis translation + * @param y y-axis translation + */ + public void setTranslation(int x, int y) + { + this.xtranslate = x; + this.ytranslate = y; + } + + /** + * Set rotation + * + * @param theta angle to rotate by (radians) + */ + public void setRotation(double theta) + { + this.rotate = theta; + } + + /** + * Set shear values + * + * @param x x-axis shear value + * @param y-axis shear value + */ + public void setShear(double x, double y) + { + this.xshear = x; + this.yshear = y; + } + + /** * Set tests to run * * @param tests bit-shifted list of tests (see J2dBenchmark constants) |