1 /* 2 * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * - Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * - Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * - Neither the name of Oracle nor the names of its 16 * contributors may be used to endorse or promote products derived 17 * from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * This source code is provided to illustrate the usage of a given feature 34 * or technique and has been deliberately simplified. Additional steps 35 * required for a production-quality application, such as security checks, 36 * input validation and proper error handling, might not be present in 37 * this sample code. 38 */ 39 40 41 package j2dbench; 42 43 import java.awt.Canvas; 44 import java.awt.Image; 45 import java.awt.Graphics; 46 import java.awt.Graphics2D; 47 import java.awt.Dimension; 48 import java.awt.AlphaComposite; 49 import java.awt.Color; 50 import java.awt.Toolkit; 51 import java.util.Hashtable; 52 53 import j2dbench.tests.GraphicsTests; 54 55 public class TestEnvironment implements Node.Visitor { 56 static Group globaloptroot; 57 static Group envroot; 58 59 static Option.Int outputWidth; 60 static Option.Int outputHeight; 61 62 static Option.Int runCount; 63 static Option.Int repCount; 64 static Option.Int testTime; 65 init()66 public static void init() { 67 globaloptroot = new Group("global", "Global Options"); 68 envroot = new Group(globaloptroot, "env", "Test Environment Options"); 69 70 outputWidth = 71 new Option.Int(envroot, "outputwidth", 72 "Width of Output Window or Image", 73 1, Integer.MAX_VALUE, 640); 74 outputHeight = 75 new Option.Int(envroot, "outputheight", 76 "Height of Output Window or Image", 77 1, Integer.MAX_VALUE, 480); 78 79 runCount = 80 new Option.Int(envroot, "runcount", 81 "Fixed Number of Test Runs per Benchmark", 82 1, Integer.MAX_VALUE, 5); 83 repCount = 84 new Option.Int(envroot, "repcount", 85 "Fixed Number of Reps (0 means calibrate)", 86 0, Integer.MAX_VALUE, 0); 87 testTime = 88 new Option.Int(envroot, "testtime", 89 "Target test time to calibrate for", 90 1, Integer.MAX_VALUE, 2500); 91 } 92 visit(Node node)93 public void visit(Node node) { 94 if (node instanceof Test) { 95 ((Test) node).runTest(this); 96 } 97 } 98 runAllTests()99 public void runAllTests() { 100 Group.root.traverse(this); 101 } 102 103 Canvas comp; 104 Image testImage; 105 Image srcImage; 106 boolean stopped; 107 ResultSet results; 108 Hashtable modifiers; 109 Timer timer; 110 TestEnvironment()111 public TestEnvironment() { 112 results = new ResultSet(); 113 modifiers = new Hashtable(); 114 timer = Timer.getImpl(); 115 } 116 startTiming()117 public void startTiming() { 118 timer.start(); 119 } 120 stopTiming()121 public void stopTiming() { 122 timer.stop(); 123 } 124 getTimeMillis()125 public long getTimeMillis() { 126 return timer.getTimeMillis(); 127 } 128 getTimeNanos()129 public long getTimeNanos() { 130 return timer.getTimeNanos(); 131 } 132 getCanvas()133 public Canvas getCanvas() { 134 if (comp == null) { 135 final int w = getWidth(); 136 final int h = getHeight(); 137 comp = new Canvas() { 138 public Dimension getPreferredSize() { 139 return new Dimension(w, h); 140 } 141 }; 142 } 143 return comp; 144 } 145 getSrcImage()146 public Image getSrcImage() { 147 return srcImage; 148 } 149 stop()150 public void stop() { 151 stopped = true; 152 } 153 isStopped()154 public boolean isStopped() { 155 return stopped; 156 } 157 setTestImage(Image img)158 public void setTestImage(Image img) { 159 this.testImage = img; 160 } 161 setSrcImage(Image img)162 public void setSrcImage(Image img) { 163 this.srcImage = img; 164 } 165 erase()166 public void erase() { 167 Graphics g = getGraphics(); 168 if (g != null) { 169 g.setColor(Color.white); 170 g.fillRect(0, 0, getWidth(), getHeight()); 171 g.dispose(); 172 } 173 } 174 getGraphics()175 public Graphics getGraphics() { 176 if (testImage != null) { 177 return testImage.getGraphics(); 178 } 179 if (comp != null) { 180 return comp.getGraphics(); 181 } 182 return null; 183 } 184 getWidth()185 public int getWidth() { 186 return outputWidth.getIntValue(); 187 } 188 getHeight()189 public int getHeight() { 190 return outputHeight.getIntValue(); 191 } 192 getRunCount()193 public int getRunCount() { 194 return runCount.getIntValue(); 195 } 196 getRepCount()197 public int getRepCount() { 198 return repCount.getIntValue(); 199 } 200 getTestTime()201 public long getTestTime() { 202 return testTime.getIntValue(); 203 } 204 sync()205 public void sync() { 206 if (comp == null) { 207 Toolkit.getDefaultToolkit().sync(); 208 } else { 209 comp.getToolkit().sync(); 210 } 211 } 212 idle()213 public boolean idle() { 214 if (!stopped) { 215 sync(); 216 System.gc(); 217 System.runFinalization(); 218 System.gc(); 219 sync(); 220 try { 221 Thread.sleep(50); 222 } catch (InterruptedException e) { 223 stop(); 224 } 225 } 226 return stopped; 227 } 228 setModifier(Modifier o, Object v)229 public void setModifier(Modifier o, Object v) { 230 modifiers.put(o, v); 231 } 232 getModifier(Modifier o)233 public Object getModifier(Modifier o) { 234 return modifiers.get(o); 235 } 236 isEnabled(Modifier o)237 public boolean isEnabled(Modifier o) { 238 return ((Boolean) modifiers.get(o)).booleanValue(); 239 } 240 getIntValue(Modifier o)241 public int getIntValue(Modifier o) { 242 return ((Integer) modifiers.get(o)).intValue(); 243 } 244 removeModifier(Modifier o)245 public void removeModifier(Modifier o) { 246 modifiers.remove(o); 247 } 248 getModifiers()249 public Hashtable getModifiers() { 250 return (Hashtable) modifiers.clone(); 251 } 252 record(Result result)253 public void record(Result result) { 254 results.record(result); 255 } 256 flushToScreen()257 public void flushToScreen() { 258 if (testImage != null && comp != null) { 259 Graphics g = comp.getGraphics(); 260 if (GraphicsTests.hasGraphics2D) { 261 ((Graphics2D) g).setComposite(AlphaComposite.Src); 262 } 263 g.drawImage(testImage, 0, 0, null); 264 g.dispose(); 265 } 266 } 267 summarize()268 public void summarize() { 269 results.summarize(); 270 } 271 272 private abstract static class Timer { getImpl()273 public static Timer getImpl() { 274 try { 275 System.nanoTime(); 276 return new Nanos(); 277 } catch (NoSuchMethodError e) { 278 return new Millis(); 279 } 280 } 281 start()282 public abstract void start(); stop()283 public abstract void stop(); getTimeMillis()284 public abstract long getTimeMillis(); getTimeNanos()285 public abstract long getTimeNanos(); 286 287 private static class Millis extends Timer { 288 private long millis; 289 start()290 public void start() { 291 millis = System.currentTimeMillis(); 292 } 293 stop()294 public void stop() { 295 millis = System.currentTimeMillis() - millis; 296 } 297 getTimeMillis()298 public long getTimeMillis() { 299 return millis; 300 } 301 getTimeNanos()302 public long getTimeNanos() { 303 return millis * 1000 * 1000; 304 } 305 } 306 307 private static class Nanos extends Timer { 308 private long nanos; 309 start()310 public void start() { 311 nanos = System.nanoTime(); 312 } 313 stop()314 public void stop() { 315 nanos = System.nanoTime() - nanos; 316 } 317 getTimeMillis()318 public long getTimeMillis() { 319 return (nanos + (500 * 1000)) / (1000 * 1000); 320 } 321 getTimeNanos()322 public long getTimeNanos() { 323 return nanos; 324 } 325 } 326 } 327 } 328