Index: chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc |
diff --git a/chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc b/chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc |
index 70e1d09d04902aeb1abf6bf254e726514ca47d77..05323cb3f0ac0dfb10da2f57eaeb5be3a4f02cc5 100644 |
--- a/chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc |
+++ b/chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc |
@@ -7,92 +7,16 @@ |
#include "ash/desktop_background/desktop_background_controller.h" |
#include "ash/shell.h" |
#include "base/debug/trace_event.h" |
-#include "base/synchronization/cancellation_flag.h" |
-#include "base/threading/worker_pool.h" |
#include "chrome/browser/chromeos/login/user_manager.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/simple_png_encoder.h" |
#include "chrome/common/url_constants.h" |
#include "content/public/browser/browser_thread.h" |
#include "grit/ui_resources.h" |
#include "net/base/mime_util.h" |
-#include "ui/gfx/codec/png_codec.h" |
-#include "ui/gfx/size.h" |
-#include "ui/gfx/skia_util.h" |
- |
-extern "C" { |
-#if defined(USE_SYSTEM_ZLIB) |
-#include <zlib.h> |
-#else |
-#include "third_party/zlib/zlib.h" |
-#endif |
-} |
namespace chromeos { |
namespace options2 { |
-// Operation class that encodes existing in-memory image as PNG. |
-// It uses NO-COMPRESSION to save time. |
-class WallpaperImageSource::WallpaperEncodingOperation |
- : public base::RefCountedThreadSafe< |
- WallpaperImageSource::WallpaperEncodingOperation> { |
- public: |
- WallpaperEncodingOperation( |
- int request_id, |
- scoped_refptr<base::RefCountedBytes> data, |
- SkBitmap image) |
- : request_id_(request_id), |
- data_(data), |
- image_(image) { |
- } |
- |
- static void Run(scoped_refptr<WallpaperEncodingOperation> weo) { |
- weo->EncodeWallpaper(); |
- } |
- |
- int request_id() { |
- return request_id_; |
- } |
- |
- void EncodeWallpaper() { |
- if (cancel_flag_.IsSet()) |
- return; |
- TRACE_EVENT0("LOCK_SCREEN", "imageEncoding"); |
- SkAutoLockPixels lock_input(image_); |
- // Avoid compression to make things faster. |
- gfx::PNGCodec::EncodeWithCompressionLevel( |
- reinterpret_cast<unsigned char*>(image_.getAddr32(0, 0)), |
- gfx::PNGCodec::FORMAT_SkBitmap, |
- gfx::Size(image_.width(), image_.height()), |
- image_.width() * image_.bytesPerPixel(), |
- false, |
- std::vector<gfx::PNGCodec::Comment>(), |
- Z_NO_COMPRESSION, |
- &data_->data()); |
- if (cancel_flag_.IsSet()) |
- return; |
- } |
- |
- void Cancel() { |
- cancel_flag_.Set(); |
- } |
- |
- private: |
- friend class base::RefCountedThreadSafe< |
- WallpaperImageSource::WallpaperEncodingOperation>; |
- |
- ~WallpaperEncodingOperation() {} |
- |
- base::CancellationFlag cancel_flag_; |
- |
- // ID of original request. |
- int request_id_; |
- // Buffer to store encoded image. |
- scoped_refptr<base::RefCountedBytes> data_; |
- // Original image to encode. |
- SkBitmap image_; |
- |
- DISALLOW_COPY_AND_ASSIGN(WallpaperEncodingOperation); |
-}; |
- |
WallpaperImageSource::WallpaperImageSource() |
: DataSource(chrome::kChromeUIWallpaperImageHost, NULL), |
weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
@@ -143,31 +67,37 @@ void WallpaperImageSource::ImageAcquired(SkBitmap image, |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
CancelPendingEncodingOperation(); |
scoped_refptr<base::RefCountedBytes> data = new base::RefCountedBytes(); |
- wallpaper_encoding_op_ = new WallpaperEncodingOperation(request_id, |
- data, |
- image); |
- base::WorkerPool::PostTaskAndReply( |
- FROM_HERE, |
- base::Bind(&WallpaperEncodingOperation::Run, wallpaper_encoding_op_), |
+ |
+ png_encoder_ = new SimplePngEncoder( |
+ data, |
+ image, |
+ base::Bind(&WallpaperImageSource::CancelCallback, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ request_id)); |
+ |
+ TRACE_EVENT0("LOCK_SCREEN", "imageEncoding"); |
+ png_encoder_->Run( |
base::Bind(&WallpaperImageSource::SendCurrentUserWallpaper, |
- weak_ptr_factory_.GetWeakPtr(), request_id, data), |
- true /* task_is_slow */); |
+ weak_ptr_factory_.GetWeakPtr(), |
+ request_id)); |
}; |
void WallpaperImageSource::CancelPendingEncodingOperation() { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
// Set canceled flag of previous request to skip unneeded encoding. |
- if (wallpaper_encoding_op_.get()) { |
- wallpaper_encoding_op_->Cancel(); |
- SendResponse(wallpaper_encoding_op_->request_id(), NULL); |
- TRACE_EVENT_ASYNC_END0("SCREEN_LOCK", "GetUserWallpaper", |
- wallpaper_encoding_op_->request_id()); |
+ if (png_encoder_.get()) { |
+ png_encoder_->Cancel(); |
} |
- // Cancel reply callback for previous request. |
+ // Cancel the callback for the previous request. |
weak_ptr_factory_.InvalidateWeakPtrs(); |
} |
+void WallpaperImageSource::CancelCallback(int request_id) { |
+ SendResponse(request_id, NULL); |
+ TRACE_EVENT_ASYNC_END0("SCREEN_LOCK", "GetUserWallpaper", request_id); |
+} |
+ |
void WallpaperImageSource::SendCurrentUserWallpaper(int request_id, |
scoped_refptr<base::RefCountedBytes> data) { |
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |