OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/chromeos/login/user_image_loader.h" | 5 #include "chrome/browser/chromeos/login/user_image_loader.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
12 #include "base/threading/worker_pool.h" | |
12 #include "chrome/browser/chromeos/login/helper.h" | 13 #include "chrome/browser/chromeos/login/helper.h" |
13 #include "chrome/browser/chromeos/login/user_image.h" | 14 #include "chrome/browser/chromeos/login/user_image.h" |
14 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
15 #include "skia/ext/image_operations.h" | 16 #include "skia/ext/image_operations.h" |
16 #include "third_party/skia/include/core/SkBitmap.h" | 17 #include "third_party/skia/include/core/SkBitmap.h" |
17 #include "ui/gfx/codec/png_codec.h" | 18 #include "ui/gfx/codec/png_codec.h" |
18 #include "ui/gfx/skbitmap_operations.h" | 19 #include "ui/gfx/skbitmap_operations.h" |
19 | 20 |
20 using content::BrowserThread; | 21 using content::BrowserThread; |
21 | 22 |
22 namespace chromeos { | 23 namespace chromeos { |
23 | 24 |
25 // static | |
26 const char* UserImageLoader::kUserImageLoaderTokenName = "user-image-loader"; | |
27 | |
24 UserImageLoader::ImageInfo::ImageInfo(int size, | 28 UserImageLoader::ImageInfo::ImageInfo(int size, |
25 const LoadedCallback& loaded_cb) | 29 const LoadedCallback& loaded_cb) |
26 : size(size), | 30 : size(size), |
27 loaded_cb(loaded_cb) { | 31 loaded_cb(loaded_cb) { |
28 } | 32 } |
29 | 33 |
30 UserImageLoader::ImageInfo::~ImageInfo() { | 34 UserImageLoader::ImageInfo::~ImageInfo() { |
31 } | 35 } |
32 | 36 |
33 UserImageLoader::UserImageLoader(ImageDecoder::ImageCodec image_codec) | 37 UserImageLoader::UserImageLoader(ImageDecoder::ImageCodec image_codec) |
34 : target_message_loop_(NULL), | 38 : target_message_loop_(NULL), |
35 image_codec_(image_codec) { | 39 image_codec_(image_codec) { |
40 sequence_token_ = | |
41 BrowserThread::GetBlockingPool()-> | |
42 GetNamedSequenceToken(kUserImageLoaderTokenName); | |
Nikita (slow)
2013/01/18 16:40:13
This does mean that there would no 2 image loading
Joao da Silva
2013/01/18 17:24:58
AFAICT the ImageDecoder spawns a utility process t
Nikita (slow)
2013/01/18 17:41:45
My point was that first it will load image using t
| |
36 } | 43 } |
37 | 44 |
38 UserImageLoader::~UserImageLoader() { | 45 UserImageLoader::~UserImageLoader() { |
39 } | 46 } |
40 | 47 |
41 void UserImageLoader::Start(const std::string& filepath, | 48 void UserImageLoader::Start(const std::string& filepath, |
42 int size, | 49 int size, |
43 const LoadedCallback& loaded_cb) { | 50 const LoadedCallback& loaded_cb) { |
44 target_message_loop_ = MessageLoop::current(); | 51 target_message_loop_ = MessageLoop::current(); |
45 | 52 |
46 ImageInfo image_info(size, loaded_cb); | 53 ImageInfo image_info(size, loaded_cb); |
47 BrowserThread::PostTask( | 54 scoped_refptr<base::SequencedTaskRunner> task_runner = |
48 BrowserThread::FILE, FROM_HERE, | 55 BrowserThread::GetBlockingPool()-> |
56 GetSequencedTaskRunnerWithShutdownBehavior( | |
57 sequence_token_, base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); | |
58 task_runner->PostTask( | |
59 FROM_HERE, | |
49 base::Bind(&UserImageLoader::LoadImage, this, filepath, image_info)); | 60 base::Bind(&UserImageLoader::LoadImage, this, filepath, image_info)); |
50 } | 61 } |
51 | 62 |
52 void UserImageLoader::LoadImage(const std::string& filepath, | 63 void UserImageLoader::LoadImage(const std::string& filepath, |
53 const ImageInfo& image_info) { | 64 const ImageInfo& image_info) { |
54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 65 DCHECK(BrowserThread::GetBlockingPool()-> |
66 IsRunningSequenceOnCurrentThread(sequence_token_)); | |
55 | 67 |
56 std::string image_data; | 68 std::string image_data; |
57 file_util::ReadFileToString(FilePath(filepath), &image_data); | 69 file_util::ReadFileToString(FilePath(filepath), &image_data); |
58 | 70 |
59 scoped_refptr<ImageDecoder> image_decoder = | 71 scoped_refptr<ImageDecoder> image_decoder = |
60 new ImageDecoder(this, image_data, image_codec_); | 72 new ImageDecoder(this, image_data, image_codec_); |
61 image_info_map_.insert(std::make_pair(image_decoder.get(), image_info)); | 73 image_info_map_.insert(std::make_pair(image_decoder.get(), image_info)); |
62 image_decoder->Start(); | 74 image_decoder->Start(kUserImageLoaderTokenName); |
Joao da Silva
2013/01/18 17:24:58
The current task_runner could be passed instead of
| |
63 } | 75 } |
64 | 76 |
65 void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder, | 77 void UserImageLoader::OnImageDecoded(const ImageDecoder* decoder, |
66 const SkBitmap& decoded_image) { | 78 const SkBitmap& decoded_image) { |
67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 79 DCHECK(BrowserThread::GetBlockingPool()-> |
80 IsRunningSequenceOnCurrentThread(sequence_token_)); | |
68 | 81 |
69 ImageInfoMap::iterator info_it = image_info_map_.find(decoder); | 82 ImageInfoMap::iterator info_it = image_info_map_.find(decoder); |
70 if (info_it == image_info_map_.end()) { | 83 if (info_it == image_info_map_.end()) { |
71 NOTREACHED(); | 84 NOTREACHED(); |
72 return; | 85 return; |
73 } | 86 } |
74 | 87 |
75 const ImageInfo& image_info = info_it->second; | 88 const ImageInfo& image_info = info_it->second; |
76 SkBitmap final_image = decoded_image; | 89 SkBitmap final_image = decoded_image; |
77 | 90 |
(...skipping 21 matching lines...) Expand all Loading... | |
99 if (image_codec_ == ImageDecoder::ROBUST_JPEG_CODEC) | 112 if (image_codec_ == ImageDecoder::ROBUST_JPEG_CODEC) |
100 user_image.MarkAsSafe(); | 113 user_image.MarkAsSafe(); |
101 target_message_loop_->PostTask( | 114 target_message_loop_->PostTask( |
102 FROM_HERE, | 115 FROM_HERE, |
103 base::Bind(image_info.loaded_cb, user_image)); | 116 base::Bind(image_info.loaded_cb, user_image)); |
104 | 117 |
105 image_info_map_.erase(info_it); | 118 image_info_map_.erase(info_it); |
106 } | 119 } |
107 | 120 |
108 void UserImageLoader::OnDecodeImageFailed(const ImageDecoder* decoder) { | 121 void UserImageLoader::OnDecodeImageFailed(const ImageDecoder* decoder) { |
109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 122 DCHECK(BrowserThread::GetBlockingPool()-> |
123 IsRunningSequenceOnCurrentThread(sequence_token_)); | |
110 | 124 |
111 ImageInfoMap::iterator info_it = image_info_map_.find(decoder); | 125 ImageInfoMap::iterator info_it = image_info_map_.find(decoder); |
112 if (info_it == image_info_map_.end()) { | 126 if (info_it == image_info_map_.end()) { |
113 NOTREACHED(); | 127 NOTREACHED(); |
114 return; | 128 return; |
115 } | 129 } |
116 | 130 |
117 const ImageInfo& image_info = info_it->second; | 131 const ImageInfo& image_info = info_it->second; |
118 target_message_loop_->PostTask( | 132 target_message_loop_->PostTask( |
119 FROM_HERE, | 133 FROM_HERE, |
120 base::Bind(image_info.loaded_cb, UserImage())); | 134 base::Bind(image_info.loaded_cb, UserImage())); |
121 image_info_map_.erase(decoder); | 135 image_info_map_.erase(decoder); |
122 } | 136 } |
123 | 137 |
124 } // namespace chromeos | 138 } // namespace chromeos |
OLD | NEW |