// 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(Surface* surface) : surface_(surface) {
}

Embedder::~Embedder() {
}

void Embedder::ProduceFrame(cc::SurfaceId child_one,
                            cc::SurfaceId child_two,
                            const gfx::Size& child_size,
                            const gfx::Size& size,
                            int offset) {
  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();

  surface_->SubmitFrame(mojo::SurfaceId::From(id_), mojo::Frame::From(*frame),
                        mojo::Closure());
}

}  // namespace examples
}  // namespace mojo
