| 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 28 matching lines...) Expand all Loading... |
| 39 namespace blink { | 39 namespace blink { |
| 40 | 40 |
| 41 struct DeferredFrameData { | 41 struct DeferredFrameData { |
| 42 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); | 42 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); |
| 43 WTF_MAKE_NONCOPYABLE(DeferredFrameData); | 43 WTF_MAKE_NONCOPYABLE(DeferredFrameData); |
| 44 | 44 |
| 45 public: | 45 public: |
| 46 DeferredFrameData() | 46 DeferredFrameData() |
| 47 : orientation_(kDefaultImageOrientation), | 47 : orientation_(kDefaultImageOrientation), |
| 48 duration_(0), | 48 duration_(0), |
| 49 is_complete_(false), | 49 is_received_(false), |
| 50 frame_bytes_(0), | 50 frame_bytes_(0), |
| 51 unique_id_(DecodingImageGenerator::kNeedNewImageUniqueID) {} | 51 unique_id_(DecodingImageGenerator::kNeedNewImageUniqueID) {} |
| 52 | 52 |
| 53 ImageOrientation orientation_; | 53 ImageOrientation orientation_; |
| 54 float duration_; | 54 float duration_; |
| 55 bool is_complete_; | 55 bool is_received_; |
| 56 size_t frame_bytes_; | 56 size_t frame_bytes_; |
| 57 uint32_t unique_id_; | 57 uint32_t unique_id_; |
| 58 }; | 58 }; |
| 59 | 59 |
| 60 std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::Create( | 60 std::unique_ptr<DeferredImageDecoder> DeferredImageDecoder::Create( |
| 61 RefPtr<SharedBuffer> data, | 61 RefPtr<SharedBuffer> data, |
| 62 bool data_complete, | 62 bool data_complete, |
| 63 ImageDecoder::AlphaOption alpha_option, | 63 ImageDecoder::AlphaOption alpha_option, |
| 64 const ColorBehavior& color_behavior) { | 64 const ColorBehavior& color_behavior) { |
| 65 std::unique_ptr<ImageDecoder> actual_decoder = | 65 std::unique_ptr<ImageDecoder> actual_decoder = |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 } | 212 } |
| 213 | 213 |
| 214 bool DeferredImageDecoder::FrameHasAlphaAtIndex(size_t index) const { | 214 bool DeferredImageDecoder::FrameHasAlphaAtIndex(size_t index) const { |
| 215 if (actual_decoder_) | 215 if (actual_decoder_) |
| 216 return actual_decoder_->FrameHasAlphaAtIndex(index); | 216 return actual_decoder_->FrameHasAlphaAtIndex(index); |
| 217 if (!frame_generator_->IsMultiFrame()) | 217 if (!frame_generator_->IsMultiFrame()) |
| 218 return frame_generator_->HasAlpha(index); | 218 return frame_generator_->HasAlpha(index); |
| 219 return true; | 219 return true; |
| 220 } | 220 } |
| 221 | 221 |
| 222 bool DeferredImageDecoder::FrameIsCompleteAtIndex(size_t index) const { | 222 bool DeferredImageDecoder::FrameIsReceivedAtIndex(size_t index) const { |
| 223 if (actual_decoder_) | 223 if (actual_decoder_) |
| 224 return actual_decoder_->FrameIsCompleteAtIndex(index); | 224 return actual_decoder_->FrameIsReceivedAtIndex(index); |
| 225 if (index < frame_data_.size()) | 225 if (index < frame_data_.size()) |
| 226 return frame_data_[index].is_complete_; | 226 return frame_data_[index].is_received_; |
| 227 return false; | 227 return false; |
| 228 } | 228 } |
| 229 | 229 |
| 230 float DeferredImageDecoder::FrameDurationAtIndex(size_t index) const { | 230 float DeferredImageDecoder::FrameDurationAtIndex(size_t index) const { |
| 231 if (actual_decoder_) | 231 if (actual_decoder_) |
| 232 return actual_decoder_->FrameDurationAtIndex(index); | 232 return actual_decoder_->FrameDurationAtIndex(index); |
| 233 if (index < frame_data_.size()) | 233 if (index < frame_data_.size()) |
| 234 return frame_data_[index].duration_; | 234 return frame_data_[index].duration_; |
| 235 return 0; | 235 return 0; |
| 236 } | 236 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 const size_t previous_size = frame_data_.size(); | 284 const size_t previous_size = frame_data_.size(); |
| 285 frame_data_.resize(actual_decoder_->FrameCount()); | 285 frame_data_.resize(actual_decoder_->FrameCount()); |
| 286 | 286 |
| 287 // We have encountered a broken image file. Simply bail. | 287 // We have encountered a broken image file. Simply bail. |
| 288 if (frame_data_.size() < previous_size) | 288 if (frame_data_.size() < previous_size) |
| 289 return; | 289 return; |
| 290 | 290 |
| 291 for (size_t i = previous_size; i < frame_data_.size(); ++i) { | 291 for (size_t i = previous_size; i < frame_data_.size(); ++i) { |
| 292 frame_data_[i].duration_ = actual_decoder_->FrameDurationAtIndex(i); | 292 frame_data_[i].duration_ = actual_decoder_->FrameDurationAtIndex(i); |
| 293 frame_data_[i].orientation_ = actual_decoder_->Orientation(); | 293 frame_data_[i].orientation_ = actual_decoder_->Orientation(); |
| 294 frame_data_[i].is_complete_ = actual_decoder_->FrameIsCompleteAtIndex(i); | 294 frame_data_[i].is_received_ = actual_decoder_->FrameIsReceivedAtIndex(i); |
| 295 } | 295 } |
| 296 | 296 |
| 297 // The last lazy decoded frame created from previous call might be | 297 // The last lazy decoded frame created from previous call might be |
| 298 // incomplete so update its state. | 298 // incomplete so update its state. |
| 299 if (previous_size) { | 299 if (previous_size) { |
| 300 const size_t last_frame = previous_size - 1; | 300 const size_t last_frame = previous_size - 1; |
| 301 frame_data_[last_frame].is_complete_ = | 301 frame_data_[last_frame].is_received_ = |
| 302 actual_decoder_->FrameIsCompleteAtIndex(last_frame); | 302 actual_decoder_->FrameIsReceivedAtIndex(last_frame); |
| 303 } | 303 } |
| 304 | 304 |
| 305 if (all_data_received_) { | 305 if (all_data_received_) { |
| 306 repetition_count_ = actual_decoder_->RepetitionCount(); | 306 repetition_count_ = actual_decoder_->RepetitionCount(); |
| 307 actual_decoder_.reset(); | 307 actual_decoder_.reset(); |
| 308 // Hold on to m_rwBuffer, which is still needed by createFrameAtIndex. | 308 // Hold on to m_rwBuffer, which is still needed by createFrameAtIndex. |
| 309 } | 309 } |
| 310 } | 310 } |
| 311 | 311 |
| 312 sk_sp<SkImage> DeferredImageDecoder::CreateFrameImageAtIndex( | 312 sk_sp<SkImage> DeferredImageDecoder::CreateFrameImageAtIndex( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 329 frame_generator_, info, std::move(segment_reader), all_data_received_, | 329 frame_generator_, info, std::move(segment_reader), all_data_received_, |
| 330 index, frame_data_[index].unique_id_); | 330 index, frame_data_[index].unique_id_); |
| 331 generator->SetCanYUVDecode(can_yuv_decode_); | 331 generator->SetCanYUVDecode(can_yuv_decode_); |
| 332 sk_sp<SkImage> image = SkImage::MakeFromGenerator(std::move(generator)); | 332 sk_sp<SkImage> image = SkImage::MakeFromGenerator(std::move(generator)); |
| 333 if (!image) | 333 if (!image) |
| 334 return nullptr; | 334 return nullptr; |
| 335 | 335 |
| 336 // We can consider decoded bitmap constant and reuse uniqueID only after all | 336 // 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 | 337 // data is received. We reuse it also for multiframe images when image data |
| 338 // is partially received but the frame data is fully received. | 338 // is partially received but the frame data is fully received. |
| 339 if (all_data_received_ || frame_data_[index].is_complete_) { | 339 if (all_data_received_ || frame_data_[index].is_received_) { |
| 340 DCHECK(frame_data_[index].unique_id_ == | 340 DCHECK(frame_data_[index].unique_id_ == |
| 341 DecodingImageGenerator::kNeedNewImageUniqueID || | 341 DecodingImageGenerator::kNeedNewImageUniqueID || |
| 342 frame_data_[index].unique_id_ == image->uniqueID()); | 342 frame_data_[index].unique_id_ == image->uniqueID()); |
| 343 frame_data_[index].unique_id_ = image->uniqueID(); | 343 frame_data_[index].unique_id_ = image->uniqueID(); |
| 344 } | 344 } |
| 345 | 345 |
| 346 return image; | 346 return image; |
| 347 } | 347 } |
| 348 | 348 |
| 349 bool DeferredImageDecoder::HotSpot(IntPoint& hot_spot) const { | 349 bool DeferredImageDecoder::HotSpot(IntPoint& hot_spot) const { |
| 350 if (actual_decoder_) | 350 if (actual_decoder_) |
| 351 return actual_decoder_->HotSpot(hot_spot); | 351 return actual_decoder_->HotSpot(hot_spot); |
| 352 if (has_hot_spot_) | 352 if (has_hot_spot_) |
| 353 hot_spot = hot_spot_; | 353 hot_spot = hot_spot_; |
| 354 return has_hot_spot_; | 354 return has_hot_spot_; |
| 355 } | 355 } |
| 356 | 356 |
| 357 } // namespace blink | 357 } // namespace blink |
| 358 | 358 |
| 359 namespace WTF { | 359 namespace WTF { |
| 360 template <> | 360 template <> |
| 361 struct VectorTraits<blink::DeferredFrameData> | 361 struct VectorTraits<blink::DeferredFrameData> |
| 362 : public SimpleClassVectorTraits<blink::DeferredFrameData> { | 362 : public SimpleClassVectorTraits<blink::DeferredFrameData> { |
| 363 STATIC_ONLY(VectorTraits); | 363 STATIC_ONLY(VectorTraits); |
| 364 static const bool kCanInitializeWithMemset = | 364 static const bool kCanInitializeWithMemset = |
| 365 false; // Not all DeferredFrameData members initialize to 0. | 365 false; // Not all DeferredFrameData members initialize to 0. |
| 366 }; | 366 }; |
| 367 } | 367 } |
| OLD | NEW |