// Copyright 2015 The Chromium 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 "mojo/ui/ganesh_renderer.h"

#include "base/bind.h"
#include "base/logging.h"
#include "mojo/gpu/gl_texture.h"
#include "mojo/skia/ganesh_context.h"
#include "mojo/skia/ganesh_texture_surface.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h"

namespace mojo {
namespace ui {

GaneshRenderer::GaneshRenderer(mojo::skia::GaneshContext* ganesh_context)
    : ganesh_context_(ganesh_context),
      gl_renderer_(ganesh_context_->gl_context()) {
  DCHECK(ganesh_context_);
}

GaneshRenderer::~GaneshRenderer() {}

mojo::gfx::composition::ResourcePtr GaneshRenderer::DrawSurface(
    const mojo::Size& size,
    const DrawSurfaceCallback& callback) {
  std::unique_ptr<mojo::GLTexture> texture = gl_renderer_.GetTexture(size);
  DCHECK(texture);

  {
    mojo::skia::GaneshContext::Scope scope(ganesh_context_);
    mojo::skia::GaneshTextureSurface texture_surface(scope, std::move(texture));

    callback.Run(texture_surface.surface());

    texture = texture_surface.TakeTexture();
  }

  return gl_renderer_.BindTextureResource(
      std::move(texture),
      mojo::gfx::composition::MailboxTextureResource::Origin::TOP_LEFT);
}

static void RunCanvasCallback(
    const mojo::ui::GaneshRenderer::DrawCanvasCallback& callback,
    SkSurface* surface) {
  callback.Run(surface->getCanvas());
}

mojo::gfx::composition::ResourcePtr GaneshRenderer::DrawCanvas(
    const mojo::Size& size,
    const DrawCanvasCallback& callback) {
  return DrawSurface(size, base::Bind(&RunCanvasCallback, callback));
}

}  // namespace ui
}  // namespace mojo
