Index: Source/core/paint/DeprecatedPaintLayer.cpp |
diff --git a/Source/core/paint/DeprecatedPaintLayer.cpp b/Source/core/paint/DeprecatedPaintLayer.cpp |
index 81f29ebe4fcb059286468123362ea893c1637fc0..e3c7b739c76629aedd987d85ca6e5a47b674c5be 100644 |
--- a/Source/core/paint/DeprecatedPaintLayer.cpp |
+++ b/Source/core/paint/DeprecatedPaintLayer.cpp |
@@ -53,7 +53,6 @@ |
#include "core/frame/FrameView.h" |
#include "core/frame/LocalFrame.h" |
#include "core/html/HTMLFrameElement.h" |
-#include "core/layout/ColumnInfo.h" |
#include "core/layout/HitTestRequest.h" |
#include "core/layout/HitTestResult.h" |
#include "core/layout/HitTestingTransformState.h" |
@@ -110,7 +109,6 @@ DeprecatedPaintLayer::DeprecatedPaintLayer(LayoutBoxModelObject* layoutObject, D |
, m_visibleDescendantStatusDirty(false) |
, m_hasVisibleDescendant(false) |
, m_hasVisibleNonLayerContent(false) |
- , m_isPaginated(false) |
#if ENABLE(ASSERT) |
, m_needsPositionUpdate(true) |
#endif |
@@ -244,8 +242,7 @@ void DeprecatedPaintLayer::updateLayerPositionsAfterLayout() |
// FIXME: Remove incremental compositing updates after fixing the chicken/egg issues |
// https://code.google.com/p/chromium/issues/detail?id=343756 |
DisableCompositingQueryAsserts disabler; |
- bool needsPaginationUpdate = isPaginated() || enclosingPaginationLayer(); |
- updatePaginationRecursive(needsPaginationUpdate); |
+ updatePaginationRecursive(enclosingPaginationLayer()); |
} |
} |
@@ -429,28 +426,6 @@ TransformationMatrix DeprecatedPaintLayer::renderableTransform(PaintBehavior pai |
return *m_transform; |
} |
-static bool checkContainingBlockChainForPagination(LayoutBoxModelObject* layoutObject, LayoutBox* ancestorColumnsLayoutObject) |
-{ |
- LayoutView* view = layoutObject->view(); |
- LayoutBoxModelObject* prevBlock = layoutObject; |
- LayoutBlock* containingBlock; |
- for (containingBlock = layoutObject->containingBlock(); |
- containingBlock && containingBlock != view && containingBlock != ancestorColumnsLayoutObject; |
- containingBlock = containingBlock->containingBlock()) |
- prevBlock = containingBlock; |
- |
- // If the columns block wasn't in our containing block chain, then we aren't paginated by it. |
- if (containingBlock != ancestorColumnsLayoutObject) |
- return false; |
- |
- // If the previous block is absolutely positioned, then we can't be paginated by the columns block. |
- if (prevBlock->isOutOfFlowPositioned()) |
- return false; |
- |
- // Otherwise we are paginated by the columns block. |
- return true; |
-} |
- |
// Convert a bounding box from flow thread coordinates, relative to |layer|, to visual coordinates, relative to |ancestorLayer|. |
// See http://www.chromium.org/developers/design-documents/multi-column-layout for more info on these coordinate types. |
static void convertFromFlowThreadToVisualBoundingBoxInAncestor(const DeprecatedPaintLayer* layer, const DeprecatedPaintLayer* ancestorLayer, LayoutRect& rect) |
@@ -481,89 +456,63 @@ static void convertFromFlowThreadToVisualBoundingBoxInAncestor(const DeprecatedP |
void DeprecatedPaintLayer::updatePaginationRecursive(bool needsPaginationUpdate) |
{ |
- m_isPaginated = false; |
m_enclosingPaginationLayer = 0; |
- if (RuntimeEnabledFeatures::regionBasedColumnsEnabled() && layoutObject()->isLayoutFlowThread()) |
+ if (layoutObject()->isLayoutFlowThread()) |
needsPaginationUpdate = true; |
if (needsPaginationUpdate) |
updatePagination(); |
- if (layoutObject()->hasColumns()) |
- needsPaginationUpdate = true; |
- |
for (DeprecatedPaintLayer* child = firstChild(); child; child = child->nextSibling()) |
child->updatePaginationRecursive(needsPaginationUpdate); |
} |
void DeprecatedPaintLayer::updatePagination() |
{ |
- bool usesRegionBasedColumns = RuntimeEnabledFeatures::regionBasedColumnsEnabled(); |
- if ((!usesRegionBasedColumns && compositingState() != NotComposited) || !parent()) |
+ if (!parent()) |
return; // FIXME: For now the LayoutView can't be paginated. Eventually printing will move to a model where it is though. |
- // The main difference between the paginated booleans for the old column code and the new column code |
- // is that each paginated layer has to paint on its own with the new code. There is no |
- // recurring into child layers. This means that the m_isPaginated bits for the new column code can't just be set on |
- // "roots" that get split and paint all their descendants. Instead each layer has to be checked individually and |
- // genuinely know if it is going to have to split itself up when painting only its contents (and not any other descendant |
- // layers). We track an enclosingPaginationLayer instead of using a simple bit, since we want to be able to get back |
+ // Each paginated layer has to paint on its own. There is no recurring into child layers. Each |
+ // layer has to be checked individually and genuinely know if it is going to have to split |
+ // itself up when painting only its contents (and not any other descendant layers). We track an |
+ // enclosingPaginationLayer instead of using a simple bit, since we want to be able to get back |
// to that layer easily. |
- if (usesRegionBasedColumns && layoutObject()->isLayoutFlowThread()) { |
+ if (layoutObject()->isLayoutFlowThread()) { |
m_enclosingPaginationLayer = this; |
return; |
} |
if (m_stackingNode->isNormalFlowOnly()) { |
- if (usesRegionBasedColumns) { |
- // We cannot take the fast path for spanners, as they do not have their nearest ancestor |
- // pagination layer (flow thread) in their containing block chain. |
- if (!layoutObject()->isColumnSpanAll()) { |
- // Content inside a transform is not considered to be paginated, since we simply |
- // paint the transform multiple times in each column, so we don't have to use |
- // fragments for the transformed content. |
- m_enclosingPaginationLayer = parent()->enclosingPaginationLayer(); |
- if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->hasTransformRelatedProperty()) |
- m_enclosingPaginationLayer = 0; |
- return; |
- } |
- } else { |
- m_isPaginated = parent()->layoutObject()->hasColumns(); |
+ // We cannot take the fast path for spanners, as they do not have their nearest ancestor |
+ // pagination layer (flow thread) in their containing block chain. |
+ if (!layoutObject()->isColumnSpanAll()) { |
+ // Content inside a transform is not considered to be paginated, since we simply |
+ // paint the transform multiple times in each column, so we don't have to use |
+ // fragments for the transformed content. |
+ m_enclosingPaginationLayer = parent()->enclosingPaginationLayer(); |
+ if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->hasTransformRelatedProperty()) |
+ m_enclosingPaginationLayer = 0; |
return; |
} |
} |
- // For the new columns code, we want to walk up our containing block chain looking for an enclosing layer. Once |
- // we find one, then we just check its pagination status. |
- if (usesRegionBasedColumns) { |
- LayoutView* view = layoutObject()->view(); |
- LayoutBlock* containingBlock; |
- for (containingBlock = layoutObject()->containingBlock(); |
- containingBlock && containingBlock != view; |
- containingBlock = containingBlock->containingBlock()) { |
- if (containingBlock->hasLayer()) { |
- // Content inside a transform is not considered to be paginated, since we simply |
- // paint the transform multiple times in each column, so we don't have to use |
- // fragments for the transformed content. |
- m_enclosingPaginationLayer = containingBlock->layer()->enclosingPaginationLayer(); |
- if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->hasTransformRelatedProperty()) |
- m_enclosingPaginationLayer = 0; |
- return; |
- } |
- } |
- return; |
- } |
- |
- // If we're not normal flow, then we need to look for a multi-column object between us and our stacking container. |
- DeprecatedPaintLayerStackingNode* ancestorStackingContextNode = m_stackingNode->ancestorStackingContextNode(); |
- for (DeprecatedPaintLayer* curr = parent(); curr; curr = curr->parent()) { |
- if (curr->layoutObject()->hasColumns()) { |
- m_isPaginated = checkContainingBlockChainForPagination(layoutObject(), curr->layoutBox()); |
+ // Walk up our containing block chain looking for an enclosing layer. Once we find one, then we |
+ // just check its pagination status. |
+ LayoutView* view = layoutObject()->view(); |
+ LayoutBlock* containingBlock; |
+ for (containingBlock = layoutObject()->containingBlock(); |
+ containingBlock && containingBlock != view; |
+ containingBlock = containingBlock->containingBlock()) { |
+ if (containingBlock->hasLayer()) { |
+ // Content inside a transform is not considered to be paginated, since we simply |
+ // paint the transform multiple times in each column, so we don't have to use |
+ // fragments for the transformed content. |
+ m_enclosingPaginationLayer = containingBlock->layer()->enclosingPaginationLayer(); |
+ if (m_enclosingPaginationLayer && m_enclosingPaginationLayer->hasTransformRelatedProperty()) |
+ m_enclosingPaginationLayer = 0; |
return; |
} |
- if (curr->stackingNode() == ancestorStackingContextNode) |
- return; |
} |
} |
@@ -847,24 +796,9 @@ bool DeprecatedPaintLayer::updateLayerPosition() |
LayoutSize offset = toLayoutInline(positionedParent->layoutObject())->offsetForInFlowPositionedInline(*toLayoutBox(layoutObject())); |
localPoint += offset; |
} |
- } else if (parent()) { |
- // FIXME: This code is very wrong, but luckily only needed in the old/current multicol |
- // implementation. The compositing system doesn't understand columns and we're hacking |
- // around that fact by faking the position of the Layers when we think we'll end up |
- // being composited. |
- if (hasStyleDeterminedDirectCompositingReasons() && !RuntimeEnabledFeatures::regionBasedColumnsEnabled()) { |
- // FIXME: Composited layers ignore pagination, so about the best we can do is make sure they're offset into the appropriate column. |
- // They won't split across columns properly. |
- if (!parent()->layoutObject()->hasColumns() && parent()->layoutObject()->isDocumentElement() && layoutObject()->view()->hasColumns()) |
- localPoint += layoutObject()->view()->columnOffset(localPoint); |
- else |
- localPoint += parent()->layoutObject()->columnOffset(localPoint); |
- } |
- |
- if (parent()->layoutObject()->hasOverflowClip()) { |
- IntSize scrollOffset = parent()->layoutBox()->scrolledContentOffset(); |
- localPoint -= scrollOffset; |
- } |
+ } else if (parent() && parent()->layoutObject()->hasOverflowClip()) { |
+ IntSize scrollOffset = parent()->layoutBox()->scrolledContentOffset(); |
+ localPoint -= scrollOffset; |
} |
bool positionOrOffsetChanged = false; |
@@ -2081,10 +2015,7 @@ DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestChildren(ChildrenIteration ch |
DeprecatedPaintLayer* childLayer = child->layer(); |
DeprecatedPaintLayer* hitLayer = 0; |
HitTestResult tempResult(result.hitTestRequest(), result.hitTestLocation()); |
- if (childLayer->isPaginated()) |
- hitLayer = hitTestPaginatedChildLayer(childLayer, rootLayer, tempResult, hitTestRect, hitTestLocation, transformState, zOffsetForDescendants); |
- else |
- hitLayer = childLayer->hitTestLayer(rootLayer, this, tempResult, hitTestRect, hitTestLocation, false, transformState, zOffsetForDescendants); |
+ hitLayer = childLayer->hitTestLayer(rootLayer, this, tempResult, hitTestRect, hitTestLocation, false, transformState, zOffsetForDescendants); |
// If it is a list-based test, we can safely append the temporary result since it might had hit |
// nodes but not necesserily had hitLayer set. |
@@ -2104,126 +2035,6 @@ DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestChildren(ChildrenIteration ch |
return resultLayer; |
} |
-DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestPaginatedChildLayer(DeprecatedPaintLayer* childLayer, DeprecatedPaintLayer* rootLayer, HitTestResult& result, |
- const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset) |
-{ |
- Vector<DeprecatedPaintLayer*> columnLayers; |
- DeprecatedPaintLayerStackingNode* ancestorNode = m_stackingNode->isNormalFlowOnly() ? parent()->stackingNode() : m_stackingNode->ancestorStackingContextNode(); |
- for (DeprecatedPaintLayer* curr = childLayer->parent(); curr; curr = curr->parent()) { |
- if (curr->layoutObject()->hasColumns() && checkContainingBlockChainForPagination(childLayer->layoutObject(), curr->layoutBox())) |
- columnLayers.append(curr); |
- if (curr->stackingNode() == ancestorNode) |
- break; |
- } |
- |
- ASSERT(columnLayers.size()); |
- return hitTestChildLayerColumns(childLayer, rootLayer, result, hitTestRect, hitTestLocation, transformState, zOffset, |
- columnLayers, columnLayers.size() - 1); |
-} |
- |
-DeprecatedPaintLayer* DeprecatedPaintLayer::hitTestChildLayerColumns(DeprecatedPaintLayer* childLayer, DeprecatedPaintLayer* rootLayer, HitTestResult& result, |
- const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const HitTestingTransformState* transformState, double* zOffset, |
- const Vector<DeprecatedPaintLayer*>& columnLayers, size_t columnIndex) |
-{ |
- LayoutBlock* columnBlock = toLayoutBlock(columnLayers[columnIndex]->layoutObject()); |
- |
- ASSERT(columnBlock && columnBlock->hasColumns()); |
- if (!columnBlock || !columnBlock->hasColumns()) |
- return 0; |
- |
- LayoutPoint layerOffset; |
- columnBlock->layer()->convertToLayerCoords(rootLayer, layerOffset); |
- |
- ColumnInfo* colInfo = columnBlock->columnInfo(); |
- int colCount = columnBlock->columnCount(colInfo); |
- |
- // We have to go backwards from the last column to the first. |
- bool isHorizontal = columnBlock->style()->isHorizontalWritingMode(); |
- LayoutUnit logicalLeft = columnBlock->logicalLeftOffsetForContent(); |
- LayoutUnit currLogicalTopOffset = 0; |
- int i; |
- for (i = 0; i < colCount; i++) { |
- LayoutRect colRect = columnBlock->columnRectAt(colInfo, i); |
- LayoutUnit blockDelta = (isHorizontal ? colRect.height() : colRect.width()); |
- if (columnBlock->style()->isFlippedBlocksWritingMode()) |
- currLogicalTopOffset += blockDelta; |
- else |
- currLogicalTopOffset -= blockDelta; |
- } |
- for (i = colCount - 1; i >= 0; i--) { |
- // For each rect, we clip to the rect, and then we adjust our coords. |
- LayoutRect colRect = columnBlock->columnRectAt(colInfo, i); |
- columnBlock->flipForWritingMode(colRect); |
- LayoutUnit currLogicalLeftOffset = (isHorizontal ? colRect.x() : colRect.y()) - logicalLeft; |
- LayoutUnit blockDelta = (isHorizontal ? colRect.height() : colRect.width()); |
- if (columnBlock->style()->isFlippedBlocksWritingMode()) |
- currLogicalTopOffset -= blockDelta; |
- else |
- currLogicalTopOffset += blockDelta; |
- |
- LayoutSize offset; |
- if (isHorizontal) { |
- if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) |
- offset = LayoutSize(currLogicalLeftOffset, currLogicalTopOffset); |
- else |
- offset = LayoutSize(0, colRect.y() + currLogicalTopOffset - columnBlock->borderTop() - columnBlock->paddingTop()); |
- } else { |
- if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) |
- offset = LayoutSize(currLogicalTopOffset, currLogicalLeftOffset); |
- else |
- offset = LayoutSize(colRect.x() + currLogicalTopOffset - columnBlock->borderLeft() - columnBlock->paddingLeft(), 0); |
- } |
- |
- colRect.moveBy(layerOffset); |
- |
- LayoutRect localClipRect(hitTestRect); |
- localClipRect.intersect(colRect); |
- |
- if (!localClipRect.isEmpty() && hitTestLocation.intersects(localClipRect)) { |
- DeprecatedPaintLayer* hitLayer = 0; |
- if (!columnIndex) { |
- // Apply a translation transform to change where the layer paints. |
- TransformationMatrix oldTransform; |
- bool oldHasTransform = childLayer->transform(); |
- if (oldHasTransform) |
- oldTransform = *childLayer->transform(); |
- TransformationMatrix newTransform(oldTransform); |
- newTransform.translateRight(offset.width(), offset.height()); |
- |
- childLayer->m_transform = adoptPtr(new TransformationMatrix(newTransform)); |
- hitLayer = childLayer->hitTestLayer(rootLayer, columnLayers[0], result, localClipRect, hitTestLocation, false, transformState, zOffset); |
- if (oldHasTransform) |
- childLayer->m_transform = adoptPtr(new TransformationMatrix(oldTransform)); |
- else |
- childLayer->m_transform.clear(); |
- } else { |
- // Adjust the transform such that the layoutObjects's upper left corner will be at (0,0) in user space. |
- // This involves subtracting out the position of the layer in our current coordinate space. |
- DeprecatedPaintLayer* nextLayer = columnLayers[columnIndex - 1]; |
- RefPtr<HitTestingTransformState> newTransformState = nextLayer->createLocalTransformState(rootLayer, nextLayer, localClipRect, hitTestLocation, transformState); |
- newTransformState->translate(offset.width(), offset.height(), HitTestingTransformState::AccumulateTransform); |
- FloatPoint localPoint = newTransformState->mappedPoint(); |
- FloatQuad localPointQuad = newTransformState->mappedQuad(); |
- LayoutRect localHitTestRect(newTransformState->mappedArea().enclosingBoundingBox()); |
- HitTestLocation newHitTestLocation; |
- if (hitTestLocation.isRectBasedTest()) |
- newHitTestLocation = HitTestLocation(localPoint, localPointQuad); |
- else |
- newHitTestLocation = HitTestLocation(localPoint); |
- newTransformState->flatten(); |
- |
- hitLayer = hitTestChildLayerColumns(childLayer, columnLayers[columnIndex - 1], result, localHitTestRect, newHitTestLocation, |
- newTransformState.get(), zOffset, columnLayers, columnIndex - 1); |
- } |
- |
- if (hitLayer) |
- return hitLayer; |
- } |
- } |
- |
- return 0; |
-} |
- |
void DeprecatedPaintLayer::blockSelectionGapsBoundsChanged() |
{ |
setNeedsCompositingInputsUpdate(); |
@@ -2442,7 +2253,7 @@ LayoutRect DeprecatedPaintLayer::boundingBoxForCompositing(const DeprecatedPaint |
// The layer created for the LayoutFlowThread is just a helper for painting and hit-testing, |
// and should not contribute to the bounding box. The LayoutMultiColumnSets will contribute |
// the correct size for the layout content of the multicol container. |
- if (RuntimeEnabledFeatures::regionBasedColumnsEnabled() && layoutObject()->isLayoutFlowThread()) |
+ if (layoutObject()->isLayoutFlowThread()) |
return LayoutRect(); |
LayoutRect result = clipper().localClipRect(); |