Skip to content

Commit

Permalink
#180 - FIX for nested transform of inline block in fixed position ele…
Browse files Browse the repository at this point in the history
…ments.
  • Loading branch information
danfickle committed Jan 2, 2019
1 parent 9ec47cd commit 45f6ee6
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ public class Layer {
private int _selectionEndY;

private boolean _forDeletion;
private boolean _hasFixedAncester;

/**
* @see {@link #getCurrentTransformMatrix()}
Expand Down Expand Up @@ -117,6 +118,7 @@ public Layer(Layer parent, Box master, CssContext c) {
master.setLayer(this);
master.setContainingLayer(this);
_hasLocalTransform = !master.getStyle().isIdent(CSSName.TRANSFORM, IdentValue.NONE);
_hasFixedAncester = (parent != null && parent._hasFixedAncester) || master.getStyle().isFixed();
}

/**
Expand Down Expand Up @@ -159,6 +161,10 @@ public boolean isForDeletion() {
return this._forDeletion;
}

public boolean hasFixedAncester() {
return _hasFixedAncester;
}

public Layer getParent() {
return _parent;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,12 @@ protected void collect(RenderingContext c, Layer layer, DisplayListContainer dlP
}
}
return;
} else if (layer.hasFixedAncester()) {
// Fixed child layers are handled when the fixed layer is painted by
// the SimplePainter.
return;
}

List<PageInfo> layerPages = PagedBoxCollector.findLayerPages(c, layer, _pages);
int layerPageStart = findStartPage(c, layer);
int layerPageEnd = findEndPage(c, layer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ public static AffineTransform createDocumentCoordinatesTransform(Box master, Css
return ctm;
}

private static float getPageTranslateX(float absTranslateX, int shadowPageNumber, PageBox page, CssContext c) {
if (shadowPageNumber == -1) {
private static float getPageTranslateX(float absTranslateX, int shadowPageNumber, PageBox page, CssContext c, Box box) {
if (shadowPageNumber == -1 || box.getContainingLayer().hasFixedAncester()) {
return absTranslateX + page.getMarginBorderPadding(c, CalculatedStyle.LEFT);
}

Expand Down Expand Up @@ -132,12 +132,12 @@ private static void createTransform(CssContext c, Box box, PageBox page, AffineT

if (transformYOrigin == TransformYOrigin.PAGE_BOTTOM) {
// The transform point is the lower left of the page (PDF coordinate system).
pageTranslateX = getPageTranslateX(absTranslateX, shadowPageNumber, page, c);
pageTranslateX = getPageTranslateX(absTranslateX, shadowPageNumber, page, c, box);
float topDownPageTranslateY = (absTranslateY + page.getMarginBorderPadding(c, CalculatedStyle.TOP)) - page.getPaintingTop();
pageTranslateY = (page.getHeight(c) - topDownPageTranslateY);
} else { // PAGE_TOP
// The transform point is the upper left of the page.
pageTranslateX = getPageTranslateX(absTranslateX, shadowPageNumber, page, c);
pageTranslateX = getPageTranslateX(absTranslateX, shadowPageNumber, page, c, box);
pageTranslateY = (absTranslateY - page.getPaintingTop()) + page.getMarginBorderPadding(c, CalculatedStyle.TOP);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,12 @@ public void paintLayer(RenderingContext c, Layer layer) {
if (parentClip != null) {
c.getOutputDevice().pushClip(parentClip);
}

if (layer.hasLocalTransform()) {
AffineTransform transform = TransformCreator.createPageMarginCoordinatesTransform(c, master, c.getPage(), xTranslate, yTranslate);
AffineTransform transform = c.isInPageMargins() ?
TransformCreator.createPageMarginCoordinatesTransform(c, master, c.getPage(), xTranslate, yTranslate) :
TransformCreator.createPageCoordinatesTranform(c, master, c.getPage(), c.getShadowPageNumber());

c.getOutputDevice().pushTransformLayer(transform);
}

Expand All @@ -56,7 +59,7 @@ public void paintLayer(RenderingContext c, Layer layer) {
paintLayerBackgroundAndBorder(c, master);
}

if (layer.isRootLayer() || layer.isStackingContext()) {
if (layer.isRootLayer() || layer.isStackingContext() || master.getStyle().isFixed()) {
paintLayers(c, layer.getSortedLayers(Layer.NEGATIVE));
}

Expand All @@ -69,7 +72,7 @@ public void paintLayer(RenderingContext c, Layer layer) {
paintInlineContent(c, boxCollector.inlines());
paintReplacedElements(c, boxCollector.replaceds());

if (layer.isRootLayer() || layer.isStackingContext()) {
if (layer.isRootLayer() || layer.isStackingContext() || master.getStyle().isFixed()) {
paintLayers(c, layer.collectLayers(Layer.AUTO));
// TODO z-index: 0 layers should be painted atomically
paintLayers(c, layer.getSortedLayers(Layer.ZERO));
Expand Down Expand Up @@ -213,6 +216,10 @@ private void paintLayers(RenderingContext c, List<Layer> layers) {
}

public void paintAsLayer(RenderingContext c, BlockBox startingPoint) {
if (startingPoint.getStyle().requiresLayer()) {
return;
}

SimpleBoxCollector collector = new SimpleBoxCollector();
collector.collect(c, startingPoint.getContainingLayer(), startingPoint);

Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -452,8 +452,6 @@ public void testFixedNestedInlineBlock() throws IOException {
* Tests that a nested transform in a fixed element renders correctly.
*/
@Test
@Ignore // Failing due to using the wrong transform offsets.
// Also boxes being painted twice.
public void testFixedNestedTransform() throws IOException {
assertTrue(run("fixed-nested-transform"));
}
Expand Down

0 comments on commit 45f6ee6

Please sign in to comment.