blob: 36b48b6c9d2506ba2d47aa61a08338b008a656cf [file] [log] [blame]
/*
* Copyright (c) 2006, Oracle and/or its affiliates. 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.
*
* - Neither the name of Oracle nor 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 j2dbench.tests.iio;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import j2dbench.Group;
import j2dbench.Result;
import j2dbench.TestEnvironment;
abstract class OutputStreamTests extends OutputTests {
private static Group streamRoot;
private static Group streamTestRoot;
public static void init() {
streamRoot = new Group(outputRoot, "stream",
"Image Stream Benchmarks");
streamTestRoot = new Group(streamRoot, "tests",
"ImageOutputStream Tests");
new IOSConstruct();
new IOSWrite();
new IOSWriteByteArray();
new IOSWriteBit();
new IOSWriteByte();
new IOSWriteShort();
new IOSWriteInt();
new IOSWriteFloat();
new IOSWriteLong();
new IOSWriteDouble();
}
protected OutputStreamTests(Group parent,
String nodeName, String description)
{
super(parent, nodeName, description);
addDependency(generalDestRoot);
addDependencies(imageioGeneralOptRoot, true);
}
public void cleanupTest(TestEnvironment env, Object ctx) {
Context iioctx = (Context)ctx;
iioctx.cleanup(env);
}
private static class Context extends OutputTests.Context {
ImageOutputStream outputStream;
int scanlineStride; // width of a scanline (in bytes)
int length; // length of the entire stream (in bytes)
byte[] byteBuf;
Context(TestEnvironment env, Result result) {
super(env, result);
// 4 bytes per "pixel"
scanlineStride = size * 4;
// tack on an extra 4 bytes, so that in the 1x1 case we can
// call writeLong() or writeDouble() before resetting
length = (scanlineStride * size) + 4;
// big enough for one scanline
byteBuf = new byte[scanlineStride];
initOutput();
try {
outputStream = createImageOutputStream();
} catch (IOException e) {
System.err.println("Error creating ImageOutputStream");
}
}
void cleanup(TestEnvironment env) {
super.cleanup(env);
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
System.err.println("error closing stream");
}
outputStream = null;
}
}
}
private static class IOSConstruct extends OutputStreamTests {
public IOSConstruct() {
super(streamTestRoot,
"construct",
"Construct");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(1);
result.setUnitName("stream");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
try {
do {
ImageOutputStream ios = octx.createImageOutputStream();
ios.close();
octx.closeOriginalStream();
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static class IOSWrite extends OutputStreamTests {
public IOSWrite() {
super(streamTestRoot,
"write",
"write()");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(1);
result.setUnitName("byte");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final int length = octx.length;
int pos = 0;
try {
ios.mark();
do {
if (pos >= length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.write(0);
pos++;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
private static class IOSWriteByteArray extends OutputStreamTests {
public IOSWriteByteArray() {
super(streamTestRoot,
"writeByteArray",
"write(byte[]) (one \"scanline\" at a time)");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(ctx.scanlineStride);
result.setUnitName("byte");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final byte[] buf = octx.byteBuf;
final int scanlineStride = octx.scanlineStride;
final int length = octx.length;
int pos = 0;
try {
ios.mark();
do {
if (pos + scanlineStride > length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.write(buf);
pos += scanlineStride;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
private static class IOSWriteBit extends OutputStreamTests {
public IOSWriteBit() {
super(streamTestRoot,
"writeBit",
"writeBit()");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(1);
result.setUnitName("bit");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final int length = octx.length * 8; // measured in bits
int pos = 0; // measured in bits
try {
ios.mark();
do {
if (pos >= length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.writeBit(0);
pos++;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
private static class IOSWriteByte extends OutputStreamTests {
public IOSWriteByte() {
super(streamTestRoot,
"writeByte",
"writeByte()");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(1);
result.setUnitName("byte");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final int length = octx.length;
int pos = 0;
try {
ios.mark();
do {
if (pos >= length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.writeByte(0);
pos++;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
private static class IOSWriteShort extends OutputStreamTests {
public IOSWriteShort() {
super(streamTestRoot,
"writeShort",
"writeShort()");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(2);
result.setUnitName("byte");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final int length = octx.length;
int pos = 0;
try {
ios.mark();
do {
if (pos + 2 > length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.writeShort(0);
pos += 2;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
private static class IOSWriteInt extends OutputStreamTests {
public IOSWriteInt() {
super(streamTestRoot,
"writeInt",
"writeInt()");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(4);
result.setUnitName("byte");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final int length = octx.length;
int pos = 0;
try {
ios.mark();
do {
if (pos + 4 > length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.writeInt(0);
pos += 4;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
private static class IOSWriteFloat extends OutputStreamTests {
public IOSWriteFloat() {
super(streamTestRoot,
"writeFloat",
"writeFloat()");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(4);
result.setUnitName("byte");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final int length = octx.length;
int pos = 0;
try {
ios.mark();
do {
if (pos + 4 > length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.writeFloat(0.0f);
pos += 4;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
private static class IOSWriteLong extends OutputStreamTests {
public IOSWriteLong() {
super(streamTestRoot,
"writeLong",
"writeLong()");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(8);
result.setUnitName("byte");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final int length = octx.length;
int pos = 0;
try {
ios.mark();
do {
if (pos + 8 > length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.writeLong(0L);
pos += 8;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
private static class IOSWriteDouble extends OutputStreamTests {
public IOSWriteDouble() {
super(streamTestRoot,
"writeDouble",
"writeDouble()");
}
public Object initTest(TestEnvironment env, Result result) {
Context ctx = new Context(env, result);
result.setUnits(8);
result.setUnitName("byte");
return ctx;
}
public void runTest(Object ctx, int numReps) {
final Context octx = (Context)ctx;
final ImageOutputStream ios = octx.outputStream;
final int length = octx.length;
int pos = 0;
try {
ios.mark();
do {
if (pos + 8 > length) {
ios.reset();
ios.mark();
pos = 0;
}
ios.writeDouble(0.0);
pos += 8;
} while (--numReps >= 0);
} catch (IOException e) {
e.printStackTrace();
} finally {
try { ios.reset(); } catch (IOException e) {}
}
}
}
}