// Copyright 2017 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_RENDERER_RASTERIZER_LIB_EXTERNAL_RASTERIZER_H_
#define COBALT_RENDERER_RASTERIZER_LIB_EXTERNAL_RASTERIZER_H_

#include <memory>

#include "base/memory/ref_counted.h"
#include "cobalt/render_tree/resource_provider.h"
#include "cobalt/renderer/backend/graphics_context.h"
#include "cobalt/renderer/backend/render_target.h"
#include "cobalt/renderer/rasterizer/rasterizer.h"

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace lib {

// The ExternalRasterizer is the Rasterizer used by Cobalt client libs to enable
// them to rasterize into Cobalt's system window.
// The primary responsibilities of the ExternalRasterizer are to provide clients
// with a window and GL context as well as rasterizing RenderTrees into
// textures that are provided to clients to render into their own GL scene.
class ExternalRasterizer : public Rasterizer {
 public:
  ExternalRasterizer(backend::GraphicsContext* graphics_context,
                     int skia_atlas_width, int skia_atlas_height,
                     int skia_cache_size_in_bytes,
                     int scratch_surface_cache_size_in_bytes,
#if defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER)
                     int rasterizer_gpu_cache_size_in_bytes,
#endif
                     bool purge_skia_font_caches_on_destruction,
                     bool force_deterministic_rendering);
  virtual ~ExternalRasterizer();

  void Submit(const scoped_refptr<render_tree::Node>& render_tree,
              const scoped_refptr<backend::RenderTarget>& render_target,
              const Options& options) override;

  // Note, this will simply pipe through the HardwareRasterizer's
  // ResourceProvider.
  render_tree::ResourceProvider* GetResourceProvider() override;

  void MakeCurrent() override;
  void ReleaseContext() override;

  class Impl;

 private:
  std::unique_ptr<Impl> impl_;
};

}  // namespace lib
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt

#endif  // COBALT_RENDERER_RASTERIZER_LIB_EXTERNAL_RASTERIZER_H_
