Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: chrome/browser/chromeos/login/users/avatar/user_image_loader.cc

Issue 1748423005: Crop the user-specified profile image for WebUI (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 : image_info_(image_info), 78 : image_info_(image_info),
79 image_data_(image_data.begin(), image_data.end()), 79 image_data_(image_data.begin(), image_data.end()),
80 background_task_runner_(background_task_runner), 80 background_task_runner_(background_task_runner),
81 weak_ptr_factory_(this) {} 81 weak_ptr_factory_(this) {}
82 ~UserImageRequest() override {} 82 ~UserImageRequest() override {}
83 83
84 // ImageDecoder::ImageRequest implementation. 84 // ImageDecoder::ImageRequest implementation.
85 void OnImageDecoded(const SkBitmap& decoded_image) override; 85 void OnImageDecoded(const SkBitmap& decoded_image) override;
86 void OnDecodeImageFailed() override; 86 void OnDecodeImageFailed() override;
87 87
88 // Called after the image is transformed (cropped and downsized) as needed. 88 // Called after the image is cropped (and downsized) as needed.
89 void OnImageFinalized(const SkBitmap& image); 89 void OnImageCropped(const SkBitmap& image);
90
91 // Called after the image is finalized. |image_bytes_regenerated| is true
92 // if |image_bytes| is regenerated from the cropped image.
93 void OnImageFinalized(const SkBitmap& image,
94 bool image_bytes_regenerated,
95 const user_manager::UserImage::Bytes& image_bytes);
90 96
91 private: 97 private:
92 const ImageInfo image_info_; 98 const ImageInfo image_info_;
93 const user_manager::UserImage::Bytes image_data_; 99 const user_manager::UserImage::Bytes image_data_;
94 scoped_refptr<base::SequencedTaskRunner> background_task_runner_; 100 scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
95 101
96 // This should be the last member. 102 // This should be the last member.
97 base::WeakPtrFactory<UserImageRequest> weak_ptr_factory_; 103 base::WeakPtrFactory<UserImageRequest> weak_ptr_factory_;
98 }; 104 };
99 105
100 void UserImageRequest::OnImageDecoded(const SkBitmap& decoded_image) { 106 void UserImageRequest::OnImageDecoded(const SkBitmap& decoded_image) {
101 int target_size = image_info_.pixels_per_side; 107 int target_size = image_info_.pixels_per_side;
102 if (target_size > 0) { 108 if (target_size > 0) {
103 // Transforming an image could be expensive, hence posting to the 109 // Cropping an image could be expensive, hence posting to the background
104 // background thread. 110 // thread.
105 base::PostTaskAndReplyWithResult( 111 base::PostTaskAndReplyWithResult(
106 background_task_runner_.get(), FROM_HERE, 112 background_task_runner_.get(), FROM_HERE,
107 base::Bind(&CropImage, decoded_image, target_size), 113 base::Bind(&CropImage, decoded_image, target_size),
108 base::Bind(&UserImageRequest::OnImageFinalized, 114 base::Bind(&UserImageRequest::OnImageCropped,
109 weak_ptr_factory_.GetWeakPtr())); 115 weak_ptr_factory_.GetWeakPtr()));
110 } else { 116 } else {
111 OnImageFinalized(decoded_image); 117 OnImageFinalized(decoded_image, false /* image_bytes_regenerated */,
118 image_data_);
112 } 119 }
113 } 120 }
114 121
115 void UserImageRequest::OnImageFinalized(const SkBitmap& image) { 122 void UserImageRequest::OnImageCropped(const SkBitmap& image) {
123 DCHECK_GT(image_info_.pixels_per_side, 0);
124
125 // Encode the cropped image to web-compatible bytes representation, because
126 // the original data in |image_data_| isn't cropped and can be big.
127 // Encoding could be expensive, hence posting to the background thread.
128 base::PostTaskAndReplyWithResult(
129 background_task_runner_.get(), FROM_HERE,
130 base::Bind(&user_manager::UserImage::Encode, image),
hashimoto 2016/03/02 07:33:58 Why don't you call Encode() from CropImage()? IIUC
satorux1 2016/03/02 08:23:50 That's a great point. Fixed!
131 base::Bind(&UserImageRequest::OnImageFinalized,
132 weak_ptr_factory_.GetWeakPtr(), image,
133 true /* image_bytes_regenerated */));
134 }
135
136 void UserImageRequest::OnImageFinalized(
137 const SkBitmap& image,
138 bool image_bytes_regenerated,
139 const user_manager::UserImage::Bytes& image_bytes) {
140 if (image_bytes.empty()) { // Failed to encode to bytes.
141 OnDecodeImageFailed();
142 return;
143 }
144
116 SkBitmap final_image = image; 145 SkBitmap final_image = image;
117 // Make the SkBitmap immutable as we won't modify it. This is important 146 // Make the SkBitmap immutable as we won't modify it. This is important
118 // because otherwise it gets duplicated during painting, wasting memory. 147 // because otherwise it gets duplicated during painting, wasting memory.
119 final_image.setImmutable(); 148 final_image.setImmutable();
120 gfx::ImageSkia final_image_skia = 149 gfx::ImageSkia final_image_skia =
121 gfx::ImageSkia::CreateFrom1xBitmap(final_image); 150 gfx::ImageSkia::CreateFrom1xBitmap(final_image);
122 final_image_skia.MakeThreadSafe(); 151 final_image_skia.MakeThreadSafe();
123 user_manager::UserImage user_image(final_image_skia, image_data_); 152 user_manager::UserImage user_image(final_image_skia, image_bytes);
124 user_image.set_file_path(image_info_.file_path); 153 user_image.set_file_path(image_info_.file_path);
125 if (image_info_.image_codec == ImageDecoder::ROBUST_JPEG_CODEC) 154 if (image_info_.image_codec == ImageDecoder::ROBUST_JPEG_CODEC ||
155 image_bytes_regenerated)
126 user_image.MarkAsSafe(); 156 user_image.MarkAsSafe();
127 image_info_.loaded_cb.Run(user_image); 157 image_info_.loaded_cb.Run(user_image);
128 delete this; 158 delete this;
129 } 159 }
130 160
131 void UserImageRequest::OnDecodeImageFailed() { 161 void UserImageRequest::OnDecodeImageFailed() {
132 image_info_.loaded_cb.Run(user_manager::UserImage()); 162 image_info_.loaded_cb.Run(user_manager::UserImage());
133 delete this; 163 delete this;
134 } 164 }
135 165
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 ImageDecoder::ImageCodec image_codec, 205 ImageDecoder::ImageCodec image_codec,
176 int pixels_per_side, 206 int pixels_per_side,
177 const LoadedCallback& loaded_cb) { 207 const LoadedCallback& loaded_cb) {
178 DecodeImage( 208 DecodeImage(
179 ImageInfo(base::FilePath(), pixels_per_side, image_codec, loaded_cb), 209 ImageInfo(base::FilePath(), pixels_per_side, image_codec, loaded_cb),
180 background_task_runner, data.get(), true /* data_is_ready */); 210 background_task_runner, data.get(), true /* data_is_ready */);
181 } 211 }
182 212
183 } // namespace user_image_loader 213 } // namespace user_image_loader
184 } // namespace chromeos 214 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698