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 #ifndef CC_TEST_FAKE_PAINT_IMAGE_GENERATOR_H_
6 #define CC_TEST_FAKE_PAINT_IMAGE_GENERATOR_H_
7 
8 #include <vector>
9 
10 #include "base/containers/flat_map.h"
11 #include "cc/paint/paint_image_generator.h"
12 #include "third_party/skia/include/core/SkYUVAPixmaps.h"
13 
14 namespace cc {
15 
16 class FakePaintImageGenerator : public PaintImageGenerator {
17  public:
18   // RGB decoding mode constructor.
19   explicit FakePaintImageGenerator(
20       const SkImageInfo& info,
21       std::vector<FrameMetadata> frames = {FrameMetadata()},
22       bool allocate_discardable_memory = true,
23       std::vector<SkISize> supported_sizes = {});
24   // YUV decoding mode constructor.
25   explicit FakePaintImageGenerator(
26       const SkImageInfo& info,
27       const SkYUVAPixmapInfo& yuva_pixmap_info,
28       std::vector<FrameMetadata> frames = {FrameMetadata()},
29       bool allocate_discardable_memory = true,
30       std::vector<SkISize> supported_sizes = {});
31   FakePaintImageGenerator(const FakePaintImageGenerator&) = delete;
32   ~FakePaintImageGenerator() override;
33 
34   FakePaintImageGenerator& operator=(const FakePaintImageGenerator&) = delete;
35 
36   // PaintImageGenerator implementation.
37   sk_sp<SkData> GetEncodedData() const override;
38   bool GetPixels(const SkImageInfo& info,
39                  void* pixels,
40                  size_t row_bytes,
41                  size_t frame_index,
42                  PaintImage::GeneratorClientId client_id,
43                  uint32_t lazy_pixel_ref) override;
44   bool QueryYUVA(
45       const SkYUVAPixmapInfo::SupportedDataTypes& supported_data_types,
46       SkYUVAPixmapInfo* yuva_pixmap_info) const override;
47   bool GetYUVAPlanes(const SkYUVAPixmaps& pixmaps,
48                      size_t frame_index,
49                      uint32_t lazy_pixel_ref) override;
50   SkISize GetSupportedDecodeSize(const SkISize& requested_size) const override;
51   const ImageHeaderMetadata* GetMetadataForDecodeAcceleration() const override;
52 
frames_decoded()53   const base::flat_map<size_t, int>& frames_decoded() const {
54     return frames_decoded_count_;
55   }
decode_infos()56   const std::vector<SkImageInfo>& decode_infos() const {
57     CHECK(!is_yuv_);
58     return decode_infos_;
59   }
reset_frames_decoded()60   void reset_frames_decoded() { frames_decoded_count_.clear(); }
SetExpectFallbackToRGB()61   void SetExpectFallbackToRGB() { expect_fallback_to_rgb_ = true; }
SetImageHeaderMetadata(const ImageHeaderMetadata & image_metadata)62   void SetImageHeaderMetadata(const ImageHeaderMetadata& image_metadata) {
63     image_metadata_ = image_metadata;
64   }
65 
66  private:
67   std::vector<uint8_t> image_backing_memory_;
68   SkPixmap image_pixmap_;
69   base::flat_map<size_t, int> frames_decoded_count_;
70   std::vector<SkISize> supported_sizes_;
71   std::vector<SkImageInfo> decode_infos_;
72   bool is_yuv_ = false;
73   SkYUVAPixmapInfo yuva_pixmap_info_;
74   // TODO(skbug.com/8564): After Skia supports rendering from software YUV
75   // planes and after Chrome implements it, we should no longer expect RGB
76   // fallback.
77   bool expect_fallback_to_rgb_ = false;
78   ImageHeaderMetadata image_metadata_;
79 };
80 
81 }  // namespace cc
82 
83 #endif  // CC_TEST_FAKE_PAINT_IMAGE_GENERATOR_H_
84