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

Unified Diff: third_party/WebKit/Source/core/page/DragController.cpp

Issue 1646543002: Create the drag image at target scale factor when possible. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: layout test Created 4 years, 11 months 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/Source/core/page/DragController.cpp
diff --git a/third_party/WebKit/Source/core/page/DragController.cpp b/third_party/WebKit/Source/core/page/DragController.cpp
index 7ac844192f1f03632bc786a326ec73320d4009c3..41c05fd5a7e8148bd946853fed45cc3a8a6cb8e0 100644
--- a/third_party/WebKit/Source/core/page/DragController.cpp
+++ b/third_party/WebKit/Source/core/page/DragController.cpp
@@ -46,6 +46,7 @@
#include "core/events/TextEvent.h"
#include "core/fetch/ImageResource.h"
#include "core/fetch/ResourceFetcher.h"
+#include "core/frame/FrameHost.h"
#include "core/frame/FrameView.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Settings.h"
@@ -776,7 +777,7 @@ static IntPoint dragLocationForSelectionDrag(LocalFrame* sourceFrame)
return IntPoint(xpos, ypos);
}
-static const IntSize& maxDragImageSize()
+static const IntSize maxDragImageSize(float deviceScaleFactor)
{
#if OS(MACOSX)
// Match Safari's drag image size.
@@ -784,10 +785,12 @@ static const IntSize& maxDragImageSize()
#else
static const IntSize maxDragImageSize(200, 200);
#endif
- return maxDragImageSize;
+ IntSize maxSizeInPixels = maxDragImageSize;
+ maxSizeInPixels.scale(deviceScaleFactor);
+ return maxSizeInPixels;
}
-static PassOwnPtr<DragImage> dragImageForImage(Element* element, Image* image, const IntPoint& dragOrigin, const IntPoint& imageLocation, const IntSize& imageSizeInDIP, IntPoint& dragLocation)
+static PassOwnPtr<DragImage> dragImageForImage(Element* element, Image* image, float deviceScaleFactor, const IntPoint& dragOrigin, const IntPoint& imageElementLocation, const IntSize& imageElementSizeInPixels, IntPoint& dragLocation)
{
OwnPtr<DragImage> dragImage;
IntPoint origin;
@@ -799,12 +802,15 @@ static PassOwnPtr<DragImage> dragImageForImage(Element* element, Image* image, c
if (shouldRespectImageOrientation == RespectImageOrientation && image->isBitmapImage())
orientation = toBitmapImage(image)->currentFrameOrientation();
- if (image->size().height() * image->size().width() <= MaxOriginalImageArea
+ IntSize imageSize = orientation.usesWidthAsHeight() ? image->size().transposedSize() : image->size();
+
+ FloatSize imageScale = DragImage::clampedImageScale(imageSize, imageElementSizeInPixels, maxDragImageSize(deviceScaleFactor));
+
+ if (imageSize.area() <= MaxOriginalImageArea
&& (dragImage = DragImage::create(image, shouldRespectImageOrientation,
- 1 /* deviceScaleFactor */, interpolationQuality, DragImageAlpha,
- DragImage::clampedImageScale(orientation.usesWidthAsHeight() ? image->size().transposedSize() : image->size(), imageSizeInDIP, maxDragImageSize())))) {
- IntSize originalSize = imageSizeInDIP;
- origin = imageLocation;
+ deviceScaleFactor, interpolationQuality, DragImageAlpha, imageScale))) {
+ IntSize originalSize = imageElementSizeInPixels;
+ origin = imageElementLocation;
IntSize newSize = dragImage->size();
@@ -884,12 +890,17 @@ bool DragController::startDrag(LocalFrame* src, const DragState& state, const Pl
ASSERT(!image->filenameExtension().isEmpty());
if (!dragImage) {
const IntRect& imageRect = hitTestResult.imageRect();
- const IntSize& imageSizeInDIP = src->page()->chromeClient().viewportToScreen(imageRect).size();
+ IntSize imageSizeInPixels = imageRect.size();
+ // TODO(oshima): Remove this scaling and simply pass imageRect to dragImageForImage
+ // once all platforms are migrated to use zoom for dsf.
+ imageSizeInPixels.scale(src->host()->deviceScaleFactor());
+
+ float screenDeviceScaleFactor = src->page()->chromeClient().screenInfo().deviceScaleFactor;
// Pass the selected image size in DIP becasue dragImageForImage clips the image in DIP.
// The coordinates of the locations are in Viewport coordinates, and they're converted in the Blink client.
// TODO(oshima): Currently, the dragged image on high DPI is scaled and can be blurry because of this.
// Consider to clip in the screen coordinates to use high resolution image on high DPI screens.
- dragImage = dragImageForImage(element, image, dragOrigin, imageRect.location(), imageSizeInDIP, dragLocation);
+ dragImage = dragImageForImage(element, image, screenDeviceScaleFactor, dragOrigin, imageRect.location(), imageSizeInPixels, dragLocation);
}
doSystemDrag(dragImage.get(), dragLocation, dragOrigin, dataTransfer, src, false);
} else if (state.m_dragType == DragSourceActionLink) {

Powered by Google App Engine
This is Rietveld 408576698