// 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(uint32_t local_id, Surface* surface)
    : local_id_(local_id), 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(local_id_, mojo::Frame::From(*frame), mojo::Closure());
}

}  // namespace examples
}  // namespace mojo
