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

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

Issue 2177833003: Avoid unnecessary copies in ImageDecoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change ArcWallpaperHandler to use new API. Created 4 years, 4 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
« no previous file with comments | « chrome/browser/image_decoder.h ('k') | chrome/browser/image_decoder_browsertest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
9 #include "build/build_config.h" 11 #include "build/build_config.h"
10 #include "chrome/browser/browser_process.h" 12 #include "chrome/browser/browser_process.h"
11 #include "chrome/common/image_decoder.mojom.h" 13 #include "chrome/common/image_decoder.mojom.h"
12 #include "chrome/grit/generated_resources.h" 14 #include "chrome/grit/generated_resources.h"
13 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
14 #include "content/public/browser/utility_process_host.h" 16 #include "content/public/browser/utility_process_host.h"
15 #include "services/shell/public/cpp/interface_provider.h" 17 #include "services/shell/public/cpp/interface_provider.h"
16 #include "third_party/skia/include/core/SkBitmap.h" 18 #include "third_party/skia/include/core/SkBitmap.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 65 DCHECK(sequence_checker_.CalledOnValidSequencedThread());
64 } 66 }
65 67
66 ImageDecoder::ImageRequest::~ImageRequest() { 68 ImageDecoder::ImageRequest::~ImageRequest() {
67 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 69 DCHECK(sequence_checker_.CalledOnValidSequencedThread());
68 ImageDecoder::Cancel(this); 70 ImageDecoder::Cancel(this);
69 } 71 }
70 72
71 // static 73 // static
72 void ImageDecoder::Start(ImageRequest* image_request, 74 void ImageDecoder::Start(ImageRequest* image_request,
75 std::vector<uint8_t> image_data) {
76 StartWithOptions(image_request, std::move(image_data), DEFAULT_CODEC, false);
77 }
78
79 // static
80 void ImageDecoder::Start(ImageRequest* image_request,
73 const std::string& image_data) { 81 const std::string& image_data) {
74 StartWithOptions(image_request, image_data, DEFAULT_CODEC, false); 82 Start(image_request,
83 std::vector<uint8_t>(image_data.begin(), image_data.end()));
84 }
85
86 // static
87 void ImageDecoder::StartWithOptions(ImageRequest* image_request,
88 std::vector<uint8_t> image_data,
89 ImageCodec image_codec,
90 bool shrink_to_fit) {
91 g_decoder.Pointer()->StartWithOptionsImpl(image_request,
92 std::move(image_data),
93 image_codec, shrink_to_fit);
75 } 94 }
76 95
77 // static 96 // static
78 void ImageDecoder::StartWithOptions(ImageRequest* image_request, 97 void ImageDecoder::StartWithOptions(ImageRequest* image_request,
79 const std::string& image_data, 98 const std::string& image_data,
80 ImageCodec image_codec, 99 ImageCodec image_codec,
81 bool shrink_to_fit) { 100 bool shrink_to_fit) {
82 g_decoder.Pointer()->StartWithOptionsImpl(image_request, image_data, 101 StartWithOptions(image_request,
83 image_codec, shrink_to_fit); 102 std::vector<uint8_t>(image_data.begin(), image_data.end()),
103 image_codec, shrink_to_fit);
84 } 104 }
85 105
86 void ImageDecoder::StartWithOptionsImpl(ImageRequest* image_request, 106 void ImageDecoder::StartWithOptionsImpl(ImageRequest* image_request,
87 const std::string& image_data, 107 std::vector<uint8_t> image_data,
88 ImageCodec image_codec, 108 ImageCodec image_codec,
89 bool shrink_to_fit) { 109 bool shrink_to_fit) {
90 DCHECK(image_request); 110 DCHECK(image_request);
91 DCHECK(image_request->task_runner()); 111 DCHECK(image_request->task_runner());
92 112
93 int request_id; 113 int request_id;
94 { 114 {
95 base::AutoLock lock(map_lock_); 115 base::AutoLock lock(map_lock_);
96 request_id = image_request_id_counter_++; 116 request_id = image_request_id_counter_++;
97 image_request_id_map_.insert(std::make_pair(request_id, image_request)); 117 image_request_id_map_.insert(std::make_pair(request_id, image_request));
98 } 118 }
99 119
100 BrowserThread::PostTask( 120 BrowserThread::PostTask(
101 BrowserThread::IO, FROM_HERE, 121 BrowserThread::IO, FROM_HERE,
102 base::Bind( 122 base::Bind(
103 &ImageDecoder::DecodeImageInSandbox, 123 &ImageDecoder::DecodeImageInSandbox,
104 g_decoder.Pointer(), request_id, 124 g_decoder.Pointer(), request_id,
105 std::vector<unsigned char>(image_data.begin(), image_data.end()), 125 base::Passed(std::move(image_data)),
106 image_codec, shrink_to_fit)); 126 image_codec, shrink_to_fit));
107 } 127 }
108 128
109 // static 129 // static
110 void ImageDecoder::Cancel(ImageRequest* image_request) { 130 void ImageDecoder::Cancel(ImageRequest* image_request) {
111 DCHECK(image_request); 131 DCHECK(image_request);
112 g_decoder.Pointer()->CancelImpl(image_request); 132 g_decoder.Pointer()->CancelImpl(image_request);
113 } 133 }
114 134
115 void ImageDecoder::DecodeImageInSandbox( 135 void ImageDecoder::DecodeImageInSandbox(
116 int request_id, 136 int request_id,
117 const std::vector<unsigned char>& image_data, 137 std::vector<uint8_t> image_data,
118 ImageCodec image_codec, 138 ImageCodec image_codec,
119 bool shrink_to_fit) { 139 bool shrink_to_fit) {
120 DCHECK_CURRENTLY_ON(BrowserThread::IO); 140 DCHECK_CURRENTLY_ON(BrowserThread::IO);
121 base::AutoLock lock(map_lock_); 141 base::AutoLock lock(map_lock_);
122 const auto it = image_request_id_map_.find(request_id); 142 const auto it = image_request_id_map_.find(request_id);
123 if (it == image_request_id_map_.end()) 143 if (it == image_request_id_map_.end())
124 return; 144 return;
125 145
126 ImageRequest* image_request = it->second; 146 ImageRequest* image_request = it->second;
127 if (!utility_process_host_) { 147 if (!utility_process_host_) {
(...skipping 19 matching lines...) Expand all
147 batch_mode_timer_->Reset(); 167 batch_mode_timer_->Reset();
148 168
149 mojom::ImageCodec mojo_codec = mojom::ImageCodec::DEFAULT; 169 mojom::ImageCodec mojo_codec = mojom::ImageCodec::DEFAULT;
150 #if defined(OS_CHROMEOS) 170 #if defined(OS_CHROMEOS)
151 if (image_codec == ROBUST_JPEG_CODEC) 171 if (image_codec == ROBUST_JPEG_CODEC)
152 mojo_codec = mojom::ImageCodec::ROBUST_JPEG; 172 mojo_codec = mojom::ImageCodec::ROBUST_JPEG;
153 if (image_codec == ROBUST_PNG_CODEC) 173 if (image_codec == ROBUST_PNG_CODEC)
154 mojo_codec = mojom::ImageCodec::ROBUST_PNG; 174 mojo_codec = mojom::ImageCodec::ROBUST_PNG;
155 #endif // defined(OS_CHROMEOS) 175 #endif // defined(OS_CHROMEOS)
156 decoder_->DecodeImage( 176 decoder_->DecodeImage(
157 mojo::Array<uint8_t>::From(image_data), 177 mojo::Array<uint8_t>(std::move(image_data)),
158 mojo_codec, 178 mojo_codec,
159 shrink_to_fit, 179 shrink_to_fit,
160 base::Bind(&OnDecodeImageDone, 180 base::Bind(&OnDecodeImageDone,
161 base::Bind(&ImageDecoder::OnDecodeImageFailed, this), 181 base::Bind(&ImageDecoder::OnDecodeImageFailed, this),
162 base::Bind(&ImageDecoder::OnDecodeImageSucceeded, this), 182 base::Bind(&ImageDecoder::OnDecodeImageSucceeded, this),
163 request_id)); 183 request_id));
164 } 184 }
165 185
166 void ImageDecoder::CancelImpl(ImageRequest* image_request) { 186 void ImageDecoder::CancelImpl(ImageRequest* image_request) {
167 base::AutoLock lock(map_lock_); 187 base::AutoLock lock(map_lock_);
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 auto it = image_request_id_map_.find(request_id); 314 auto it = image_request_id_map_.find(request_id);
295 if (it == image_request_id_map_.end()) 315 if (it == image_request_id_map_.end())
296 return; 316 return;
297 image_request = it->second; 317 image_request = it->second;
298 image_request_id_map_.erase(it); 318 image_request_id_map_.erase(it);
299 } 319 }
300 320
301 DCHECK(image_request->task_runner()->RunsTasksOnCurrentThread()); 321 DCHECK(image_request->task_runner()->RunsTasksOnCurrentThread());
302 image_request->OnDecodeImageFailed(); 322 image_request->OnDecodeImageFailed();
303 } 323 }
OLDNEW
« no previous file with comments | « chrome/browser/image_decoder.h ('k') | chrome/browser/image_decoder_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698