summaryrefslogtreecommitdiffstats
path: root/ash/drag_drop
diff options
context:
space:
mode:
authorvarunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-30 00:36:41 +0000
committervarunjain@chromium.org <varunjain@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-30 00:36:41 +0000
commit399882394634321111b6caf55136760b3ce3b471 (patch)
tree0ba0e48ec1291bcda680416b11fa95c1ce76264b /ash/drag_drop
parent171244986e15feace373f6ba975f77033b5a4006 (diff)
downloadchromium_src-399882394634321111b6caf55136760b3ce3b471.zip
chromium_src-399882394634321111b6caf55136760b3ce3b471.tar.gz
chromium_src-399882394634321111b6caf55136760b3ce3b471.tar.bz2
Drag image scaling code should take device scale into account.
BUG=114755 Review URL: https://chromiumcodereview.appspot.com/11418223 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170307 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/drag_drop')
-rw-r--r--ash/drag_drop/drag_image_view.cc32
1 files changed, 27 insertions, 5 deletions
diff --git a/ash/drag_drop/drag_image_view.cc b/ash/drag_drop/drag_image_view.cc
index fb28b9d..acb4292 100644
--- a/ash/drag_drop/drag_image_view.cc
+++ b/ash/drag_drop/drag_image_view.cc
@@ -6,7 +6,9 @@
#include "skia/ext/image_operations.h"
#include "ui/aura/window.h"
+#include "ui/compositor/dip_util.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/size_conversions.h"
#include "ui/views/corewm/shadow_types.h"
#include "ui/views/widget/widget.h"
@@ -64,14 +66,34 @@ void DragImageView::SetWidgetVisible(bool visible) {
}
void DragImageView::OnPaint(gfx::Canvas* canvas) {
+ if (GetImage().isNull())
+ return;
+
+ // |widget_size_| is in DIP. ImageSkia::size() also returns the size in DIP.
if (GetImage().size() == widget_size_) {
canvas->DrawImageInt(GetImage(), 0, 0);
} else {
- SkBitmap scaled = skia::ImageOperations::Resize(
- *GetImage().bitmap(), skia::ImageOperations::RESIZE_LANCZOS3,
- widget_size_.width(), widget_size_.height());
- SkPaint paint;
- canvas->sk_canvas()->drawBitmap(scaled, 0, 0, &paint);
+ float device_scale = 1;
+ if (widget_->GetNativeView() && widget_->GetNativeView()->layer()) {
+ device_scale = ui::GetDeviceScaleFactor(
+ widget_->GetNativeView()->layer());
+ }
+ ui::ScaleFactor device_scale_factor =
+ ui::GetScaleFactorFromScale(device_scale);
+
+ // The drag image already has device scale factor applied. But
+ // |widget_size_| is in DIP units.
+ gfx::Size scaled_widget_size = gfx::ToRoundedSize(
+ gfx::ScaleSize(widget_size_, device_scale));
+ gfx::ImageSkiaRep image_rep = GetImage().GetRepresentation(
+ device_scale_factor);
+ if (image_rep.is_null())
+ return;
+ SkBitmap scaled = skia::ImageOperations::Resize(
+ image_rep.sk_bitmap(), skia::ImageOperations::RESIZE_LANCZOS3,
+ scaled_widget_size.width(), scaled_widget_size.height());
+ gfx::ImageSkia image_skia(gfx::ImageSkiaRep(scaled, device_scale_factor));
+ canvas->DrawImageInt(image_skia, 0, 0);
}
}