// This block is just a JAI way to make a scaled rendering of the
// given button image using JAI.
RenderedImage adjustedIcon;
if (!transform.isIdentity()) {
ParameterBlock pb = new ParameterBlock();
pb.addSource(icon);
pb.add(transform);
pb.add(interp);
adjustedIcon = JAI.create("Affine", pb, extenderHint);
} else
adjustedIcon = icon;
ParameterBlock pb = new ParameterBlock();
pb.add((float) buttonTile.getWidth());
pb.add((float) buttonTile.getHeight());
pb.add(new Byte[]{new Byte((byte) 0),
new Byte((byte) 0),
new Byte((byte) 0),
new Byte((byte) 0)});
final RenderedOp zero = JAI.create("Constant", pb, null);
final RenderedOp extendedIcon = JAI.create("Overlay", zero, adjustedIcon);
final BufferedImage allRGB = new BufferedImage(buttonTile.getWidth(), buttonTile.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
allRGB.setData(buttonTile.getData().createChild(0, 0,
buttonTile.getWidth(), buttonTile.getHeight(),
0, 0, new int[]{0, 1, 2}));
final BufferedImage allAlpha = new BufferedImage(buttonTile.getWidth(), buttonTile.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
allAlpha.setData(buttonTile.getData().createChild(0, 0,
buttonTile.getWidth(), buttonTile.getHeight(),
0, 0, new int[]{3}));
final BufferedImage iconRGB = new BufferedImage(extendedIcon.getWidth(), extendedIcon.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
iconRGB.setData(extendedIcon.getData().createChild(0, 0,
extendedIcon.getWidth(), extendedIcon.getHeight(),
0, 0, new int[]{0, 1, 2}));
final BufferedImage iconAlpha = new BufferedImage(extendedIcon.getWidth(), extendedIcon.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
iconAlpha.setData(extendedIcon.getData().createChild(0, 0,
extendedIcon.getWidth(), extendedIcon.getHeight(),
0, 0, new int[]{3}));
pb = new ParameterBlock();
pb.addSource(iconRGB);
pb.addSource(allRGB);
pb.add(iconAlpha);
pb.add(allAlpha);
pb.add(new Boolean(false));
pb.add(CompositeDescriptor.DESTINATION_ALPHA_LAST);
return JAI.create("Composite", pb, null).getAsBufferedImage();
}
}