OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "config.h" |
| 6 #include "core/paint/PaintInvalidationCapableScrollableArea.h" |
| 7 |
| 8 #include "core/frame/Settings.h" |
| 9 #include "core/html/HTMLFrameOwnerElement.h" |
| 10 #include "core/layout/LayoutBox.h" |
| 11 #include "core/layout/LayoutScrollbar.h" |
| 12 #include "core/layout/LayoutScrollbarPart.h" |
| 13 #include "core/layout/PaintInvalidationState.h" |
| 14 #include "core/paint/PaintLayer.h" |
| 15 |
| 16 namespace blink { |
| 17 |
| 18 void PaintInvalidationCapableScrollableArea::willRemoveScrollbar(Scrollbar* scro
llbar, ScrollbarOrientation orientation) |
| 19 { |
| 20 if (!scrollbar->isCustomScrollbar() |
| 21 && !(orientation == HorizontalScrollbar ? layerForHorizontalScrollbar()
: layerForVerticalScrollbar())) |
| 22 boxForScrollControlPaintInvalidation().invalidateDisplayItemClient(*scro
llbar); |
| 23 |
| 24 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
| 25 } |
| 26 |
| 27 // Returns true if the scroll control is invalidated. |
| 28 static bool invalidatePaintOfScrollControlIfNeeded(const IntRect& scrollControlR
ect, LayoutRect& previousPaintInvalidationRect, bool needsPaintInvalidation, Lay
outBox& box, const PaintInvalidationState& paintInvalidationState, const LayoutB
oxModelObject& paintInvalidationContainer) |
| 29 { |
| 30 LayoutRect paintInvalidationRect(scrollControlRect); |
| 31 if (!paintInvalidationRect.isEmpty()) |
| 32 PaintLayer::mapRectToPaintInvalidationBacking(&box, &paintInvalidationCo
ntainer, paintInvalidationRect, &paintInvalidationState); |
| 33 |
| 34 if (paintInvalidationRect != previousPaintInvalidationRect) { |
| 35 box.invalidatePaintUsingContainer(paintInvalidationContainer, previousPa
intInvalidationRect, PaintInvalidationScroll); |
| 36 previousPaintInvalidationRect = paintInvalidationRect; |
| 37 needsPaintInvalidation = true; |
| 38 } |
| 39 |
| 40 if (needsPaintInvalidation) { |
| 41 box.invalidatePaintUsingContainer(paintInvalidationContainer, paintInval
idationRect, PaintInvalidationScroll); |
| 42 return true; |
| 43 } |
| 44 |
| 45 return false; |
| 46 } |
| 47 |
| 48 static void invalidatePaintOfScrollbarIfNeeded(Scrollbar* scrollbar, GraphicsLay
er* scrollbarGraphicsLayer, LayoutRect& previousPaintInvalidationRect, bool need
sPaintInvalidation, LayoutBox& box, const PaintInvalidationState& paintInvalidat
ionState, const LayoutBoxModelObject& paintInvalidationContainer) |
| 49 { |
| 50 IntRect scrollbarRect = scrollbar && !scrollbarGraphicsLayer ? scrollbar->fr
ameRect() : IntRect(); |
| 51 if (!invalidatePaintOfScrollControlIfNeeded(scrollbarRect, previousPaintInva
lidationRect, needsPaintInvalidation, box, paintInvalidationState, paintInvalida
tionContainer)) |
| 52 return; |
| 53 if (!scrollbar) |
| 54 return; |
| 55 |
| 56 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*scrollbar,
PaintInvalidationScroll, &previousPaintInvalidationRect); |
| 57 if (scrollbar->isCustomScrollbar()) |
| 58 toLayoutScrollbar(scrollbar)->invalidateDisplayItemClientsOfScrollbarPar
ts(paintInvalidationContainer, previousPaintInvalidationRect); |
| 59 } |
| 60 |
| 61 void PaintInvalidationCapableScrollableArea::invalidatePaintOfScrollControlsIfNe
eded(const PaintInvalidationState& paintInvalidationState, const LayoutBoxModelO
bject& paintInvalidationContainer) |
| 62 { |
| 63 LayoutBox& box = boxForScrollControlPaintInvalidation(); |
| 64 LayoutRect oldRect = m_horizontalScrollbarPreviousPaintInvalidationRect; |
| 65 invalidatePaintOfScrollbarIfNeeded(horizontalScrollbar(), layerForHorizontal
Scrollbar(), m_horizontalScrollbarPreviousPaintInvalidationRect, horizontalScrol
lbarNeedsPaintInvalidation(), box, paintInvalidationState, paintInvalidationCont
ainer); |
| 66 bool scrollbarGeometryChanged = oldRect != m_horizontalScrollbarPreviousPain
tInvalidationRect; |
| 67 |
| 68 oldRect = m_verticalScrollbarPreviousPaintInvalidationRect; |
| 69 invalidatePaintOfScrollbarIfNeeded(verticalScrollbar(), layerForVerticalScro
llbar(), m_verticalScrollbarPreviousPaintInvalidationRect, verticalScrollbarNeed
sPaintInvalidation(), box, paintInvalidationState, paintInvalidationContainer); |
| 70 scrollbarGeometryChanged |= oldRect != m_verticalScrollbarPreviousPaintInval
idationRect; |
| 71 |
| 72 if (scrollbarGeometryChanged) |
| 73 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(box, Pai
ntInvalidationScroll, nullptr); |
| 74 |
| 75 if (invalidatePaintOfScrollControlIfNeeded(scrollCornerRect(), m_scrollCorne
rPreviousPaintInvalidationRect, scrollCornerNeedsPaintInvalidation(), box, paint
InvalidationState, paintInvalidationContainer)) { |
| 76 if (LayoutScrollbarPart* scrollCorner = this->scrollCorner()) |
| 77 scrollCorner->invalidateDisplayItemClientsIncludingNonCompositingDes
cendants(&paintInvalidationContainer, PaintInvalidationScroll, &m_scrollCornerPr
eviousPaintInvalidationRect); |
| 78 if (LayoutScrollbarPart* resizer = this->resizer()) |
| 79 resizer->invalidateDisplayItemClientsIncludingNonCompositingDescenda
nts(&paintInvalidationContainer, PaintInvalidationScroll, &m_scrollCornerPreviou
sPaintInvalidationRect); |
| 80 } |
| 81 |
| 82 clearNeedsPaintInvalidationForScrollControls(); |
| 83 } |
| 84 |
| 85 } // namespace blink |
OLD | NEW |