Index: chrome/browser/chromeos/login/users/avatar/user_image_loader.cc |
diff --git a/chrome/browser/chromeos/login/users/avatar/user_image_loader.cc b/chrome/browser/chromeos/login/users/avatar/user_image_loader.cc |
index 17088c37b8f696be62bb2570811cb8cbb64f1c58..56bef09feb984115b398a10755dc6df35d56d4f3 100644 |
--- a/chrome/browser/chromeos/login/users/avatar/user_image_loader.cc |
+++ b/chrome/browser/chromeos/login/users/avatar/user_image_loader.cc |
@@ -31,6 +31,14 @@ UserImageLoader::ImageInfo::ImageInfo(const std::string& file_path, |
UserImageLoader::ImageInfo::~ImageInfo() { |
} |
+UserImageLoader::ImageData::ImageData(const ImageInfo& image_info, |
+ const std::string& data) |
+ : image_info(image_info), data(data.begin(), data.end()) { |
+} |
+ |
+UserImageLoader::ImageData::~ImageData() { |
+} |
+ |
UserImageLoader::UserImageLoader( |
ImageDecoder::ImageCodec image_codec, |
scoped_refptr<base::SequencedTaskRunner> background_task_runner) |
@@ -79,25 +87,22 @@ void UserImageLoader::DecodeImage(const scoped_ptr<std::string> data, |
const ImageInfo& image_info) { |
DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); |
- scoped_refptr<ImageDecoder> image_decoder = |
- new ImageDecoder(this, *data, image_codec_); |
- image_info_map_.insert(std::make_pair(image_decoder.get(), image_info)); |
- image_decoder->Start(background_task_runner_); |
+ ImageData image_data(image_info, *data); |
+ image_data_queue_.push(image_data); |
+ ImageDecoder::GetInstance()->Start(this, *data, image_codec_, |
+ background_task_runner_, false); |
} |
-void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder, |
- const SkBitmap& decoded_image) { |
+void UserImageLoader::OnImageDecoded(const SkBitmap& decoded_image) { |
DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); |
- ImageInfoMap::iterator it = image_info_map_.find(decoder); |
- if (it == image_info_map_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- const std::string file_path = it->second.file_path; |
- const int target_size = it->second.pixels_per_side; |
- const LoadedCallback loaded_cb = it->second.loaded_cb; |
- image_info_map_.erase(it); |
+ const ImageData& image_data = image_data_queue_.front(); |
+ const ImageInfo& image_info = image_data.image_info; |
+ const std::string file_path = image_info.file_path; |
+ const int target_size = image_info.pixels_per_side; |
+ const LoadedCallback loaded_cb = image_info.loaded_cb; |
+ std::vector<unsigned char> original_data = image_data.data; |
+ image_data_queue_.pop(); |
dcheng
2015/03/19 14:25:46
After thinking about this, I feel uncomfortable wi
Theresa
2015/03/19 21:54:56
I created a UserImageLoader::ImageRequest subclass
dcheng
2015/03/20 00:14:45
I think it's OK for those single-shot instances to
Theresa
2015/03/20 19:09:01
Done.
|
SkBitmap final_image = decoded_image; |
@@ -126,8 +131,7 @@ void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder, |
gfx::ImageSkia final_image_skia = |
gfx::ImageSkia::CreateFrom1xBitmap(final_image); |
final_image_skia.MakeThreadSafe(); |
- user_manager::UserImage user_image(final_image_skia, |
- decoder->get_image_data()); |
+ user_manager::UserImage user_image(final_image_skia, original_data); |
user_image.set_file_path(file_path); |
if (image_codec_ == ImageDecoder::ROBUST_JPEG_CODEC) |
user_image.MarkAsSafe(); |
@@ -135,16 +139,12 @@ void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder, |
base::Bind(loaded_cb, user_image)); |
} |
-void UserImageLoader::OnDecodeImageFailed(const ImageDecoder* decoder) { |
+void UserImageLoader::OnDecodeImageFailed() { |
DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); |
- ImageInfoMap::iterator it = image_info_map_.find(decoder); |
- if (it == image_info_map_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- const LoadedCallback loaded_cb = it->second.loaded_cb; |
- image_info_map_.erase(it); |
+ ImageInfo image_info = image_data_queue_.front().image_info; |
+ const LoadedCallback loaded_cb = image_info.loaded_cb; |
+ image_data_queue_.pop(); |
foreground_task_runner_->PostTask( |
FROM_HERE, base::Bind(loaded_cb, user_manager::UserImage())); |