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

Side by Side Diff: sky/engine/core/rendering/RenderLayer.cpp

Issue 965013003: Move transforms from RenderLayer to RenderBox. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months 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
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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 95
96 RenderLayer::~RenderLayer() 96 RenderLayer::~RenderLayer()
97 { 97 {
98 } 98 }
99 99
100 void RenderLayer::updateLayerPositionsAfterLayout() 100 void RenderLayer::updateLayerPositionsAfterLayout()
101 { 101 {
102 m_clipper.clearClipRectsIncludingDescendants(); 102 m_clipper.clearClipRectsIncludingDescendants();
103 } 103 }
104 104
105 void RenderLayer::updateTransformationMatrix()
106 {
107 if (m_transform) {
108 RenderBox* box = renderer();
109 m_transform->makeIdentity();
110 box->style()->applyTransform(*m_transform, box->pixelSnappedBorderBoxRec t().size(), RenderStyle::IncludeTransformOrigin);
111 // FIXME(sky): We shouldn't need to do this once Skia has 4x4 matrix sup port.
112 // Until then, 3d transforms don't work right.
113 m_transform->makeAffine();
114 }
115 }
116
117 void RenderLayer::updateTransform(const RenderStyle* oldStyle, RenderStyle* newS tyle)
118 {
119 if (oldStyle && newStyle->transformDataEquivalent(*oldStyle))
120 return;
121
122 // hasTransform() on the renderer is also true when there is transform-style : preserve-3d or perspective set,
123 // so check style too.
124 bool hasTransform = renderer()->hasTransform() && newStyle->hasTransform();
125 bool had3DTransform = has3DTransform();
126
127 bool hadTransform = m_transform;
128 if (hasTransform != hadTransform) {
129 if (hasTransform)
130 m_transform = adoptPtr(new TransformationMatrix);
131 else
132 m_transform.clear();
133
134 // Layers with transforms act as clip rects roots, so clear the cached c lip rects here.
135 m_clipper.clearClipRectsIncludingDescendants();
136 } else if (hasTransform) {
137 m_clipper.clearClipRectsIncludingDescendants(AbsoluteClipRects);
138 }
139
140 updateTransformationMatrix();
141
142 if (had3DTransform != has3DTransform())
143 dirty3DTransformedDescendantStatus();
144 }
145 105
146 void RenderLayer::dirty3DTransformedDescendantStatus() 106 void RenderLayer::dirty3DTransformedDescendantStatus()
147 { 107 {
148 RenderLayerStackingNode* stackingNode = m_stackingNode->ancestorStackingCont extNode(); 108 RenderLayerStackingNode* stackingNode = m_stackingNode->ancestorStackingCont extNode();
149 if (!stackingNode) 109 if (!stackingNode)
150 return; 110 return;
151 111
152 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true; 112 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true;
153 113
154 // This propagates up through preserve-3d hierarchies to the enclosing flatt ening layer. 114 // This propagates up through preserve-3d hierarchies to the enclosing flatt ening layer.
155 // Note that preserves3D() creates stacking context, so we can just run up t he stacking containers. 115 // Note that preserves3D() creates stacking context, so we can just run up t he stacking containers.
156 while (stackingNode && stackingNode->layer()->preserves3D()) { 116 while (stackingNode && stackingNode->layer()->renderer()->style()->preserves 3D()) {
157 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true; 117 stackingNode->layer()->m_3DTransformedDescendantStatusDirty = true;
158 stackingNode = stackingNode->ancestorStackingContextNode(); 118 stackingNode = stackingNode->ancestorStackingContextNode();
159 } 119 }
160 } 120 }
161 121
162 // Return true if this layer or any preserve-3d descendants have 3d. 122 // Return true if this layer or any preserve-3d descendants have 3d.
163 bool RenderLayer::update3DTransformedDescendantStatus() 123 bool RenderLayer::update3DTransformedDescendantStatus()
164 { 124 {
165 if (m_3DTransformedDescendantStatusDirty) { 125 if (m_3DTransformedDescendantStatusDirty) {
166 m_has3DTransformedDescendant = false; 126 m_has3DTransformedDescendant = false;
167 127
168 m_stackingNode->updateZOrderLists(); 128 m_stackingNode->updateZOrderLists();
169 129
170 // Transformed or preserve-3d descendants can only be in the z-order lis ts, not 130 // Transformed or preserve-3d descendants can only be in the z-order lis ts, not
171 // in the normal flow list, so we only need to check those. 131 // in the normal flow list, so we only need to check those.
172 RenderLayerStackingNodeIterator iterator(*m_stackingNode.get(), Positive ZOrderChildren); 132 RenderLayerStackingNodeIterator iterator(*m_stackingNode.get(), Positive ZOrderChildren);
173 while (RenderLayerStackingNode* node = iterator.next()) 133 while (RenderLayerStackingNode* node = iterator.next())
174 m_has3DTransformedDescendant |= node->layer()->update3DTransformedDe scendantStatus(); 134 m_has3DTransformedDescendant |= node->layer()->update3DTransformedDe scendantStatus();
175 135
176 m_3DTransformedDescendantStatusDirty = false; 136 m_3DTransformedDescendantStatusDirty = false;
177 } 137 }
178 138
179 // If we live in a 3d hierarchy, then the layer at the root of that hierarch y needs 139 // If we live in a 3d hierarchy, then the layer at the root of that hierarch y needs
180 // the m_has3DTransformedDescendant set. 140 // the m_has3DTransformedDescendant set.
181 if (preserves3D()) 141 if (renderer()->style()->preserves3D())
182 return has3DTransform() || m_has3DTransformedDescendant; 142 return renderer()->has3DTransform() || m_has3DTransformedDescendant;
183 143
184 return has3DTransform(); 144 return renderer()->has3DTransform();
185 } 145 }
186 146
187 IntSize RenderLayer::size() const 147 IntSize RenderLayer::size() const
188 { 148 {
189 // FIXME: Is snapping the size really needed here? 149 // FIXME: Is snapping the size really needed here?
190 RenderBox* box = renderer(); 150 RenderBox* box = renderer();
191 return pixelSnappedIntSize(box->size(), box->location()); 151 return pixelSnappedIntSize(box->size(), box->location());
192 } 152 }
193 153
194 LayoutPoint RenderLayer::location() const 154 LayoutPoint RenderLayer::location() const
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 524
565 if (!ancestorLayer) 525 if (!ancestorLayer)
566 ancestorLayer = this; 526 ancestorLayer = this;
567 527
568 // The root layer is always just the size of the document. 528 // The root layer is always just the size of the document.
569 if (isRootLayer()) 529 if (isRootLayer())
570 return m_renderer->view()->unscaledDocumentRect(); 530 return m_renderer->view()->unscaledDocumentRect();
571 531
572 LayoutRect localClipRect = clipper().localClipRect(); 532 LayoutRect localClipRect = clipper().localClipRect();
573 if (localClipRect != PaintInfo::infiniteRect()) { 533 if (localClipRect != PaintInfo::infiniteRect()) {
574 if (transform()) 534 if (renderer()->transform())
575 localClipRect = transform()->mapRect(localClipRect); 535 localClipRect = renderer()->transform()->mapRect(localClipRect);
576 536
577 LayoutPoint delta; 537 LayoutPoint delta;
578 convertToLayerCoords(ancestorLayer, delta); 538 convertToLayerCoords(ancestorLayer, delta);
579 localClipRect.moveBy(delta); 539 localClipRect.moveBy(delta);
580 return localClipRect; 540 return localClipRect;
581 } 541 }
582 542
583 LayoutPoint origin; 543 LayoutPoint origin;
584 LayoutRect result = physicalBoundingBox(ancestorLayer, &origin); 544 LayoutRect result = physicalBoundingBox(ancestorLayer, &origin);
585 545
586 const_cast<RenderLayer*>(this)->stackingNode()->updateLayerListsIfNeeded(); 546 const_cast<RenderLayer*>(this)->stackingNode()->updateLayerListsIfNeeded();
587 547
588 expandRectForReflectionAndStackingChildren(this, result); 548 expandRectForReflectionAndStackingChildren(this, result);
589 549
590 // FIXME: We can optimize the size of the composited layers, by not enlargin g 550 // FIXME: We can optimize the size of the composited layers, by not enlargin g
591 // filtered areas with the outsets if we know that the filter is going to re nder in hardware. 551 // filtered areas with the outsets if we know that the filter is going to re nder in hardware.
592 // https://bugs.webkit.org/show_bug.cgi?id=81239 552 // https://bugs.webkit.org/show_bug.cgi?id=81239
593 m_renderer->style()->filterOutsets().expandRect(result); 553 m_renderer->style()->filterOutsets().expandRect(result);
594 554
595 if (transform()) 555 if (renderer()->transform())
596 result = transform()->mapRect(result); 556 result = renderer()->transform()->mapRect(result);
597 557
598 LayoutPoint delta; 558 LayoutPoint delta;
599 convertToLayerCoords(ancestorLayer, delta); 559 convertToLayerCoords(ancestorLayer, delta);
600 result.moveBy(delta); 560 result.moveBy(delta);
601 return result; 561 return result;
602 } 562 }
603 563
604 bool RenderLayer::shouldBeSelfPaintingLayer() const 564 bool RenderLayer::shouldBeSelfPaintingLayer() const
605 { 565 {
606 return m_layerType == NormalLayer; 566 return m_layerType == NormalLayer;
607 } 567 }
608 568
609 void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle ) 569 void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle )
610 { 570 {
611 m_stackingNode->updateIsNormalFlowOnly(); 571 m_stackingNode->updateIsNormalFlowOnly();
612 m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle); 572 m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle);
613 573
614 // Overlay scrollbars can make this layer self-painting so we need 574 // Overlay scrollbars can make this layer self-painting so we need
615 // to recompute the bit once scrollbars have been updated. 575 // to recompute the bit once scrollbars have been updated.
616 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer(); 576 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer();
617
618 updateTransform(oldStyle, renderer()->style());
619 } 577 }
620 578
621 } // namespace blink 579 } // namespace blink
OLDNEW
« no previous file with comments | « sky/engine/core/rendering/RenderLayer.h ('k') | sky/engine/core/rendering/RenderLayerClipper.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698