OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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/PaintPropertyTreeBuilder.h" | 5 #include "core/paint/PaintPropertyTreeBuilder.h" |
6 | 6 |
7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
8 #include "core/frame/LocalFrame.h" | 8 #include "core/frame/LocalFrame.h" |
9 #include "core/frame/Settings.h" | 9 #include "core/frame/Settings.h" |
10 #include "core/layout/LayoutInline.h" | 10 #include "core/layout/LayoutInline.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 void PaintPropertyTreeBuilder::buildTreeRootNodes(FrameView& rootFrame, PaintPro
pertyTreeBuilderContext& context) | 22 void PaintPropertyTreeBuilder::buildTreeRootNodes(FrameView& rootFrame, PaintPro
pertyTreeBuilderContext& context) |
23 { | 23 { |
24 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) | 24 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) |
25 return; | 25 return; |
26 | 26 |
27 if (!rootFrame.rootTransform() || rootFrame.rootTransform()->parent()) { | 27 if (!rootFrame.rootTransform() || rootFrame.rootTransform()->parent()) { |
28 rootFrame.setRootTransform(TransformPaintPropertyNode::create(nullptr, T
ransformationMatrix(), FloatPoint3D())); | 28 rootFrame.setRootTransform(TransformPaintPropertyNode::create(nullptr, T
ransformationMatrix(), FloatPoint3D())); |
29 rootFrame.setRootClip(ClipPaintPropertyNode::create(nullptr, rootFrame.r
ootTransform(), FloatRoundedRect(LayoutRect::infiniteIntRect()))); | 29 rootFrame.setRootClip(ClipPaintPropertyNode::create(nullptr, rootFrame.r
ootTransform(), FloatRoundedRect(LayoutRect::infiniteIntRect()))); |
30 rootFrame.setRootEffect(EffectPaintPropertyNode::create(nullptr, 1.0)); | 30 rootFrame.setRootEffect(EffectPaintPropertyNode::create(nullptr, 1.0)); |
| 31 rootFrame.setRootScroll(ScrollPaintPropertyNode::create(nullptr, rootFra
me.rootTransform(), FloatSize(), FloatSize(), false, false)); |
31 } else { | 32 } else { |
32 DCHECK(rootFrame.rootClip() && !rootFrame.rootClip()->parent()); | 33 DCHECK(rootFrame.rootClip() && !rootFrame.rootClip()->parent()); |
33 DCHECK(rootFrame.rootEffect() && !rootFrame.rootEffect()->parent()); | 34 DCHECK(rootFrame.rootEffect() && !rootFrame.rootEffect()->parent()); |
34 } | 35 } |
35 | 36 |
36 context.current.transform = context.absolutePosition.transform = context.fix
edPosition.transform = rootFrame.rootTransform(); | 37 context.current.transform = context.absolutePosition.transform = context.fix
edPosition.transform = rootFrame.rootTransform(); |
| 38 context.current.scroll = rootFrame.rootScroll(); |
37 context.current.clip = context.absolutePosition.clip = context.fixedPosition
.clip = rootFrame.rootClip(); | 39 context.current.clip = context.absolutePosition.clip = context.fixedPosition
.clip = rootFrame.rootClip(); |
38 context.currentEffect = rootFrame.rootEffect(); | 40 context.currentEffect = rootFrame.rootEffect(); |
39 } | 41 } |
40 | 42 |
41 void PaintPropertyTreeBuilder::buildTreeNodes(FrameView& frameView, PaintPropert
yTreeBuilderContext& context) | 43 void PaintPropertyTreeBuilder::buildTreeNodes(FrameView& frameView, PaintPropert
yTreeBuilderContext& context) |
42 { | 44 { |
43 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { | 45 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { |
44 LayoutView* layoutView = frameView.layoutView(); | 46 LayoutView* layoutView = frameView.layoutView(); |
45 if (!layoutView) | 47 if (!layoutView) |
46 return; | 48 return; |
47 | 49 |
48 TransformationMatrix frameTranslate; | 50 TransformationMatrix frameTranslate; |
49 frameTranslate.translate( | 51 frameTranslate.translate( |
50 frameView.x() + layoutView->location().x() + context.current.paintOf
fset.x(), | 52 frameView.x() + layoutView->location().x() + context.current.paintOf
fset.x(), |
51 frameView.y() + layoutView->location().y() + context.current.paintOf
fset.y()); | 53 frameView.y() + layoutView->location().y() + context.current.paintOf
fset.y()); |
52 context.current.transform = layoutView->getMutableForPainting().ensureOb
jectPaintProperties().createOrUpdatePaintOffsetTranslation( | 54 context.current.transform = layoutView->getMutableForPainting().ensureOb
jectPaintProperties().createOrUpdatePaintOffsetTranslation( |
53 context.current.transform, frameTranslate, FloatPoint3D()); | 55 context.current.transform, frameTranslate, FloatPoint3D()); |
| 56 context.current.scroll = layoutView->getMutableForPainting().ensureObjec
tPaintProperties().createOrUpdateScroll( |
| 57 context.current.scroll, context.current.transform, FloatSize(), Floa
tSize(), false, false); |
54 context.current.paintOffset = LayoutPoint(); | 58 context.current.paintOffset = LayoutPoint(); |
55 context.current.renderingContextID = 0; | 59 context.current.renderingContextID = 0; |
56 context.current.shouldFlattenInheritedTransform = true; | 60 context.current.shouldFlattenInheritedTransform = true; |
57 context.absolutePosition = context.current; | 61 context.absolutePosition = context.current; |
58 context.containerForAbsolutePosition = nullptr; // This will get set in
updateOutOfFlowContext(). | 62 context.containerForAbsolutePosition = nullptr; // This will get set in
updateOutOfFlowContext(). |
59 context.fixedPosition = context.current; | 63 context.fixedPosition = context.current; |
60 return; | 64 return; |
61 } | 65 } |
62 | 66 |
63 TransformationMatrix frameTranslate; | 67 TransformationMatrix frameTranslate; |
(...skipping 10 matching lines...) Expand all Loading... |
74 frameView.setContentClip(ClipPaintPropertyNode::create(context.current.c
lip, frameView.preTranslation(), contentClip)); | 78 frameView.setContentClip(ClipPaintPropertyNode::create(context.current.c
lip, frameView.preTranslation(), contentClip)); |
75 | 79 |
76 DoubleSize scrollOffset = frameView.scrollOffsetDouble(); | 80 DoubleSize scrollOffset = frameView.scrollOffsetDouble(); |
77 TransformationMatrix frameScroll; | 81 TransformationMatrix frameScroll; |
78 frameScroll.translate(-scrollOffset.width(), -scrollOffset.height()); | 82 frameScroll.translate(-scrollOffset.width(), -scrollOffset.height()); |
79 if (TransformPaintPropertyNode* existingScrollTranslation = frameView.scroll
Translation()) | 83 if (TransformPaintPropertyNode* existingScrollTranslation = frameView.scroll
Translation()) |
80 existingScrollTranslation->update(frameView.preTranslation(), frameScrol
l, FloatPoint3D()); | 84 existingScrollTranslation->update(frameView.preTranslation(), frameScrol
l, FloatPoint3D()); |
81 else | 85 else |
82 frameView.setScrollTranslation(TransformPaintPropertyNode::create(frameV
iew.preTranslation(), frameScroll, FloatPoint3D())); | 86 frameView.setScrollTranslation(TransformPaintPropertyNode::create(frameV
iew.preTranslation(), frameScroll, FloatPoint3D())); |
83 | 87 |
| 88 FloatSize scrollClip = FloatSize(frameView.visibleContentSize()); |
| 89 FloatSize scrollBounds = FloatSize(frameView.contentsSize()); |
| 90 bool userScrollableHorizontal = frameView.userInputScrollable(HorizontalScro
llbar); |
| 91 bool userScrollableVertical = frameView.userInputScrollable(VerticalScrollba
r); |
| 92 if (ScrollPaintPropertyNode* existingScroll = frameView.scroll()) |
| 93 existingScroll->update(context.current.scroll, frameView.scrollTranslati
on(), scrollClip, scrollBounds, userScrollableHorizontal, userScrollableVertical
); |
| 94 else |
| 95 frameView.setScroll(ScrollPaintPropertyNode::create(context.current.scro
ll, frameView.scrollTranslation(), scrollClip, scrollBounds, userScrollableHoriz
ontal, userScrollableVertical)); |
| 96 |
84 // Initialize the context for current, absolute and fixed position cases. | 97 // Initialize the context for current, absolute and fixed position cases. |
85 // They are the same, except that scroll translation does not apply to | 98 // They are the same, except that scroll translation does not apply to |
86 // fixed position descendants. | 99 // fixed position descendants. |
87 context.current.transform = frameView.scrollTranslation(); | 100 context.current.transform = frameView.scrollTranslation(); |
88 context.current.paintOffset = LayoutPoint(); | 101 context.current.paintOffset = LayoutPoint(); |
89 context.current.clip = frameView.contentClip(); | 102 context.current.clip = frameView.contentClip(); |
| 103 context.current.scroll = frameView.scroll(); |
90 context.current.renderingContextID = 0; | 104 context.current.renderingContextID = 0; |
91 context.current.shouldFlattenInheritedTransform = true; | 105 context.current.shouldFlattenInheritedTransform = true; |
92 context.absolutePosition = context.current; | 106 context.absolutePosition = context.current; |
93 context.containerForAbsolutePosition = nullptr; | 107 context.containerForAbsolutePosition = nullptr; |
94 context.fixedPosition = context.current; | 108 context.fixedPosition = context.current; |
95 context.fixedPosition.transform = frameView.preTranslation(); | 109 context.fixedPosition.transform = frameView.preTranslation(); |
96 } | 110 } |
97 | 111 |
98 void PaintPropertyTreeBuilder::updatePaintOffsetTranslation(const LayoutObject&
object, PaintPropertyTreeBuilderContext& context) | 112 void PaintPropertyTreeBuilder::updatePaintOffsetTranslation(const LayoutObject&
object, PaintPropertyTreeBuilderContext& context) |
99 { | 113 { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 void PaintPropertyTreeBuilder::updateLocalBorderBoxContext(const LayoutObject& o
bject, PaintPropertyTreeBuilderContext& context) | 244 void PaintPropertyTreeBuilder::updateLocalBorderBoxContext(const LayoutObject& o
bject, PaintPropertyTreeBuilderContext& context) |
231 { | 245 { |
232 // Avoid adding an ObjectPaintProperties for non-boxes to save memory, since
we don't need them at the moment. | 246 // Avoid adding an ObjectPaintProperties for non-boxes to save memory, since
we don't need them at the moment. |
233 if (!object.isBox() && !object.hasLayer()) | 247 if (!object.isBox() && !object.hasLayer()) |
234 return; | 248 return; |
235 | 249 |
236 std::unique_ptr<ObjectPaintProperties::LocalBorderBoxProperties> borderBoxCo
ntext = | 250 std::unique_ptr<ObjectPaintProperties::LocalBorderBoxProperties> borderBoxCo
ntext = |
237 wrapUnique(new ObjectPaintProperties::LocalBorderBoxProperties); | 251 wrapUnique(new ObjectPaintProperties::LocalBorderBoxProperties); |
238 borderBoxContext->paintOffset = context.current.paintOffset; | 252 borderBoxContext->paintOffset = context.current.paintOffset; |
239 borderBoxContext->propertyTreeState = PropertyTreeState(context.current.tran
sform, context.current.clip, context.currentEffect); | 253 borderBoxContext->propertyTreeState = PropertyTreeState(context.current.tran
sform, context.current.clip, context.currentEffect); |
| 254 borderBoxContext->scroll = context.current.scroll; |
240 | 255 |
241 if (!context.current.clip) { | 256 if (!context.current.clip) { |
242 DCHECK(object.isLayoutView()); | 257 DCHECK(object.isLayoutView()); |
243 DCHECK(toLayoutView(object).frameView()->frame().isMainFrame()); | 258 DCHECK(toLayoutView(object).frameView()->frame().isMainFrame()); |
244 DCHECK(RuntimeEnabledFeatures::rootLayerScrollingEnabled()); | 259 DCHECK(RuntimeEnabledFeatures::rootLayerScrollingEnabled()); |
245 borderBoxContext->propertyTreeState.clip = ClipPaintPropertyNode::create
(nullptr, context.current.transform, FloatRoundedRect(LayoutRect::infiniteIntRec
t())); | 260 borderBoxContext->propertyTreeState.clip = ClipPaintPropertyNode::create
(nullptr, context.current.transform, FloatRoundedRect(LayoutRect::infiniteIntRec
t())); |
246 context.current.clip = borderBoxContext->propertyTreeState.clip.get(); | 261 context.current.clip = borderBoxContext->propertyTreeState.clip.get(); |
247 } | 262 } |
248 | 263 |
249 object.getMutableForPainting().ensureObjectPaintProperties().setLocalBorderB
oxProperties(std::move(borderBoxContext)); | 264 object.getMutableForPainting().ensureObjectPaintProperties().setLocalBorderB
oxProperties(std::move(borderBoxContext)); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 properties->clearSvgLocalToBorderBoxTransform(); | 362 properties->clearSvgLocalToBorderBoxTransform(); |
348 return; | 363 return; |
349 } | 364 } |
350 | 365 |
351 context.current.transform = object.getMutableForPainting().ensureObjectPaint
Properties().createOrUpdateSvgLocalToBorderBoxTransform( | 366 context.current.transform = object.getMutableForPainting().ensureObjectPaint
Properties().createOrUpdateSvgLocalToBorderBoxTransform( |
352 context.current.transform, transformToBorderBox, FloatPoint3D()); | 367 context.current.transform, transformToBorderBox, FloatPoint3D()); |
353 context.current.shouldFlattenInheritedTransform = false; | 368 context.current.shouldFlattenInheritedTransform = false; |
354 context.current.renderingContextID = 0; | 369 context.current.renderingContextID = 0; |
355 } | 370 } |
356 | 371 |
357 void PaintPropertyTreeBuilder::updateScrollTranslation(const LayoutObject& objec
t, PaintPropertyTreeBuilderContext& context) | 372 void PaintPropertyTreeBuilder::updateScrollAndScrollTranslation(const LayoutObje
ct& object, PaintPropertyTreeBuilderContext& context) |
358 { | 373 { |
359 if (object.isBoxModelObject() && object.hasOverflowClip()) { | 374 if (object.isBoxModelObject() && object.hasOverflowClip()) { |
360 PaintLayer* layer = toLayoutBoxModelObject(object).layer(); | 375 PaintLayer* layer = toLayoutBoxModelObject(object).layer(); |
361 DCHECK(layer); | 376 DCHECK(layer); |
362 DoubleSize scrollOffset = layer->getScrollableArea()->scrollOffset(); | 377 DoubleSize scrollOffset = layer->getScrollableArea()->scrollOffset(); |
363 bool forceScrollingForLayoutView = object.isLayoutView() && RuntimeEnabl
edFeatures::rootLayerScrollingEnabled(); | 378 bool forceScrollingForLayoutView = object.isLayoutView() && RuntimeEnabl
edFeatures::rootLayerScrollingEnabled(); |
364 if (forceScrollingForLayoutView || !scrollOffset.isZero() || layer->scro
llsOverflow()) { | 379 if (forceScrollingForLayoutView || !scrollOffset.isZero() || layer->scro
llsOverflow()) { |
365 TransformationMatrix matrix = TransformationMatrix().translate(-scro
llOffset.width(), -scrollOffset.height()); | 380 TransformationMatrix matrix = TransformationMatrix().translate(-scro
llOffset.width(), -scrollOffset.height()); |
366 context.current.transform = object.getMutableForPainting().ensureObj
ectPaintProperties().createOrUpdateScrollTranslation( | 381 context.current.transform = object.getMutableForPainting().ensureObj
ectPaintProperties().createOrUpdateScrollTranslation( |
367 context.current.transform, matrix, FloatPoint3D(), context.curre
nt.shouldFlattenInheritedTransform, context.current.renderingContextID); | 382 context.current.transform, matrix, FloatPoint3D(), context.curre
nt.shouldFlattenInheritedTransform, context.current.renderingContextID); |
| 383 |
| 384 FloatSize scrollClip = FloatSize(layer->getScrollableArea()->visible
ContentRect().size()); |
| 385 FloatSize scrollBounds = FloatSize(layer->getScrollableArea()->conte
ntsSize()); |
| 386 bool userScrollableHorizontal = layer->getScrollableArea()->userInpu
tScrollable(HorizontalScrollbar); |
| 387 bool userScrollableVertical = layer->getScrollableArea()->userInputS
crollable(VerticalScrollbar); |
| 388 context.current.scroll = object.getMutableForPainting().ensureObject
PaintProperties().createOrUpdateScroll( |
| 389 context.current.scroll, context.current.transform, scrollClip, s
crollBounds, userScrollableHorizontal, userScrollableVertical); |
| 390 |
368 context.current.shouldFlattenInheritedTransform = false; | 391 context.current.shouldFlattenInheritedTransform = false; |
369 return; | 392 return; |
370 } | 393 } |
371 } | 394 } |
372 | 395 |
373 if (ObjectPaintProperties* properties = object.getMutableForPainting().objec
tPaintProperties()) | 396 if (ObjectPaintProperties* properties = object.getMutableForPainting().objec
tPaintProperties()) { |
374 properties->clearScrollTranslation(); | 397 properties->clearScrollTranslation(); |
| 398 properties->clearScroll(); |
| 399 } |
375 } | 400 } |
376 | 401 |
377 void PaintPropertyTreeBuilder::updateOutOfFlowContext(const LayoutObject& object
, PaintPropertyTreeBuilderContext& context) | 402 void PaintPropertyTreeBuilder::updateOutOfFlowContext(const LayoutObject& object
, PaintPropertyTreeBuilderContext& context) |
378 { | 403 { |
379 if (object.canContainAbsolutePositionObjects()) { | 404 if (object.canContainAbsolutePositionObjects()) { |
380 context.absolutePosition = context.current; | 405 context.absolutePosition = context.current; |
381 context.containerForAbsolutePosition = &object; | 406 context.containerForAbsolutePosition = &object; |
382 } | 407 } |
383 | 408 |
384 if (object.isLayoutView()) { | 409 if (object.isLayoutView()) { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 } | 503 } |
479 | 504 |
480 void PaintPropertyTreeBuilder::buildTreeNodesForChildren(const LayoutObject& obj
ect, PaintPropertyTreeBuilderContext& context) | 505 void PaintPropertyTreeBuilder::buildTreeNodesForChildren(const LayoutObject& obj
ect, PaintPropertyTreeBuilderContext& context) |
481 { | 506 { |
482 if (!object.isBoxModelObject() && !object.isSVG()) | 507 if (!object.isBoxModelObject() && !object.isSVG()) |
483 return; | 508 return; |
484 | 509 |
485 updateOverflowClip(object, context); | 510 updateOverflowClip(object, context); |
486 updatePerspective(object, context); | 511 updatePerspective(object, context); |
487 updateSvgLocalToBorderBoxTransform(object, context); | 512 updateSvgLocalToBorderBoxTransform(object, context); |
488 updateScrollTranslation(object, context); | 513 updateScrollAndScrollTranslation(object, context); |
489 updateOutOfFlowContext(object, context); | 514 updateOutOfFlowContext(object, context); |
490 } | 515 } |
491 | 516 |
492 } // namespace blink | 517 } // namespace blink |
OLD | NEW |