// 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.

#include "flutter/flow/layers/cacheable_layer.h"
#include "flutter/flow/raster_cache.h"
#include "flutter/flow/raster_cache_item.h"

namespace flutter {

AutoCache::AutoCache(RasterCacheItem* raster_cache_item,
                     PrerollContext* context,
                     const SkMatrix& matrix)
    : raster_cache_item_(raster_cache_item),
      context_(context),
      matrix_(matrix) {
  if (IsCacheEnabled()) {
    raster_cache_item->PrerollSetup(context, matrix);
  }
}

bool AutoCache::IsCacheEnabled() {
  return raster_cache_item_ && context_ && context_->raster_cache;
}

AutoCache::~AutoCache() {
  if (IsCacheEnabled()) {
    raster_cache_item_->PrerollFinalize(context_, matrix_);
  }
}

CacheableContainerLayer::CacheableContainerLayer(int layer_cached_threshold,
                                                 bool can_cache_children) {
  layer_raster_cache_item_ = LayerRasterCacheItem::Make(
      this, layer_cached_threshold, can_cache_children);
}

}  // namespace flutter
