blob: 813995e3fcdd8f4e49e940142fecc1b3086c96f6 [file] [log] [blame]
/*
* Copyright (c) 2002, 2007, 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;
import j2dbench.Destinations;
import j2dbench.Group;
import j2dbench.Modifier;
import j2dbench.Option;
import j2dbench.TestEnvironment;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Image;
import java.awt.Canvas;
import java.awt.AlphaComposite;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ByteLookupTable;
import java.awt.image.ConvolveOp;
import java.awt.image.DataBuffer;
import java.awt.image.IndexColorModel;
import java.awt.image.Kernel;
import java.awt.image.LookupOp;
import java.awt.image.Raster;
import java.awt.image.RasterOp;
import java.awt.image.RescaleOp;
import java.awt.image.ShortLookupTable;
import java.awt.image.VolatileImage;
import java.awt.image.WritableRaster;
import java.awt.Transparency;
import java.awt.geom.AffineTransform;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferInt;
import java.awt.image.DataBufferShort;
import java.util.ArrayList;
import javax.swing.JComponent;
public abstract class ImageTests extends GraphicsTests {
public static boolean hasVolatileImage;
public static boolean hasCompatImage;
static {
try {
hasVolatileImage = (VolatileImage.class != null);
} catch (NoClassDefFoundError e) {
}
try {
new Canvas().getGraphicsConfiguration();
hasCompatImage = true;
} catch (NoSuchMethodError e) {
}
}
static Group imageroot;
static Group.EnableSet imgsrcroot;
static Group.EnableSet bufimgsrcroot;
static Group imgtestroot;
static Group imgoptionsroot;
static Group imageOpRoot;
static Group imageOpOptRoot;
static Group imageOpTestRoot;
static Group graphicsTestRoot;
static Group bufImgOpTestRoot;
static Group rasterOpTestRoot;
static Option opList;
static Option doTouchSrc;
static String transNodeNames[] = {
null, "opaque", "bitmask", "translucent",
};
static String transDescriptions[] = {
null, "Opaque", "Bitmask", "Translucent",
};
public static void init() {
imageroot = new Group(graphicsroot, "imaging",
"Imaging Benchmarks");
imageroot.setTabbed();
imgsrcroot = new Group.EnableSet(imageroot, "src",
"Image Rendering Sources");
imgsrcroot.setBordered(true);
imgoptionsroot = new Group(imgsrcroot, "options",
"Image Source Options");
imgoptionsroot.setBordered(true);
doTouchSrc =
new Option.Toggle(imgoptionsroot, "touchsrc",
"Touch src image before every operation",
Option.Toggle.Off);
imgtestroot = new Group(imageroot, "tests",
"Image Rendering Tests");
imgtestroot.setBordered(true);
new OffScreen();
if (hasGraphics2D) {
if (hasCompatImage) {
new CompatImg(Transparency.OPAQUE);
new CompatImg(Transparency.BITMASK);
new CompatImg(Transparency.TRANSLUCENT);
}
if (hasVolatileImage) {
new VolatileImg();
}
bufimgsrcroot =
new Group.EnableSet(imgsrcroot, "bufimg",
"BufferedImage Rendering Sources");
new BufImg(BufferedImage.TYPE_INT_RGB);
new BufImg(BufferedImage.TYPE_INT_ARGB);
new BufImg(BufferedImage.TYPE_BYTE_GRAY);
new BufImg(BufferedImage.TYPE_3BYTE_BGR);
new BmByteIndexBufImg();
new BufImg(BufferedImage.TYPE_INT_RGB, true);
new BufImg(BufferedImage.TYPE_INT_ARGB, true);
new BufImg(BufferedImage.TYPE_3BYTE_BGR, true);
imageOpRoot = new Group(imageroot, "imageops",
"Image Op Benchmarks");
imageOpOptRoot = new Group(imageOpRoot, "opts", "Options");
imageOpTestRoot = new Group(imageOpRoot, "tests", "Tests");
graphicsTestRoot = new Group(imageOpTestRoot, "graphics2d",
"Graphics2D Tests");
bufImgOpTestRoot = new Group(imageOpTestRoot, "bufimgop",
"BufferedImageOp Tests");
rasterOpTestRoot = new Group(imageOpTestRoot, "rasterop",
"RasterOp Tests");
ArrayList opStrs = new ArrayList();
ArrayList opDescs = new ArrayList();
opStrs.add("convolve3x3zero");
opDescs.add("ConvolveOp (3x3 blur, zero)");
opStrs.add("convolve3x3noop");
opDescs.add("ConvolveOp (3x3 blur, noop)");
opStrs.add("convolve5x5zero");
opDescs.add("ConvolveOp (5x5 edge, zero)");
opStrs.add("convolve5x5noop");
opDescs.add("ConvolveOp (5x5 edge, noop)");
opStrs.add("lookup1byte");
opDescs.add("LookupOp (1 band, byte)");
opStrs.add("lookup1short");
opDescs.add("LookupOp (1 band, short)");
opStrs.add("lookup3byte");
opDescs.add("LookupOp (3 band, byte)");
opStrs.add("lookup3short");
opDescs.add("LookupOp (3 band, short)");
opStrs.add("rescale1band");
opDescs.add("RescaleOp (1 band)");
opStrs.add("rescale3band");
opDescs.add("RescaleOp (3 band)");
String[] opStrArr = new String[opStrs.size()];
opStrArr = (String[])opStrs.toArray(opStrArr);
String[] opDescArr = new String[opDescs.size()];
opDescArr = (String[])opDescs.toArray(opDescArr);
opList =
new Option.ObjectList(imageOpOptRoot,
"op", "Operation",
opStrArr, opStrArr,
opStrArr, opDescArr,
0x1);
((Option.ObjectList) opList).setNumRows(4);
new DrawImageOp();
new BufImgOpFilter(false);
new BufImgOpFilter(true);
new RasterOpFilter(false);
new RasterOpFilter(true);
}
new DrawImage();
new DrawImageBg();
new DrawImageScale("up", 1.5f);
new DrawImageScale("down", .75f);
new DrawImageTransform();
}
public static class Context extends GraphicsTests.Context {
boolean touchSrc;
Image src;
AffineTransform tx;
}
public ImageTests(Group parent, String nodeName, String description) {
this(parent, nodeName, description, null);
}
public ImageTests(Group parent, String nodeName, String description,
Modifier.Filter srcFilter)
{
super(parent, nodeName, description);
addDependency(imgsrcroot, srcFilter);
addDependency(doTouchSrc);
}
public GraphicsTests.Context createContext() {
return new ImageTests.Context();
}
public void initContext(TestEnvironment env, GraphicsTests.Context ctx) {
super.initContext(env, ctx);
ImageTests.Context ictx = (ImageTests.Context) ctx;
ictx.src = env.getSrcImage();
ictx.touchSrc = env.isEnabled(doTouchSrc);
}
public abstract static class TriStateImageType extends Group {
Image theImage;
public TriStateImageType(Group parent, String nodename, String desc,
int transparency)
{
super(parent, nodename, desc);
setHorizontal();
new DrawableImage(this, Transparency.OPAQUE, true);
new DrawableImage(this, Transparency.BITMASK,
(transparency != Transparency.OPAQUE));
new DrawableImage(this, Transparency.TRANSLUCENT,
(transparency == Transparency.TRANSLUCENT));
}
public Image getImage(TestEnvironment env, int w, int h) {
if (theImage == null ||
theImage.getWidth(null) != w ||
theImage.getHeight(null) != h)
{
theImage = makeImage(env, w, h);
}
return theImage;
}
public abstract Image makeImage(TestEnvironment env, int w, int h);
}
public static class OffScreen extends TriStateImageType {
public OffScreen() {
super(imgsrcroot, "offscr", "Offscreen Image", Transparency.OPAQUE);
}
public Image makeImage(TestEnvironment env, int w, int h) {
Canvas c = env.getCanvas();
return c.createImage(w, h);
}
}
public static class VolatileImg extends TriStateImageType {
public VolatileImg() {
super(imgsrcroot, "volimg", "Volatile Image", Transparency.OPAQUE);
}
public Image makeImage(TestEnvironment env, int w, int h) {
Canvas c = env.getCanvas();
return c.createVolatileImage(w, h);
}
}
public static class CompatImg extends TriStateImageType {
int transparency;
public CompatImg(int transparency) {
super(imgsrcroot,
Destinations.CompatImg.ShortNames[transparency],
Destinations.CompatImg.LongDescriptions[transparency],
transparency);
this.transparency = transparency;
}
public Image makeImage(TestEnvironment env, int w, int h) {
Canvas c = env.getCanvas();
GraphicsConfiguration gc = c.getGraphicsConfiguration();
return gc.createCompatibleImage(w, h, transparency);
}
}
public static class BufImg extends TriStateImageType {
int type;
boolean unmanaged;
static int Transparencies[] = {
Transparency.TRANSLUCENT, // "custom",
Transparency.OPAQUE, // "IntXrgb",
Transparency.TRANSLUCENT, // "IntArgb",
Transparency.TRANSLUCENT, // "IntArgbPre",
Transparency.OPAQUE, // "IntXbgr",
Transparency.OPAQUE, // "3ByteBgr",
Transparency.TRANSLUCENT, // "4ByteAbgr",
Transparency.TRANSLUCENT, // "4ByteAbgrPre",
Transparency.OPAQUE, // "Short565",
Transparency.OPAQUE, // "Short555",
Transparency.OPAQUE, // "ByteGray",
Transparency.OPAQUE, // "ShortGray",
Transparency.OPAQUE, // "ByteBinary",
Transparency.OPAQUE, // "ByteIndexed",
};
public BufImg(int type) {
this(type, false);
}
public BufImg(int type, boolean unmanaged) {
super(bufimgsrcroot,
(unmanaged ? "unmanaged" : "") +
Destinations.BufImg.ShortNames[type],
(unmanaged ? "Unmanaged " : "") +
Destinations.BufImg.Descriptions[type],
Transparencies[type]);
this.type = type;
this.unmanaged = unmanaged;
}
public Image makeImage(TestEnvironment env, int w, int h) {
BufferedImage img = new BufferedImage(w, h, type);
if (unmanaged) {
DataBuffer db = img.getRaster().getDataBuffer();
if (db instanceof DataBufferInt) {
((DataBufferInt)db).getData();
} else if (db instanceof DataBufferShort) {
((DataBufferShort)db).getData();
} else if (db instanceof DataBufferByte) {
((DataBufferByte)db).getData();
} else {
try {
img.setAccelerationPriority(0.0f);
} catch (Throwable e) {}
}
}
return img;
}
}
public static class BmByteIndexBufImg extends TriStateImageType {
static IndexColorModel icm;
public BmByteIndexBufImg() {
super(bufimgsrcroot,
"ByteIndexedBm",
"8-bit Transparent Indexed Image",
Transparency.BITMASK);
}
public Image makeImage(TestEnvironment env, int w, int h) {
if (icm == null) {
int cmap[] = new int[256];
// Workaround for transparency rendering bug in earlier VMs
// Can only render transparency if first cmap entry is 0x0
// This bug is fixed in 1.4.2 (Mantis)
int i = 1;
for (int r = 0; r < 256; r += 51) {
for (int g = 0; g < 256; g += 51) {
for (int b = 0; b < 256; b += 51) {
cmap[i++] = (0xff<<24)|(r<<16)|(g<<8)|b;
}
}
}
// Leave the rest of the colormap transparent
icm = new IndexColorModel(8, 256, cmap, 0, true, 255,
DataBuffer.TYPE_BYTE);
}
return new BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED,
icm);
}
}
public static class DrawableImage extends Option.Enable {
static Color transparentBlack = makeAlphaColor(Color.black, 0);
static Color translucentRed = makeAlphaColor(Color.red, 192);
static Color translucentGreen = makeAlphaColor(Color.green, 128);
static Color translucentYellow = makeAlphaColor(Color.yellow, 64);
static Color colorsets[][] = new Color[][] {
null,
{
Color.blue, Color.red,
Color.green, Color.yellow,
Color.blue,
},
{
transparentBlack, Color.red,
Color.green, transparentBlack,
transparentBlack,
},
{
Color.blue, translucentRed,
translucentGreen, translucentYellow,
translucentRed,
},
};
TriStateImageType tsit;
int transparency;
boolean possible;
public DrawableImage(TriStateImageType parent, int transparency,
boolean possible)
{
super(parent,
transNodeNames[transparency],
transDescriptions[transparency],
false);
this.tsit = parent;
this.transparency = transparency;
this.possible = possible;
}
public int getTransparency() {
return transparency;
}
public JComponent getJComponent() {
JComponent comp = super.getJComponent();
comp.setEnabled(possible);
return comp;
}
public String setValueFromString(String value) {
if (!possible && !value.equalsIgnoreCase("disabled")) {
return "Bad Value";
}
return super.setValueFromString(value);
}
public void modifyTest(TestEnvironment env) {
int size = env.getIntValue(sizeList);
Image src = tsit.getImage(env, size, size);
Graphics g = src.getGraphics();
if (hasGraphics2D) {
((Graphics2D) g).setComposite(AlphaComposite.Src);
}
if (size == 1) {
g.setColor(colorsets[transparency][4]);
g.fillRect(0, 0, 1, 1);
} else {
int mid = size/2;
g.setColor(colorsets[transparency][0]);
g.fillRect(0, 0, mid, mid);
g.setColor(colorsets[transparency][1]);
g.fillRect(mid, 0, size-mid, mid);
g.setColor(colorsets[transparency][2]);
g.fillRect(0, mid, mid, size-mid);
g.setColor(colorsets[transparency][3]);
g.fillRect(mid, mid, size-mid, size-mid);
}
g.dispose();
env.setSrcImage(src);
}
public void restoreTest(TestEnvironment env) {
env.setSrcImage(null);
}
public String getAbbreviatedModifierDescription(Object value) {
return "from "+getModifierValueName(value);
}
public String getModifierValueName(Object val) {
return getParent().getNodeName()+" "+getNodeName();
}
}
public static class DrawImage extends ImageTests {
public DrawImage() {
super(imgtestroot, "drawimage", "drawImage(img, x, y, obs);");
}
public void runTest(Object ctx, int numReps) {
ImageTests.Context ictx = (ImageTests.Context) ctx;
int x = ictx.initX;
int y = ictx.initY;
Graphics g = ictx.graphics;
g.translate(ictx.orgX, ictx.orgY);
Image src = ictx.src;
if (ictx.animate) {
if (ictx.touchSrc) {
Graphics srcG = src.getGraphics();
do {
srcG.fillRect(0, 0, 1, 1);
g.drawImage(src, x, y, null);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
} else {
do {
g.drawImage(src, x, y, null);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
}
} else {
if (ictx.touchSrc) {
Graphics srcG = src.getGraphics();
do {
srcG.fillRect(0, 0, 1, 1);
g.drawImage(src, x, y, null);
} while (--numReps > 0);
} else {
do {
g.drawImage(src, x, y, null);
} while (--numReps > 0);
}
}
g.translate(-ictx.orgX, -ictx.orgY);
}
}
public static class DrawImageBg extends ImageTests {
public DrawImageBg() {
super(imgtestroot, "drawimagebg", "drawImage(img, x, y, bg, obs);",
new Modifier.Filter() {
public boolean isCompatible(Object val) {
DrawableImage di = (DrawableImage) val;
return (di.getTransparency() != Transparency.OPAQUE);
}
});
}
public void runTest(Object ctx, int numReps) {
ImageTests.Context ictx = (ImageTests.Context) ctx;
int x = ictx.initX;
int y = ictx.initY;
Graphics g = ictx.graphics;
g.translate(ictx.orgX, ictx.orgY);
Image src = ictx.src;
Color bg = Color.orange;
if (ictx.animate) {
if (ictx.touchSrc) {
Graphics srcG = src.getGraphics();
do {
srcG.fillRect(0, 0, 1, 1);
g.drawImage(src, x, y, bg, null);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
} else {
do {
g.drawImage(src, x, y, bg, null);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
}
} else {
if (ictx.touchSrc) {
Graphics srcG = src.getGraphics();
do {
srcG.fillRect(0, 0, 1, 1);
g.drawImage(src, x, y, bg, null);
} while (--numReps > 0);
} else {
do {
g.drawImage(src, x, y, bg, null);
} while (--numReps > 0);
}
}
g.translate(-ictx.orgX, -ictx.orgY);
}
}
public static class DrawImageScale extends ImageTests {
float scale;
public DrawImageScale(String dir, float scale) {
super(imgtestroot, "drawimagescale"+dir,
"drawImage(img, x, y, w*"+scale+", h*"+scale+", obs);");
this.scale = scale;
}
public Dimension getOutputSize(int w, int h) {
int neww = (int) (w * scale);
int newh = (int) (h * scale);
if (neww == w && scale > 1f) neww = w+1;
if (newh == h && scale > 1f) newh = h+1;
return new Dimension(neww, newh);
}
public void runTest(Object ctx, int numReps) {
ImageTests.Context ictx = (ImageTests.Context) ctx;
int x = ictx.initX;
int y = ictx.initY;
int w = ictx.outdim.width;
int h = ictx.outdim.height;
Graphics g = ictx.graphics;
g.translate(ictx.orgX, ictx.orgY);
Image src = ictx.src;
if (ictx.animate) {
if (ictx.touchSrc) {
Graphics srcG = src.getGraphics();
do {
srcG.fillRect(0, 0, 1, 1);
g.drawImage(src, x, y, w, h, null);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
} else {
do {
g.drawImage(src, x, y, w, h, null);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
}
} else {
Graphics srcG = src.getGraphics();
if (ictx.touchSrc) {
do {
srcG.fillRect(0, 0, 1, 1);
g.drawImage(src, x, y, w, h, null);
} while (--numReps > 0);
} else {
do {
g.drawImage(src, x, y, w, h, null);
} while (--numReps > 0);
}
}
g.translate(-ictx.orgX, -ictx.orgY);
}
}
public static class DrawImageTransform extends ImageTests {
public DrawImageTransform() {
super(imgtestroot, "drawimagetxform", "drawImage(img, tx, obs);");
}
public Dimension getOutputSize(int w, int h) {
int neww = (int) Math.ceil(w * 1.1);
int newh = (int) Math.ceil(h * 1.1);
return new Dimension(neww, newh);
}
public void initContext(TestEnvironment env, GraphicsTests.Context ctx)
{
super.initContext(env, ctx);
ImageTests.Context ictx = (ImageTests.Context) ctx;
ictx.tx = new AffineTransform();
}
public void runTest(Object ctx, int numReps) {
ImageTests.Context ictx = (ImageTests.Context) ctx;
int x = ictx.initX;
int y = ictx.initY;
Graphics2D g = (Graphics2D) ictx.graphics;
g.translate(ictx.orgX, ictx.orgY);
Image src = ictx.src;
AffineTransform tx = ictx.tx;
if (ictx.animate) {
if (ictx.touchSrc) {
Graphics srcG = src.getGraphics();
do {
tx.setTransform(1.0, 0.1, 0.1, 1.0, x, y);
srcG.fillRect(0, 0, 1, 1);
g.drawImage(src, tx, null);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
} else {
do {
tx.setTransform(1.0, 0.1, 0.1, 1.0, x, y);
g.drawImage(src, tx, null);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
}
} else {
tx.setTransform(1.0, 0.1, 0.1, 1.0, x, y);
if (ictx.touchSrc) {
Graphics srcG = src.getGraphics();
do {
srcG.fillRect(0, 0, 1, 1);
g.drawImage(src, tx, null);
} while (--numReps > 0);
} else {
do {
g.drawImage(src, tx, null);
} while (--numReps > 0);
}
}
g.translate(-ictx.orgX, -ictx.orgY);
}
}
private static abstract class ImageOpTests extends ImageTests {
ImageOpTests(Group parent, String nodeName, String desc) {
super(parent, nodeName, desc,
new Modifier.Filter() {
public boolean isCompatible(Object val) {
// Filter out all non-BufferedImage sources
DrawableImage di = (DrawableImage) val;
Group imgtype = di.getParent();
return
!(imgtype instanceof VolatileImg) &&
!(imgtype instanceof OffScreen);
}
});
addDependencies(imageOpOptRoot, true);
}
private static class Context extends ImageTests.Context {
BufferedImageOp bufImgOp;
BufferedImage bufSrc;
BufferedImage bufDst;
RasterOp rasterOp;
Raster rasSrc;
WritableRaster rasDst;
}
public GraphicsTests.Context createContext() {
return new ImageOpTests.Context();
}
public void initContext(TestEnvironment env,
GraphicsTests.Context ctx)
{
super.initContext(env, ctx);
ImageOpTests.Context ictx = (ImageOpTests.Context)ctx;
// Note: We filter out all non-BufferedImage sources in the
// ImageOpTests constructor above, so the following is safe...
ictx.bufSrc = (BufferedImage)ictx.src;
String op = (String)env.getModifier(opList);
if (op.startsWith("convolve")) {
Kernel kernel;
if (op.startsWith("convolve3x3")) {
// 3x3 blur
float[] data = {
0.1f, 0.1f, 0.1f,
0.1f, 0.2f, 0.1f,
0.1f, 0.1f, 0.1f,
};
kernel = new Kernel(3, 3, data);
} else { // (op.startsWith("convolve5x5"))
// 5x5 edge
float[] data = {
-1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 24.0f, -1.0f, -1.0f,
-1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
};
kernel = new Kernel(5, 5, data);
}
int edge = op.endsWith("zero") ?
ConvolveOp.EDGE_ZERO_FILL : ConvolveOp.EDGE_NO_OP;
ictx.bufImgOp = new ConvolveOp(kernel, edge, null);
} else if (op.startsWith("lookup")) {
if (op.endsWith("byte")) {
byte invert[] = new byte[256];
byte ordered[] = new byte[256];
for (int j = 0; j < 256 ; j++) {
invert[j] = (byte)(255-j);
ordered[j] = (byte)j;
}
if (op.equals("lookup1byte")) {
ictx.bufImgOp =
new LookupOp(new ByteLookupTable(0, invert),
null);
} else { // (op.equals("lookup3byte"))
byte[][] yellowInvert =
new byte[][] { invert, invert, ordered };
ictx.bufImgOp =
new LookupOp(new ByteLookupTable(0, yellowInvert),
null);
}
} else { // (op.endsWith("short"))
short invert[] = new short[256];
short ordered[] = new short[256];
for (int j = 0; j < 256 ; j++) {
invert[j] = (short)((255-j) * 255);
ordered[j] = (short)(j * 255);
}
if (op.equals("lookup1short")) {
ictx.bufImgOp =
new LookupOp(new ShortLookupTable(0, invert),
null);
} else { // (op.equals("lookup3short"))
short[][] yellowInvert =
new short[][] { invert, invert, ordered };
ictx.bufImgOp =
new LookupOp(new ShortLookupTable(0, yellowInvert),
null);
}
}
} else if (op.equals("rescale1band")) {
ictx.bufImgOp = new RescaleOp(0.5f, 10.0f, null);
} else if (op.equals("rescale3band")) {
float[] scaleFactors = { 0.5f, 0.3f, 0.8f };
float[] offsets = { 5.0f, -7.5f, 1.0f };
ictx.bufImgOp = new RescaleOp(scaleFactors, offsets, null);
} else {
throw new InternalError("Invalid image op");
}
ictx.rasterOp = (RasterOp)ictx.bufImgOp;
}
}
private static class DrawImageOp extends ImageOpTests {
DrawImageOp() {
super(graphicsTestRoot, "drawimageop",
"drawImage(srcBufImg, op, x, y);");
}
public void runTest(Object ctx, int numReps) {
ImageOpTests.Context ictx = (ImageOpTests.Context)ctx;
int x = ictx.initX;
int y = ictx.initY;
BufferedImageOp op = ictx.bufImgOp;
BufferedImage src = ictx.bufSrc;
Graphics2D g2 = (Graphics2D)ictx.graphics;
g2.translate(ictx.orgX, ictx.orgY);
if (ictx.animate) {
if (ictx.touchSrc) {
Graphics gSrc = src.getGraphics();
do {
gSrc.fillRect(0, 0, 1, 1);
g2.drawImage(src, op, x, y);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
} else {
do {
g2.drawImage(src, op, x, y);
if ((x -= 3) < 0) x += ictx.maxX;
if ((y -= 1) < 0) y += ictx.maxY;
} while (--numReps > 0);
}
} else {
if (ictx.touchSrc) {
Graphics gSrc = src.getGraphics();
do {
gSrc.fillRect(0, 0, 1, 1);
g2.drawImage(src, op, x, y);
} while (--numReps > 0);
} else {
do {
g2.drawImage(src, op, x, y);
} while (--numReps > 0);
}
}
g2.translate(-ictx.orgX, -ictx.orgY);
}
}
private static class BufImgOpFilter extends ImageOpTests {
private boolean cached;
BufImgOpFilter(boolean cached) {
super(bufImgOpTestRoot,
"filter" + (cached ? "cached" : "null"),
"op.filter(srcBufImg, " +
(cached ? "cachedCompatibleDestImg" : "null") + ");");
this.cached = cached;
}
public void initContext(TestEnvironment env,
GraphicsTests.Context ctx)
{
super.initContext(env, ctx);
ImageOpTests.Context ictx = (ImageOpTests.Context)ctx;
if (cached) {
ictx.bufDst =
ictx.bufImgOp.createCompatibleDestImage(ictx.bufSrc, null);
}
}
public void runTest(Object ctx, int numReps) {
ImageOpTests.Context ictx = (ImageOpTests.Context)ctx;
BufferedImageOp op = ictx.bufImgOp;
BufferedImage src = ictx.bufSrc;
BufferedImage dst = ictx.bufDst;
if (ictx.touchSrc) {
Graphics gSrc = src.getGraphics();
do {
gSrc.fillRect(0, 0, 1, 1);
op.filter(src, dst);
} while (--numReps > 0);
} else {
do {
op.filter(src, dst);
} while (--numReps > 0);
}
}
}
private static class RasterOpFilter extends ImageOpTests {
private boolean cached;
RasterOpFilter(boolean cached) {
super(rasterOpTestRoot,
"filter" + (cached ? "cached" : "null"),
"op.filter(srcRaster, " +
(cached ? "cachedCompatibleDestRaster" : "null") + ");");
this.cached = cached;
}
public void initContext(TestEnvironment env,
GraphicsTests.Context ctx)
{
super.initContext(env, ctx);
ImageOpTests.Context ictx = (ImageOpTests.Context)ctx;
ictx.rasSrc = ictx.bufSrc.getRaster();
if (cached) {
ictx.bufDst =
ictx.bufImgOp.createCompatibleDestImage(ictx.bufSrc, null);
ictx.rasDst = ictx.bufDst.getRaster();
}
}
public void runTest(Object ctx, int numReps) {
ImageOpTests.Context ictx = (ImageOpTests.Context)ctx;
RasterOp op = ictx.rasterOp;
Raster src = ictx.rasSrc;
WritableRaster dst = ictx.rasDst;
if (ictx.touchSrc) {
Graphics gSrc = ictx.bufSrc.getGraphics();
do {
gSrc.fillRect(0, 0, 1, 1);
op.filter(src, dst);
} while (--numReps > 0);
} else {
do {
op.filter(src, dst);
} while (--numReps > 0);
}
}
}
}