summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/DragImage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/DragImage.cpp')
-rw-r--r--Source/WebCore/platform/DragImage.cpp72
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