// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_LOADER_IMAGE_IMAGE_CACHE_H_
#define COBALT_LOADER_IMAGE_IMAGE_CACHE_H_

#include <memory>
#include <string>

#include "cobalt/loader/image/image.h"
#include "cobalt/loader/loader_factory.h"
#include "cobalt/loader/resource_cache.h"

namespace cobalt {
namespace loader {
namespace image {

// |ImageResourceCacheType| provides the types and implements the functions
// required by |ResourceCache<ImageResourceCacheType>|
struct ImageResourceCacheType {
  typedef Image ResourceType;

  static uint32 GetEstimatedSizeInBytes(
      const scoped_refptr<ResourceType>& resource) {
    return resource->GetEstimatedSizeInBytes();
  }
};

typedef CachedResource<ImageResourceCacheType> CachedImage;
typedef WeakCachedResource<ImageResourceCacheType> WeakCachedImage;
typedef CachedResourceReferenceWithCallbacks CachedImageReferenceWithCallbacks;
typedef CachedImageReferenceWithCallbacks::CachedResourceReferenceVector
    CachedImageReferenceVector;

typedef ResourceCache<ImageResourceCacheType> ImageCache;

// CreateImageCache() provides a mechanism for creating an |ImageCache|.
inline static std::unique_ptr<ImageCache> CreateImageCache(
    const std::string& name, const base::DebuggerHooks& debugger_hooks,
    uint32 cache_capacity, loader::LoaderFactory* loader_factory) {
  return std::unique_ptr<ImageCache>(
      new ImageCache(name, debugger_hooks, cache_capacity,
                     false /*are_loading_retries_enabled*/,
                     base::Bind(&loader::LoaderFactory::CreateImageLoader,
                                base::Unretained(loader_factory)),
                     base::Bind(&loader::LoaderFactory::NotifyResourceRequested,
                                base::Unretained(loader_factory))));
}

// The ReducedCacheCapacityManager is a helper class that manages state which
// makes it easy for clients to place the image cache in a reduced memory state,
// at times when GPU memory is at a premium, such as when playing a video.
// Clients should create ReducedCacheCapacityManager::Request objects to
// indicate that they would like the image cache to enter a reduced capacity
// state, internally, the manager keeps a reference count of how many Request
// objects exist and enables the reduced capacity state if there is more than
// one of them.
class ReducedCacheCapacityManager {
 public:
  class Request {
   public:
    explicit Request(ReducedCacheCapacityManager* manager) : manager_(manager) {
      manager_->IncrementRequestRefCount();
    }
    ~Request() { manager_->DecrementRequestRefCount(); }

   private:
    ReducedCacheCapacityManager* manager_;
  };

  ReducedCacheCapacityManager(ImageCache* cache,
                              float reduced_capacity_percentage)
      : cache_(cache),
        request_ref_count_(0),
        reduced_capacity_percentage_(reduced_capacity_percentage),
        original_capacity_(cache_->capacity()),
        reduced_capacity_(static_cast<uint32>(reduced_capacity_percentage_ *
                                              original_capacity_)) {
    DCHECK_GE(1.0f, reduced_capacity_percentage);
  }

  float reduced_capacity_percentage() const {
    return reduced_capacity_percentage_;
  }

 private:
  void IncrementRequestRefCount() {
    if (request_ref_count_ == 0) {
      cache_->SetCapacity(reduced_capacity_);
    }
    ++request_ref_count_;
  }

  void DecrementRequestRefCount() {
    DCHECK_LT(0, request_ref_count_);
    --request_ref_count_;
    if (request_ref_count_ == 0) {
      cache_->SetCapacity(original_capacity_);
    }
  }

  ImageCache* cache_;
  int request_ref_count_;
  float reduced_capacity_percentage_;
  const uint32 original_capacity_;
  const uint32 reduced_capacity_;

  friend class Request;
};

}  // namespace image
}  // namespace loader
}  // namespace cobalt

#endif  // COBALT_LOADER_IMAGE_IMAGE_CACHE_H_
