diff options
Diffstat (limited to 'Source/WebCore/platform/DragImage.cpp')
-rw-r--r-- | Source/WebCore/platform/DragImage.cpp | 72 |
1 files changed, 60 insertions, 12 deletions
diff --git a/Source/WebCore/platform/DragImage.cpp b/Source/WebCore/platform/DragImage.cpp index 3af6b303b..c7203a13d 100644 --- a/Source/WebCore/platform/DragImage.cpp +++ b/Source/WebCore/platform/DragImage.cpp @@ -10,10 +10,10 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR @@ -31,6 +31,7 @@ #include "FrameView.h" #include "ImageBuffer.h" #include "Range.h" +#include "RenderElement.h" #include "RenderObject.h" #include "RenderView.h" @@ -97,16 +98,17 @@ static DragImageRef createDragImageFromSnapshot(std::unique_ptr<ImageBuffer> sna #if ENABLE(CSS_IMAGE_ORIENTATION) if (node) { RenderObject* renderer = node->renderer(); - if (!renderer) + if (!renderer || !is<RenderElement>(renderer)) return nullptr; - orientation.setRespectImageOrientation(renderer->shouldRespectImageOrientation()); - orientation.setImageOrientationEnum(renderer->style().imageOrientation()); + auto& renderElement = downcast<RenderElement>(*renderer); + orientation.setRespectImageOrientation(renderElement.shouldRespectImageOrientation()); + orientation.setImageOrientationEnum(renderElement.style().imageOrientation()); } #else UNUSED_PARAM(node); #endif - RefPtr<Image> image = snapshot->copyImage(ImageBuffer::fastCopyImageMode(), Unscaled); + RefPtr<Image> image = ImageBuffer::sinkIntoImage(WTFMove(snapshot), Unscaled); if (!image) return nullptr; return createDragImageFromImage(image.get(), orientation); @@ -118,12 +120,16 @@ DragImageRef createDragImageForNode(Frame& frame, Node& node) return createDragImageFromSnapshot(snapshotNode(frame, node), &node); } +#if !ENABLE(DATA_INTERACTION) + DragImageRef createDragImageForSelection(Frame& frame, bool forceBlackText) { SnapshotOptions options = forceBlackText ? SnapshotOptionsForceBlackText : SnapshotOptionsNone; return createDragImageFromSnapshot(snapshotSelection(frame, options), nullptr); } +#endif + struct ScopedFrameSelectionState { ScopedFrameSelectionState(Frame& frame) : frame(frame) @@ -141,8 +147,8 @@ struct ScopedFrameSelectionState { const Frame& frame; RenderObject* startRenderer; RenderObject* endRenderer; - int startOffset; - int endOffset; + std::optional<unsigned> startOffset; + std::optional<unsigned> endOffset; }; DragImageRef createDragImageForRange(Frame& frame, Range& range, bool forceBlackText) @@ -174,7 +180,10 @@ DragImageRef createDragImageForRange(Frame& frame, Range& range, bool forceBlack return nullptr; SnapshotOptions options = SnapshotOptionsPaintSelectionOnly | (forceBlackText ? SnapshotOptionsForceBlackText : SnapshotOptionsNone); - view->setSelection(startRenderer, start.deprecatedEditingOffset(), endRenderer, end.deprecatedEditingOffset(), RenderView::RepaintNothing); + int startOffset = start.deprecatedEditingOffset(); + int endOffset = end.deprecatedEditingOffset(); + ASSERT(startOffset >= 0 && endOffset >= 0); + view->setSelection(startRenderer, startOffset, endRenderer, endOffset, RenderView::RepaintNothing); // We capture using snapshotFrameRect() because we fake up the selection using // FrameView but snapshotSelection() uses the selection from the Frame itself. return createDragImageFromSnapshot(snapshotFrameRect(frame, view->selectionBounds(), options), nullptr); @@ -190,23 +199,62 @@ DragImageRef createDragImageForImage(Frame& frame, Node& node, IntRect& imageRec // Calculate image and element metrics for the client, then create drag image. LayoutRect topLevelRect; - IntRect paintingRect = pixelSnappedIntRect(renderer->paintingRootRect(topLevelRect)); + IntRect paintingRect = snappedIntRect(renderer->paintingRootRect(topLevelRect)); if (paintingRect.isEmpty()) return nullptr; - elementRect = pixelSnappedIntRect(topLevelRect); + elementRect = snappedIntRect(topLevelRect); imageRect = paintingRect; return createDragImageFromSnapshot(snapshotNode(frame, node), &node); } -#if !PLATFORM(MAC) && (!PLATFORM(WIN) || OS(WINCE)) +#if !ENABLE(DATA_INTERACTION) +DragImageRef platformAdjustDragImageForDeviceScaleFactor(DragImageRef image, float deviceScaleFactor) +{ + // Later code expects the drag image to be scaled by device's scale factor. + return scaleDragImage(image, { deviceScaleFactor, deviceScaleFactor }); +} +#endif + +#if !PLATFORM(COCOA) && !PLATFORM(WIN) DragImageRef createDragImageForLink(URL&, const String&, FontRenderingMode) { return nullptr; } #endif +DragImage::DragImage() + : m_dragImageRef { nullptr } +{ +} + +DragImage::DragImage(DragImageRef dragImageRef) + : m_dragImageRef { dragImageRef } +{ +} + +DragImage::DragImage(DragImage&& other) + : m_dragImageRef { std::exchange(other.m_dragImageRef, nullptr) } +{ +} + +DragImage& DragImage::operator=(DragImage&& other) +{ + if (m_dragImageRef) + deleteDragImage(m_dragImageRef); + + m_dragImageRef = std::exchange(other.m_dragImageRef, nullptr); + + return *this; +} + +DragImage::~DragImage() +{ + if (m_dragImageRef) + deleteDragImage(m_dragImageRef); +} + } // namespace WebCore |