// Copyright 2014 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 "examples/surfaces_app/embedder.h"

#include "cc/output/compositor_frame.h"
#include "cc/output/delegated_frame_data.h"
#include "cc/quads/render_pass.h"
#include "cc/quads/solid_color_draw_quad.h"
#include "cc/quads/surface_draw_quad.h"
#include "examples/surfaces_app/surfaces_util.h"
#include "mojo/converters/surfaces/surfaces_type_converters.h"
#include "mojo/services/surfaces/public/interfaces/surface_id.mojom.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/size.h"
#include "ui/gfx/transform.h"

namespace mojo {
namespace examples {

using cc::RenderPass;
using cc::RenderPassId;
using cc::SurfaceDrawQuad;
using cc::DrawQuad;
using cc::SolidColorDrawQuad;
using cc::DelegatedFrameData;
using cc::CompositorFrame;

Embedder::Embedder(Display* display)
    : display_(display), frame_pending_(false) {
}

Embedder::~Embedder() {
}

void Embedder::ProduceFrame(cc::SurfaceId child_one,
                            cc::SurfaceId child_two,
                            const gfx::Size& child_size,
                            const gfx::Size& size,
                            int offset) {
  DCHECK(!frame_pending_);

  gfx::Rect rect(size);
  RenderPassId pass_id(1, 1);
  scoped_ptr<RenderPass> pass = RenderPass::Create();
  pass->SetNew(pass_id, rect, rect, gfx::Transform());

  if (!child_one.is_null()) {
    gfx::Transform one_transform;
    one_transform.Translate(10 + child_size.width() / 2,
                            50 + child_size.height() / 2);
    one_transform.Translate(0, offset);
    one_transform.Translate(-child_size.width() / 2, -child_size.height() / 2);
    CreateAndAppendSimpleSharedQuadState(pass.get(), one_transform, size);

    SurfaceDrawQuad* surface_one_quad =
        pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
    gfx::Rect one_rect(child_size);
    surface_one_quad->SetNew(
        pass->shared_quad_state_list.back(), one_rect, one_rect, child_one);
  }

  if (!child_two.is_null()) {
    gfx::Transform two_transform;
    two_transform.Translate(10 + size.width() / 2 + child_size.width() / 2,
                            50 + child_size.height() / 2);
    two_transform.Translate(0, 200 - offset);
    two_transform.Translate(-child_size.width() / 2, -child_size.height() / 2);
    CreateAndAppendSimpleSharedQuadState(pass.get(), two_transform, size);

    SurfaceDrawQuad* surface_two_quad =
        pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
    gfx::Rect two_rect(child_size);
    surface_two_quad->SetNew(
        pass->shared_quad_state_list.back(), two_rect, two_rect, child_two);
  }

  CreateAndAppendSimpleSharedQuadState(pass.get(), gfx::Transform(), size);
  SolidColorDrawQuad* color_quad =
      pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
  bool force_anti_aliasing_off = false;
  color_quad->SetNew(pass->shared_quad_state_list.back(),
                     rect,
                     rect,
                     SK_ColorYELLOW,
                     force_anti_aliasing_off);

  scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData);
  delegated_frame_data->render_pass_list.push_back(pass.Pass());

  scoped_ptr<CompositorFrame> frame(new CompositorFrame);
  frame->delegated_frame_data = delegated_frame_data.Pass();

  frame_pending_ = true;
  display_->SubmitFrame(mojo::Frame::From(*frame),
                        [this]() { frame_pending_ = false; });
}

}  // namespace examples
}  // namespace mojo
