Chromium Code Reviews| Index: third_party/WebKit/Source/core/frame/LocalFrame.cpp |
| diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp |
| index 15161faa4dcb7882692ff8645199a611fbf15140..f748404371bb61381e71044abcdbe87f080bad63 100644 |
| --- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp |
| +++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp |
| @@ -97,7 +97,7 @@ namespace { |
| class DragImageBuilder { |
| STACK_ALLOCATED(); |
| public: |
| - DragImageBuilder(const LocalFrame* localFrame, const IntRect& bounds, Node* draggedNode, float opacity = 1) |
| + DragImageBuilder(const LocalFrame* localFrame, const FloatRect& bounds, Node* draggedNode, float opacity = 1) |
| : m_localFrame(localFrame) |
| , m_draggedNode(draggedNode) |
| , m_bounds(bounds) |
| @@ -140,7 +140,7 @@ public: |
| private: |
| RawPtrWillBeMember<const LocalFrame> m_localFrame; |
| RawPtrWillBeMember<Node> m_draggedNode; |
| - IntRect m_bounds; |
| + FloatRect m_bounds; |
| float m_opacity; |
| OwnPtr<SkPictureBuilder> m_pictureBuilder; |
| }; |
| @@ -631,18 +631,6 @@ double LocalFrame::devicePixelRatio() const |
| return ratio; |
| } |
| -PassOwnPtr<DragImage> LocalFrame::paintIntoDragImage(const GlobalPaintFlags globalPaintFlags, |
| - IntRect paintingRect, Node* draggedNode, float opacity) |
| -{ |
| - ASSERT(document()->isActive()); |
| - // Not flattening compositing layers will result in a broken image being painted. |
| - ASSERT(globalPaintFlags & GlobalPaintFlattenCompositingLayers); |
| - |
| - DragImageBuilder dragImageBuilder(this, paintingRect, draggedNode, opacity); |
| - m_view->paintContents(dragImageBuilder.context(), globalPaintFlags, paintingRect); |
| - return dragImageBuilder.createImage(); |
| -} |
| - |
| PassOwnPtr<DragImage> LocalFrame::nodeImage(Node& node) |
| { |
| m_view->updateAllLifecyclePhases(); |
| @@ -650,24 +638,24 @@ PassOwnPtr<DragImage> LocalFrame::nodeImage(Node& node) |
| if (!layoutObject) |
| return nullptr; |
| - // Directly paint boxes as if they are a stacking context. |
| - if (layoutObject->isBox() && layoutObject->container()) { |
| - IntRect boundingBox = layoutObject->absoluteBoundingBoxRectIncludingDescendants(); |
| - LayoutPoint paintOffset = boundingBox.location() - layoutObject->offsetFromContainer(layoutObject->container(), LayoutPoint()); |
| - |
| - DragImageBuilder dragImageBuilder(this, boundingBox, &node); |
| - { |
| - PaintInfo paintInfo(dragImageBuilder.context(), boundingBox, PaintPhase::PaintPhaseForeground, GlobalPaintFlattenCompositingLayers, 0); |
| - ObjectPainter(*layoutObject).paintAsPseudoStackingContext(paintInfo, LayoutPoint(paintOffset)); |
| - } |
| - return dragImageBuilder.createImage(); |
| + // Paint starting at the nearest painting layer, clipped to the object itself. |
|
chrishtr
2016/02/26 18:31:05
s/painting layer/self-painting PaintLayer/.
pdr.
2016/02/26 18:41:38
It's not necessarily the nearest self painting lay
chrishtr
2016/02/26 18:58:53
I don't think the hasSelfPaintingLayerDescendant()
pdr.
2016/02/26 19:28:02
Cool, this makes sense. I've updated this cl to us
|
| + // TODO(pdr): This will also paint the content behind the object if the object contains |
| + // transparency but the layer is opaque. We could directly call layoutObject->paint(...) |
| + // (see: ObjectPainter::paintAsPseudoStackingContext) but this would skip composited children. |
|
chrishtr
2016/02/26 18:31:05
s/composited children/self-painting PaintLayer chi
pdr.
2016/02/26 19:28:02
Done
|
| + PaintLayer* layer = layoutObject->enclosingLayer(); |
| + // Find the first layer that will paint content, otherwise the paintLayer call will be a noop. |
| + while (layer && !(layer->isSelfPaintingLayer() || layer->hasSelfPaintingLayerDescendant())) |
|
chrishtr
2016/02/26 18:31:05
How about putting this method on PaintLayer? Paint
pdr.
2016/02/26 19:28:02
Done.
|
| + layer = layer->parent(); |
| + |
| + IntRect absoluteBoundingBox = layoutObject->absoluteBoundingBoxRectIncludingDescendants(); |
|
chrishtr
2016/02/26 18:31:05
How about layer->boundingBoxForCompositing() inste
pdr.
2016/02/26 18:41:38
boundingBoxForCompositing would be the layer's bou
chrishtr
2016/02/26 18:58:53
boundingBoxForCompositing is the bounds of the Lay
pdr.
2016/02/26 19:28:02
I don't think we can do this because text needs to
chrishtr
2016/02/26 19:36:27
Oh, I see, you're leaving clipToDirtyRect true on
|
| + FloatRect boundingBox = layer->layoutObject()->absoluteToLocalQuad(FloatQuad(absoluteBoundingBox), UseTransforms).boundingBox(); |
| + DragImageBuilder dragImageBuilder(this, boundingBox, &node); |
| + { |
| + PaintLayerPaintingInfo paintingInfo(layer, LayoutRect(boundingBox), GlobalPaintFlattenCompositingLayers, LayoutSize(), 0); |
| + PaintLayerFlags flags = PaintLayerHaveTransparency | PaintLayerAppliedTransform | PaintLayerUncachedClipRects; |
| + PaintLayerPainter(*layer).paintLayer(dragImageBuilder.context(), paintingInfo, flags); |
| } |
| - |
| - // TODO(pdr): This will also paint the background if the object contains transparency. We can |
| - // directly call layoutObject->paint(...) (see: ObjectPainter::paintAsPseudoStackingContext) but |
| - // painters are inconsistent about which transform space they expect (see: svg, inlines, etc.) |
| - // TODO(pdr): SVG and inlines are painted offset (crbug.com/579153, crbug.com/579158). |
| - return paintIntoDragImage(GlobalPaintFlattenCompositingLayers, layoutObject->absoluteBoundingBoxRectIncludingDescendants(), &node); |
| + return dragImageBuilder.createImage(); |
| } |
| PassOwnPtr<DragImage> LocalFrame::dragImageForSelection(float opacity) |
| @@ -676,9 +664,13 @@ PassOwnPtr<DragImage> LocalFrame::dragImageForSelection(float opacity) |
| return nullptr; |
| m_view->updateAllLifecyclePhases(); |
| + ASSERT(document()->isActive()); |
| - return paintIntoDragImage(GlobalPaintSelectionOnly | GlobalPaintFlattenCompositingLayers, |
| - enclosingIntRect(selection().bounds()), nullptr, opacity); |
| + FloatRect paintingRect = FloatRect(selection().bounds()); |
| + DragImageBuilder dragImageBuilder(this, paintingRect, nullptr, opacity); |
| + GlobalPaintFlags paintFlags = GlobalPaintSelectionOnly | GlobalPaintFlattenCompositingLayers; |
| + m_view->paintContents(dragImageBuilder.context(), paintFlags, enclosingIntRect(paintingRect)); |
|
chrishtr
2016/02/26 18:31:05
Here you're giving up on the common code solution?
pdr.
2016/02/26 18:41:38
This is just a small refactoring mentioned in the
chrishtr
2016/02/26 18:58:53
Ah ok. I think the refactoring as stated in the CL
|
| + return dragImageBuilder.createImage(); |
| } |
| String LocalFrame::selectedText() const |