// Copyright 2013 The Flutter 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 FLUTTER_FLOW_LAYER_RASTER_CACHE_ITEM_H_
#define FLUTTER_FLOW_LAYER_RASTER_CACHE_ITEM_H_

#include <memory>
#include <optional>

#include "flutter/flow/raster_cache_item.h"

namespace flutter {

class LayerRasterCacheItem : public RasterCacheItem {
 public:
  explicit LayerRasterCacheItem(Layer* layer,
                                int layer_cached_threshold = 1,
                                bool can_cache_children = false);

  /**
   * @brief Create a LayerRasterCacheItem, connect a layer and manage the
   * Layer's raster cache
   *
   * @param layer_cache_threshold  after how many frames to start trying to
   * cache the layer self
   * @param can_cache_children the layer can do a cache for his children
   */
  static std::unique_ptr<LayerRasterCacheItem>
  Make(Layer*, int layer_cache_threshold, bool can_cache_children = false);

  std::optional<RasterCacheKeyID> GetId() const override;

  void PrerollSetup(PrerollContext* context, const SkMatrix& matrix) override;

  void PrerollFinalize(PrerollContext* context,
                       const SkMatrix& matrix) override;

  bool Draw(const PaintContext& context, const DlPaint* paint) const override;

  bool Draw(const PaintContext& context,
            DlCanvas* canvas,
            const DlPaint* paint) const override;

  bool TryToPrepareRasterCache(const PaintContext& context,
                               bool parent_cached = false) const override;

  void MarkCacheChildren() { can_cache_children_ = true; }

  void MarkNotCacheChildren() { can_cache_children_ = false; }

  bool IsCacheChildren() const { return cache_state_ == CacheState::kChildren; }

 protected:
  const SkRect* GetPaintBoundsFromLayer() const;

  Layer* layer_;

  // The id for cache the layer's children.
  std::optional<RasterCacheKeyID> layer_children_id_;

  int layer_cached_threshold_ = 1;

  // if the layer's children can be directly cache, set the param is true;
  bool can_cache_children_ = false;

  mutable int num_cache_attempts_ = 1;
};

}  // namespace flutter

#endif  // FLUTTER_FLOW_LAYER_RASTER_CACHE_ITEM_H_
