OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "cc/tiles/software_image_decode_controller.h" | 5 #include "cc/tiles/software_image_decode_controller.h" |
6 | 6 |
7 #include <inttypes.h> | 7 #include <inttypes.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 scoped_refptr<TileTask>, | 53 scoped_refptr<TileTask>, |
54 SoftwareImageDecodeController::ImageKeyHash>* task_map, | 54 SoftwareImageDecodeController::ImageKeyHash>* task_map, |
55 const SoftwareImageDecodeController::ImageKey& key) | 55 const SoftwareImageDecodeController::ImageKey& key) |
56 : task_map_(task_map), key_(key) {} | 56 : task_map_(task_map), key_(key) {} |
57 ~AutoRemoveKeyFromTaskMap() { task_map_->erase(key_); } | 57 ~AutoRemoveKeyFromTaskMap() { task_map_->erase(key_); } |
58 | 58 |
59 private: | 59 private: |
60 std::unordered_map<SoftwareImageDecodeController::ImageKey, | 60 std::unordered_map<SoftwareImageDecodeController::ImageKey, |
61 scoped_refptr<TileTask>, | 61 scoped_refptr<TileTask>, |
62 SoftwareImageDecodeController::ImageKeyHash>* task_map_; | 62 SoftwareImageDecodeController::ImageKeyHash>* task_map_; |
63 SoftwareImageDecodeController::ImageKey key_; | 63 const SoftwareImageDecodeController::ImageKey& key_; |
| 64 }; |
| 65 |
| 66 class AutoDrawWithImageFinished { |
| 67 public: |
| 68 AutoDrawWithImageFinished(SoftwareImageDecodeController* controller, |
| 69 const DrawImage& draw_image, |
| 70 const DecodedDrawImage& decoded_draw_image) |
| 71 : controller_(controller), |
| 72 draw_image_(draw_image), |
| 73 decoded_draw_image_(decoded_draw_image) {} |
| 74 ~AutoDrawWithImageFinished() { |
| 75 controller_->DrawWithImageFinished(draw_image_, decoded_draw_image_); |
| 76 } |
| 77 |
| 78 private: |
| 79 SoftwareImageDecodeController* controller_; |
| 80 const DrawImage& draw_image_; |
| 81 const DecodedDrawImage& decoded_draw_image_; |
64 }; | 82 }; |
65 | 83 |
66 class ImageDecodeTaskImpl : public TileTask { | 84 class ImageDecodeTaskImpl : public TileTask { |
67 public: | 85 public: |
68 ImageDecodeTaskImpl(SoftwareImageDecodeController* controller, | 86 ImageDecodeTaskImpl(SoftwareImageDecodeController* controller, |
69 const SoftwareImageDecodeController::ImageKey& image_key, | 87 const SoftwareImageDecodeController::ImageKey& image_key, |
70 const DrawImage& image, | 88 const DrawImage& image, |
71 const ImageDecodeController::TracingInfo& tracing_info) | 89 const ImageDecodeController::TracingInfo& tracing_info) |
72 : TileTask(true), | 90 : TileTask(true), |
73 controller_(controller), | 91 controller_(controller), |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 kNone_SkFilterQuality, SkMatrix::I()); | 561 kNone_SkFilterQuality, SkMatrix::I()); |
544 ImageKey original_size_key = | 562 ImageKey original_size_key = |
545 ImageKey::FromDrawImage(original_size_draw_image); | 563 ImageKey::FromDrawImage(original_size_draw_image); |
546 // Sanity checks. | 564 // Sanity checks. |
547 DCHECK(original_size_key.can_use_original_decode()) | 565 DCHECK(original_size_key.can_use_original_decode()) |
548 << original_size_key.ToString(); | 566 << original_size_key.ToString(); |
549 DCHECK(full_image_rect.size() == original_size_key.target_size()); | 567 DCHECK(full_image_rect.size() == original_size_key.target_size()); |
550 | 568 |
551 auto decoded_draw_image = GetDecodedImageForDrawInternal( | 569 auto decoded_draw_image = GetDecodedImageForDrawInternal( |
552 original_size_key, original_size_draw_image); | 570 original_size_key, original_size_draw_image); |
553 if (!decoded_draw_image.image()) { | 571 AutoDrawWithImageFinished auto_finish_draw(this, original_size_draw_image, |
554 DrawWithImageFinished(original_size_draw_image, decoded_draw_image); | 572 decoded_draw_image); |
| 573 if (!decoded_draw_image.image()) |
555 return nullptr; | 574 return nullptr; |
556 } | |
557 | 575 |
558 SkImageInfo subrect_info = CreateImageInfo( | 576 SkImageInfo subrect_info = CreateImageInfo( |
559 key.target_size().width(), key.target_size().height(), format_); | 577 key.target_size().width(), key.target_size().height(), format_); |
560 std::unique_ptr<base::DiscardableMemory> subrect_pixels; | 578 std::unique_ptr<base::DiscardableMemory> subrect_pixels; |
561 { | 579 { |
562 TRACE_EVENT0("disabled-by-default-cc.debug", | 580 TRACE_EVENT0("disabled-by-default-cc.debug", |
563 "SoftwareImageDecodeController::GetSubrectImageDecode - " | 581 "SoftwareImageDecodeController::GetSubrectImageDecode - " |
564 "allocate subrect pixels"); | 582 "allocate subrect pixels"); |
565 subrect_pixels = | 583 subrect_pixels = |
566 base::DiscardableMemoryAllocator::GetInstance() | 584 base::DiscardableMemoryAllocator::GetInstance() |
567 ->AllocateLockedDiscardableMemory(subrect_info.minRowBytes() * | 585 ->AllocateLockedDiscardableMemory(subrect_info.minRowBytes() * |
568 subrect_info.height()); | 586 subrect_info.height()); |
569 } | 587 } |
570 { | 588 { |
571 TRACE_EVENT0("disabled-by-default-cc.debug", | 589 TRACE_EVENT0("disabled-by-default-cc.debug", |
572 "SoftwareImageDecodeController::GetOriginalImageDecode - " | 590 "SoftwareImageDecodeController::GetOriginalImageDecode - " |
573 "read pixels"); | 591 "read pixels"); |
574 bool result = decoded_draw_image.image()->readPixels( | 592 bool result = decoded_draw_image.image()->readPixels( |
575 subrect_info, subrect_pixels->data(), subrect_info.minRowBytes(), | 593 subrect_info, subrect_pixels->data(), subrect_info.minRowBytes(), |
576 key.src_rect().x(), key.src_rect().y(), SkImage::kDisallow_CachingHint); | 594 key.src_rect().x(), key.src_rect().y(), SkImage::kDisallow_CachingHint); |
577 // We have a decoded image, and we're reading into already allocated memory. | 595 // We have a decoded image, and we're reading into already allocated memory. |
578 // This should never fail. | 596 // This should never fail. |
579 DCHECK(result); | 597 DCHECK(result); |
580 // Release the original image, since we don't need it anymore. | |
581 DrawWithImageFinished(original_size_draw_image, decoded_draw_image); | |
582 } | 598 } |
583 return base::WrapUnique( | 599 return base::WrapUnique( |
584 new DecodedImage(subrect_info, std::move(subrect_pixels), | 600 new DecodedImage(subrect_info, std::move(subrect_pixels), |
585 SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), | 601 SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), |
586 next_tracing_id_.GetNext())); | 602 next_tracing_id_.GetNext())); |
587 } | 603 } |
588 | 604 |
589 std::unique_ptr<SoftwareImageDecodeController::DecodedImage> | 605 std::unique_ptr<SoftwareImageDecodeController::DecodedImage> |
590 SoftwareImageDecodeController::GetScaledImageDecode( | 606 SoftwareImageDecodeController::GetScaledImageDecode( |
591 const ImageKey& key, | 607 const ImageKey& key, |
592 sk_sp<const SkImage> image) { | 608 sk_sp<const SkImage> image) { |
593 // Construct a key to use in GetDecodedImageForDrawInternal(). | 609 // Construct a key to use in GetDecodedImageForDrawInternal(). |
594 // This allows us to reuse an image in any cache if available. | 610 // This allows us to reuse an image in any cache if available. |
595 gfx::Rect full_image_rect(image->width(), image->height()); | 611 gfx::Rect full_image_rect(image->width(), image->height()); |
596 DrawImage original_size_draw_image(std::move(image), | 612 DrawImage original_size_draw_image(std::move(image), |
597 gfx::RectToSkIRect(full_image_rect), | 613 gfx::RectToSkIRect(full_image_rect), |
598 kNone_SkFilterQuality, SkMatrix::I()); | 614 kNone_SkFilterQuality, SkMatrix::I()); |
599 ImageKey original_size_key = | 615 ImageKey original_size_key = |
600 ImageKey::FromDrawImage(original_size_draw_image); | 616 ImageKey::FromDrawImage(original_size_draw_image); |
601 // Sanity checks. | 617 // Sanity checks. |
602 DCHECK(original_size_key.can_use_original_decode()) | 618 DCHECK(original_size_key.can_use_original_decode()) |
603 << original_size_key.ToString(); | 619 << original_size_key.ToString(); |
604 DCHECK(full_image_rect.size() == original_size_key.target_size()); | 620 DCHECK(full_image_rect.size() == original_size_key.target_size()); |
605 | 621 |
606 auto decoded_draw_image = GetDecodedImageForDrawInternal( | 622 auto decoded_draw_image = GetDecodedImageForDrawInternal( |
607 original_size_key, original_size_draw_image); | 623 original_size_key, original_size_draw_image); |
608 if (!decoded_draw_image.image()) { | 624 AutoDrawWithImageFinished auto_finish_draw(this, original_size_draw_image, |
609 DrawWithImageFinished(original_size_draw_image, decoded_draw_image); | 625 decoded_draw_image); |
| 626 if (!decoded_draw_image.image()) |
610 return nullptr; | 627 return nullptr; |
611 } | |
612 | 628 |
613 SkPixmap decoded_pixmap; | 629 SkPixmap decoded_pixmap; |
614 bool result = decoded_draw_image.image()->peekPixels(&decoded_pixmap); | 630 bool result = decoded_draw_image.image()->peekPixels(&decoded_pixmap); |
615 DCHECK(result) << key.ToString(); | 631 DCHECK(result) << key.ToString(); |
616 if (key.src_rect() != full_image_rect) { | 632 if (key.src_rect() != full_image_rect) { |
617 result = decoded_pixmap.extractSubset(&decoded_pixmap, | 633 result = decoded_pixmap.extractSubset(&decoded_pixmap, |
618 gfx::RectToSkIRect(key.src_rect())); | 634 gfx::RectToSkIRect(key.src_rect())); |
619 DCHECK(result) << key.ToString(); | 635 DCHECK(result) << key.ToString(); |
620 } | 636 } |
621 | 637 |
(...skipping 14 matching lines...) Expand all Loading... |
636 DCHECK(key.filter_quality() == kHigh_SkFilterQuality || | 652 DCHECK(key.filter_quality() == kHigh_SkFilterQuality || |
637 key.filter_quality() == kMedium_SkFilterQuality); | 653 key.filter_quality() == kMedium_SkFilterQuality); |
638 { | 654 { |
639 TRACE_EVENT0("disabled-by-default-cc.debug", | 655 TRACE_EVENT0("disabled-by-default-cc.debug", |
640 "SoftwareImageDecodeController::ScaleImage - scale pixels"); | 656 "SoftwareImageDecodeController::ScaleImage - scale pixels"); |
641 bool result = | 657 bool result = |
642 decoded_pixmap.scalePixels(scaled_pixmap, key.filter_quality()); | 658 decoded_pixmap.scalePixels(scaled_pixmap, key.filter_quality()); |
643 DCHECK(result) << key.ToString(); | 659 DCHECK(result) << key.ToString(); |
644 } | 660 } |
645 | 661 |
646 // Release the original sized decode. Any other intermediate result to release | |
647 // would be the subrect memory. However, that's in a scoped_ptr and will be | |
648 // deleted automatically when we return. | |
649 DrawWithImageFinished(original_size_draw_image, decoded_draw_image); | |
650 | |
651 return base::WrapUnique( | 662 return base::WrapUnique( |
652 new DecodedImage(scaled_info, std::move(scaled_pixels), | 663 new DecodedImage(scaled_info, std::move(scaled_pixels), |
653 SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), | 664 SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), |
654 next_tracing_id_.GetNext())); | 665 next_tracing_id_.GetNext())); |
655 } | 666 } |
656 | 667 |
657 void SoftwareImageDecodeController::DrawWithImageFinished( | 668 void SoftwareImageDecodeController::DrawWithImageFinished( |
658 const DrawImage& image, | 669 const DrawImage& image, |
659 const DecodedDrawImage& decoded_image) { | 670 const DecodedDrawImage& decoded_image) { |
660 TRACE_EVENT1("disabled-by-default-cc.debug", | 671 TRACE_EVENT1("disabled-by-default-cc.debug", |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 void SoftwareImageDecodeController::MemoryBudget::ResetUsage() { | 1072 void SoftwareImageDecodeController::MemoryBudget::ResetUsage() { |
1062 current_usage_bytes_ = 0; | 1073 current_usage_bytes_ = 0; |
1063 } | 1074 } |
1064 | 1075 |
1065 size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe() | 1076 size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe() |
1066 const { | 1077 const { |
1067 return current_usage_bytes_.ValueOrDie(); | 1078 return current_usage_bytes_.ValueOrDie(); |
1068 } | 1079 } |
1069 | 1080 |
1070 } // namespace cc | 1081 } // namespace cc |
OLD | NEW |