else
at.concatenate(ar.getTransform());
cr = ar.getSource();
continue;
} else if (cr instanceof TranslateRed) {
TranslateRed tr = (TranslateRed)cr;
// System.out.println("testing Translate");
int dx = tr.getDeltaX();
int dy = tr.getDeltaY();
if (at == null)
at = AffineTransform.getTranslateInstance(dx, dy);
else
at.translate(dx, dy);
cr = tr.getSource();
continue;
}
break;
}
AffineTransform g2dAt = g2d.getTransform();
if ((at == null) || (at.isIdentity()))
at = g2dAt;
else
at.preConcatenate(g2dAt);
ColorModel srcCM = cr.getColorModel();
ColorSpace g2dCS = getDestinationColorSpace(g2d);
ColorModel g2dCM = getDestinationColorModel(g2d);
if (g2dCS == null)
// Assume device is sRGB
g2dCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorModel drawCM = g2dCM;
if ((g2dCM == null) || !g2dCM.hasAlpha()) {
// If we can't find out about our device or the device
// does not support alpha just use SRGB unpremultiplied
// (Just because this seems to work for us).
drawCM = sRGB_Unpre;
}
if (cr instanceof BufferedImageCachableRed) {
// There is a huge win if we can use the BI directly here.
// This results in something like a 10x performance gain
// for images, the best thing is this is the common case.
if (g2dCS.equals(srcCM.getColorSpace()) &&
drawCM.equals(srcCM)) {
// System.err.println("Fast Case");
g2d.setTransform(at);
BufferedImageCachableRed bicr;
bicr = (BufferedImageCachableRed)cr;
g2d.drawImage(bicr.getBufferedImage(),
bicr.getMinX(), bicr.getMinY(), null);
g2d.setTransform(g2dAt);
return;
}
}
// Scaling down so do it before color conversion.
double determinant = at.getDeterminant();
if (!at.isIdentity() && (determinant <= 1.0)) {
if (at.getType() != AffineTransform.TYPE_TRANSLATION)
cr = new AffineRed(cr, at, g2d.getRenderingHints());
else {
int xloc = cr.getMinX() + (int)at.getTranslateX();
int yloc = cr.getMinY() + (int)at.getTranslateY();
cr = new TranslateRed(cr, xloc, yloc);
}
}
if (g2dCS != srcCM.getColorSpace()) {
// System.out.println("srcCS: " + srcCM.getColorSpace());