in fop-core/src/main/java/org/apache/fop/svg/PDFGraphics2D.java [987:1103]
protected boolean applyUnknownPaint(Paint paint, Shape shape) {
preparePainting();
Shape clip = getClip();
Rectangle2D usrClipBounds;
Rectangle2D usrBounds;
usrBounds = shape.getBounds2D();
if (clip != null) {
usrClipBounds = clip.getBounds2D();
if (!usrClipBounds.intersects(usrBounds)) {
return true;
}
Rectangle2D.intersect(usrBounds, usrClipBounds, usrBounds);
}
double usrX = usrBounds.getX();
double usrY = usrBounds.getY();
double usrW = usrBounds.getWidth();
double usrH = usrBounds.getHeight();
Rectangle devShapeBounds;
Rectangle devClipBounds;
Rectangle devBounds;
AffineTransform at = getTransform();
devShapeBounds = at.createTransformedShape(shape).getBounds();
if (clip != null) {
devClipBounds = at.createTransformedShape(clip).getBounds();
if (!devClipBounds.intersects(devShapeBounds)) {
return true;
}
devBounds = devShapeBounds.intersection(devClipBounds);
} else {
devBounds = devShapeBounds;
}
int devX = devBounds.x;
int devY = devBounds.y;
int devW = devBounds.width;
int devH = devBounds.height;
ColorSpace rgbCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorModel rgbCM = new DirectColorModel(
rgbCS, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000,
false, DataBuffer.TYPE_BYTE);
PaintContext pctx = paint.createContext(rgbCM, devBounds, usrBounds,
at, getRenderingHints());
PDFXObject imageInfo = pdfDoc.getXObject(
"TempImage:" + pctx.toString());
if (imageInfo != null) {
resourceContext.addXObject(imageInfo);
} else {
Raster r = pctx.getRaster(devX, devY, devW, devH);
assert (r instanceof WritableRaster);
WritableRaster wr = (WritableRaster) r;
wr = wr.createWritableTranslatedChild(0, 0);
ColorModel pcm = pctx.getColorModel();
BufferedImage bi = new BufferedImage(
pcm, wr, pcm.isAlphaPremultiplied(), null);
final byte[] rgb = new byte[devW * devH * 3];
final int[] line = new int[devW];
final byte[] mask;
int x;
int y;
int val;
int rgbIdx = 0;
if (pcm.hasAlpha()) {
mask = new byte[devW * devH];
int maskIdx = 0;
for (y = 0; y < devH; y++) {
bi.getRGB(0, y, devW, 1, line, 0, devW);
for (x = 0; x < devW; x++) {
val = line[x];
mask[maskIdx++] = (byte)(val >>> 24);
rgb[rgbIdx++] = (byte)((val >> 16) & 0x0FF);
rgb[rgbIdx++] = (byte)((val >> 8) & 0x0FF);
rgb[rgbIdx++] = (byte)(val & 0x0FF);
}
}
} else {
mask = null;
for (y = 0; y < devH; y++) {
bi.getRGB(0, y, devW, 1, line, 0, devW);
for (x = 0; x < devW; x++) {
val = line[x];
rgb[rgbIdx++] = (byte)((val >> 16) & 0x0FF);
rgb[rgbIdx++] = (byte)((val >> 8) & 0x0FF);
rgb[rgbIdx++] = (byte)(val & 0x0FF);
}
}
}
PDFReference maskRef = null;
if (mask != null) {
BitmapImage fopimg = new BitmapImage(
"TempImageMask:" + pctx.toString(), devW, devH, mask, null);
fopimg.setColorSpace(new PDFDeviceColorSpace(PDFDeviceColorSpace.DEVICE_GRAY));
PDFImageXObject xobj = pdfDoc.addImage(resourceContext, fopimg);
maskRef = xobj.makeReference();
flushPDFDocument();
}
BitmapImage fopimg;
fopimg = new BitmapImage("TempImage:" + pctx.toString(),
devW, devH, rgb, maskRef);
fopimg.setTransparent(new PDFColor(255, 255, 255));
imageInfo = pdfDoc.addImage(resourceContext, fopimg);
flushPDFDocument();
}
currentStream.write("q\n");
writeClip(shape);
currentStream.write("" + PDFNumber.doubleOut(usrW) + " 0 0 " + PDFNumber.doubleOut(-usrH) + " "
+ PDFNumber.doubleOut(usrX) + " " + PDFNumber.doubleOut(usrY + usrH) + " cm\n"
+ imageInfo.getName() + " Do\nQ\n");
return true;
}