| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/paint/PaintLayerPainter.h" | 5 #include "core/paint/PaintLayerPainter.h" |
| 6 | 6 |
| 7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
| 8 #include "core/frame/Settings.h" | 8 #include "core/frame/Settings.h" |
| 9 #include "core/layout/ClipPathOperation.h" | 9 #include "core/layout/ClipPathOperation.h" |
| 10 #include "core/layout/LayoutBlock.h" | 10 #include "core/layout/LayoutBlock.h" |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 | 454 |
| 455 ClipRect ancestorBackgroundClipRect; | 455 ClipRect ancestorBackgroundClipRect; |
| 456 if (parentLayer) { | 456 if (parentLayer) { |
| 457 // Calculate the clip rectangle that the ancestors establish. | 457 // Calculate the clip rectangle that the ancestors establish. |
| 458 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlags &
PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOver
layScrollbarSize); | 458 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlags &
PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOver
layScrollbarSize); |
| 459 if (shouldRespectOverflowClip(paintFlags, m_paintLayer.layoutObject()) =
= IgnoreOverflowClip) | 459 if (shouldRespectOverflowClip(paintFlags, m_paintLayer.layoutObject()) =
= IgnoreOverflowClip) |
| 460 clipRectsContext.setIgnoreOverflowClip(); | 460 clipRectsContext.setIgnoreOverflowClip(); |
| 461 ancestorBackgroundClipRect = m_paintLayer.clipper().backgroundClipRect(c
lipRectsContext); | 461 ancestorBackgroundClipRect = m_paintLayer.clipper().backgroundClipRect(c
lipRectsContext); |
| 462 } | 462 } |
| 463 | 463 |
| 464 LayoutObject* object = m_paintLayer.layoutObject(); |
| 465 LayoutView* view = object->view(); |
| 466 bool isFixedPosObjectInPagedMedia = object->style()->position() == FixedPosi
tion && object->container() == view && view->pageLogicalHeight(); |
| 464 PaintLayer* paginationLayer = m_paintLayer.enclosingPaginationLayer(); | 467 PaintLayer* paginationLayer = m_paintLayer.enclosingPaginationLayer(); |
| 465 PaintLayerFragments fragments; | 468 PaintLayerFragments fragments; |
| 466 if (paginationLayer) { | 469 if (isFixedPosObjectInPagedMedia) { |
| 470 // "For paged media, boxes with fixed positions are repeated on every pa
ge." |
| 471 // - https://www.w3.org/TR/2011/REC-CSS2-20110607/visuren.html#fixed-pos
itioning |
| 472 ASSERT(view->firstChild() && view->firstChild()->isLayoutBlock()); |
| 473 int pages = toLayoutBlock(view->firstChild())->logicalHeight() / view->p
ageLogicalHeight(); |
| 474 LayoutPoint paginationOffset; |
| 475 for (int i = 0; i <= pages; i++) { |
| 476 PaintLayerFragment fragment; |
| 477 fragment.backgroundRect = paintingInfo.paintDirtyRect; |
| 478 fragment.paginationOffset = paginationOffset; |
| 479 fragments.append(fragment); |
| 480 paginationOffset += LayoutPoint(0, view->pageLogicalHeight()); |
| 481 } |
| 482 } else if (paginationLayer) { |
| 467 // FIXME: This is a mess. Look closely at this code and the code in Laye
r and fix any | 483 // FIXME: This is a mess. Look closely at this code and the code in Laye
r and fix any |
| 468 // issues in it & refactor to make it obvious from code structure what i
t does and that it's | 484 // issues in it & refactor to make it obvious from code structure what i
t does and that it's |
| 469 // correct. | 485 // correct. |
| 470 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects
) ? UncachedClipRects : PaintingClipRects; | 486 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects
) ? UncachedClipRects : PaintingClipRects; |
| 471 ShouldRespectOverflowClipType respectOverflowClip = shouldRespectOverflo
wClip(paintFlags, m_paintLayer.layoutObject()); | 487 ShouldRespectOverflowClipType respectOverflowClip = shouldRespectOverflo
wClip(paintFlags, m_paintLayer.layoutObject()); |
| 472 // Calculate the transformed bounding box in the current coordinate spac
e, to figure out | 488 // Calculate the transformed bounding box in the current coordinate spac
e, to figure out |
| 473 // which fragmentainers (e.g. columns) we need to visit. | 489 // which fragmentainers (e.g. columns) we need to visit. |
| 474 LayoutRect transformedExtent = PaintLayer::transparencyClipBox(&m_paintL
ayer, paginationLayer, PaintLayer::PaintingTransparencyClipBox, PaintLayer::Root
OfTransparencyClipBox, paintingInfo.subPixelAccumulation, paintingInfo.getGlobal
PaintFlags()); | 490 LayoutRect transformedExtent = PaintLayer::transparencyClipBox(&m_paintL
ayer, paginationLayer, PaintLayer::PaintingTransparencyClipBox, PaintLayer::Root
OfTransparencyClipBox, paintingInfo.subPixelAccumulation, paintingInfo.getGlobal
PaintFlags()); |
| 475 // FIXME: we don't check if paginationLayer is within paintingInfo.rootL
ayer here. | 491 // FIXME: we don't check if paginationLayer is within paintingInfo.rootL
ayer here. |
| 476 paginationLayer->collectFragments(fragments, paintingInfo.rootLayer, pai
ntingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflow
Clip, 0, paintingInfo.subPixelAccumulation, &transformedExtent); | 492 paginationLayer->collectFragments(fragments, paintingInfo.rootLayer, pai
ntingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflow
Clip, 0, paintingInfo.subPixelAccumulation, &transformedExtent); |
| 477 } else { | 493 } else { |
| 478 // We don't need to collect any fragments in the regular way here. We ha
ve already | 494 // We don't need to collect any fragments in the regular way here. We ha
ve already |
| 479 // calculated a clip rectangle for the ancestry if it was needed, and cl
ipping this | 495 // calculated a clip rectangle for the ancestry if it was needed, and cl
ipping this |
| 480 // layer is something that can be done further down the path, when the t
ransform has | 496 // layer is something that can be done further down the path, when the t
ransform has |
| 481 // been applied. | 497 // been applied. |
| 482 PaintLayerFragment fragment; | 498 PaintLayerFragment fragment; |
| 483 fragment.backgroundRect = paintingInfo.paintDirtyRect; | 499 fragment.backgroundRect = paintingInfo.paintDirtyRect; |
| 484 fragments.append(fragment); | 500 fragments.append(fragment); |
| 485 } | 501 } |
| 486 | 502 |
| 487 bool needsScope = fragments.size() > 1; | 503 bool needsScope = fragments.size() > 1; |
| 488 PaintResult result = FullyPainted; | 504 PaintResult result = FullyPainted; |
| 489 for (const auto& fragment : fragments) { | 505 for (const auto& fragment : fragments) { |
| 490 Optional<ScopeRecorder> scopeRecorder; | 506 Optional<ScopeRecorder> scopeRecorder; |
| 491 if (needsScope) | 507 if (needsScope) |
| 492 scopeRecorder.emplace(context); | 508 scopeRecorder.emplace(context); |
| 493 Optional<LayerClipRecorder> clipRecorder; | 509 Optional<LayerClipRecorder> clipRecorder; |
| 494 if (parentLayer) { | 510 if (parentLayer) { |
| 495 ClipRect clipRectForFragment(ancestorBackgroundClipRect); | 511 ClipRect clipRectForFragment(ancestorBackgroundClipRect); |
| 496 clipRectForFragment.moveBy(fragment.paginationOffset); | 512 // A fixed-position object is repeated on every page, but if it is c
lipped by an ancestor layer then |
| 513 // the repetitions are clipped out. |
| 514 if (!isFixedPosObjectInPagedMedia) |
| 515 clipRectForFragment.moveBy(fragment.paginationOffset); |
| 497 clipRectForFragment.intersect(fragment.backgroundRect); | 516 clipRectForFragment.intersect(fragment.backgroundRect); |
| 498 if (clipRectForFragment.isEmpty()) | 517 if (clipRectForFragment.isEmpty()) |
| 499 continue; | 518 continue; |
| 500 if (needsToClip(paintingInfo, clipRectForFragment)) { | 519 if (needsToClip(paintingInfo, clipRectForFragment)) { |
| 501 if (m_paintLayer.layoutObject()->isPositioned() && clipRectForFr
agment.isClippedByClipCss()) | 520 if (m_paintLayer.layoutObject()->isPositioned() && clipRectForFr
agment.isClippedByClipCss()) |
| 502 UseCounter::count(m_paintLayer.layoutObject()->document(), U
seCounter::ClipCssOfPositionedElement); | 521 UseCounter::count(m_paintLayer.layoutObject()->document(), U
seCounter::ClipCssOfPositionedElement); |
| 503 clipRecorder.emplace(context, *parentLayer->layoutObject(), Disp
layItem::ClipLayerParent, clipRectForFragment, &paintingInfo, fragment.paginatio
nOffset, paintFlags); | 522 clipRecorder.emplace(context, *parentLayer->layoutObject(), Disp
layItem::ClipLayerParent, clipRectForFragment, &paintingInfo, fragment.paginatio
nOffset, paintFlags); |
| 504 } | 523 } |
| 505 } | 524 } |
| 506 if (paintFragmentByApplyingTransform(context, paintingInfo, paintFlags,
fragment.paginationOffset) == MayBeClippedByPaintDirtyRect) | 525 if (paintFragmentByApplyingTransform(context, paintingInfo, paintFlags,
fragment.paginationOffset) == MayBeClippedByPaintDirtyRect) |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 if (!m_paintLayer.containsDirtyOverlayScrollbars()) | 793 if (!m_paintLayer.containsDirtyOverlayScrollbars()) |
| 775 return; | 794 return; |
| 776 | 795 |
| 777 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRe
ct(damageRect)), paintFlags, LayoutSize()); | 796 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, LayoutRect(enclosingIntRe
ct(damageRect)), paintFlags, LayoutSize()); |
| 778 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); | 797 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); |
| 779 | 798 |
| 780 m_paintLayer.setContainsDirtyOverlayScrollbars(false); | 799 m_paintLayer.setContainsDirtyOverlayScrollbars(false); |
| 781 } | 800 } |
| 782 | 801 |
| 783 } // namespace blink | 802 } // namespace blink |
| OLD | NEW |