OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/users/avatar/user_image_loader.h" | 5 #include "chrome/browser/chromeos/login/users/avatar/user_image_loader.h" |
6 | 6 |
| 7 #include <memory> |
7 #include <utility> | 8 #include <utility> |
8 | 9 |
9 #include "base/bind.h" | 10 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
11 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
12 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
13 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/ptr_util.h" |
14 #include "base/sequenced_task_runner.h" | 15 #include "base/sequenced_task_runner.h" |
15 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
16 #include "base/task_runner_util.h" | 17 #include "base/task_runner_util.h" |
17 #include "base/thread_task_runner_handle.h" | 18 #include "base/thread_task_runner_handle.h" |
18 #include "chrome/browser/chromeos/login/helper.h" | 19 #include "chrome/browser/chromeos/login/helper.h" |
19 #include "components/user_manager/user_image/user_image.h" | 20 #include "components/user_manager/user_image/user_image.h" |
20 #include "skia/ext/image_operations.h" | 21 #include "skia/ext/image_operations.h" |
21 #include "third_party/skia/include/core/SkBitmap.h" | 22 #include "third_party/skia/include/core/SkBitmap.h" |
22 #include "ui/gfx/codec/png_codec.h" | 23 #include "ui/gfx/codec/png_codec.h" |
23 #include "ui/gfx/skbitmap_operations.h" | 24 #include "ui/gfx/skbitmap_operations.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 if (pixels_per_side > target_size) { | 64 if (pixels_per_side > target_size) { |
64 // Also downsize the image to save space and memory. | 65 // Also downsize the image to save space and memory. |
65 final_image = skia::ImageOperations::Resize( | 66 final_image = skia::ImageOperations::Resize( |
66 cropped_image, skia::ImageOperations::RESIZE_LANCZOS3, target_size, | 67 cropped_image, skia::ImageOperations::RESIZE_LANCZOS3, target_size, |
67 target_size); | 68 target_size); |
68 } else { | 69 } else { |
69 final_image = cropped_image; | 70 final_image = cropped_image; |
70 } | 71 } |
71 | 72 |
72 // Encode the cropped image to web-compatible bytes representation | 73 // Encode the cropped image to web-compatible bytes representation |
73 scoped_ptr<user_manager::UserImage::Bytes> encoded = | 74 std::unique_ptr<user_manager::UserImage::Bytes> encoded = |
74 user_manager::UserImage::Encode(final_image); | 75 user_manager::UserImage::Encode(final_image); |
75 if (!encoded) | 76 if (!encoded) |
76 return false; | 77 return false; |
77 | 78 |
78 bitmap->swap(final_image); | 79 bitmap->swap(final_image); |
79 bytes->swap(*encoded); | 80 bytes->swap(*encoded); |
80 return true; | 81 return true; |
81 } | 82 } |
82 | 83 |
83 // Handles the decoded image returned from ImageDecoder through the | 84 // Handles the decoded image returned from ImageDecoder through the |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 const SkBitmap& image, | 154 const SkBitmap& image, |
154 const user_manager::UserImage::Bytes& image_bytes, | 155 const user_manager::UserImage::Bytes& image_bytes, |
155 bool image_bytes_regenerated) { | 156 bool image_bytes_regenerated) { |
156 SkBitmap final_image = image; | 157 SkBitmap final_image = image; |
157 // Make the SkBitmap immutable as we won't modify it. This is important | 158 // Make the SkBitmap immutable as we won't modify it. This is important |
158 // because otherwise it gets duplicated during painting, wasting memory. | 159 // because otherwise it gets duplicated during painting, wasting memory. |
159 final_image.setImmutable(); | 160 final_image.setImmutable(); |
160 gfx::ImageSkia final_image_skia = | 161 gfx::ImageSkia final_image_skia = |
161 gfx::ImageSkia::CreateFrom1xBitmap(final_image); | 162 gfx::ImageSkia::CreateFrom1xBitmap(final_image); |
162 final_image_skia.MakeThreadSafe(); | 163 final_image_skia.MakeThreadSafe(); |
163 scoped_ptr<user_manager::UserImage> user_image( | 164 std::unique_ptr<user_manager::UserImage> user_image( |
164 new user_manager::UserImage(final_image_skia, image_bytes)); | 165 new user_manager::UserImage(final_image_skia, image_bytes)); |
165 user_image->set_file_path(image_info_.file_path); | 166 user_image->set_file_path(image_info_.file_path); |
166 if (image_info_.image_codec == ImageDecoder::ROBUST_JPEG_CODEC || | 167 if (image_info_.image_codec == ImageDecoder::ROBUST_JPEG_CODEC || |
167 image_bytes_regenerated) | 168 image_bytes_regenerated) |
168 user_image->MarkAsSafe(); | 169 user_image->MarkAsSafe(); |
169 image_info_.loaded_cb.Run(std::move(user_image)); | 170 image_info_.loaded_cb.Run(std::move(user_image)); |
170 delete this; | 171 delete this; |
171 } | 172 } |
172 | 173 |
173 void UserImageRequest::OnDecodeImageFailed() { | 174 void UserImageRequest::OnDecodeImageFailed() { |
174 image_info_.loaded_cb.Run(make_scoped_ptr(new user_manager::UserImage)); | 175 image_info_.loaded_cb.Run(base::WrapUnique(new user_manager::UserImage)); |
175 delete this; | 176 delete this; |
176 } | 177 } |
177 | 178 |
178 // Starts decoding the image with ImageDecoder for the image |data| if | 179 // Starts decoding the image with ImageDecoder for the image |data| if |
179 // |data_is_ready| is true. | 180 // |data_is_ready| is true. |
180 void DecodeImage( | 181 void DecodeImage( |
181 const ImageInfo& image_info, | 182 const ImageInfo& image_info, |
182 scoped_refptr<base::SequencedTaskRunner> background_task_runner, | 183 scoped_refptr<base::SequencedTaskRunner> background_task_runner, |
183 const std::string* data, | 184 const std::string* data, |
184 bool data_is_ready) { | 185 bool data_is_ready) { |
185 if (!data_is_ready) { | 186 if (!data_is_ready) { |
186 base::ThreadTaskRunnerHandle::Get()->PostTask( | 187 base::ThreadTaskRunnerHandle::Get()->PostTask( |
187 FROM_HERE, | 188 FROM_HERE, |
188 base::Bind(image_info.loaded_cb, | 189 base::Bind(image_info.loaded_cb, base::Passed(base::WrapUnique( |
189 base::Passed(make_scoped_ptr(new user_manager::UserImage)))); | 190 new user_manager::UserImage)))); |
190 return; | 191 return; |
191 } | 192 } |
192 | 193 |
193 UserImageRequest* image_request = | 194 UserImageRequest* image_request = |
194 new UserImageRequest(image_info, *data, background_task_runner); | 195 new UserImageRequest(image_info, *data, background_task_runner); |
195 ImageDecoder::StartWithOptions(image_request, *data, image_info.image_codec, | 196 ImageDecoder::StartWithOptions(image_request, *data, image_info.image_codec, |
196 false); | 197 false); |
197 } | 198 } |
198 | 199 |
199 } // namespace | 200 } // namespace |
200 | 201 |
201 void StartWithFilePath( | 202 void StartWithFilePath( |
202 scoped_refptr<base::SequencedTaskRunner> background_task_runner, | 203 scoped_refptr<base::SequencedTaskRunner> background_task_runner, |
203 const base::FilePath& file_path, | 204 const base::FilePath& file_path, |
204 ImageDecoder::ImageCodec image_codec, | 205 ImageDecoder::ImageCodec image_codec, |
205 int pixels_per_side, | 206 int pixels_per_side, |
206 const LoadedCallback& loaded_cb) { | 207 const LoadedCallback& loaded_cb) { |
207 std::string* data = new std::string; | 208 std::string* data = new std::string; |
208 base::PostTaskAndReplyWithResult( | 209 base::PostTaskAndReplyWithResult( |
209 background_task_runner.get(), FROM_HERE, | 210 background_task_runner.get(), FROM_HERE, |
210 base::Bind(&base::ReadFileToString, file_path, data), | 211 base::Bind(&base::ReadFileToString, file_path, data), |
211 base::Bind(&DecodeImage, | 212 base::Bind(&DecodeImage, |
212 ImageInfo(file_path, pixels_per_side, image_codec, loaded_cb), | 213 ImageInfo(file_path, pixels_per_side, image_codec, loaded_cb), |
213 background_task_runner, base::Owned(data))); | 214 background_task_runner, base::Owned(data))); |
214 } | 215 } |
215 | 216 |
216 void StartWithData( | 217 void StartWithData( |
217 scoped_refptr<base::SequencedTaskRunner> background_task_runner, | 218 scoped_refptr<base::SequencedTaskRunner> background_task_runner, |
218 scoped_ptr<std::string> data, | 219 std::unique_ptr<std::string> data, |
219 ImageDecoder::ImageCodec image_codec, | 220 ImageDecoder::ImageCodec image_codec, |
220 int pixels_per_side, | 221 int pixels_per_side, |
221 const LoadedCallback& loaded_cb) { | 222 const LoadedCallback& loaded_cb) { |
222 DecodeImage( | 223 DecodeImage( |
223 ImageInfo(base::FilePath(), pixels_per_side, image_codec, loaded_cb), | 224 ImageInfo(base::FilePath(), pixels_per_side, image_codec, loaded_cb), |
224 background_task_runner, data.get(), true /* data_is_ready */); | 225 background_task_runner, data.get(), true /* data_is_ready */); |
225 } | 226 } |
226 | 227 |
227 } // namespace user_image_loader | 228 } // namespace user_image_loader |
228 } // namespace chromeos | 229 } // namespace chromeos |
OLD | NEW |