Index: third_party/WebKit/WebCore/rendering/RenderObject.cpp |
=================================================================== |
--- third_party/WebKit/WebCore/rendering/RenderObject.cpp (revision 5296) |
+++ third_party/WebKit/WebCore/rendering/RenderObject.cpp (working copy) |
@@ -1704,9 +1704,22 @@ |
rects.append(IntRect(tx, ty, width(), height() + borderTopExtra() + borderBottomExtra())); |
} |
-IntRect RenderObject::absoluteBoundingBoxRect() |
+IntRect RenderObject::absoluteBoundingBoxRect(bool useTransforms) |
{ |
- // FIXME: This doesn't work correctly with transforms. |
+ if (useTransforms) { |
+ Vector<FloatQuad> quads; |
+ absoluteQuads(quads); |
+ |
+ size_t n = quads.size(); |
+ if (!n) |
+ return IntRect(); |
+ |
+ IntRect result = quads[0].enclosingBoundingBox(); |
+ for (size_t i = 1; i < n; ++i) |
+ result.unite(quads[i].enclosingBoundingBox()); |
+ return result; |
+ } |
+ |
FloatPoint absPos = localToAbsolute(); |
Vector<IntRect> rects; |
absoluteRects(rects, absPos.x(), absPos.y()); |
@@ -1721,6 +1734,24 @@ |
return result; |
} |
+void RenderObject::collectAbsoluteLineBoxQuads(Vector<FloatQuad>& quads, unsigned startOffset, unsigned endOffset, bool useSelectionHeight) |
+{ |
+} |
+ |
+void RenderObject::absoluteQuads(Vector<FloatQuad>& quads, bool topLevel) |
+{ |
+ // For blocks inside inlines, we go ahead and include margins so that we run right up to the |
+ // inline boxes above and below us (thus getting merged with them to form a single irregular |
+ // shape). |
+ if (topLevel && continuation()) { |
+ FloatRect localRect(0, -collapsedMarginTop(), |
+ width(), height() + collapsedMarginTop() + collapsedMarginBottom()); |
+ quads.append(localToAbsoluteQuad(localRect)); |
+ continuation()->absoluteQuads(quads, topLevel); |
+ } else |
+ quads.append(localToAbsoluteQuad(FloatRect(0, 0, width(), height() + borderTopExtra() + borderBottomExtra()))); |
+} |
+ |
void RenderObject::addAbsoluteRectForLayer(IntRect& result) |
{ |
if (hasLayer()) |
@@ -2398,6 +2429,20 @@ |
return FloatPoint(); |
} |
+FloatQuad RenderObject::localToAbsoluteQuad(const FloatQuad& localQuad, bool fixed) const |
+{ |
+ RenderObject* o = parent(); |
+ if (o) { |
+ FloatQuad quad = localQuad; |
+ quad.move(0.0f, static_cast<float>(o->borderTopExtra())); |
+ if (o->hasOverflowClip()) |
+ quad -= o->layer()->scrolledContentOffset(); |
+ return o->localToAbsoluteQuad(quad, fixed); |
+ } |
+ |
+ return FloatQuad(); |
+} |
+ |
IntRect RenderObject::caretRect(InlineBox* inlineBox, int caretOffset, int* extraWidthToEndOfLine) |
{ |
if (extraWidthToEndOfLine) |
@@ -3070,6 +3115,12 @@ |
return rect; |
} |
+FloatQuad RenderObject::absoluteContentQuad() const |
+{ |
+ IntRect rect = contentBox(); |
+ return localToAbsoluteQuad(FloatRect(rect)); |
+} |
+ |
void RenderObject::adjustRectForOutlineAndShadow(IntRect& rect) const |
{ |
int outlineSize = !isInline() && continuation() ? continuation()->style()->outlineSize() : style()->outlineSize(); |