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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 | 93 |
94 namespace { | 94 namespace { |
95 | 95 |
96 static CompositingQueryMode gCompositingQueryMode = | 96 static CompositingQueryMode gCompositingQueryMode = |
97 CompositingQueriesAreOnlyAllowedInCertainDocumentLifecyclePhases; | 97 CompositingQueriesAreOnlyAllowedInCertainDocumentLifecyclePhases; |
98 | 98 |
99 } // namespace | 99 } // namespace |
100 | 100 |
101 using namespace HTMLNames; | 101 using namespace HTMLNames; |
102 | 102 |
103 Layer::Layer(LayoutLayerModelObject* renderer, LayerType type) | 103 Layer::Layer(LayoutBoxModelObject* renderer, LayerType type) |
104 : m_layerType(type) | 104 : m_layerType(type) |
105 , m_hasSelfPaintingLayerDescendant(false) | 105 , m_hasSelfPaintingLayerDescendant(false) |
106 , m_hasSelfPaintingLayerDescendantDirty(false) | 106 , m_hasSelfPaintingLayerDescendantDirty(false) |
107 , m_isRootLayer(renderer->isRenderView()) | 107 , m_isRootLayer(renderer->isRenderView()) |
108 , m_visibleContentStatusDirty(true) | 108 , m_visibleContentStatusDirty(true) |
109 , m_hasVisibleContent(false) | 109 , m_hasVisibleContent(false) |
110 , m_visibleDescendantStatusDirty(false) | 110 , m_visibleDescendantStatusDirty(false) |
111 , m_hasVisibleDescendant(false) | 111 , m_hasVisibleDescendant(false) |
112 , m_hasVisibleNonLayerContent(false) | 112 , m_hasVisibleNonLayerContent(false) |
113 , m_isPaginated(false) | 113 , m_isPaginated(false) |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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(LayoutLayerModelObject* rende
rer, RenderBox* ancestorColumnsRenderer) | 423 static bool checkContainingBlockChainForPagination(LayoutBoxModelObject* rendere
r, RenderBox* ancestorColumnsRenderer) |
424 { | 424 { |
425 RenderView* view = renderer->view(); | 425 RenderView* view = renderer->view(); |
426 LayoutLayerModelObject* 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. |
434 if (containingBlock != ancestorColumnsRenderer) | 434 if (containingBlock != ancestorColumnsRenderer) |
435 return false; | 435 return false; |
436 | 436 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 } | 558 } |
559 } | 559 } |
560 | 560 |
561 void Layer::clearPaginationRecursive() | 561 void Layer::clearPaginationRecursive() |
562 { | 562 { |
563 m_enclosingPaginationLayer = 0; | 563 m_enclosingPaginationLayer = 0; |
564 for (Layer* child = firstChild(); child; child = child->nextSibling()) | 564 for (Layer* child = firstChild(); child; child = child->nextSibling()) |
565 child->clearPaginationRecursive(); | 565 child->clearPaginationRecursive(); |
566 } | 566 } |
567 | 567 |
568 LayoutPoint Layer::positionFromPaintInvalidationBacking(const LayoutObject* layo
utObject, const LayoutLayerModelObject* paintInvalidationContainer, const PaintI
nvalidationState* paintInvalidationState) | 568 LayoutPoint Layer::positionFromPaintInvalidationBacking(const LayoutObject* layo
utObject, const LayoutBoxModelObject* paintInvalidationContainer, const PaintInv
alidationState* paintInvalidationState) |
569 { | 569 { |
570 FloatPoint point = layoutObject->localToContainerPoint(FloatPoint(), paintIn
validationContainer, 0, 0, paintInvalidationState); | 570 FloatPoint point = layoutObject->localToContainerPoint(FloatPoint(), paintIn
validationContainer, 0, 0, paintInvalidationState); |
571 | 571 |
572 // FIXME: Eventually we are going to unify coordinates in GraphicsLayer spac
e. | 572 // FIXME: Eventually we are going to unify coordinates in GraphicsLayer spac
e. |
573 if (paintInvalidationContainer && paintInvalidationContainer->layer()->group
edMapping()) | 573 if (paintInvalidationContainer && paintInvalidationContainer->layer()->group
edMapping()) |
574 mapPointToPaintBackingCoordinates(paintInvalidationContainer, point); | 574 mapPointToPaintBackingCoordinates(paintInvalidationContainer, point); |
575 | 575 |
576 return LayoutPoint(point); | 576 return LayoutPoint(point); |
577 } | 577 } |
578 | 578 |
579 void Layer::mapPointToPaintBackingCoordinates(const LayoutLayerModelObject* pain
tInvalidationContainer, FloatPoint& point) | 579 void Layer::mapPointToPaintBackingCoordinates(const LayoutBoxModelObject* paintI
nvalidationContainer, FloatPoint& point) |
580 { | 580 { |
581 Layer* paintInvalidationLayer = paintInvalidationContainer->layer(); | 581 Layer* paintInvalidationLayer = paintInvalidationContainer->layer(); |
582 if (!paintInvalidationLayer->groupedMapping()) { | 582 if (!paintInvalidationLayer->groupedMapping()) { |
583 point.move(paintInvalidationLayer->compositedLayerMapping()->contentOffs
etInCompositingLayer()); | 583 point.move(paintInvalidationLayer->compositedLayerMapping()->contentOffs
etInCompositingLayer()); |
584 return; | 584 return; |
585 } | 585 } |
586 | 586 |
587 LayoutLayerModelObject* transformedAncestor = paintInvalidationLayer->enclos
ingTransformedAncestor()->renderer(); | 587 LayoutBoxModelObject* transformedAncestor = paintInvalidationLayer->enclosin
gTransformedAncestor()->renderer(); |
588 if (!transformedAncestor) | 588 if (!transformedAncestor) |
589 return; | 589 return; |
590 | 590 |
591 // |paintInvalidationContainer| may have a local 2D transform on it, so take
that into account when mapping into the space of the | 591 // |paintInvalidationContainer| may have a local 2D transform on it, so take
that into account when mapping into the space of the |
592 // transformed ancestor. | 592 // transformed ancestor. |
593 point = paintInvalidationContainer->localToContainerPoint(point, transformed
Ancestor); | 593 point = paintInvalidationContainer->localToContainerPoint(point, transformed
Ancestor); |
594 | 594 |
595 point.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromT
ransformedAncestor()); | 595 point.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromT
ransformedAncestor()); |
596 } | 596 } |
597 | 597 |
598 void Layer::mapRectToPaintBackingCoordinates(const LayoutLayerModelObject* paint
InvalidationContainer, LayoutRect& rect) | 598 void Layer::mapRectToPaintBackingCoordinates(const LayoutBoxModelObject* paintIn
validationContainer, LayoutRect& rect) |
599 { | 599 { |
600 Layer* paintInvalidationLayer = paintInvalidationContainer->layer(); | 600 Layer* paintInvalidationLayer = paintInvalidationContainer->layer(); |
601 if (!paintInvalidationLayer->groupedMapping()) { | 601 if (!paintInvalidationLayer->groupedMapping()) { |
602 rect.move(paintInvalidationLayer->compositedLayerMapping()->contentOffse
tInCompositingLayer()); | 602 rect.move(paintInvalidationLayer->compositedLayerMapping()->contentOffse
tInCompositingLayer()); |
603 return; | 603 return; |
604 } | 604 } |
605 | 605 |
606 LayoutLayerModelObject* transformedAncestor = paintInvalidationLayer->enclos
ingTransformedAncestor()->renderer(); | 606 LayoutBoxModelObject* transformedAncestor = paintInvalidationLayer->enclosin
gTransformedAncestor()->renderer(); |
607 if (!transformedAncestor) | 607 if (!transformedAncestor) |
608 return; | 608 return; |
609 | 609 |
610 // |paintInvalidationContainer| may have a local 2D transform on it, so take
that into account when mapping into the space of the | 610 // |paintInvalidationContainer| may have a local 2D transform on it, so take
that into account when mapping into the space of the |
611 // transformed ancestor. | 611 // transformed ancestor. |
612 rect = LayoutRect(paintInvalidationContainer->localToContainerQuad(FloatRect
(rect), transformedAncestor).boundingBox()); | 612 rect = LayoutRect(paintInvalidationContainer->localToContainerQuad(FloatRect
(rect), transformedAncestor).boundingBox()); |
613 | 613 |
614 rect.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromTr
ansformedAncestor()); | 614 rect.moveBy(-paintInvalidationLayer->groupedMapping()->squashingOffsetFromTr
ansformedAncestor()); |
615 } | 615 } |
616 | 616 |
617 void Layer::mapRectToPaintInvalidationBacking(const LayoutObject* layoutObject,
const LayoutLayerModelObject* paintInvalidationContainer, LayoutRect& rect, cons
t PaintInvalidationState* paintInvalidationState) | 617 void Layer::mapRectToPaintInvalidationBacking(const LayoutObject* layoutObject,
const LayoutBoxModelObject* paintInvalidationContainer, LayoutRect& rect, const
PaintInvalidationState* paintInvalidationState) |
618 { | 618 { |
619 if (!paintInvalidationContainer->layer()->groupedMapping()) { | 619 if (!paintInvalidationContainer->layer()->groupedMapping()) { |
620 layoutObject->mapRectToPaintInvalidationBacking(paintInvalidationContain
er, rect, paintInvalidationState); | 620 layoutObject->mapRectToPaintInvalidationBacking(paintInvalidationContain
er, rect, paintInvalidationState); |
621 return; | 621 return; |
622 } | 622 } |
623 | 623 |
624 // This code adjusts the paint invalidation rectangle to be in the space of
the transformed ancestor of the grouped (i.e. squashed) | 624 // This code adjusts the paint invalidation rectangle to be in the space of
the transformed ancestor of the grouped (i.e. squashed) |
625 // layer. This is because all layers that squash together need to issue pain
t invalidations w.r.t. a single container that is | 625 // layer. This is because all layers that squash together need to issue pain
t invalidations w.r.t. a single container that is |
626 // an ancestor of all of them, in order to properly take into account any lo
cal transforms etc. | 626 // an ancestor of all of them, in order to properly take into account any lo
cal transforms etc. |
627 // FIXME: remove this special-case code that works around the paint invalida
tion code structure. | 627 // FIXME: remove this special-case code that works around the paint invalida
tion code structure. |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 } | 867 } |
868 | 868 |
869 if (parent()->renderer()->hasOverflowClip()) { | 869 if (parent()->renderer()->hasOverflowClip()) { |
870 IntSize scrollOffset = parent()->renderBox()->scrolledContentOffset(
); | 870 IntSize scrollOffset = parent()->renderBox()->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 = toLayoutBoxModelObject(renderer())->offsetForInFl
owPosition(); | 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); |
881 } else { | 881 } else { |
882 m_offsetForInFlowPosition = LayoutSize(); | 882 m_offsetForInFlowPosition = LayoutSize(); |
883 } | 883 } |
884 | 884 |
885 // FIXME: We'd really like to just get rid of the concept of a layer rectang
le and rely on the renderers. | 885 // FIXME: We'd really like to just get rid of the concept of a layer rectang
le and rely on the renderers. |
886 localPoint.moveBy(-inlineBoundingBoxOffset); | 886 localPoint.moveBy(-inlineBoundingBoxOffset); |
887 | 887 |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1099 | 1099 |
1100 m_shouldIsolateCompositedDescendants = shouldIsolateCompositedDescendants; | 1100 m_shouldIsolateCompositedDescendants = shouldIsolateCompositedDescendants; |
1101 | 1101 |
1102 if (hasCompositedLayerMapping()) | 1102 if (hasCompositedLayerMapping()) |
1103 compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdat
eLocal); | 1103 compositedLayerMapping()->setNeedsGraphicsLayerUpdate(GraphicsLayerUpdat
eLocal); |
1104 } | 1104 } |
1105 | 1105 |
1106 bool Layer::hasAncestorWithFilterOutsets() const | 1106 bool Layer::hasAncestorWithFilterOutsets() const |
1107 { | 1107 { |
1108 for (const Layer* curr = this; curr; curr = curr->parent()) { | 1108 for (const Layer* curr = this; curr; curr = curr->parent()) { |
1109 LayoutLayerModelObject* renderer = curr->renderer(); | 1109 LayoutBoxModelObject* renderer = curr->renderer(); |
1110 if (renderer->style()->hasFilterOutsets()) | 1110 if (renderer->style()->hasFilterOutsets()) |
1111 return true; | 1111 return true; |
1112 } | 1112 } |
1113 return false; | 1113 return false; |
1114 } | 1114 } |
1115 | 1115 |
1116 static void expandClipRectForDescendantsAndReflection(LayoutRect& clipRect, cons
t Layer* layer, const Layer* rootLayer, | 1116 static void expandClipRectForDescendantsAndReflection(LayoutRect& clipRect, cons
t Layer* layer, const Layer* rootLayer, |
1117 Layer::TransparencyClipBoxBehavior transparencyBehavior, const LayoutSize& s
ubPixelAccumulation, PaintBehavior paintBehavior) | 1117 Layer::TransparencyClipBoxBehavior transparencyBehavior, const LayoutSize& s
ubPixelAccumulation, PaintBehavior paintBehavior) |
1118 { | 1118 { |
1119 // If we have a mask, then the clip is limited to the border box area (and t
here is | 1119 // If we have a mask, then the clip is limited to the border box area (and t
here is |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 | 1344 |
1345 // Clear out all the clip rects. | 1345 // Clear out all the clip rects. |
1346 m_clipper.clearClipRectsIncludingDescendants(); | 1346 m_clipper.clearClipRectsIncludingDescendants(); |
1347 } | 1347 } |
1348 | 1348 |
1349 // Returns the layer reached on the walk up towards the ancestor. | 1349 // Returns the layer reached on the walk up towards the ancestor. |
1350 static inline const Layer* accumulateOffsetTowardsAncestor(const Layer* layer, c
onst Layer* ancestorLayer, LayoutPoint& location) | 1350 static inline const Layer* accumulateOffsetTowardsAncestor(const Layer* layer, c
onst Layer* ancestorLayer, LayoutPoint& location) |
1351 { | 1351 { |
1352 ASSERT(ancestorLayer != layer); | 1352 ASSERT(ancestorLayer != layer); |
1353 | 1353 |
1354 const LayoutLayerModelObject* renderer = layer->renderer(); | 1354 const LayoutBoxModelObject* renderer = layer->renderer(); |
1355 EPosition position = renderer->style()->position(); | 1355 EPosition position = renderer->style()->position(); |
1356 | 1356 |
1357 // FIXME: Positioning of out-of-flow(fixed, absolute) elements collected in
a LayoutFlowThread | 1357 // FIXME: Positioning of out-of-flow(fixed, absolute) elements collected in
a LayoutFlowThread |
1358 // may need to be revisited in a future patch. | 1358 // may need to be revisited in a future patch. |
1359 // If the fixed renderer is inside a LayoutFlowThread, we should not compute
location using localToAbsolute, | 1359 // If the fixed renderer is inside a LayoutFlowThread, we should not compute
location using localToAbsolute, |
1360 // since localToAbsolute maps the coordinates from flow thread to regions co
ordinates and regions can be | 1360 // since localToAbsolute maps the coordinates from flow thread to regions co
ordinates and regions can be |
1361 // positioned in a completely different place in the viewport (RenderView). | 1361 // positioned in a completely different place in the viewport (RenderView). |
1362 if (position == FixedPosition && (!ancestorLayer || ancestorLayer == rendere
r->view()->layer())) { | 1362 if (position == FixedPosition && (!ancestorLayer || ancestorLayer == rendere
r->view()->layer())) { |
1363 // If the fixed layer's container is the root, just add in the offset of
the view. We can obtain this by calling | 1363 // If the fixed layer's container is the root, just add in the offset of
the view. We can obtain this by calling |
1364 // localToAbsolute() on the RenderView. | 1364 // localToAbsolute() on the RenderView. |
(...skipping 1586 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 |