vmpstr | 94cfa88 | 2017-04-14 01:19:35 | [diff] [blame] | 1 | // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "cc/paint/paint_image.h" |
Khushal | 1b8abc01 | 2017-08-10 05:16:17 | [diff] [blame] | 6 | |
vmpstr | 81a39a3 | 2017-05-16 19:30:21 | [diff] [blame] | 7 | #include "base/atomic_sequence_num.h" |
Khushal | 1b8abc01 | 2017-08-10 05:16:17 | [diff] [blame] | 8 | #include "base/memory/ptr_util.h" |
| 9 | #include "cc/paint/paint_image_generator.h" |
Vladimir Levin | 4f2c08c | 2017-07-28 03:03:28 | [diff] [blame] | 10 | #include "cc/paint/paint_record.h" |
Khushal | 1b8abc01 | 2017-08-10 05:16:17 | [diff] [blame] | 11 | #include "cc/paint/skia_paint_image_generator.h" |
Vladimir Levin | 4f2c08c | 2017-07-28 03:03:28 | [diff] [blame] | 12 | #include "ui/gfx/skia_util.h" |
vmpstr | 94cfa88 | 2017-04-14 01:19:35 | [diff] [blame] | 13 | |
| 14 | namespace cc { |
vmpstr | 81a39a3 | 2017-05-16 19:30:21 | [diff] [blame] | 15 | namespace { |
tzik | 455b325fa | 2017-07-20 03:24:57 | [diff] [blame] | 16 | base::AtomicSequenceNumber s_next_id_; |
vmpstr | 81a39a3 | 2017-05-16 19:30:21 | [diff] [blame] | 17 | } |
vmpstr | 94cfa88 | 2017-04-14 01:19:35 | [diff] [blame] | 18 | |
vmpstr | 55c7657ca | 2017-04-29 00:46:48 | [diff] [blame] | 19 | PaintImage::PaintImage() = default; |
vmpstr | 55c7657ca | 2017-04-29 00:46:48 | [diff] [blame] | 20 | PaintImage::PaintImage(const PaintImage& other) = default; |
| 21 | PaintImage::PaintImage(PaintImage&& other) = default; |
vmpstr | 94cfa88 | 2017-04-14 01:19:35 | [diff] [blame] | 22 | PaintImage::~PaintImage() = default; |
| 23 | |
vmpstr | 55c7657ca | 2017-04-29 00:46:48 | [diff] [blame] | 24 | PaintImage& PaintImage::operator=(const PaintImage& other) = default; |
| 25 | PaintImage& PaintImage::operator=(PaintImage&& other) = default; |
| 26 | |
khushalsagar | d5e13bf | 2017-05-17 08:08:50 | [diff] [blame] | 27 | bool PaintImage::operator==(const PaintImage& other) const { |
Khushal | b481b28 | 2017-08-24 00:06:53 | [diff] [blame^] | 28 | return sk_image_ == other.sk_image_ && paint_record_ == other.paint_record_ && |
| 29 | paint_record_rect_ == other.paint_record_rect_ && |
| 30 | paint_image_generator_ == other.paint_image_generator_ && |
| 31 | id_ == other.id_ && animation_type_ == other.animation_type_ && |
vmpstr | 05729e7 | 2017-06-06 03:07:18 | [diff] [blame] | 32 | completion_state_ == other.completion_state_ && |
Khushal | b481b28 | 2017-08-24 00:06:53 | [diff] [blame^] | 33 | subset_rect_ == other.subset_rect_ && |
khushalsagar | 54b956cf | 2017-06-21 15:54:05 | [diff] [blame] | 34 | frame_count_ == other.frame_count_ && |
| 35 | is_multipart_ == other.is_multipart_; |
vmpstr | 55c7657ca | 2017-04-29 00:46:48 | [diff] [blame] | 36 | } |
| 37 | |
vmpstr | 81a39a3 | 2017-05-16 19:30:21 | [diff] [blame] | 38 | PaintImage::Id PaintImage::GetNextId() { |
| 39 | return s_next_id_.GetNext(); |
| 40 | } |
| 41 | |
Vladimir Levin | 4f2c08c | 2017-07-28 03:03:28 | [diff] [blame] | 42 | const sk_sp<SkImage>& PaintImage::GetSkImage() const { |
| 43 | if (cached_sk_image_) |
| 44 | return cached_sk_image_; |
| 45 | |
| 46 | if (sk_image_) { |
| 47 | cached_sk_image_ = sk_image_; |
| 48 | } else if (paint_record_) { |
| 49 | cached_sk_image_ = SkImage::MakeFromPicture( |
| 50 | ToSkPicture(paint_record_, gfx::RectToSkRect(paint_record_rect_)), |
| 51 | SkISize::Make(paint_record_rect_.width(), paint_record_rect_.height()), |
| 52 | nullptr, nullptr, SkImage::BitDepth::kU8, SkColorSpace::MakeSRGB()); |
Khushal | 1b8abc01 | 2017-08-10 05:16:17 | [diff] [blame] | 53 | } else if (paint_image_generator_) { |
| 54 | cached_sk_image_ = SkImage::MakeFromGenerator( |
| 55 | base::MakeUnique<SkiaPaintImageGenerator>(paint_image_generator_)); |
Vladimir Levin | 4f2c08c | 2017-07-28 03:03:28 | [diff] [blame] | 56 | } |
Khushal | b481b28 | 2017-08-24 00:06:53 | [diff] [blame^] | 57 | |
| 58 | if (!subset_rect_.IsEmpty() && cached_sk_image_) { |
| 59 | cached_sk_image_ = |
| 60 | cached_sk_image_->makeSubset(gfx::RectToSkIRect(subset_rect_)); |
| 61 | } |
Vladimir Levin | 4f2c08c | 2017-07-28 03:03:28 | [diff] [blame] | 62 | return cached_sk_image_; |
| 63 | } |
| 64 | |
Khushal | b481b28 | 2017-08-24 00:06:53 | [diff] [blame^] | 65 | PaintImage PaintImage::MakeSubset(const gfx::Rect& subset) const { |
| 66 | DCHECK(!subset.IsEmpty()); |
| 67 | |
| 68 | // If the subset is the same as the image bounds, we can return the same |
| 69 | // image. |
| 70 | gfx::Rect bounds(width(), height()); |
| 71 | if (bounds == subset) |
| 72 | return *this; |
| 73 | |
| 74 | DCHECK(bounds.Contains(subset)) |
| 75 | << "Subset should not be greater than the image bounds"; |
| 76 | PaintImage result(*this); |
| 77 | result.subset_rect_ = subset; |
| 78 | // Store the subset from the original image. |
| 79 | result.subset_rect_.Offset(subset_rect_.x(), subset_rect_.y()); |
| 80 | |
| 81 | // Creating the |cached_sk_image_| is an optimization to allow re-use of the |
| 82 | // original decode for image subsets in skia, for cases that rely on skia's |
| 83 | // image decode cache. |
| 84 | // TODO(khushalsagar): Remove this when we no longer have such cases. See |
| 85 | // crbug.com/753639. |
| 86 | result.cached_sk_image_ = |
| 87 | GetSkImage()->makeSubset(gfx::RectToSkIRect(subset)); |
| 88 | return result; |
| 89 | } |
| 90 | |
vmpstr | 94cfa88 | 2017-04-14 01:19:35 | [diff] [blame] | 91 | } // namespace cc |