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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp

Issue 2918443003: Remove redundant reading and writing of data about SharedBuffer.
Patch Set: benchmark Created 3 years, 6 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 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 ImageFrame* frame = actual_decoder_->FrameBufferAtIndex(index); 121 ImageFrame* frame = actual_decoder_->FrameBufferAtIndex(index);
122 if (!frame || frame->GetStatus() == ImageFrame::kFrameEmpty) 122 if (!frame || frame->GetStatus() == ImageFrame::kFrameEmpty)
123 return nullptr; 123 return nullptr;
124 124
125 return (frame->GetStatus() == ImageFrame::kFrameComplete) 125 return (frame->GetStatus() == ImageFrame::kFrameComplete)
126 ? frame->FinalizePixelsAndGetImage() 126 ? frame->FinalizePixelsAndGetImage()
127 : SkImage::MakeFromBitmap(frame->Bitmap()); 127 : SkImage::MakeFromBitmap(frame->Bitmap());
128 } 128 }
129 129
130 PassRefPtr<SharedBuffer> DeferredImageDecoder::Data() { 130 PassRefPtr<SharedBuffer> DeferredImageDecoder::Data() {
131 if (!rw_buffer_) 131 return buffer_;
132 return nullptr;
133 sk_sp<SkROBuffer> ro_buffer(rw_buffer_->makeROBufferSnapshot());
134 RefPtr<SharedBuffer> shared_buffer = SharedBuffer::Create();
135 SkROBuffer::Iter it(ro_buffer.get());
136 do {
137 shared_buffer->Append(static_cast<const char*>(it.data()), it.size());
138 } while (it.next());
139 return shared_buffer.Release();
140 } 132 }
141 133
142 void DeferredImageDecoder::SetData(PassRefPtr<SharedBuffer> data, 134 void DeferredImageDecoder::SetData(PassRefPtr<SharedBuffer> data,
143 bool all_data_received) { 135 bool all_data_received) {
144 SetDataInternal(std::move(data), all_data_received, true); 136 SetDataInternal(std::move(data), all_data_received, true);
145 } 137 }
146 138
147 void DeferredImageDecoder::SetDataInternal(RefPtr<SharedBuffer> data, 139 void DeferredImageDecoder::SetDataInternal(PassRefPtr<SharedBuffer> data,
148 bool all_data_received, 140 bool all_data_received,
149 bool push_data_to_decoder) { 141 bool push_data_to_decoder) {
142 buffer_ = std::move(data);
143
150 if (actual_decoder_) { 144 if (actual_decoder_) {
151 all_data_received_ = all_data_received; 145 all_data_received_ = all_data_received;
152 if (push_data_to_decoder) 146 if (push_data_to_decoder)
153 actual_decoder_->SetData(data, all_data_received); 147 actual_decoder_->SetData(buffer_, all_data_received);
154 PrepareLazyDecodedFrames(); 148 PrepareLazyDecodedFrames();
155 } 149 }
156
157 if (frame_generator_) {
158 if (!rw_buffer_)
159 rw_buffer_ = WTF::WrapUnique(new SkRWBuffer(data->size()));
160
161 const char* segment = 0;
162 for (size_t length = data->GetSomeData(segment, rw_buffer_->size()); length;
163 length = data->GetSomeData(segment, rw_buffer_->size())) {
164 DCHECK_GE(data->size(), rw_buffer_->size() + length);
165 const size_t remaining = data->size() - rw_buffer_->size() - length;
166 rw_buffer_->append(segment, length, remaining);
167 }
168 }
169 } 150 }
170 151
171 bool DeferredImageDecoder::IsSizeAvailable() { 152 bool DeferredImageDecoder::IsSizeAvailable() {
172 // m_actualDecoder is 0 only if image decoding is deferred and that means 153 // m_actualDecoder is 0 only if image decoding is deferred and that means
173 // the image header decoded successfully and the size is available. 154 // the image header decoded successfully and the size is available.
174 return actual_decoder_ ? actual_decoder_->IsSizeAvailable() : true; 155 return actual_decoder_ ? actual_decoder_->IsSizeAvailable() : true;
175 } 156 }
176 157
177 bool DeferredImageDecoder::HasEmbeddedColorSpace() const { 158 bool DeferredImageDecoder::HasEmbeddedColorSpace() const {
178 return actual_decoder_ ? actual_decoder_->HasEmbeddedColorSpace() 159 return actual_decoder_ ? actual_decoder_->HasEmbeddedColorSpace()
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 } 290 }
310 } 291 }
311 292
312 sk_sp<SkImage> DeferredImageDecoder::CreateFrameImageAtIndex( 293 sk_sp<SkImage> DeferredImageDecoder::CreateFrameImageAtIndex(
313 size_t index, 294 size_t index,
314 bool known_to_be_opaque) { 295 bool known_to_be_opaque) {
315 const SkISize& decoded_size = frame_generator_->GetFullSize(); 296 const SkISize& decoded_size = frame_generator_->GetFullSize();
316 DCHECK_GT(decoded_size.width(), 0); 297 DCHECK_GT(decoded_size.width(), 0);
317 DCHECK_GT(decoded_size.height(), 0); 298 DCHECK_GT(decoded_size.height(), 0);
318 299
319 sk_sp<SkROBuffer> ro_buffer(rw_buffer_->makeROBufferSnapshot()); 300 RefPtr<SharedBuffer::ThreadSafeStepper> stepper =
320 RefPtr<SegmentReader> segment_reader = 301 buffer_->thread_safe_stepper();
321 SegmentReader::CreateFromSkROBuffer(std::move(ro_buffer));
322 302
323 SkImageInfo info = SkImageInfo::MakeN32( 303 SkImageInfo info = SkImageInfo::MakeN32(
324 decoded_size.width(), decoded_size.height(), 304 decoded_size.width(), decoded_size.height(),
325 known_to_be_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType, 305 known_to_be_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType,
326 color_space_for_sk_images_); 306 color_space_for_sk_images_);
327 307
328 auto generator = WTF::MakeUnique<DecodingImageGenerator>( 308 auto generator = WTF::MakeUnique<DecodingImageGenerator>(
329 frame_generator_, info, std::move(segment_reader), all_data_received_, 309 frame_generator_, info, stepper, all_data_received_, index,
330 index, frame_data_[index].unique_id_); 310 frame_data_[index].unique_id_);
331 generator->SetCanYUVDecode(can_yuv_decode_); 311 generator->SetCanYUVDecode(can_yuv_decode_);
332 sk_sp<SkImage> image = SkImage::MakeFromGenerator(std::move(generator)); 312 sk_sp<SkImage> image = SkImage::MakeFromGenerator(std::move(generator));
333 if (!image) 313 if (!image)
334 return nullptr; 314 return nullptr;
335 315
336 // We can consider decoded bitmap constant and reuse uniqueID only after all 316 // We can consider decoded bitmap constant and reuse uniqueID only after all
337 // data is received. We reuse it also for multiframe images when image data 317 // data is received. We reuse it also for multiframe images when image data
338 // is partially received but the frame data is fully received. 318 // is partially received but the frame data is fully received.
339 if (all_data_received_ || frame_data_[index].is_complete_) { 319 if (all_data_received_ || frame_data_[index].is_complete_) {
340 DCHECK(frame_data_[index].unique_id_ == 320 DCHECK(frame_data_[index].unique_id_ ==
(...skipping 17 matching lines...) Expand all
358 338
359 namespace WTF { 339 namespace WTF {
360 template <> 340 template <>
361 struct VectorTraits<blink::DeferredFrameData> 341 struct VectorTraits<blink::DeferredFrameData>
362 : public SimpleClassVectorTraits<blink::DeferredFrameData> { 342 : public SimpleClassVectorTraits<blink::DeferredFrameData> {
363 STATIC_ONLY(VectorTraits); 343 STATIC_ONLY(VectorTraits);
364 static const bool kCanInitializeWithMemset = 344 static const bool kCanInitializeWithMemset =
365 false; // Not all DeferredFrameData members initialize to 0. 345 false; // Not all DeferredFrameData members initialize to 0.
366 }; 346 };
367 } 347 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698