Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/wallpaper/wallpaper_color_calculator.h" | 5 #include "components/wallpaper/wallpaper_color_calculator.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
| 12 #include "base/task_runner.h" | 12 #include "base/task_runner.h" |
| 13 #include "base/task_runner_util.h" | 13 #include "base/task_runner_util.h" |
| 14 #include "components/wallpaper/wallpaper_color_calculator_observer.h" | 14 #include "components/wallpaper/wallpaper_color_calculator_observer.h" |
| 15 | 15 |
| 16 namespace wallpaper { | 16 namespace wallpaper { |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 // The largest image size, in pixels, to synchronously calculate the prominent | 20 // The largest image size, in pixels, to synchronously calculate the prominent |
| 21 // color. This is a simple heuristic optimization because extraction on images | 21 // color. This is a simple heuristic optimization because extraction on images |
| 22 // smaller than this should run very quickly, and offloading the task to another | 22 // smaller than this should run very quickly, and offloading the task to another |
| 23 // thread would actually take longer. | 23 // thread would actually take longer. |
| 24 const int kMaxPixelsForSynchronousCalculation = 100; | 24 const int kMaxPixelsForSynchronousCalculation = 100; |
| 25 | 25 |
| 26 // Wrapper for color_utils::CalculateProminentColorOfBitmap() that records | 26 // Wrapper for color_utils::CalculateProminentColorsOfBitmap() that records |
| 27 // wallpaper specific metrics. | 27 // wallpaper specific metrics. |
| 28 // | 28 // |
| 29 // NOTE: |image| is intentionally a copy to ensure it exists for the duration of | 29 // NOTE: |image| is intentionally a copy to ensure it exists for the duration of |
| 30 // the calculation. | 30 // the calculation. |
| 31 SkColor CalculateWallpaperColor(const gfx::ImageSkia image, | 31 std::vector<SkColor> CalculateWallpaperColor( |
| 32 color_utils::LumaRange luma, | 32 const gfx::ImageSkia image, |
| 33 color_utils::SaturationRange saturation) { | 33 const color_utils::ColorProfiles& color_profiles) { |
| 34 base::TimeTicks start_time = base::TimeTicks::Now(); | 34 base::TimeTicks start_time = base::TimeTicks::Now(); |
| 35 const SkColor prominent_color = color_utils::CalculateProminentColorOfBitmap( | 35 const std::vector<SkColor> prominent_colors = |
| 36 *image.bitmap(), luma, saturation); | 36 color_utils::CalculateProminentColorsOfBitmap(*image.bitmap(), |
| 37 color_profiles); | |
| 37 | 38 |
| 38 UMA_HISTOGRAM_TIMES("Ash.Wallpaper.ColorExtraction.Durations", | 39 // TODO(warx): reconsider these UMAs for multiple colors calculation. |
|
Qiang(Joe) Xu
2017/06/19 22:51:30
This is a workaround to please the wallpaper_color
| |
| 39 base::TimeTicks::Now() - start_time); | 40 if (1u == color_profiles.size()) { |
| 40 UMA_HISTOGRAM_BOOLEAN("Ash.Wallpaper.ColorExtractionResult", | 41 UMA_HISTOGRAM_TIMES("Ash.Wallpaper.ColorExtraction.Durations", |
| 41 prominent_color != SK_ColorTRANSPARENT); | 42 base::TimeTicks::Now() - start_time); |
| 43 UMA_HISTOGRAM_BOOLEAN("Ash.Wallpaper.ColorExtractionResult", | |
| 44 prominent_colors[0] != SK_ColorTRANSPARENT); | |
| 45 } | |
| 42 | 46 |
| 43 return prominent_color; | 47 return prominent_colors; |
| 44 } | 48 } |
| 45 | 49 |
| 46 bool ShouldCalculateSync(const gfx::ImageSkia& image) { | 50 bool ShouldCalculateSync(const gfx::ImageSkia& image) { |
| 47 return image.width() * image.height() <= kMaxPixelsForSynchronousCalculation; | 51 return image.width() * image.height() <= kMaxPixelsForSynchronousCalculation; |
| 48 } | 52 } |
| 49 | 53 |
| 50 } // namespace | 54 } // namespace |
| 51 | 55 |
| 52 WallpaperColorCalculator::WallpaperColorCalculator( | 56 WallpaperColorCalculator::WallpaperColorCalculator( |
| 53 const gfx::ImageSkia& image, | 57 const gfx::ImageSkia& image, |
| 54 color_utils::LumaRange luma, | 58 const color_utils::ColorProfiles& color_profiles, |
| 55 color_utils::SaturationRange saturation, | |
| 56 scoped_refptr<base::TaskRunner> task_runner) | 59 scoped_refptr<base::TaskRunner> task_runner) |
| 57 : image_(image), | 60 : image_(image), |
| 58 luma_(luma), | 61 color_profiles_(color_profiles), |
| 59 saturation_(saturation), | |
| 60 task_runner_(std::move(task_runner)), | 62 task_runner_(std::move(task_runner)), |
| 61 weak_ptr_factory_(this) {} | 63 weak_ptr_factory_(this) { |
| 64 prominent_colors_ = | |
| 65 std::vector<SkColor>(color_profiles_.size(), SK_ColorTRANSPARENT); | |
| 66 } | |
| 62 | 67 |
| 63 WallpaperColorCalculator::~WallpaperColorCalculator() {} | 68 WallpaperColorCalculator::~WallpaperColorCalculator() = default; |
| 64 | 69 |
| 65 void WallpaperColorCalculator::AddObserver( | 70 void WallpaperColorCalculator::AddObserver( |
| 66 WallpaperColorCalculatorObserver* observer) { | 71 WallpaperColorCalculatorObserver* observer) { |
| 67 observers_.AddObserver(observer); | 72 observers_.AddObserver(observer); |
| 68 } | 73 } |
| 69 | 74 |
| 70 void WallpaperColorCalculator::RemoveObserver( | 75 void WallpaperColorCalculator::RemoveObserver( |
| 71 WallpaperColorCalculatorObserver* observer) { | 76 WallpaperColorCalculatorObserver* observer) { |
| 72 observers_.RemoveObserver(observer); | 77 observers_.RemoveObserver(observer); |
| 73 } | 78 } |
| 74 | 79 |
| 75 bool WallpaperColorCalculator::StartCalculation() { | 80 bool WallpaperColorCalculator::StartCalculation() { |
| 76 if (ShouldCalculateSync(image_)) { | 81 if (ShouldCalculateSync(image_)) { |
| 77 const SkColor prominent_color = | 82 const std::vector<SkColor> prominent_colors = |
| 78 CalculateWallpaperColor(image_, luma_, saturation_); | 83 CalculateWallpaperColor(image_, color_profiles_); |
| 79 NotifyCalculationComplete(prominent_color); | 84 NotifyCalculationComplete(prominent_colors); |
| 80 return true; | 85 return true; |
| 81 } | 86 } |
| 82 | 87 |
| 83 image_.MakeThreadSafe(); | 88 image_.MakeThreadSafe(); |
| 84 if (base::PostTaskAndReplyWithResult( | 89 if (base::PostTaskAndReplyWithResult( |
| 85 task_runner_.get(), FROM_HERE, | 90 task_runner_.get(), FROM_HERE, |
| 86 base::Bind(&CalculateWallpaperColor, image_, luma_, saturation_), | 91 base::Bind(&CalculateWallpaperColor, image_, color_profiles_), |
| 87 base::Bind(&WallpaperColorCalculator::OnAsyncCalculationComplete, | 92 base::Bind(&WallpaperColorCalculator::OnAsyncCalculationComplete, |
| 88 weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now()))) { | 93 weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now()))) { |
| 89 return true; | 94 return true; |
| 90 } | 95 } |
| 91 | 96 |
| 92 LOG(WARNING) << "PostSequencedWorkerTask failed. " | 97 LOG(WARNING) << "PostSequencedWorkerTask failed. " |
| 93 << "Wallpaper promiment color may not be calculated."; | 98 << "Wallpaper prominent colors may not be calculated."; |
| 94 | 99 |
| 95 prominent_color_ = SK_ColorTRANSPARENT; | 100 prominent_colors_ = |
| 101 std::vector<SkColor>(color_profiles_.size(), SK_ColorTRANSPARENT); | |
| 96 return false; | 102 return false; |
| 97 } | 103 } |
| 98 | 104 |
| 99 void WallpaperColorCalculator::SetTaskRunnerForTest( | 105 void WallpaperColorCalculator::SetTaskRunnerForTest( |
| 100 scoped_refptr<base::TaskRunner> task_runner) { | 106 scoped_refptr<base::TaskRunner> task_runner) { |
| 101 task_runner_ = task_runner; | 107 task_runner_ = task_runner; |
| 102 } | 108 } |
| 103 | 109 |
| 104 void WallpaperColorCalculator::OnAsyncCalculationComplete( | 110 void WallpaperColorCalculator::OnAsyncCalculationComplete( |
| 105 base::TimeTicks async_start_time, | 111 base::TimeTicks async_start_time, |
| 106 SkColor prominent_color) { | 112 const std::vector<SkColor>& prominent_colors) { |
| 107 UMA_HISTOGRAM_TIMES("Ash.Wallpaper.ColorExtraction.UserDelay", | 113 UMA_HISTOGRAM_TIMES("Ash.Wallpaper.ColorExtraction.UserDelay", |
| 108 base::TimeTicks::Now() - async_start_time); | 114 base::TimeTicks::Now() - async_start_time); |
| 109 NotifyCalculationComplete(prominent_color); | 115 NotifyCalculationComplete(prominent_colors); |
| 110 } | 116 } |
| 111 | 117 |
| 112 void WallpaperColorCalculator::NotifyCalculationComplete( | 118 void WallpaperColorCalculator::NotifyCalculationComplete( |
| 113 SkColor prominent_color) { | 119 const std::vector<SkColor>& prominent_colors) { |
| 114 prominent_color_ = prominent_color; | 120 prominent_colors_ = prominent_colors; |
| 115 for (auto& observer : observers_) | 121 for (auto& observer : observers_) |
| 116 observer.OnColorCalculationComplete(); | 122 observer.OnColorCalculationComplete(); |
| 117 | 123 |
| 118 // This could be deleted! | 124 // This could be deleted! |
| 119 } | 125 } |
| 120 | 126 |
| 121 } // namespace wallpaper | 127 } // namespace wallpaper |
| OLD | NEW |