Index: ui/snapshot/snapshot_aura.cc |
diff --git a/ui/snapshot/snapshot_aura.cc b/ui/snapshot/snapshot_aura.cc |
index b92681811c179076f42e64d5436c64b680e2eccb..b40ea47ec1b85b73a7c512c4703e161eabf637fc 100644 |
--- a/ui/snapshot/snapshot_aura.cc |
+++ b/ui/snapshot/snapshot_aura.cc |
@@ -40,45 +40,17 @@ void OnFrameScalingFinished( |
callback.Run(gfx::Image(gfx::ImageSkia::CreateFrom1xBitmap(scaled_bitmap))); |
} |
-void RotateBitmap(SkBitmap* bitmap, gfx::Display::Rotation rotation) { |
- switch (rotation) { |
- case gfx::Display::ROTATE_0: |
- break; |
- case gfx::Display::ROTATE_90: |
- *bitmap = SkBitmapOperations::Rotate(*bitmap, |
- SkBitmapOperations::ROTATION_270_CW); |
- break; |
- case gfx::Display::ROTATE_180: |
- *bitmap = SkBitmapOperations::Rotate(*bitmap, |
- SkBitmapOperations::ROTATION_180_CW); |
- break; |
- case gfx::Display::ROTATE_270: |
- *bitmap = SkBitmapOperations::Rotate(*bitmap, |
- SkBitmapOperations::ROTATION_90_CW); |
- break; |
- } |
-} |
- |
-SkBitmap ScaleAndRotateBitmap(const SkBitmap& input_bitmap, |
- gfx::Size target_size_pre_rotation, |
- gfx::Display::Rotation rotation) { |
- SkBitmap bitmap; |
- bitmap = |
- skia::ImageOperations::Resize(input_bitmap, |
- skia::ImageOperations::RESIZE_GOOD, |
- target_size_pre_rotation.width(), |
- target_size_pre_rotation.height(), |
- static_cast<SkBitmap::Allocator*>(NULL)); |
- RotateBitmap(&bitmap, rotation); |
- return bitmap; |
+SkBitmap ScaleBitmap(const SkBitmap& input_bitmap, |
+ const gfx::Size& target_size) { |
+ return skia::ImageOperations::Resize( |
+ input_bitmap, |
+ skia::ImageOperations::RESIZE_GOOD, |
+ target_size.width(), |
+ target_size.height(), |
+ static_cast<SkBitmap::Allocator*>(NULL)); |
} |
-scoped_refptr<base::RefCountedBytes> ScaleRotateAndEncodeBitmap( |
- const SkBitmap& input_bitmap, |
- gfx::Size target_size_pre_rotation, |
- gfx::Display::Rotation rotation) { |
- SkBitmap bitmap = |
- ScaleAndRotateBitmap(input_bitmap, target_size_pre_rotation, rotation); |
+scoped_refptr<base::RefCountedBytes> EncodeBitmap(const SkBitmap& bitmap) { |
scoped_refptr<base::RefCountedBytes> png_data(new base::RefCountedBytes); |
unsigned char* pixels = |
reinterpret_cast<unsigned char*>(bitmap.pixelRef()->pixels()); |
@@ -94,10 +66,9 @@ scoped_refptr<base::RefCountedBytes> ScaleRotateAndEncodeBitmap( |
return png_data; |
} |
-void ScaleAndRotateCopyOutputResult( |
+void ScaleCopyOutputResult( |
const GrabWindowSnapshotAsyncCallback& callback, |
const gfx::Size& target_size, |
- gfx::Display::Rotation rotation, |
scoped_refptr<base::TaskRunner> background_task_runner, |
scoped_ptr<cc::CopyOutputResult> result) { |
if (result->IsEmpty()) { |
@@ -112,15 +83,12 @@ void ScaleAndRotateCopyOutputResult( |
base::PostTaskAndReplyWithResult( |
background_task_runner, |
FROM_HERE, |
- base::Bind( |
- ScaleAndRotateBitmap, *result->TakeBitmap(), target_size, rotation), |
+ base::Bind(ScaleBitmap, *result->TakeBitmap(), target_size), |
base::Bind(&OnFrameScalingFinished, callback)); |
} |
-void ScaleRotateAndEncodeCopyOutputResult( |
+void EncodeCopyOutputResult( |
const GrabWindowSnapshotAsyncPNGCallback& callback, |
- const gfx::Size& target_size, |
- gfx::Display::Rotation rotation, |
scoped_refptr<base::TaskRunner> background_task_runner, |
scoped_ptr<cc::CopyOutputResult> result) { |
if (result->IsEmpty()) { |
@@ -134,38 +102,11 @@ void ScaleRotateAndEncodeCopyOutputResult( |
// somewhere so that it can be reused here. |
base::PostTaskAndReplyWithResult(background_task_runner, |
FROM_HERE, |
- base::Bind(ScaleRotateAndEncodeBitmap, |
- *result->TakeBitmap(), |
- target_size, |
- rotation), |
+ base::Bind(EncodeBitmap, |
+ *result->TakeBitmap()), |
callback); |
} |
-gfx::Rect GetTargetBoundsFromWindow(gfx::NativeWindow window, |
- gfx::Rect snapshot_bounds) { |
- gfx::RectF read_pixels_bounds = snapshot_bounds; |
- |
- // We must take into account the window's position on the desktop. |
- read_pixels_bounds.Offset( |
- window->GetBoundsInRootWindow().origin().OffsetFromOrigin()); |
- aura::WindowEventDispatcher* dispatcher = window->GetDispatcher(); |
- if (dispatcher) |
- dispatcher->host()->GetRootTransform().TransformRect(&read_pixels_bounds); |
- |
- gfx::Rect read_pixels_bounds_in_pixel = |
- gfx::ToEnclosingRect(read_pixels_bounds); |
- |
- // Sometimes (i.e. when using Aero on Windows) the compositor's size is |
- // smaller than the window bounds. So trim appropriately. |
- ui::Compositor* compositor = window->layer()->GetCompositor(); |
- read_pixels_bounds_in_pixel.Intersect(gfx::Rect(compositor->size())); |
- |
- DCHECK_LE(0, read_pixels_bounds.x()); |
- DCHECK_LE(0, read_pixels_bounds.y()); |
- |
- return read_pixels_bounds_in_pixel; |
-} |
- |
} // namespace |
bool GrabViewSnapshot(gfx::NativeView view, |
@@ -197,31 +138,11 @@ void GrabWindowSnapshotAndScaleAsync( |
const gfx::Size& target_size, |
scoped_refptr<base::TaskRunner> background_task_runner, |
const GrabWindowSnapshotAsyncCallback& callback) { |
- // target_size is post-rotation, and so logically this is a rotate and then |
- // scale operation. However, it will usually be more efficient to scale first |
- // (given that this is mostly used for thumbnails) and then rotate. |
- gfx::Display::Rotation rotation = gfx::Screen::GetScreenFor(window) |
- ->GetDisplayNearestWindow(window) |
- .rotation(); |
- gfx::Size rotated_target_size; |
- switch (rotation) { |
- case gfx::Display::ROTATE_0: |
- case gfx::Display::ROTATE_180: |
- rotated_target_size = target_size; |
- break; |
- case gfx::Display::ROTATE_90: |
- case gfx::Display::ROTATE_270: |
- rotated_target_size = |
- gfx::Size(target_size.height(), target_size.width()); |
- break; |
- }; |
- |
MakeAsyncCopyRequest(window, |
source_rect, |
- base::Bind(&ScaleAndRotateCopyOutputResult, |
+ base::Bind(&ScaleCopyOutputResult, |
callback, |
- rotated_target_size, |
- rotation, |
+ target_size, |
background_task_runner)); |
} |
@@ -230,16 +151,10 @@ void GrabWindowSnapshotAsync( |
const gfx::Rect& source_rect, |
scoped_refptr<base::TaskRunner> background_task_runner, |
const GrabWindowSnapshotAsyncPNGCallback& callback) { |
- gfx::Size target_size = GetTargetBoundsFromWindow(window, source_rect).size(); |
- gfx::Display::Rotation rotation = gfx::Screen::GetScreenFor(window) |
- ->GetDisplayNearestWindow(window) |
- .rotation(); |
MakeAsyncCopyRequest(window, |
source_rect, |
- base::Bind(&ScaleRotateAndEncodeCopyOutputResult, |
+ base::Bind(&EncodeCopyOutputResult, |
callback, |
- target_size, |
- rotation, |
background_task_runner)); |
} |