| Index: ash/desktop_background/wallpaper_resizer.cc
|
| diff --git a/ash/desktop_background/wallpaper_resizer.cc b/ash/desktop_background/wallpaper_resizer.cc
|
| index c7e1dda1a466553443a91c46a5e5ad57ffd63695..b75e262e25f2ac8dbd1bb81a7e465a11fc21acaf 100644
|
| --- a/ash/desktop_background/wallpaper_resizer.cc
|
| +++ b/ash/desktop_background/wallpaper_resizer.cc
|
| @@ -18,91 +18,95 @@ using content::BrowserThread;
|
| namespace ash {
|
| namespace {
|
|
|
| -// Callback used to indicate that wallpaper has been resized.
|
| -typedef base::Callback<void(const SkBitmap&)> ResizedCallback;
|
| -
|
| // For our scaling ratios we need to round positive numbers.
|
| int RoundPositive(double x) {
|
| return static_cast<int>(floor(x + 0.5));
|
| }
|
|
|
| -// Resizes |wallpaper| to |target_size| and calls the callback.
|
| -void Resize(const SkBitmap& wallpaper,
|
| - WallpaperLayout layout,
|
| +// Resizes |orig_bitmap| to |target_size| using |layout| and stores the
|
| +// resulting bitmap at |resized_bitmap_out|.
|
| +void Resize(SkBitmap orig_bitmap,
|
| const gfx::Size& target_size,
|
| - base::MessageLoop* origin_loop,
|
| - const ResizedCallback& callback) {
|
| - SkBitmap resized_wallpaper = wallpaper;
|
| - int width = target_size.width();
|
| - int height = target_size.height();
|
| - if (wallpaper.width() > width || wallpaper.height() > height) {
|
| - gfx::Rect wallpaper_rect(0, 0, wallpaper.width(), wallpaper.height());
|
| - gfx::Size cropped_size = gfx::Size(std::min(width, wallpaper.width()),
|
| - std::min(height, wallpaper.height()));
|
| + WallpaperLayout layout,
|
| + SkBitmap* resized_bitmap_out) {
|
| + DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
|
| + SkBitmap new_bitmap = orig_bitmap;
|
| +
|
| + const int orig_width = orig_bitmap.width();
|
| + const int orig_height = orig_bitmap.height();
|
| + const int new_width = target_size.width();
|
| + const int new_height = target_size.height();
|
| +
|
| + if (orig_width > new_width || orig_height > new_height) {
|
| + gfx::Rect wallpaper_rect(0, 0, orig_width, orig_height);
|
| + gfx::Size cropped_size = gfx::Size(std::min(new_width, orig_width),
|
| + std::min(new_height, orig_height));
|
| switch (layout) {
|
| case WALLPAPER_LAYOUT_CENTER:
|
| wallpaper_rect.ClampToCenteredSize(cropped_size);
|
| - wallpaper.extractSubset(&resized_wallpaper,
|
| - gfx::RectToSkIRect(wallpaper_rect));
|
| + orig_bitmap.extractSubset(&new_bitmap,
|
| + gfx::RectToSkIRect(wallpaper_rect));
|
| break;
|
| case WALLPAPER_LAYOUT_TILE:
|
| wallpaper_rect.set_size(cropped_size);
|
| - wallpaper.extractSubset(&resized_wallpaper,
|
| - gfx::RectToSkIRect(wallpaper_rect));
|
| + orig_bitmap.extractSubset(&new_bitmap,
|
| + gfx::RectToSkIRect(wallpaper_rect));
|
| break;
|
| case WALLPAPER_LAYOUT_STRETCH:
|
| - resized_wallpaper = skia::ImageOperations::Resize(
|
| - wallpaper, skia::ImageOperations::RESIZE_LANCZOS3,
|
| - width, height);
|
| + new_bitmap = skia::ImageOperations::Resize(
|
| + orig_bitmap, skia::ImageOperations::RESIZE_LANCZOS3,
|
| + new_width, new_height);
|
| break;
|
| case WALLPAPER_LAYOUT_CENTER_CROPPED:
|
| - if (wallpaper.width() > width && wallpaper.height() > height) {
|
| + if (orig_width > new_width && orig_height > new_height) {
|
| // The dimension with the smallest ratio must be cropped, the other
|
| // one is preserved. Both are set in gfx::Size cropped_size.
|
| - double horizontal_ratio = static_cast<double>(width) /
|
| - static_cast<double>(wallpaper.width());
|
| - double vertical_ratio = static_cast<double>(height) /
|
| - static_cast<double>(wallpaper.height());
|
| + double horizontal_ratio = static_cast<double>(new_width) /
|
| + static_cast<double>(orig_width);
|
| + double vertical_ratio = static_cast<double>(new_height) /
|
| + static_cast<double>(orig_height);
|
|
|
| if (vertical_ratio > horizontal_ratio) {
|
| cropped_size = gfx::Size(
|
| - RoundPositive(static_cast<double>(width) / vertical_ratio),
|
| - wallpaper.height());
|
| + RoundPositive(static_cast<double>(new_width) / vertical_ratio),
|
| + orig_height);
|
| } else {
|
| - cropped_size = gfx::Size(wallpaper.width(),
|
| - RoundPositive(static_cast<double>(height) / horizontal_ratio));
|
| + cropped_size = gfx::Size(orig_width, RoundPositive(
|
| + static_cast<double>(new_height) / horizontal_ratio));
|
| }
|
| wallpaper_rect.ClampToCenteredSize(cropped_size);
|
| SkBitmap sub_image;
|
| - wallpaper.extractSubset(&sub_image,
|
| - gfx::RectToSkIRect(wallpaper_rect));
|
| - resized_wallpaper = skia::ImageOperations::Resize(
|
| + orig_bitmap.extractSubset(&sub_image,
|
| + gfx::RectToSkIRect(wallpaper_rect));
|
| + new_bitmap = skia::ImageOperations::Resize(
|
| sub_image, skia::ImageOperations::RESIZE_LANCZOS3,
|
| - width, height);
|
| + new_width, new_height);
|
| }
|
| }
|
| }
|
| - resized_wallpaper.setImmutable();
|
| - origin_loop->PostTask(FROM_HERE, base::Bind(callback, resized_wallpaper));
|
| +
|
| + *resized_bitmap_out = new_bitmap;
|
| + resized_bitmap_out->setImmutable();
|
| }
|
|
|
| } // namespace
|
|
|
| -WallpaperResizer::WallpaperResizer(const WallpaperInfo& info,
|
| - const gfx::Size& target_size)
|
| - : wallpaper_info_(info),
|
| +WallpaperResizer::WallpaperResizer(int image_resource_id,
|
| + const gfx::Size& target_size,
|
| + WallpaperLayout layout)
|
| + : wallpaper_image_(*(ui::ResourceBundle::GetSharedInstance().
|
| + GetImageNamed(image_resource_id).ToImageSkia())),
|
| target_size_(target_size),
|
| - wallpaper_image_(*(ui::ResourceBundle::GetSharedInstance().
|
| - GetImageNamed(info.idr).ToImageSkia())),
|
| + layout_(layout),
|
| weak_ptr_factory_(this) {
|
| }
|
|
|
| -WallpaperResizer::WallpaperResizer(const WallpaperInfo& info,
|
| +WallpaperResizer::WallpaperResizer(const gfx::ImageSkia& image,
|
| const gfx::Size& target_size,
|
| - const gfx::ImageSkia& image)
|
| - : wallpaper_info_(info),
|
| + WallpaperLayout layout)
|
| + : wallpaper_image_(image),
|
| target_size_(target_size),
|
| - wallpaper_image_(image),
|
| + layout_(layout),
|
| weak_ptr_factory_(this) {
|
| }
|
|
|
| @@ -110,18 +114,17 @@ WallpaperResizer::~WallpaperResizer() {
|
| }
|
|
|
| void WallpaperResizer::StartResize() {
|
| - if (!BrowserThread::GetBlockingPool()->PostWorkerTaskWithShutdownBehavior(
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + SkBitmap* resized_bitmap = new SkBitmap;
|
| + if (!content::BrowserThread::PostBlockingPoolTaskAndReply(
|
| FROM_HERE,
|
| - base::Bind(&Resize,
|
| - *wallpaper_image_.bitmap(),
|
| - wallpaper_info_.layout,
|
| - target_size_,
|
| - base::MessageLoop::current(),
|
| - base::Bind(&WallpaperResizer::OnResizeFinished,
|
| - weak_ptr_factory_.GetWeakPtr())),
|
| - base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN)) {
|
| - LOG(WARNING) << "PostSequencedWorkerTask failed. " <<
|
| - "Wallpaper may not be resized.";
|
| + base::Bind(&Resize, *wallpaper_image_.bitmap(), target_size_,
|
| + layout_, resized_bitmap),
|
| + base::Bind(&WallpaperResizer::OnResizeFinished,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Owned(resized_bitmap)))) {
|
| + LOG(WARNING) << "PostSequencedWorkerTask failed. "
|
| + << "Wallpaper may not be resized.";
|
| }
|
| }
|
|
|
| @@ -133,8 +136,9 @@ void WallpaperResizer::RemoveObserver(WallpaperResizerObserver* observer) {
|
| observers_.RemoveObserver(observer);
|
| }
|
|
|
| -void WallpaperResizer::OnResizeFinished(const SkBitmap& resized_wallpaper) {
|
| - wallpaper_image_ = gfx::ImageSkia::CreateFrom1xBitmap(resized_wallpaper);
|
| +void WallpaperResizer::OnResizeFinished(SkBitmap* resized_bitmap) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + wallpaper_image_ = gfx::ImageSkia::CreateFrom1xBitmap(*resized_bitmap);
|
| FOR_EACH_OBSERVER(WallpaperResizerObserver, observers_,
|
| OnWallpaperResized());
|
| }
|
|
|