| Index: ui/snapshot/snapshot_aura.cc
 | 
| diff --git a/ui/snapshot/snapshot_aura.cc b/ui/snapshot/snapshot_aura.cc
 | 
| index a360b87e116ff5f75bd5af4516976264cf5fea9d..fbf898b4c60f7e7e91eaf02291353501f8e2eaf9 100644
 | 
| --- a/ui/snapshot/snapshot_aura.cc
 | 
| +++ b/ui/snapshot/snapshot_aura.cc
 | 
| @@ -6,109 +6,18 @@
 | 
|  
 | 
|  #include "base/bind.h"
 | 
|  #include "base/callback.h"
 | 
| -#include "base/logging.h"
 | 
| -#include "base/numerics/safe_conversions.h"
 | 
|  #include "base/task_runner_util.h"
 | 
|  #include "cc/output/copy_output_request.h"
 | 
|  #include "cc/output/copy_output_result.h"
 | 
| -#include "skia/ext/image_operations.h"
 | 
|  #include "third_party/skia/include/core/SkBitmap.h"
 | 
| -#include "third_party/skia/include/core/SkPixelRef.h"
 | 
|  #include "ui/aura/window.h"
 | 
| -#include "ui/aura/window_event_dispatcher.h"
 | 
|  #include "ui/compositor/compositor.h"
 | 
|  #include "ui/compositor/dip_util.h"
 | 
|  #include "ui/compositor/layer.h"
 | 
| -#include "ui/gfx/codec/png_codec.h"
 | 
| -#include "ui/gfx/display.h"
 | 
| -#include "ui/gfx/image/image.h"
 | 
| -#include "ui/gfx/image/image_skia.h"
 | 
| -#include "ui/gfx/rect.h"
 | 
| -#include "ui/gfx/rect_conversions.h"
 | 
| -#include "ui/gfx/rect_f.h"
 | 
| -#include "ui/gfx/screen.h"
 | 
| -#include "ui/gfx/skbitmap_operations.h"
 | 
| -#include "ui/gfx/transform.h"
 | 
| +#include "ui/snapshot/snapshot_async.h"
 | 
|  
 | 
|  namespace ui {
 | 
|  
 | 
| -namespace {
 | 
| -
 | 
| -void OnFrameScalingFinished(
 | 
| -    const GrabWindowSnapshotAsyncCallback& callback,
 | 
| -    const SkBitmap& scaled_bitmap) {
 | 
| -  callback.Run(gfx::Image(gfx::ImageSkia::CreateFrom1xBitmap(scaled_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> EncodeBitmap(const SkBitmap& bitmap) {
 | 
| -  scoped_refptr<base::RefCountedBytes> png_data(new base::RefCountedBytes);
 | 
| -  unsigned char* pixels =
 | 
| -      reinterpret_cast<unsigned char*>(bitmap.pixelRef()->pixels());
 | 
| -  if (!gfx::PNGCodec::Encode(pixels,
 | 
| -                             gfx::PNGCodec::FORMAT_BGRA,
 | 
| -                             gfx::Size(bitmap.width(), bitmap.height()),
 | 
| -                             base::checked_cast<int>(bitmap.rowBytes()),
 | 
| -                             true,
 | 
| -                             std::vector<gfx::PNGCodec::Comment>(),
 | 
| -                             &png_data->data())) {
 | 
| -    return scoped_refptr<base::RefCountedBytes>();
 | 
| -  }
 | 
| -  return png_data;
 | 
| -}
 | 
| -
 | 
| -void ScaleCopyOutputResult(
 | 
| -    const GrabWindowSnapshotAsyncCallback& callback,
 | 
| -    const gfx::Size& target_size,
 | 
| -    scoped_refptr<base::TaskRunner> background_task_runner,
 | 
| -    scoped_ptr<cc::CopyOutputResult> result) {
 | 
| -  if (result->IsEmpty()) {
 | 
| -    callback.Run(gfx::Image());
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // TODO(sergeyu): Potentially images can be scaled on GPU before reading it
 | 
| -  // from GPU. Image scaling is implemented in content::GlHelper, but it's can't
 | 
| -  // be used here because it's not in content/public. Move the scaling code
 | 
| -  // somewhere so that it can be reused here.
 | 
| -  base::PostTaskAndReplyWithResult(
 | 
| -      background_task_runner,
 | 
| -      FROM_HERE,
 | 
| -      base::Bind(ScaleBitmap, *result->TakeBitmap(), target_size),
 | 
| -      base::Bind(&OnFrameScalingFinished, callback));
 | 
| -}
 | 
| -
 | 
| -void EncodeCopyOutputResult(
 | 
| -    const GrabWindowSnapshotAsyncPNGCallback& callback,
 | 
| -    scoped_refptr<base::TaskRunner> background_task_runner,
 | 
| -    scoped_ptr<cc::CopyOutputResult> result) {
 | 
| -  if (result->IsEmpty()) {
 | 
| -    callback.Run(scoped_refptr<base::RefCountedBytes>());
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // TODO(sergeyu): Potentially images can be scaled on GPU before reading it
 | 
| -  // from GPU. Image scaling is implemented in content::GlHelper, but it's can't
 | 
| -  // be used here because it's not in content/public. Move the scaling code
 | 
| -  // somewhere so that it can be reused here.
 | 
| -  base::PostTaskAndReplyWithResult(background_task_runner,
 | 
| -                                   FROM_HERE,
 | 
| -                                   base::Bind(EncodeBitmap,
 | 
| -                                              *result->TakeBitmap()),
 | 
| -                                   callback);
 | 
| -}
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
|  bool GrabViewSnapshot(gfx::NativeView view,
 | 
|                        std::vector<unsigned char>* png_representation,
 | 
|                        const gfx::Rect& snapshot_bounds) {
 | 
| @@ -122,7 +31,7 @@ bool GrabWindowSnapshot(gfx::NativeWindow window,
 | 
|    return false;
 | 
|  }
 | 
|  
 | 
| -void MakeAsyncCopyRequest(
 | 
| +static void MakeAsyncCopyRequest(
 | 
|      gfx::NativeWindow window,
 | 
|      const gfx::Rect& source_rect,
 | 
|      const cc::CopyOutputRequest::CopyOutputRequestCallback& callback) {
 | 
| @@ -140,7 +49,7 @@ void GrabWindowSnapshotAndScaleAsync(
 | 
|      const GrabWindowSnapshotAsyncCallback& callback) {
 | 
|    MakeAsyncCopyRequest(window,
 | 
|                         source_rect,
 | 
| -                       base::Bind(&ScaleCopyOutputResult,
 | 
| +                       base::Bind(&SnapshotAsync::ScaleCopyOutputResult,
 | 
|                                    callback,
 | 
|                                    target_size,
 | 
|                                    background_task_runner));
 | 
| @@ -153,7 +62,7 @@ void GrabWindowSnapshotAsync(
 | 
|      const GrabWindowSnapshotAsyncPNGCallback& callback) {
 | 
|    MakeAsyncCopyRequest(window,
 | 
|                         source_rect,
 | 
| -                       base::Bind(&EncodeCopyOutputResult,
 | 
| +                       base::Bind(&SnapshotAsync::EncodeCopyOutputResult,
 | 
|                                    callback,
 | 
|                                    background_task_runner));
 | 
|  }
 | 
| 
 |