| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |