blob: 53e9a65237aefe0d5fec7437962c262f17c92f6a [file] [log] [blame]
// 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_