OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
5 * | 5 * |
6 * Other contributors: | 6 * Other contributors: |
7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 if (updateLayerPosition()) | 325 if (updateLayerPosition()) |
326 m_renderer->setPreviousPaintInvalidationRect(m_renderer->boundsRectForPa
intInvalidation(m_renderer->containerForPaintInvalidation())); | 326 m_renderer->setPreviousPaintInvalidationRect(m_renderer->boundsRectForPa
intInvalidation(m_renderer->containerForPaintInvalidation())); |
327 | 327 |
328 for (Layer* child = firstChild(); child; child = child->nextSibling()) | 328 for (Layer* child = firstChild(); child; child = child->nextSibling()) |
329 child->updateLayerPositionsAfterScrollRecursive(); | 329 child->updateLayerPositionsAfterScrollRecursive(); |
330 } | 330 } |
331 | 331 |
332 void Layer::updateTransformationMatrix() | 332 void Layer::updateTransformationMatrix() |
333 { | 333 { |
334 if (m_transform) { | 334 if (m_transform) { |
335 RenderBox* box = renderBox(); | 335 LayoutBox* box = layoutBox(); |
336 ASSERT(box); | 336 ASSERT(box); |
337 m_transform->makeIdentity(); | 337 m_transform->makeIdentity(); |
338 box->style()->applyTransform(*m_transform, LayoutSize(box->pixelSnappedS
ize()), LayoutStyle::IncludeTransformOrigin); | 338 box->style()->applyTransform(*m_transform, LayoutSize(box->pixelSnappedS
ize()), LayoutStyle::IncludeTransformOrigin); |
339 makeMatrixRenderable(*m_transform, compositor()->hasAcceleratedCompositi
ng()); | 339 makeMatrixRenderable(*m_transform, compositor()->hasAcceleratedCompositi
ng()); |
340 } | 340 } |
341 } | 341 } |
342 | 342 |
343 void Layer::updateTransform(const LayoutStyle* oldStyle, const LayoutStyle& newS
tyle) | 343 void Layer::updateTransform(const LayoutStyle* oldStyle, const LayoutStyle& newS
tyle) |
344 { | 344 { |
345 if (oldStyle && newStyle.transformDataEquivalent(*oldStyle)) | 345 if (oldStyle && newStyle.transformDataEquivalent(*oldStyle)) |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 return renderingContext; | 389 return renderingContext; |
390 } | 390 } |
391 | 391 |
392 TransformationMatrix Layer::currentTransform(LayoutStyle::ApplyTransformOrigin a
pplyOrigin) const | 392 TransformationMatrix Layer::currentTransform(LayoutStyle::ApplyTransformOrigin a
pplyOrigin) const |
393 { | 393 { |
394 if (!m_transform) | 394 if (!m_transform) |
395 return TransformationMatrix(); | 395 return TransformationMatrix(); |
396 | 396 |
397 // m_transform includes transform-origin, so we need to recompute the transf
orm here. | 397 // m_transform includes transform-origin, so we need to recompute the transf
orm here. |
398 if (applyOrigin == LayoutStyle::ExcludeTransformOrigin) { | 398 if (applyOrigin == LayoutStyle::ExcludeTransformOrigin) { |
399 RenderBox* box = renderBox(); | 399 LayoutBox* box = layoutBox(); |
400 TransformationMatrix currTransform; | 400 TransformationMatrix currTransform; |
401 box->style()->applyTransform(currTransform, LayoutSize(box->pixelSnapped
Size()), LayoutStyle::ExcludeTransformOrigin); | 401 box->style()->applyTransform(currTransform, LayoutSize(box->pixelSnapped
Size()), LayoutStyle::ExcludeTransformOrigin); |
402 makeMatrixRenderable(currTransform, compositor()->hasAcceleratedComposit
ing()); | 402 makeMatrixRenderable(currTransform, compositor()->hasAcceleratedComposit
ing()); |
403 return currTransform; | 403 return currTransform; |
404 } | 404 } |
405 | 405 |
406 return *m_transform; | 406 return *m_transform; |
407 } | 407 } |
408 | 408 |
409 TransformationMatrix Layer::renderableTransform(PaintBehavior paintBehavior) con
st | 409 TransformationMatrix Layer::renderableTransform(PaintBehavior paintBehavior) con
st |
410 { | 410 { |
411 if (!m_transform) | 411 if (!m_transform) |
412 return TransformationMatrix(); | 412 return TransformationMatrix(); |
413 | 413 |
414 if (paintBehavior & PaintBehaviorFlattenCompositingLayers) { | 414 if (paintBehavior & PaintBehaviorFlattenCompositingLayers) { |
415 TransformationMatrix matrix = *m_transform; | 415 TransformationMatrix matrix = *m_transform; |
416 makeMatrixRenderable(matrix, false /* flatten 3d */); | 416 makeMatrixRenderable(matrix, false /* flatten 3d */); |
417 return matrix; | 417 return matrix; |
418 } | 418 } |
419 | 419 |
420 return *m_transform; | 420 return *m_transform; |
421 } | 421 } |
422 | 422 |
423 static bool checkContainingBlockChainForPagination(LayoutBoxModelObject* rendere
r, RenderBox* ancestorColumnsRenderer) | 423 static bool checkContainingBlockChainForPagination(LayoutBoxModelObject* rendere
r, LayoutBox* ancestorColumnsRenderer) |
424 { | 424 { |
425 RenderView* view = renderer->view(); | 425 RenderView* view = renderer->view(); |
426 LayoutBoxModelObject* prevBlock = renderer; | 426 LayoutBoxModelObject* prevBlock = renderer; |
427 RenderBlock* containingBlock; | 427 RenderBlock* containingBlock; |
428 for (containingBlock = renderer->containingBlock(); | 428 for (containingBlock = renderer->containingBlock(); |
429 containingBlock && containingBlock != view && containingBlock != ancesto
rColumnsRenderer; | 429 containingBlock && containingBlock != view && containingBlock != ancesto
rColumnsRenderer; |
430 containingBlock = containingBlock->containingBlock()) | 430 containingBlock = containingBlock->containingBlock()) |
431 prevBlock = containingBlock; | 431 prevBlock = containingBlock; |
432 | 432 |
433 // If the columns block wasn't in our containing block chain, then we aren't
paginated by it. | 433 // If the columns block wasn't in our containing block chain, then we aren't
paginated by it. |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 return; | 543 return; |
544 } | 544 } |
545 } | 545 } |
546 return; | 546 return; |
547 } | 547 } |
548 | 548 |
549 // If we're not normal flow, then we need to look for a multi-column object
between us and our stacking container. | 549 // If we're not normal flow, then we need to look for a multi-column object
between us and our stacking container. |
550 LayerStackingNode* ancestorStackingContextNode = m_stackingNode->ancestorSta
ckingContextNode(); | 550 LayerStackingNode* ancestorStackingContextNode = m_stackingNode->ancestorSta
ckingContextNode(); |
551 for (Layer* curr = parent(); curr; curr = curr->parent()) { | 551 for (Layer* curr = parent(); curr; curr = curr->parent()) { |
552 if (curr->renderer()->hasColumns()) { | 552 if (curr->renderer()->hasColumns()) { |
553 m_isPaginated = checkContainingBlockChainForPagination(renderer(), c
urr->renderBox()); | 553 m_isPaginated = checkContainingBlockChainForPagination(renderer(), c
urr->layoutBox()); |
554 return; | 554 return; |
555 } | 555 } |
556 if (curr->stackingNode() == ancestorStackingContextNode) | 556 if (curr->stackingNode() == ancestorStackingContextNode) |
557 return; | 557 return; |
558 } | 558 } |
559 } | 559 } |
560 | 560 |
561 void Layer::clearPaginationRecursive() | 561 void Layer::clearPaginationRecursive() |
562 { | 562 { |
563 m_enclosingPaginationLayer = 0; | 563 m_enclosingPaginationLayer = 0; |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 { | 808 { |
809 LayoutPoint localPoint; | 809 LayoutPoint localPoint; |
810 LayoutPoint inlineBoundingBoxOffset; // We don't put this into the Layer x/y
for inlines, so we need to subtract it out when done. | 810 LayoutPoint inlineBoundingBoxOffset; // We don't put this into the Layer x/y
for inlines, so we need to subtract it out when done. |
811 | 811 |
812 if (renderer()->isInline() && renderer()->isRenderInline()) { | 812 if (renderer()->isInline() && renderer()->isRenderInline()) { |
813 RenderInline* inlineFlow = toRenderInline(renderer()); | 813 RenderInline* inlineFlow = toRenderInline(renderer()); |
814 IntRect lineBox = inlineFlow->linesBoundingBox(); | 814 IntRect lineBox = inlineFlow->linesBoundingBox(); |
815 m_size = lineBox.size(); | 815 m_size = lineBox.size(); |
816 inlineBoundingBoxOffset = lineBox.location(); | 816 inlineBoundingBoxOffset = lineBox.location(); |
817 localPoint.moveBy(inlineBoundingBoxOffset); | 817 localPoint.moveBy(inlineBoundingBoxOffset); |
818 } else if (RenderBox* box = renderBox()) { | 818 } else if (LayoutBox* box = layoutBox()) { |
819 m_size = pixelSnappedIntSize(box->size(), box->location()); | 819 m_size = pixelSnappedIntSize(box->size(), box->location()); |
820 localPoint.moveBy(box->topLeftLocation()); | 820 localPoint.moveBy(box->topLeftLocation()); |
821 } | 821 } |
822 | 822 |
823 if (!renderer()->isOutOfFlowPositioned() && !renderer()->isColumnSpanAll() &
& renderer()->parent()) { | 823 if (!renderer()->isOutOfFlowPositioned() && !renderer()->isColumnSpanAll() &
& renderer()->parent()) { |
824 // We must adjust our position by walking up the render tree looking for
the | 824 // We must adjust our position by walking up the render tree looking for
the |
825 // nearest enclosing object with a layer. | 825 // nearest enclosing object with a layer. |
826 LayoutObject* curr = renderer()->parent(); | 826 LayoutObject* curr = renderer()->parent(); |
827 while (curr && !curr->hasLayer()) { | 827 while (curr && !curr->hasLayer()) { |
828 if (curr->isBox() && !curr->isTableRow()) { | 828 if (curr->isBox() && !curr->isTableRow()) { |
829 // Rows and cells share the same coordinate space (that of the s
ection). | 829 // Rows and cells share the same coordinate space (that of the s
ection). |
830 // Omit them when computing our xpos/ypos. | 830 // Omit them when computing our xpos/ypos. |
831 localPoint.moveBy(toRenderBox(curr)->topLeftLocation()); | 831 localPoint.moveBy(toLayoutBox(curr)->topLeftLocation()); |
832 } | 832 } |
833 curr = curr->parent(); | 833 curr = curr->parent(); |
834 } | 834 } |
835 if (curr->isBox() && curr->isTableRow()) { | 835 if (curr->isBox() && curr->isTableRow()) { |
836 // Put ourselves into the row coordinate space. | 836 // Put ourselves into the row coordinate space. |
837 localPoint.moveBy(-toRenderBox(curr)->topLeftLocation()); | 837 localPoint.moveBy(-toLayoutBox(curr)->topLeftLocation()); |
838 } | 838 } |
839 } | 839 } |
840 | 840 |
841 // Subtract our parent's scroll offset. | 841 // Subtract our parent's scroll offset. |
842 if (renderer()->isOutOfFlowPositioned() && enclosingPositionedAncestor()) { | 842 if (renderer()->isOutOfFlowPositioned() && enclosingPositionedAncestor()) { |
843 Layer* positionedParent = enclosingPositionedAncestor(); | 843 Layer* positionedParent = enclosingPositionedAncestor(); |
844 | 844 |
845 // For positioned layers, we subtract out the enclosing positioned layer
's scroll offset. | 845 // For positioned layers, we subtract out the enclosing positioned layer
's scroll offset. |
846 if (positionedParent->renderer()->hasOverflowClip()) { | 846 if (positionedParent->renderer()->hasOverflowClip()) { |
847 IntSize offset = positionedParent->renderBox()->scrolledContentOffse
t(); | 847 IntSize offset = positionedParent->layoutBox()->scrolledContentOffse
t(); |
848 localPoint -= offset; | 848 localPoint -= offset; |
849 } | 849 } |
850 | 850 |
851 if (positionedParent->renderer()->isRelPositioned() && positionedParent-
>renderer()->isRenderInline()) { | 851 if (positionedParent->renderer()->isRelPositioned() && positionedParent-
>renderer()->isRenderInline()) { |
852 LayoutSize offset = toRenderInline(positionedParent->renderer())->of
fsetForInFlowPositionedInline(*toRenderBox(renderer())); | 852 LayoutSize offset = toRenderInline(positionedParent->renderer())->of
fsetForInFlowPositionedInline(*toLayoutBox(renderer())); |
853 localPoint += offset; | 853 localPoint += offset; |
854 } | 854 } |
855 } else if (parent()) { | 855 } else if (parent()) { |
856 // FIXME: This code is very wrong, but luckily only needed in the old/cu
rrent multicol | 856 // FIXME: This code is very wrong, but luckily only needed in the old/cu
rrent multicol |
857 // implementation. The compositing system doesn't understand columns and
we're hacking | 857 // implementation. The compositing system doesn't understand columns and
we're hacking |
858 // around that fact by faking the position of the Layers when we think w
e'll end up | 858 // around that fact by faking the position of the Layers when we think w
e'll end up |
859 // being composited. | 859 // being composited. |
860 if (hasStyleDeterminedDirectCompositingReasons() && !useRegionBasedColum
ns()) { | 860 if (hasStyleDeterminedDirectCompositingReasons() && !useRegionBasedColum
ns()) { |
861 // FIXME: Composited layers ignore pagination, so about the best we
can do is make sure they're offset into the appropriate column. | 861 // FIXME: Composited layers ignore pagination, so about the best we
can do is make sure they're offset into the appropriate column. |
862 // They won't split across columns properly. | 862 // They won't split across columns properly. |
863 if (!parent()->renderer()->hasColumns() && parent()->renderer()->isD
ocumentElement() && renderer()->view()->hasColumns()) | 863 if (!parent()->renderer()->hasColumns() && parent()->renderer()->isD
ocumentElement() && renderer()->view()->hasColumns()) |
864 localPoint += renderer()->view()->columnOffset(localPoint); | 864 localPoint += renderer()->view()->columnOffset(localPoint); |
865 else | 865 else |
866 localPoint += parent()->renderer()->columnOffset(localPoint); | 866 localPoint += parent()->renderer()->columnOffset(localPoint); |
867 } | 867 } |
868 | 868 |
869 if (parent()->renderer()->hasOverflowClip()) { | 869 if (parent()->renderer()->hasOverflowClip()) { |
870 IntSize scrollOffset = parent()->renderBox()->scrolledContentOffset(
); | 870 IntSize scrollOffset = parent()->layoutBox()->scrolledContentOffset(
); |
871 localPoint -= scrollOffset; | 871 localPoint -= scrollOffset; |
872 } | 872 } |
873 } | 873 } |
874 | 874 |
875 bool positionOrOffsetChanged = false; | 875 bool positionOrOffsetChanged = false; |
876 if (renderer()->isRelPositioned()) { | 876 if (renderer()->isRelPositioned()) { |
877 LayoutSize newOffset = renderer()->offsetForInFlowPosition(); | 877 LayoutSize newOffset = renderer()->offsetForInFlowPosition(); |
878 positionOrOffsetChanged = newOffset != m_offsetForInFlowPosition; | 878 positionOrOffsetChanged = newOffset != m_offsetForInFlowPosition; |
879 m_offsetForInFlowPosition = newOffset; | 879 m_offsetForInFlowPosition = newOffset; |
880 localPoint.move(m_offsetForInFlowPosition); | 880 localPoint.move(m_offsetForInFlowPosition); |
(...skipping 17 matching lines...) Expand all Loading... |
898 TransformationMatrix Layer::perspectiveTransform() const | 898 TransformationMatrix Layer::perspectiveTransform() const |
899 { | 899 { |
900 if (!renderer()->hasTransformRelatedProperty()) | 900 if (!renderer()->hasTransformRelatedProperty()) |
901 return TransformationMatrix(); | 901 return TransformationMatrix(); |
902 | 902 |
903 const LayoutStyle& style = renderer()->styleRef(); | 903 const LayoutStyle& style = renderer()->styleRef(); |
904 if (!style.hasPerspective()) | 904 if (!style.hasPerspective()) |
905 return TransformationMatrix(); | 905 return TransformationMatrix(); |
906 | 906 |
907 // Maybe fetch the perspective from the backing? | 907 // Maybe fetch the perspective from the backing? |
908 const IntRect borderBox = toRenderBox(renderer())->pixelSnappedBorderBoxRect
(); | 908 const IntRect borderBox = toLayoutBox(renderer())->pixelSnappedBorderBoxRect
(); |
909 const float boxWidth = borderBox.width(); | 909 const float boxWidth = borderBox.width(); |
910 const float boxHeight = borderBox.height(); | 910 const float boxHeight = borderBox.height(); |
911 | 911 |
912 float perspectiveOriginX = floatValueForLength(style.perspectiveOriginX(), b
oxWidth); | 912 float perspectiveOriginX = floatValueForLength(style.perspectiveOriginX(), b
oxWidth); |
913 float perspectiveOriginY = floatValueForLength(style.perspectiveOriginY(), b
oxHeight); | 913 float perspectiveOriginY = floatValueForLength(style.perspectiveOriginY(), b
oxHeight); |
914 | 914 |
915 // A perspective origin of 0,0 makes the vanishing point in the center of th
e element. | 915 // A perspective origin of 0,0 makes the vanishing point in the center of th
e element. |
916 // We want it to be in the top-left, so subtract half the height and width. | 916 // We want it to be in the top-left, so subtract half the height and width. |
917 perspectiveOriginX -= boxWidth / 2.0f; | 917 perspectiveOriginX -= boxWidth / 2.0f; |
918 perspectiveOriginY -= boxHeight / 2.0f; | 918 perspectiveOriginY -= boxHeight / 2.0f; |
919 | 919 |
920 TransformationMatrix t; | 920 TransformationMatrix t; |
921 t.translate(perspectiveOriginX, perspectiveOriginY); | 921 t.translate(perspectiveOriginX, perspectiveOriginY); |
922 t.applyPerspective(style.perspective()); | 922 t.applyPerspective(style.perspective()); |
923 t.translate(-perspectiveOriginX, -perspectiveOriginY); | 923 t.translate(-perspectiveOriginX, -perspectiveOriginY); |
924 | 924 |
925 return t; | 925 return t; |
926 } | 926 } |
927 | 927 |
928 FloatPoint Layer::perspectiveOrigin() const | 928 FloatPoint Layer::perspectiveOrigin() const |
929 { | 929 { |
930 if (!renderer()->hasTransformRelatedProperty()) | 930 if (!renderer()->hasTransformRelatedProperty()) |
931 return FloatPoint(); | 931 return FloatPoint(); |
932 | 932 |
933 const LayoutRect borderBox = toRenderBox(renderer())->borderBoxRect(); | 933 const LayoutRect borderBox = toLayoutBox(renderer())->borderBoxRect(); |
934 const LayoutStyle& style = renderer()->styleRef(); | 934 const LayoutStyle& style = renderer()->styleRef(); |
935 | 935 |
936 return FloatPoint(floatValueForLength(style.perspectiveOriginX(), borderBox.
width().toFloat()), floatValueForLength(style.perspectiveOriginY(), borderBox.he
ight().toFloat())); | 936 return FloatPoint(floatValueForLength(style.perspectiveOriginX(), borderBox.
width().toFloat()), floatValueForLength(style.perspectiveOriginY(), borderBox.he
ight().toFloat())); |
937 } | 937 } |
938 | 938 |
939 static inline bool isFixedPositionedContainer(Layer* layer) | 939 static inline bool isFixedPositionedContainer(Layer* layer) |
940 { | 940 { |
941 return layer->isRootLayer() || layer->hasTransformRelatedProperty(); | 941 return layer->isRootLayer() || layer->hasTransformRelatedProperty(); |
942 } | 942 } |
943 | 943 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 } | 1128 } |
1129 | 1129 |
1130 // If we have a reflection, then we need to account for that when we push th
e clip. Reflect our entire | 1130 // If we have a reflection, then we need to account for that when we push th
e clip. Reflect our entire |
1131 // current transparencyClipBox to catch all child layers. | 1131 // current transparencyClipBox to catch all child layers. |
1132 // FIXME: Accelerated compositing will eventually want to do something smart
here to avoid incorporating this | 1132 // FIXME: Accelerated compositing will eventually want to do something smart
here to avoid incorporating this |
1133 // size into the parent layer. | 1133 // size into the parent layer. |
1134 if (layer->renderer()->hasReflection()) { | 1134 if (layer->renderer()->hasReflection()) { |
1135 LayoutPoint delta; | 1135 LayoutPoint delta; |
1136 layer->convertToLayerCoords(rootLayer, delta); | 1136 layer->convertToLayerCoords(rootLayer, delta); |
1137 clipRect.move(-delta.x(), -delta.y()); | 1137 clipRect.move(-delta.x(), -delta.y()); |
1138 clipRect.unite(layer->renderBox()->reflectedRect(clipRect)); | 1138 clipRect.unite(layer->layoutBox()->reflectedRect(clipRect)); |
1139 clipRect.moveBy(delta); | 1139 clipRect.moveBy(delta); |
1140 } | 1140 } |
1141 } | 1141 } |
1142 | 1142 |
1143 LayoutRect Layer::transparencyClipBox(const Layer* layer, const Layer* rootLayer
, TransparencyClipBoxBehavior transparencyBehavior, | 1143 LayoutRect Layer::transparencyClipBox(const Layer* layer, const Layer* rootLayer
, TransparencyClipBoxBehavior transparencyBehavior, |
1144 TransparencyClipBoxMode transparencyMode, const LayoutSize& subPixelAccumula
tion, PaintBehavior paintBehavior) | 1144 TransparencyClipBoxMode transparencyMode, const LayoutSize& subPixelAccumula
tion, PaintBehavior paintBehavior) |
1145 { | 1145 { |
1146 // FIXME: Although this function completely ignores CSS-imposed clipping, we
did already intersect with the | 1146 // FIXME: Although this function completely ignores CSS-imposed clipping, we
did already intersect with the |
1147 // paintDirtyRect, and that should cut down on the amount we have to paint.
Still it | 1147 // paintDirtyRect, and that should cut down on the amount we have to paint.
Still it |
1148 // would be better to respect clips. | 1148 // would be better to respect clips. |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1516 void Layer::didUpdateNeedsCompositedScrolling() | 1516 void Layer::didUpdateNeedsCompositedScrolling() |
1517 { | 1517 { |
1518 updateSelfPaintingLayer(); | 1518 updateSelfPaintingLayer(); |
1519 } | 1519 } |
1520 | 1520 |
1521 void Layer::updateReflectionInfo(const LayoutStyle* oldStyle) | 1521 void Layer::updateReflectionInfo(const LayoutStyle* oldStyle) |
1522 { | 1522 { |
1523 ASSERT(!oldStyle || !renderer()->style()->reflectionDataEquivalent(oldStyle)
); | 1523 ASSERT(!oldStyle || !renderer()->style()->reflectionDataEquivalent(oldStyle)
); |
1524 if (renderer()->hasReflection()) { | 1524 if (renderer()->hasReflection()) { |
1525 if (!m_reflectionInfo) | 1525 if (!m_reflectionInfo) |
1526 m_reflectionInfo = adoptPtr(new LayerReflectionInfo(*renderBox())); | 1526 m_reflectionInfo = adoptPtr(new LayerReflectionInfo(*layoutBox())); |
1527 m_reflectionInfo->updateAfterStyleChange(oldStyle); | 1527 m_reflectionInfo->updateAfterStyleChange(oldStyle); |
1528 } else if (m_reflectionInfo) { | 1528 } else if (m_reflectionInfo) { |
1529 m_reflectionInfo->destroy(); | 1529 m_reflectionInfo->destroy(); |
1530 m_reflectionInfo = nullptr; | 1530 m_reflectionInfo = nullptr; |
1531 } | 1531 } |
1532 } | 1532 } |
1533 | 1533 |
1534 void Layer::updateStackingNode() | 1534 void Layer::updateStackingNode() |
1535 { | 1535 { |
1536 if (requiresStackingNode()) | 1536 if (requiresStackingNode()) |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2034 newHitTestLocation = HitTestLocation(localPoint); | 2034 newHitTestLocation = HitTestLocation(localPoint); |
2035 | 2035 |
2036 // Now do a hit test with the root layer shifted to be us. | 2036 // Now do a hit test with the root layer shifted to be us. |
2037 return hitTestLayer(this, containerLayer, request, result, localHitTestRect,
newHitTestLocation, true, newTransformState.get(), zOffset); | 2037 return hitTestLayer(this, containerLayer, request, result, localHitTestRect,
newHitTestLocation, true, newTransformState.get(), zOffset); |
2038 } | 2038 } |
2039 | 2039 |
2040 bool Layer::hitTestContents(const HitTestRequest& request, HitTestResult& result
, const LayoutRect& layerBounds, const HitTestLocation& hitTestLocation, HitTest
Filter hitTestFilter) const | 2040 bool Layer::hitTestContents(const HitTestRequest& request, HitTestResult& result
, const LayoutRect& layerBounds, const HitTestLocation& hitTestLocation, HitTest
Filter hitTestFilter) const |
2041 { | 2041 { |
2042 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); | 2042 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); |
2043 | 2043 |
2044 if (!renderer()->hitTest(request, result, hitTestLocation, toLayoutPoint(lay
erBounds.location() - renderBoxLocation()), hitTestFilter)) { | 2044 if (!renderer()->hitTest(request, result, hitTestLocation, toLayoutPoint(lay
erBounds.location() - layoutBoxLocation()), hitTestFilter)) { |
2045 // It's wrong to set innerNode, but then claim that you didn't hit anyth
ing, unless it is | 2045 // It's wrong to set innerNode, but then claim that you didn't hit anyth
ing, unless it is |
2046 // a rect-based test. | 2046 // a rect-based test. |
2047 ASSERT(!result.innerNode() || (request.listBased() && result.listBasedTe
stResult().size())); | 2047 ASSERT(!result.innerNode() || (request.listBased() && result.listBasedTe
stResult().size())); |
2048 return false; | 2048 return false; |
2049 } | 2049 } |
2050 | 2050 |
2051 // For positioned generated content, we might still not have a | 2051 // For positioned generated content, we might still not have a |
2052 // node by the time we get to the layer level, since none of | 2052 // node by the time we get to the layer level, since none of |
2053 // the content in the layer has an element. So just walk up | 2053 // the content in the layer has an element. So just walk up |
2054 // the tree. | 2054 // the tree. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2102 | 2102 |
2103 return resultLayer; | 2103 return resultLayer; |
2104 } | 2104 } |
2105 | 2105 |
2106 Layer* Layer::hitTestPaginatedChildLayer(Layer* childLayer, Layer* rootLayer, co
nst HitTestRequest& request, HitTestResult& result, | 2106 Layer* Layer::hitTestPaginatedChildLayer(Layer* childLayer, Layer* rootLayer, co
nst HitTestRequest& request, HitTestResult& result, |
2107 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const
HitTestingTransformState* transformState, double* zOffset) | 2107 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const
HitTestingTransformState* transformState, double* zOffset) |
2108 { | 2108 { |
2109 Vector<Layer*> columnLayers; | 2109 Vector<Layer*> columnLayers; |
2110 LayerStackingNode* ancestorNode = m_stackingNode->isNormalFlowOnly() ? paren
t()->stackingNode() : m_stackingNode->ancestorStackingContextNode(); | 2110 LayerStackingNode* ancestorNode = m_stackingNode->isNormalFlowOnly() ? paren
t()->stackingNode() : m_stackingNode->ancestorStackingContextNode(); |
2111 for (Layer* curr = childLayer->parent(); curr; curr = curr->parent()) { | 2111 for (Layer* curr = childLayer->parent(); curr; curr = curr->parent()) { |
2112 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina
tion(childLayer->renderer(), curr->renderBox())) | 2112 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina
tion(childLayer->renderer(), curr->layoutBox())) |
2113 columnLayers.append(curr); | 2113 columnLayers.append(curr); |
2114 if (curr->stackingNode() == ancestorNode) | 2114 if (curr->stackingNode() == ancestorNode) |
2115 break; | 2115 break; |
2116 } | 2116 } |
2117 | 2117 |
2118 ASSERT(columnLayers.size()); | 2118 ASSERT(columnLayers.size()); |
2119 return hitTestChildLayerColumns(childLayer, rootLayer, request, result, hitT
estRect, hitTestLocation, transformState, zOffset, | 2119 return hitTestChildLayerColumns(childLayer, rootLayer, request, result, hitT
estRect, hitTestLocation, transformState, zOffset, |
2120 columnLayers, columnLayers.size() - 1); | 2120 columnLayers, columnLayers.size() - 1); |
2121 } | 2121 } |
2122 | 2122 |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2248 // FIXME: We should not allow paint invalidation out of paint invalidati
on state. crbug.com/457415 | 2248 // FIXME: We should not allow paint invalidation out of paint invalidati
on state. crbug.com/457415 |
2249 DisablePaintInvalidationStateAsserts disabler; | 2249 DisablePaintInvalidationStateAsserts disabler; |
2250 child->invalidatePaintForBlockSelectionGaps(); | 2250 child->invalidatePaintForBlockSelectionGaps(); |
2251 } | 2251 } |
2252 | 2252 |
2253 if (m_blockSelectionGapsBounds.isEmpty()) | 2253 if (m_blockSelectionGapsBounds.isEmpty()) |
2254 return; | 2254 return; |
2255 | 2255 |
2256 LayoutRect rect = m_blockSelectionGapsBounds; | 2256 LayoutRect rect = m_blockSelectionGapsBounds; |
2257 if (renderer()->hasOverflowClip()) { | 2257 if (renderer()->hasOverflowClip()) { |
2258 RenderBox* box = renderBox(); | 2258 LayoutBox* box = layoutBox(); |
2259 rect.move(-box->scrolledContentOffset()); | 2259 rect.move(-box->scrolledContentOffset()); |
2260 if (!scrollableArea()->usesCompositedScrolling()) | 2260 if (!scrollableArea()->usesCompositedScrolling()) |
2261 rect.intersect(box->overflowClipRect(LayoutPoint())); | 2261 rect.intersect(box->overflowClipRect(LayoutPoint())); |
2262 } | 2262 } |
2263 if (renderer()->hasClip()) | 2263 if (renderer()->hasClip()) |
2264 rect.intersect(toRenderBox(renderer())->clipRect(LayoutPoint())); | 2264 rect.intersect(toLayoutBox(renderer())->clipRect(LayoutPoint())); |
2265 if (!rect.isEmpty()) { | 2265 if (!rect.isEmpty()) { |
2266 // FIXME: We should not allow paint invalidation out of paint invalidati
on state. crbug.com/457415 | 2266 // FIXME: We should not allow paint invalidation out of paint invalidati
on state. crbug.com/457415 |
2267 DisablePaintInvalidationStateAsserts disabler; | 2267 DisablePaintInvalidationStateAsserts disabler; |
2268 renderer()->invalidatePaintRectangle(rect); | 2268 renderer()->invalidatePaintRectangle(rect); |
2269 } | 2269 } |
2270 } | 2270 } |
2271 | 2271 |
2272 IntRect Layer::blockSelectionGapsBounds() const | 2272 IntRect Layer::blockSelectionGapsBounds() const |
2273 { | 2273 { |
2274 if (!renderer()->isRenderBlockFlow()) | 2274 if (!renderer()->isRenderBlockFlow()) |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2325 // (3) Floats. When a layer has overhanging floats that it paints, we need
to make sure to include these overhanging floats | 2325 // (3) Floats. When a layer has overhanging floats that it paints, we need
to make sure to include these overhanging floats |
2326 // as part of our bounding box. We do this because we are the responsible l
ayer for both hit testing and painting those | 2326 // as part of our bounding box. We do this because we are the responsible l
ayer for both hit testing and painting those |
2327 // floats. | 2327 // floats. |
2328 LayoutRect result; | 2328 LayoutRect result; |
2329 if (renderer()->isInline() && renderer()->isRenderInline()) { | 2329 if (renderer()->isInline() && renderer()->isRenderInline()) { |
2330 result = toRenderInline(renderer())->linesVisualOverflowBoundingBox(); | 2330 result = toRenderInline(renderer())->linesVisualOverflowBoundingBox(); |
2331 } else if (renderer()->isTableRow()) { | 2331 } else if (renderer()->isTableRow()) { |
2332 // Our bounding box is just the union of all of our cells' border/overfl
ow rects. | 2332 // Our bounding box is just the union of all of our cells' border/overfl
ow rects. |
2333 for (LayoutObject* child = renderer()->slowFirstChild(); child; child =
child->nextSibling()) { | 2333 for (LayoutObject* child = renderer()->slowFirstChild(); child; child =
child->nextSibling()) { |
2334 if (child->isTableCell()) { | 2334 if (child->isTableCell()) { |
2335 LayoutRect bbox = toRenderBox(child)->borderBoxRect(); | 2335 LayoutRect bbox = toLayoutBox(child)->borderBoxRect(); |
2336 result.unite(bbox); | 2336 result.unite(bbox); |
2337 LayoutRect overflowRect = renderBox()->visualOverflowRect(); | 2337 LayoutRect overflowRect = layoutBox()->visualOverflowRect(); |
2338 if (bbox != overflowRect) | 2338 if (bbox != overflowRect) |
2339 result.unite(overflowRect); | 2339 result.unite(overflowRect); |
2340 } | 2340 } |
2341 } | 2341 } |
2342 } else { | 2342 } else { |
2343 RenderBox* box = renderBox(); | 2343 LayoutBox* box = layoutBox(); |
2344 ASSERT(box); | 2344 ASSERT(box); |
2345 result = box->borderBoxRect(); | 2345 result = box->borderBoxRect(); |
2346 result.unite(box->visualOverflowRect()); | 2346 result.unite(box->visualOverflowRect()); |
2347 } | 2347 } |
2348 | 2348 |
2349 ASSERT(renderer()->view()); | 2349 ASSERT(renderer()->view()); |
2350 return result; | 2350 return result; |
2351 } | 2351 } |
2352 | 2352 |
2353 static inline LayoutRect flippedLogicalBoundingBox(LayoutRect boundingBox, Layou
tObject* renderer) | 2353 static inline LayoutRect flippedLogicalBoundingBox(LayoutRect boundingBox, Layou
tObject* renderer) |
2354 { | 2354 { |
2355 LayoutRect result = boundingBox; | 2355 LayoutRect result = boundingBox; |
2356 if (renderer->isBox()) | 2356 if (renderer->isBox()) |
2357 toRenderBox(renderer)->flipForWritingMode(result); | 2357 toLayoutBox(renderer)->flipForWritingMode(result); |
2358 else | 2358 else |
2359 renderer->containingBlock()->flipForWritingMode(result); | 2359 renderer->containingBlock()->flipForWritingMode(result); |
2360 return result; | 2360 return result; |
2361 } | 2361 } |
2362 | 2362 |
2363 LayoutRect Layer::physicalBoundingBox(const Layer* ancestorLayer, const LayoutPo
int* offsetFromRoot) const | 2363 LayoutRect Layer::physicalBoundingBox(const Layer* ancestorLayer, const LayoutPo
int* offsetFromRoot) const |
2364 { | 2364 { |
2365 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), renderer
()); | 2365 LayoutRect result = flippedLogicalBoundingBox(logicalBoundingBox(), renderer
()); |
2366 if (offsetFromRoot) | 2366 if (offsetFromRoot) |
2367 result.moveBy(*offsetFromRoot); | 2367 result.moveBy(*offsetFromRoot); |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2680 // Some HTML can cause whitespace text nodes to have renderers, like: | 2680 // Some HTML can cause whitespace text nodes to have renderers, like: |
2681 // <div> | 2681 // <div> |
2682 // <img src=...> | 2682 // <img src=...> |
2683 // </div> | 2683 // </div> |
2684 // so test for 0x0 RenderTexts here | 2684 // so test for 0x0 RenderTexts here |
2685 for (LayoutObject* child = renderer()->slowFirstChild(); child; child = chil
d->nextSibling()) { | 2685 for (LayoutObject* child = renderer()->slowFirstChild(); child; child = chil
d->nextSibling()) { |
2686 if (!child->hasLayer()) { | 2686 if (!child->hasLayer()) { |
2687 if (child->isRenderInline() || !child->isBox()) | 2687 if (child->isRenderInline() || !child->isBox()) |
2688 return true; | 2688 return true; |
2689 | 2689 |
2690 if (toRenderBox(child)->size().width() > 0 || toRenderBox(child)->si
ze().height() > 0) | 2690 if (toLayoutBox(child)->size().width() > 0 || toLayoutBox(child)->si
ze().height() > 0) |
2691 return true; | 2691 return true; |
2692 } | 2692 } |
2693 } | 2693 } |
2694 return false; | 2694 return false; |
2695 } | 2695 } |
2696 | 2696 |
2697 bool Layer::hasBoxDecorationsOrBackground() const | 2697 bool Layer::hasBoxDecorationsOrBackground() const |
2698 { | 2698 { |
2699 return renderer()->style()->hasBoxDecorations() || renderer()->style()->hasB
ackground(); | 2699 return renderer()->style()->hasBoxDecorations() || renderer()->style()->hasB
ackground(); |
2700 } | 2700 } |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2888 computeSelfHitTestRects(rects); | 2888 computeSelfHitTestRects(rects); |
2889 for (Layer* child = firstChild(); child; child = child->nextSibling()) | 2889 for (Layer* child = firstChild(); child; child = child->nextSibling()) |
2890 child->addLayerHitTestRects(rects); | 2890 child->addLayerHitTestRects(rects); |
2891 } | 2891 } |
2892 | 2892 |
2893 void Layer::computeSelfHitTestRects(LayerHitTestRects& rects) const | 2893 void Layer::computeSelfHitTestRects(LayerHitTestRects& rects) const |
2894 { | 2894 { |
2895 if (!size().isEmpty()) { | 2895 if (!size().isEmpty()) { |
2896 Vector<LayoutRect> rect; | 2896 Vector<LayoutRect> rect; |
2897 | 2897 |
2898 if (renderBox() && renderBox()->scrollsOverflow()) { | 2898 if (layoutBox() && layoutBox()->scrollsOverflow()) { |
2899 // For scrolling layers, rects are taken to be in the space of the c
ontents. | 2899 // For scrolling layers, rects are taken to be in the space of the c
ontents. |
2900 // We need to include the bounding box of the layer in the space of
its parent | 2900 // We need to include the bounding box of the layer in the space of
its parent |
2901 // (eg. for border / scroll bars) and if it's composited then the en
tire contents | 2901 // (eg. for border / scroll bars) and if it's composited then the en
tire contents |
2902 // as well as they may be on another composited layer. Skip reportin
g contents | 2902 // as well as they may be on another composited layer. Skip reportin
g contents |
2903 // for non-composited layers as they'll get projected to the same la
yer as the | 2903 // for non-composited layers as they'll get projected to the same la
yer as the |
2904 // bounding box. | 2904 // bounding box. |
2905 if (compositingState() != NotComposited) | 2905 if (compositingState() != NotComposited) |
2906 rect.append(m_scrollableArea->overflowRect()); | 2906 rect.append(m_scrollableArea->overflowRect()); |
2907 | 2907 |
2908 rects.set(this, rect); | 2908 rects.set(this, rect); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2951 } | 2951 } |
2952 } | 2952 } |
2953 | 2953 |
2954 void showLayerTree(const blink::LayoutObject* renderer) | 2954 void showLayerTree(const blink::LayoutObject* renderer) |
2955 { | 2955 { |
2956 if (!renderer) | 2956 if (!renderer) |
2957 return; | 2957 return; |
2958 showLayerTree(renderer->enclosingLayer()); | 2958 showLayerTree(renderer->enclosingLayer()); |
2959 } | 2959 } |
2960 #endif | 2960 #endif |
OLD | NEW |