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

Side by Side Diff: chrome/browser/image_decoder.cc

Issue 2715153006: Set desired_image_size when decoding images for NTP Tile icons. (Closed)
Patch Set: ax Created 3 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 (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/image_decoder.h" 5 #include "chrome/browser/image_decoder.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
13 #include "build/build_config.h" 13 #include "build/build_config.h"
14 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 #include "content/public/common/service_manager_connection.h" 15 #include "content/public/common/service_manager_connection.h"
16 #include "ipc/ipc_channel.h" 16 #include "ipc/ipc_channel.h"
17 #include "services/image_decoder/public/cpp/decode.h" 17 #include "services/image_decoder/public/cpp/decode.h"
18 #include "services/service_manager/public/cpp/connector.h" 18 #include "services/service_manager/public/cpp/connector.h"
19 #include "third_party/skia/include/core/SkBitmap.h" 19 #include "third_party/skia/include/core/SkBitmap.h"
20 #include "ui/gfx/geometry/size.h"
20 21
21 namespace { 22 namespace {
22 23
23 // static, Leaky to allow access from any thread. 24 // static, Leaky to allow access from any thread.
24 base::LazyInstance<ImageDecoder>::Leaky g_decoder = LAZY_INSTANCE_INITIALIZER; 25 base::LazyInstance<ImageDecoder>::Leaky g_decoder = LAZY_INSTANCE_INITIALIZER;
25 26
26 const int64_t kMaxImageSizeInBytes = 27 const int64_t kMaxImageSizeInBytes =
27 static_cast<int64_t>(IPC::Channel::kMaximumMessageSize); 28 static_cast<int64_t>(IPC::Channel::kMaximumMessageSize);
28 29
29 // Note that this is always called on the thread which initiated the 30 // Note that this is always called on the thread which initiated the
(...skipping 25 matching lines...) Expand all
55 const image_decoder::mojom::ImageDecoder::DecodeImageCallback& callback, 56 const image_decoder::mojom::ImageDecoder::DecodeImageCallback& callback,
56 scoped_refptr<base::SequencedTaskRunner> task_runner, 57 scoped_refptr<base::SequencedTaskRunner> task_runner,
57 const SkBitmap& image) { 58 const SkBitmap& image) {
58 task_runner->PostTask(FROM_HERE, base::Bind(callback, image)); 59 task_runner->PostTask(FROM_HERE, base::Bind(callback, image));
59 } 60 }
60 61
61 void DecodeImage( 62 void DecodeImage(
62 std::vector<uint8_t> image_data, 63 std::vector<uint8_t> image_data,
63 image_decoder::mojom::ImageCodec codec, 64 image_decoder::mojom::ImageCodec codec,
64 bool shrink_to_fit, 65 bool shrink_to_fit,
66 const gfx::Size& desired_image_frame_size,
65 const image_decoder::mojom::ImageDecoder::DecodeImageCallback& callback, 67 const image_decoder::mojom::ImageDecoder::DecodeImageCallback& callback,
66 scoped_refptr<base::SequencedTaskRunner> callback_task_runner) { 68 scoped_refptr<base::SequencedTaskRunner> callback_task_runner) {
67 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 69 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
68 70
69 service_manager::mojom::ConnectorRequest connector_request; 71 service_manager::mojom::ConnectorRequest connector_request;
70 std::unique_ptr<service_manager::Connector> connector = 72 std::unique_ptr<service_manager::Connector> connector =
71 service_manager::Connector::Create(&connector_request); 73 service_manager::Connector::Create(&connector_request);
72 BindToBrowserConnector(std::move(connector_request)); 74 BindToBrowserConnector(std::move(connector_request));
73 75
74 image_decoder::Decode(connector.get(), image_data, codec, shrink_to_fit, 76 image_decoder::Decode(connector.get(), image_data, codec, shrink_to_fit,
75 kMaxImageSizeInBytes, 77 kMaxImageSizeInBytes, desired_image_frame_size,
76 base::Bind(&RunDecodeCallbackOnTaskRunner, 78 base::Bind(&RunDecodeCallbackOnTaskRunner, callback,
77 callback, callback_task_runner)); 79 callback_task_runner));
78 } 80 }
79 81
80 } // namespace 82 } // namespace
81 83
82 ImageDecoder::ImageRequest::ImageRequest() 84 ImageDecoder::ImageRequest::ImageRequest()
83 : task_runner_(base::ThreadTaskRunnerHandle::Get()) { 85 : task_runner_(base::ThreadTaskRunnerHandle::Get()) {
84 DCHECK(sequence_checker_.CalledOnValidSequence()); 86 DCHECK(sequence_checker_.CalledOnValidSequence());
85 } 87 }
86 88
87 ImageDecoder::ImageRequest::ImageRequest( 89 ImageDecoder::ImageRequest::ImageRequest(
88 const scoped_refptr<base::SequencedTaskRunner>& task_runner) 90 const scoped_refptr<base::SequencedTaskRunner>& task_runner)
89 : task_runner_(task_runner) { 91 : task_runner_(task_runner) {
90 DCHECK(sequence_checker_.CalledOnValidSequence()); 92 DCHECK(sequence_checker_.CalledOnValidSequence());
91 } 93 }
92 94
93 ImageDecoder::ImageRequest::~ImageRequest() { 95 ImageDecoder::ImageRequest::~ImageRequest() {
94 DCHECK(sequence_checker_.CalledOnValidSequence()); 96 DCHECK(sequence_checker_.CalledOnValidSequence());
95 ImageDecoder::Cancel(this); 97 ImageDecoder::Cancel(this);
96 } 98 }
97 99
98 ImageDecoder::ImageDecoder() : image_request_id_counter_(0) {} 100 ImageDecoder::ImageDecoder() : image_request_id_counter_(0) {}
99 101
100 ImageDecoder::~ImageDecoder() {} 102 ImageDecoder::~ImageDecoder() {}
101 103
102 // static 104 // static
103 void ImageDecoder::Start(ImageRequest* image_request, 105 void ImageDecoder::Start(ImageRequest* image_request,
104 std::vector<uint8_t> image_data) { 106 std::vector<uint8_t> image_data) {
105 StartWithOptions(image_request, std::move(image_data), DEFAULT_CODEC, false); 107 StartWithOptions(image_request, std::move(image_data), DEFAULT_CODEC, false,
108 gfx::Size());
106 } 109 }
107 110
108 // static 111 // static
109 void ImageDecoder::Start(ImageRequest* image_request, 112 void ImageDecoder::Start(ImageRequest* image_request,
110 const std::string& image_data) { 113 const std::string& image_data) {
111 Start(image_request, 114 Start(image_request,
112 std::vector<uint8_t>(image_data.begin(), image_data.end())); 115 std::vector<uint8_t>(image_data.begin(), image_data.end()));
113 } 116 }
114 117
115 // static 118 // static
116 void ImageDecoder::StartWithOptions(ImageRequest* image_request, 119 void ImageDecoder::StartWithOptions(ImageRequest* image_request,
117 std::vector<uint8_t> image_data, 120 std::vector<uint8_t> image_data,
118 ImageCodec image_codec, 121 ImageCodec image_codec,
119 bool shrink_to_fit) { 122 bool shrink_to_fit,
123 const gfx::Size& desired_image_frame_size) {
120 g_decoder.Get().StartWithOptionsImpl(image_request, std::move(image_data), 124 g_decoder.Get().StartWithOptionsImpl(image_request, std::move(image_data),
121 image_codec, shrink_to_fit); 125 image_codec, shrink_to_fit,
126 desired_image_frame_size);
122 } 127 }
123 128
124 // static 129 // static
125 void ImageDecoder::StartWithOptions(ImageRequest* image_request, 130 void ImageDecoder::StartWithOptions(ImageRequest* image_request,
126 const std::string& image_data, 131 const std::string& image_data,
127 ImageCodec image_codec, 132 ImageCodec image_codec,
128 bool shrink_to_fit) { 133 bool shrink_to_fit) {
129 StartWithOptions(image_request, 134 StartWithOptions(image_request,
130 std::vector<uint8_t>(image_data.begin(), image_data.end()), 135 std::vector<uint8_t>(image_data.begin(), image_data.end()),
131 image_codec, shrink_to_fit); 136 image_codec, shrink_to_fit, gfx::Size());
132 }
133
134 void ImageDecoder::StartWithOptionsImpl(ImageRequest* image_request,
135 std::vector<uint8_t> image_data,
136 ImageCodec image_codec,
137 bool shrink_to_fit) {
138 DCHECK(image_request);
139 DCHECK(image_request->task_runner());
140
141 int request_id;
142 {
143 base::AutoLock lock(map_lock_);
144 request_id = image_request_id_counter_++;
145 image_request_id_map_.insert(std::make_pair(request_id, image_request));
146 } 137 }
147 138
148 image_decoder::mojom::ImageCodec codec = 139 void ImageDecoder::StartWithOptionsImpl(
149 image_decoder::mojom::ImageCodec::DEFAULT; 140 ImageRequest * image_request, std::vector<uint8_t> image_data,
141 ImageCodec image_codec, bool shrink_to_fit,
142 const gfx::Size& desired_image_frame_size) {
Marc Treib 2017/03/01 09:17:26 nit: Is this "git cl format"ted? I think each para
tschumann 2017/03/01 09:37:43 reformatted.
143 DCHECK(image_request);
144 DCHECK(image_request->task_runner());
145
146 int request_id;
147 {
148 base::AutoLock lock(map_lock_);
149 request_id = image_request_id_counter_++;
150 image_request_id_map_.insert(std::make_pair(request_id, image_request));
151 }
152
153 image_decoder::mojom::ImageCodec codec =
154 image_decoder::mojom::ImageCodec::DEFAULT;
150 #if defined(OS_CHROMEOS) 155 #if defined(OS_CHROMEOS)
151 if (image_codec == ROBUST_JPEG_CODEC) 156 if (image_codec == ROBUST_JPEG_CODEC)
152 codec = image_decoder::mojom::ImageCodec::ROBUST_JPEG; 157 codec = image_decoder::mojom::ImageCodec::ROBUST_JPEG;
153 if (image_codec == ROBUST_PNG_CODEC) 158 if (image_codec == ROBUST_PNG_CODEC)
154 codec = image_decoder::mojom::ImageCodec::ROBUST_PNG; 159 codec = image_decoder::mojom::ImageCodec::ROBUST_PNG;
155 #endif // defined(OS_CHROMEOS) 160 #endif // defined(OS_CHROMEOS)
156 161
157 auto callback = base::Bind( 162 auto callback = base::Bind(
158 &OnDecodeImageDone, 163 &OnDecodeImageDone,
159 base::Bind(&ImageDecoder::OnDecodeImageFailed, base::Unretained(this)), 164 base::Bind(&ImageDecoder::OnDecodeImageFailed, base::Unretained(this)),
160 base::Bind(&ImageDecoder::OnDecodeImageSucceeded, base::Unretained(this)), 165 base::Bind(&ImageDecoder::OnDecodeImageSucceeded, base::Unretained(this)),
161 request_id); 166 request_id);
162 167
163 // NOTE: There exist ImageDecoder consumers which implicitly rely on this 168 // NOTE: There exist ImageDecoder consumers which implicitly rely on this
164 // operation happening on a thread which always has a ThreadTaskRunnerHandle. 169 // operation happening on a thread which always has a ThreadTaskRunnerHandle.
165 // We arbitrarily use the IO thread here to match details of the legacy 170 // We arbitrarily use the IO thread here to match details of the legacy
166 // implementation. 171 // implementation.
167 content::BrowserThread::PostTask( 172 content::BrowserThread::PostTask(
168 content::BrowserThread::IO, FROM_HERE, 173 content::BrowserThread::IO, FROM_HERE,
169 base::Bind(&DecodeImage, base::Passed(&image_data), codec, shrink_to_fit, 174 base::Bind(&DecodeImage, base::Passed(&image_data), codec, shrink_to_fit,
170 callback, make_scoped_refptr(image_request->task_runner()))); 175 desired_image_frame_size, callback,
176 make_scoped_refptr(image_request->task_runner())));
171 } 177 }
172 178
173 // static 179 // static
174 void ImageDecoder::Cancel(ImageRequest* image_request) { 180 void ImageDecoder::Cancel(ImageRequest* image_request) {
175 DCHECK(image_request); 181 DCHECK(image_request);
176 g_decoder.Get().CancelImpl(image_request); 182 g_decoder.Get().CancelImpl(image_request);
177 } 183 }
178 184
179 void ImageDecoder::CancelImpl(ImageRequest* image_request) { 185 void ImageDecoder::CancelImpl(ImageRequest* image_request) {
180 base::AutoLock lock(map_lock_); 186 base::AutoLock lock(map_lock_);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 auto it = image_request_id_map_.find(request_id); 218 auto it = image_request_id_map_.find(request_id);
213 if (it == image_request_id_map_.end()) 219 if (it == image_request_id_map_.end())
214 return; 220 return;
215 image_request = it->second; 221 image_request = it->second;
216 image_request_id_map_.erase(it); 222 image_request_id_map_.erase(it);
217 } 223 }
218 224
219 DCHECK(image_request->task_runner()->RunsTasksOnCurrentThread()); 225 DCHECK(image_request->task_runner()->RunsTasksOnCurrentThread());
220 image_request->OnDecodeImageFailed(); 226 image_request->OnDecodeImageFailed();
221 } 227 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698