// save positions
int saveIP = currentIPPosition;
int saveBP = currentBPPosition;
CTM ctm = bv.getCTM();
int borderPaddingStart = bv.getBorderAndPaddingWidthStart();
int borderPaddingBefore = bv.getBorderAndPaddingWidthBefore();
//This is the content-rect
float width = (float)bv.getIPD() / 1000f;
float height = (float)bv.getBPD() / 1000f;
if (bv.getPositioning() == Block.ABSOLUTE
|| bv.getPositioning() == Block.FIXED) {
//For FIXED, we need to break out of the current viewports to the
//one established by the page. We save the state stack for restoration
//after the block-container has been painted. See below.
List breakOutList = null;
if (bv.getPositioning() == Block.FIXED) {
breakOutList = breakOutOfStateStack();
}
AffineTransform positionTransform = new AffineTransform();
positionTransform.translate(bv.getXOffset(), bv.getYOffset());
//"left/"top" (bv.getX/YOffset()) specify the position of the content rectangle
positionTransform.translate(-borderPaddingStart, -borderPaddingBefore);
//skipping fox:transform here
//saveGraphicsState();
//Viewport position
//concatenateTransformationMatrix(mptToPt(positionTransform));
//Background and borders
float bpwidth = (borderPaddingStart + bv.getBorderAndPaddingWidthEnd()) / 1000f;
float bpheight = (borderPaddingBefore + bv.getBorderAndPaddingWidthAfter()) / 1000f;
Point2D ptSrc = new Point(0, 0);
Point2D ptDst = positionTransform.transform(ptSrc, null);
Rectangle2D borderRect = new Rectangle2D.Double(ptDst.getX(), ptDst.getY(),
1000 * (width + bpwidth), 1000 * (height + bpheight));
pushViewPortPos(new ViewPortPos(borderRect, new CTM(positionTransform)));
drawBackAndBorders(bv, 0, 0, width + bpwidth, height + bpheight);
//Shift to content rectangle after border painting
AffineTransform contentRectTransform = new AffineTransform();
contentRectTransform.translate(borderPaddingStart, borderPaddingBefore);
//concatenateTransformationMatrix(mptToPt(contentRectTransform));
ptSrc = new Point(0, 0);
ptDst = contentRectTransform.transform(ptSrc, null);
Rectangle2D contentRect = new Rectangle2D.Double(ptDst.getX(), ptDst.getY(),
1000 * width, 1000 * height);
pushViewPortPos(new ViewPortPos(contentRect, new CTM(contentRectTransform)));
//Clipping is not supported, yet
//Rectangle2D clippingRect = null;
//clippingRect = new Rectangle(0, 0, bv.getIPD(), bv.getBPD());
//saveGraphicsState();
//Set up coordinate system for content rectangle
AffineTransform contentTransform = ctm.toAffineTransform();
//concatenateTransformationMatrix(mptToPt(contentTransform));
contentRect = new Rectangle2D.Double(0, 0, 1000 * width, 1000 * height);
pushViewPortPos(new ViewPortPos(contentRect, new CTM(contentTransform)));
currentIPPosition = 0;
currentBPPosition = 0;
renderBlocks(bv, children);
popViewPortPos();
popViewPortPos();
//restoreGraphicsState();
popViewPortPos();
//restoreGraphicsState();
if (breakOutList != null) {
restoreStateStackAfterBreakOut(breakOutList);
}
currentIPPosition = saveIP;
currentBPPosition = saveBP;
} else {
currentBPPosition += bv.getSpaceBefore();
//borders and background in the old coordinate system
handleBlockTraits(bv);
//Advance to start of content area
currentIPPosition += bv.getStartIndent();
CTM tempctm = new CTM(containingIPPosition, currentBPPosition);
ctm = tempctm.multiply(ctm);
//Now adjust for border/padding
currentBPPosition += borderPaddingBefore;
Rectangle2D clippingRect = null;