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

Unified Diff: third_party/WebKit/WebCore/rendering/RenderBox.cpp

Issue 10670: Do another merge using nifty new merge script (CL for that coming soon). (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/WebCore/rendering/RenderBox.cpp
===================================================================
--- third_party/WebKit/WebCore/rendering/RenderBox.cpp (revision 5296)
+++ third_party/WebKit/WebCore/rendering/RenderBox.cpp (working copy)
@@ -1052,6 +1052,34 @@
return FloatPoint();
}
+FloatQuad RenderBox::localToAbsoluteQuad(const FloatQuad& localQuad, bool fixed) const
+{
+ // We don't expect localToAbsoluteQuad() to be called during layout (yet)
+ ASSERT(!view() || !view()->layoutState());
+
+ if (style()->position() == FixedPosition)
+ fixed = true;
+
+ RenderObject* o = container();
+ if (o) {
+ FloatQuad quad = localQuad;
+ if (m_layer && m_layer->transform()) {
+ fixed = false; // Elements with transforms act as a containing block for fixed position descendants
+ quad = m_layer->transform()->mapQuad(quad);
+ }
+
+ quad += offsetFromContainer(o);
+
+ // Take into account space above a vertically aligned table cell
+ // (see localToAbsoluteForContent())
+ quad.move(0.0f, static_cast<float>(borderTopExtra()));
+
+ return o->localToAbsoluteQuad(quad, fixed);
+ }
+
+ return FloatQuad();
+}
+
IntSize RenderBox::offsetFromContainer(RenderObject* o) const
{
ASSERT(o == container());
@@ -1180,62 +1208,63 @@
invalidatingReflection = false;
}
+ RenderObject* o = container();
+ if (!o)
+ return;
+
IntPoint topLeft = rect.location();
topLeft.move(m_x, m_y);
- // Apply the relative position offset when invalidating a rectangle. The layer
- // is translated, but the render box isn't, so we need to do this to get the
- // right dirty rect. Since this is called from RenderObject::setStyle, the relative position
- // flag on the RenderObject has been cleared, so use the one on the style().
- if (style()->position() == RelativePosition && m_layer)
- topLeft += m_layer->relativePositionOffset();
-
if (style()->position() == FixedPosition)
fixed = true;
-
- RenderObject* o = container();
- if (o) {
- if (o->isBlockFlow() && style()->position() != AbsolutePosition && style()->position() != FixedPosition) {
- RenderBlock* cb = static_cast<RenderBlock*>(o);
- if (cb->hasColumns()) {
- IntRect repaintRect(topLeft, rect.size());
- cb->adjustRectForColumns(repaintRect);
- topLeft = repaintRect.location();
- rect = repaintRect;
- }
- }
- if (style()->position() == AbsolutePosition)
- topLeft += offsetForPositionedInContainer(o);
-
- // We are now in our parent container's coordinate space. Apply our transform to obtain a bounding box
- // in the parent's coordinate space that encloses us.
- if (m_layer && m_layer->transform()) {
- fixed = false;
- rect = m_layer->transform()->mapRect(rect);
- topLeft = rect.location();
- topLeft.move(m_x, m_y);
+ if (o->isBlockFlow() && style()->position() != AbsolutePosition && style()->position() != FixedPosition) {
+ RenderBlock* cb = static_cast<RenderBlock*>(o);
+ if (cb->hasColumns()) {
+ IntRect repaintRect(topLeft, rect.size());
+ cb->adjustRectForColumns(repaintRect);
+ topLeft = repaintRect.location();
+ rect = repaintRect;
}
+ }
- // FIXME: We ignore the lightweight clipping rect that controls use, since if |o| is in mid-layout,
- // its controlClipRect will be wrong. For overflow clip we use the values cached by the layer.
- if (o->hasOverflowClip()) {
- // o->height() is inaccurate if we're in the middle of a layout of |o|, so use the
- // layer's size instead. Even if the layer's size is wrong, the layer itself will repaint
- // anyway if its size does change.
- IntRect boxRect(0, 0, o->layer()->width(), o->layer()->height());
- int x = 0, y = 0;
- o->layer()->subtractScrolledContentOffset(x, y); // For overflow:auto/scroll/hidden.
- topLeft.move(x, y);
- IntRect repaintRect(topLeft, rect.size());
- rect = intersection(repaintRect, boxRect);
- if (rect.isEmpty())
- return;
- } else
- rect.setLocation(topLeft);
-
- o->computeAbsoluteRepaintRect(rect, fixed);
+ // We are now in our parent container's coordinate space. Apply our transform to obtain a bounding box
+ // in the parent's coordinate space that encloses us.
+ if (m_layer && m_layer->transform()) {
+ fixed = false;
+ rect = m_layer->transform()->mapRect(rect);
+ // FIXME: this clobbers topLeft adjustment done for multicol above
+ topLeft = rect.location();
+ topLeft.move(m_x, m_y);
}
+
+ if (style()->position() == AbsolutePosition)
+ topLeft += offsetForPositionedInContainer(o);
+ else if (style()->position() == RelativePosition && m_layer) {
+ // Apply the relative position offset when invalidating a rectangle. The layer
+ // is translated, but the render box isn't, so we need to do this to get the
+ // right dirty rect. Since this is called from RenderObject::setStyle, the relative position
+ // flag on the RenderObject has been cleared, so use the one on the style().
+ topLeft += m_layer->relativePositionOffset();
+ }
+
+ // FIXME: We ignore the lightweight clipping rect that controls use, since if |o| is in mid-layout,
+ // its controlClipRect will be wrong. For overflow clip we use the values cached by the layer.
+ if (o->hasOverflowClip()) {
+ // o->height() is inaccurate if we're in the middle of a layout of |o|, so use the
+ // layer's size instead. Even if the layer's size is wrong, the layer itself will repaint
+ // anyway if its size does change.
+ topLeft -= o->layer()->scrolledContentOffset(); // For overflow:auto/scroll/hidden.
+
+ IntRect repaintRect(topLeft, rect.size());
+ IntRect boxRect(0, 0, o->layer()->width(), o->layer()->height());
+ rect = intersection(repaintRect, boxRect);
+ if (rect.isEmpty())
+ return;
+ } else
+ rect.setLocation(topLeft);
+
+ o->computeAbsoluteRepaintRect(rect, fixed);
}
void RenderBox::repaintDuringLayoutIfMoved(const IntRect& rect)
« no previous file with comments | « third_party/WebKit/WebCore/rendering/RenderBox.h ('k') | third_party/WebKit/WebCore/rendering/RenderContainer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698