| 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) {
|
|
|