Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Unified Diff: chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc

Issue 10824006: Revert 148272 - Refactor the wallpaper encoding to another file/class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/webui/options2/chromeos/wallpaper_source.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc
===================================================================
--- chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc (revision 148277)
+++ chrome/browser/ui/webui/options2/chromeos/wallpaper_source.cc (working copy)
@@ -7,16 +7,92 @@
#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)) {
@@ -67,37 +143,31 @@
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
CancelPendingEncodingOperation();
scoped_refptr<base::RefCountedBytes> data = new base::RefCountedBytes();
-
- png_encoder_ = new SimplePngEncoder(
- data,
- image,
- base::Bind(&WallpaperImageSource::CancelCallback,
- weak_ptr_factory_.GetWeakPtr(),
- request_id));
-
- TRACE_EVENT0("LOCK_SCREEN", "imageEncoding");
- png_encoder_->Run(
+ wallpaper_encoding_op_ = new WallpaperEncodingOperation(request_id,
+ data,
+ image);
+ base::WorkerPool::PostTaskAndReply(
+ FROM_HERE,
+ base::Bind(&WallpaperEncodingOperation::Run, wallpaper_encoding_op_),
base::Bind(&WallpaperImageSource::SendCurrentUserWallpaper,
- weak_ptr_factory_.GetWeakPtr(),
- request_id));
+ weak_ptr_factory_.GetWeakPtr(), request_id, data),
+ true /* task_is_slow */);
};
void WallpaperImageSource::CancelPendingEncodingOperation() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
// Set canceled flag of previous request to skip unneeded encoding.
- if (png_encoder_.get()) {
- png_encoder_->Cancel();
+ 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());
}
- // Cancel the callback for the previous request.
+ // Cancel reply callback for 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));
« no previous file with comments | « chrome/browser/ui/webui/options2/chromeos/wallpaper_source.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698