// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_RESOURCES_PICTURE_PILE_H_
#define CC_RESOURCES_PICTURE_PILE_H_

#include <bitset>
#include <utility>
#include <vector>

#include "base/containers/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "cc/base/tiling_data.h"
#include "cc/resources/picture.h"

namespace cc {
class PicturePileImpl;

class CC_EXPORT PicturePile : public RecordingSource {
 public:
  PicturePile(float min_contents_scale, const gfx::Size& tile_grid_size);
  ~PicturePile() override;

  // RecordingSource overrides.
  bool UpdateAndExpandInvalidation(ContentLayerClient* painter,
                                   Region* invalidation,
                                   bool can_use_lcd_text,
                                   const gfx::Size& layer_size,
                                   const gfx::Rect& visible_layer_rect,
                                   int frame_number,
                                   RecordingMode recording_mode) override;
  scoped_refptr<RasterSource> CreateRasterSource() const override;
  gfx::Size GetSize() const final;
  void SetEmptyBounds() override;
  void SetSlowdownRasterScaleFactor(int factor) override;
  bool IsSuitableForGpuRasterization() const override;
  void SetUnsuitableForGpuRasterizationForTesting() override;
  gfx::Size GetTileGridSizeForTesting() const override;

 protected:
  class CC_EXPORT PictureInfo {
   public:
    enum { INVALIDATION_FRAMES_TRACKED = 32 };

    PictureInfo();
    ~PictureInfo();

    bool Invalidate(int frame_number);
    bool NeedsRecording(int frame_number, int distance_to_visible);
    void SetPicture(scoped_refptr<Picture> picture);
    const Picture* GetPicture() const;

    float GetInvalidationFrequencyForTesting() const {
      return GetInvalidationFrequency();
    }

   private:
    void AdvanceInvalidationHistory(int frame_number);
    float GetInvalidationFrequency() const;

    int last_frame_number_;
    scoped_refptr<const Picture> picture_;
    std::bitset<INVALIDATION_FRAMES_TRACKED> invalidation_history_;
  };

  typedef std::pair<int, int> PictureMapKey;
  typedef base::hash_map<PictureMapKey, PictureInfo> PictureMap;

  // An internal CanRaster check that goes to the picture_map rather than
  // using the recorded_viewport hint.
  bool CanRasterSlowTileCheck(const gfx::Rect& layer_rect) const;

  void Clear();

  void SetMinContentsScale(float min_contents_scale);
  void SetTileGridSize(const gfx::Size& tile_grid_size);

  gfx::Rect PaddedRect(const PictureMapKey& key) const;
  gfx::Rect PadRect(const gfx::Rect& rect) const;

  int buffer_pixels() const { return tiling_.border_texels(); }

  // A picture pile is a tiled set of pictures. The picture map is a map of tile
  // indices to picture infos.
  PictureMap picture_map_;
  TilingData tiling_;

  // If non-empty, all pictures tiles inside this rect are recorded. There may
  // be recordings outside this rect, but everything inside the rect is
  // recorded.
  gfx::Rect recorded_viewport_;
  float min_contents_scale_;
  gfx::Size tile_grid_size_;
  int slow_down_raster_scale_factor_for_debug_;
  bool can_use_lcd_text_;
  // A hint about whether there are any recordings. This may be a false
  // positive.
  bool has_any_recordings_;
  bool is_solid_color_;
  SkColor solid_color_;
  int pixel_record_distance_;

 private:
  friend class PicturePileImpl;

  void CreatePictures(ContentLayerClient* painter,
                      RecordingMode recording_mode,
                      const std::vector<gfx::Rect>& record_rects);
  void GetInvalidTileRects(const gfx::Rect& interest_rect,
                           Region* invalidation,
                           const gfx::Rect& visible_layer_rect,
                           int frame_number,
                           std::vector<gfx::Rect>* invalid_tiles);
  bool ApplyInvalidationAndResize(const gfx::Rect& interest_rect,
                                  Region* invalidation,
                                  const gfx::Size& layer_size,
                                  int frame_number,
                                  bool can_use_lcd_text_changed);
  void DetermineIfSolidColor();
  void SetBufferPixels(int buffer_pixels);

  bool is_suitable_for_gpu_rasterization_;

  DISALLOW_COPY_AND_ASSIGN(PicturePile);
};

}  // namespace cc

#endif  // CC_RESOURCES_PICTURE_PILE_H_
