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

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

Issue 2982083002: FrameIsCompleteAtIndex to FrameIsReceivedAtIndex (Closed)
Patch Set: Update upstack from ImageDecoder Created 3 years, 5 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) 2006 Samuel Weinig (sam.weinig@gmail.com) 2 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 frames_.Grow(num_frames); 147 frames_.Grow(num_frames);
148 148
149 // We are caching frame snapshots. This is OK even for partially decoded 149 // We are caching frame snapshots. This is OK even for partially decoded
150 // frames, as they are cleared by dataChanged() when new data arrives. 150 // frames, as they are cleared by dataChanged() when new data arrives.
151 sk_sp<SkImage> image = source_.CreateFrameAtIndex(index); 151 sk_sp<SkImage> image = source_.CreateFrameAtIndex(index);
152 cached_frame_ = image; 152 cached_frame_ = image;
153 cached_frame_index_ = index; 153 cached_frame_index_ = index;
154 154
155 frames_[index].orientation_ = source_.OrientationAtIndex(index); 155 frames_[index].orientation_ = source_.OrientationAtIndex(index);
156 frames_[index].have_metadata_ = true; 156 frames_[index].have_metadata_ = true;
157 frames_[index].is_complete_ = source_.FrameIsCompleteAtIndex(index); 157 frames_[index].is_complete_ = source_.FrameIsReceivedAtIndex(index);
158 if (RepetitionCount(false) != kAnimationNone) 158 if (RepetitionCount(false) != kAnimationNone)
159 frames_[index].duration_ = source_.FrameDurationAtIndex(index); 159 frames_[index].duration_ = source_.FrameDurationAtIndex(index);
160 frames_[index].has_alpha_ = source_.FrameHasAlphaAtIndex(index); 160 frames_[index].has_alpha_ = source_.FrameHasAlphaAtIndex(index);
161 frames_[index].frame_bytes_ = source_.FrameBytesAtIndex(index); 161 frames_[index].frame_bytes_ = source_.FrameBytesAtIndex(index);
162 162
163 NotifyMemoryChanged(); 163 NotifyMemoryChanged();
164 return image; 164 return image;
165 } 165 }
166 166
167 void BitmapImage::UpdateSize() const { 167 void BitmapImage::UpdateSize() const {
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 sk_sp<SkImage> BitmapImage::FrameAtIndex(size_t index) { 342 sk_sp<SkImage> BitmapImage::FrameAtIndex(size_t index) {
343 if (index >= FrameCount()) 343 if (index >= FrameCount())
344 return nullptr; 344 return nullptr;
345 345
346 if (index == cached_frame_index_ && cached_frame_) 346 if (index == cached_frame_index_ && cached_frame_)
347 return cached_frame_; 347 return cached_frame_;
348 348
349 return DecodeAndCacheFrame(index); 349 return DecodeAndCacheFrame(index);
350 } 350 }
351 351
352 bool BitmapImage::FrameIsCompleteAtIndex(size_t index) const { 352 bool BitmapImage::FrameIsReceivedAtIndex(size_t index) const {
353 if (index < frames_.size() && frames_[index].have_metadata_ && 353 if (index < frames_.size() && frames_[index].have_metadata_ &&
354 frames_[index].is_complete_) 354 frames_[index].is_complete_)
355 return true; 355 return true;
356 356
357 return source_.FrameIsCompleteAtIndex(index); 357 return source_.FrameIsReceivedAtIndex(index);
358 } 358 }
359 359
360 float BitmapImage::FrameDurationAtIndex(size_t index) const { 360 float BitmapImage::FrameDurationAtIndex(size_t index) const {
361 if (index < frames_.size() && frames_[index].have_metadata_) 361 if (index < frames_.size() && frames_[index].have_metadata_)
362 return frames_[index].duration_; 362 return frames_[index].duration_;
363 363
364 return source_.FrameDurationAtIndex(index); 364 return source_.FrameDurationAtIndex(index);
365 } 365 }
366 366
367 sk_sp<SkImage> BitmapImage::ImageForCurrentFrame() { 367 sk_sp<SkImage> BitmapImage::ImageForCurrentFrame() {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 if (metadata_mode == kPreCacheMetadata) { 399 if (metadata_mode == kPreCacheMetadata) {
400 // frameHasAlphaAtIndex() conservatively returns false for uncached frames. 400 // frameHasAlphaAtIndex() conservatively returns false for uncached frames.
401 // To increase the chance of an accurate answer, pre-cache the current frame 401 // To increase the chance of an accurate answer, pre-cache the current frame
402 // metadata. 402 // metadata.
403 FrameAtIndex(CurrentFrame()); 403 FrameAtIndex(CurrentFrame());
404 } 404 }
405 return !FrameHasAlphaAtIndex(CurrentFrame()); 405 return !FrameHasAlphaAtIndex(CurrentFrame());
406 } 406 }
407 407
408 bool BitmapImage::CurrentFrameIsComplete() { 408 bool BitmapImage::CurrentFrameIsComplete() {
409 return FrameIsCompleteAtIndex(CurrentFrame()); 409 return FrameIsReceivedAtIndex(CurrentFrame());
410 } 410 }
411 411
412 bool BitmapImage::CurrentFrameIsLazyDecoded() { 412 bool BitmapImage::CurrentFrameIsLazyDecoded() {
413 sk_sp<SkImage> image = FrameAtIndex(CurrentFrame()); 413 sk_sp<SkImage> image = FrameAtIndex(CurrentFrame());
414 return image && image->isLazyGenerated(); 414 return image && image->isLazyGenerated();
415 } 415 }
416 416
417 ImageOrientation BitmapImage::CurrentFrameOrientation() { 417 ImageOrientation BitmapImage::CurrentFrameOrientation() {
418 return FrameOrientationAtIndex(CurrentFrame()); 418 return FrameOrientationAtIndex(CurrentFrame());
419 } 419 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 if (frame_timer_ || !ShouldAnimate() || FrameCount() <= 1) 457 if (frame_timer_ || !ShouldAnimate() || FrameCount() <= 1)
458 return; 458 return;
459 459
460 // If we aren't already animating, set now as the animation start time. 460 // If we aren't already animating, set now as the animation start time.
461 const double time = MonotonicallyIncreasingTime(); 461 const double time = MonotonicallyIncreasingTime();
462 if (!desired_frame_start_time_) 462 if (!desired_frame_start_time_)
463 desired_frame_start_time_ = time; 463 desired_frame_start_time_ = time;
464 464
465 // Don't advance the animation to an incomplete frame. 465 // Don't advance the animation to an incomplete frame.
466 size_t next_frame = (current_frame_ + 1) % FrameCount(); 466 size_t next_frame = (current_frame_ + 1) % FrameCount();
467 if (!all_data_received_ && !FrameIsCompleteAtIndex(next_frame)) 467 if (!all_data_received_ && !FrameIsReceivedAtIndex(next_frame))
468 return; 468 return;
469 469
470 // Don't advance past the last frame if we haven't decoded the whole image 470 // Don't advance past the last frame if we haven't decoded the whole image
471 // yet and our repetition count is potentially unset. The repetition count 471 // yet and our repetition count is potentially unset. The repetition count
472 // in a GIF can potentially come after all the rest of the image data, so 472 // in a GIF can potentially come after all the rest of the image data, so
473 // wait on it. 473 // wait on it.
474 if (!all_data_received_ && 474 if (!all_data_received_ &&
475 (RepetitionCount(false) == kAnimationLoopOnce || 475 (RepetitionCount(false) == kAnimationLoopOnce ||
476 animation_policy_ == kImageAnimationPolicyAnimateOnce) && 476 animation_policy_ == kImageAnimationPolicyAnimateOnce) &&
477 current_frame_ >= (FrameCount() - 1)) 477 current_frame_ >= (FrameCount() - 1))
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 frame_timer_ = WTF::WrapUnique(new TaskRunnerTimer<BitmapImage>( 510 frame_timer_ = WTF::WrapUnique(new TaskRunnerTimer<BitmapImage>(
511 task_runner_, this, &BitmapImage::AdvanceAnimation)); 511 task_runner_, this, &BitmapImage::AdvanceAnimation));
512 frame_timer_->StartOneShot(std::max(desired_frame_start_time_ - time, 0.), 512 frame_timer_->StartOneShot(std::max(desired_frame_start_time_ - time, 0.),
513 BLINK_FROM_HERE); 513 BLINK_FROM_HERE);
514 } else { 514 } else {
515 // We've already reached or passed the time for the next frame to start. 515 // We've already reached or passed the time for the next frame to start.
516 // See if we've also passed the time for frames after that to start, in 516 // See if we've also passed the time for frames after that to start, in
517 // case we need to skip some frames entirely. Remember not to advance 517 // case we need to skip some frames entirely. Remember not to advance
518 // to an incomplete frame. 518 // to an incomplete frame.
519 for (size_t frame_after_next = (next_frame + 1) % FrameCount(); 519 for (size_t frame_after_next = (next_frame + 1) % FrameCount();
520 FrameIsCompleteAtIndex(frame_after_next); 520 FrameIsReceivedAtIndex(frame_after_next);
521 frame_after_next = (next_frame + 1) % FrameCount()) { 521 frame_after_next = (next_frame + 1) % FrameCount()) {
522 // Should we skip the next frame? 522 // Should we skip the next frame?
523 double frame_after_next_start_time = 523 double frame_after_next_start_time =
524 desired_frame_start_time_ + FrameDurationAtIndex(next_frame); 524 desired_frame_start_time_ + FrameDurationAtIndex(next_frame);
525 if (time < frame_after_next_start_time) 525 if (time < frame_after_next_start_time)
526 break; 526 break;
527 527
528 // Skip the next frame by advancing the animation forward one frame. 528 // Skip the next frame by advancing the animation forward one frame.
529 if (!InternalAdvanceAnimation(kSkipFramesToCatchUp)) { 529 if (!InternalAdvanceAnimation(kSkipFramesToCatchUp)) {
530 DCHECK(animation_finished_); 530 DCHECK(animation_finished_);
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 643
644 return true; 644 return true;
645 } 645 }
646 646
647 void BitmapImage::NotifyObserversOfAnimationAdvance(TimerBase*) { 647 void BitmapImage::NotifyObserversOfAnimationAdvance(TimerBase*) {
648 if (GetImageObserver()) 648 if (GetImageObserver())
649 GetImageObserver()->AnimationAdvanced(this); 649 GetImageObserver()->AnimationAdvanced(this);
650 } 650 }
651 651
652 } // namespace blink 652 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698