Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintInvalidationCapableScrollableArea.cpp

Issue 1406133005: Calculate paint invalidation rect for scrollbars (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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(LayoutBox& box, Scrollbar* scrollbar, ScrollbarOrientation orientation)
19 {
20 if (!scrollbar->isCustomScrollbar()
21 && !(orientation == HorizontalScrollbar ? layerForHorizontalScrollbar() : layerForVerticalScrollbar()))
22 box.invalidateDisplayItemClient(*scrollbar);
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& ownerBox, const PaintInvalidationState& paintInvalidationState, const La youtBoxModelObject& paintInvalidationContainer)
29 {
30 LayoutRect paintInvalidationRect(scrollControlRect);
31 if (!paintInvalidationRect.isEmpty())
32 PaintLayer::mapRectToPaintInvalidationBacking(&ownerBox, &paintInvalidat ionContainer, paintInvalidationRect, &paintInvalidationState);
33
34 if (paintInvalidationRect != previousPaintInvalidationRect) {
35 ownerBox.invalidatePaintUsingContainer(paintInvalidationContainer, previ ousPaintInvalidationRect, PaintInvalidationScroll);
36 previousPaintInvalidationRect = paintInvalidationRect;
37 needsPaintInvalidation = true;
38 }
39
40 if (needsPaintInvalidation) {
41 ownerBox.invalidatePaintUsingContainer(paintInvalidationContainer, paint InvalidationRect, 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& ownerBox, const PaintInvalidationState& paintInva lidationState, const LayoutBoxModelObject& paintInvalidationContainer)
49 {
50 IntRect scrollbarRect = scrollbar && !scrollbarGraphicsLayer ? scrollbar->fr ameRect() : IntRect();
51 if (!invalidatePaintOfScrollControlIfNeeded(scrollbarRect, previousPaintInva lidationRect, needsPaintInvalidation, ownerBox, paintInvalidationState, paintInv alidationContainer))
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(LayoutBox& ownerBox, const PaintInvalidationState& paintInvalidationState, const LayoutBoxModelObject& paintInvalidationContainer, LayoutScrollbarPart* scr ollCorner, LayoutScrollbarPart* resizer)
62 {
63 LayoutRect oldRect = m_horizontalScrollbarPreviousPaintInvalidationRect;
64 invalidatePaintOfScrollbarIfNeeded(horizontalScrollbar(), layerForHorizontal Scrollbar(), m_horizontalScrollbarPreviousPaintInvalidationRect, horizontalScrol lbarNeedsPaintInvalidation(), ownerBox, paintInvalidationState, paintInvalidatio nContainer);
65 bool scrollbarGeometryChanged = oldRect != m_horizontalScrollbarPreviousPain tInvalidationRect;
66
67 oldRect = m_verticalScrollbarPreviousPaintInvalidationRect;
68 invalidatePaintOfScrollbarIfNeeded(verticalScrollbar(), layerForVerticalScro llbar(), m_verticalScrollbarPreviousPaintInvalidationRect, verticalScrollbarNeed sPaintInvalidation(), ownerBox, paintInvalidationState, paintInvalidationContain er);
69 scrollbarGeometryChanged |= oldRect != m_verticalScrollbarPreviousPaintInval idationRect;
70
71 if (scrollbarGeometryChanged)
72 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(ownerBox , PaintInvalidationScroll, nullptr);
73
74 if (invalidatePaintOfScrollControlIfNeeded(scrollCornerRect(), m_scrollCorne rPreviousPaintInvalidationRect, scrollCornerNeedsPaintInvalidation(), ownerBox, paintInvalidationState, paintInvalidationContainer)) {
75 if (scrollCorner)
chrishtr 2015/11/17 01:34:20 Roll lines 75-78 into invalidatePaintOfScrollContr
Xianzhu 2015/11/17 18:31:37 It seems not feasible for invalidatePaintOfScrollC
76 scrollCorner->invalidateDisplayItemClientsIncludingNonCompositingDes cendants(&paintInvalidationContainer, PaintInvalidationScroll, &m_scrollCornerPr eviousPaintInvalidationRect);
77 if (resizer)
78 resizer->invalidateDisplayItemClientsIncludingNonCompositingDescenda nts(&paintInvalidationContainer, PaintInvalidationScroll, &m_scrollCornerPreviou sPaintInvalidationRect);
79 }
80
81 clearNeedsPaintInvalidationForScrollControls();
82 }
83
84 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698