// Copyright 2016 Google Inc. 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_RENDERER_RASTERIZER_BLITTER_SCRATCH_SURFACE_CACHE_H_
#define COBALT_RENDERER_RASTERIZER_BLITTER_SCRATCH_SURFACE_CACHE_H_

#include "cobalt/math/size.h"
#include "cobalt/renderer/rasterizer/common/scratch_surface_cache.h"
#include "starboard/blitter.h"

#if SB_HAS(BLITTER)

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace blitter {

// We define a blitter::ScratchSurfaceCache class here that decorates
// common::ScratchSurfaceCache by customizing it to be Blitter API specific.
// A Blitter API renderer can use this class to request temporary scratch
// SbBlitterSurfaces that can be automatically re-used over the course of a
// frame.  CachedScratchSurface objects must be created in order to actually
// interact with ScratchSurfaceCache.
class ScratchSurfaceCache {
 public:
  // |device| specifies the |device| from which surfaces should be allocated
  // from and |context| specifies which context to use when draw commands need
  // to be issued (e.g. to clear a surface so it is ready for use).
  ScratchSurfaceCache(SbBlitterDevice device, SbBlitterContext context,
                      int cache_capacity_in_bytes);

 private:
  class Delegate : public common::ScratchSurfaceCache::Delegate {
   public:
    Delegate(SbBlitterDevice device, SbBlitterContext context);

    common::ScratchSurfaceCache::Surface* CreateSurface(
        const math::Size& size) OVERRIDE;
    void DestroySurface(common::ScratchSurfaceCache::Surface* surface) OVERRIDE;
    void PrepareForUse(common::ScratchSurfaceCache::Surface* surface,
                       const math::Size& area) OVERRIDE;

   private:
    SbBlitterDevice device_;
    SbBlitterContext context_;
  };

  Delegate delegate_;
  common::ScratchSurfaceCache cache_;

  friend class CachedScratchSurface;
};

// This class acts as the interface to ScratchSurfaceCache.  It does so by
// decorating common::CachedScratchSurface and adding methods to obtain
// a reference to the Blitter API-specific SbBlitterSurface object.
class CachedScratchSurface {
 public:
  CachedScratchSurface(ScratchSurfaceCache* cache, const math::Size& size)
      : common_scratch_surface_(&cache->cache_, size) {}

  // Returns a pointer to the Blitter surface.
  SbBlitterSurface GetSurface();

 private:
  common::CachedScratchSurface common_scratch_surface_;
};

}  // namespace blitter
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt

#endif  // SB_HAS(BLITTER)

#endif  // COBALT_RENDERER_RASTERIZER_BLITTER_SCRATCH_SURFACE_CACHE_H_
