// Copyright 2018 The Fuchsia 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 "garnet/examples/ui/yuv_to_image_pipe/yuv_cyclic_view.h"

#include <lib/ui/scenic/cpp/commands.h>

#include <iostream>

namespace yuv_to_image_pipe {

namespace {

constexpr float kDisplayHeight = 50;

}  // namespace

YuvCyclicView::YuvCyclicView(scenic::ViewContext context,
                             fuchsia::images::PixelFormat pixel_format)
    : YuvBaseView(std::move(context), pixel_format) {
  const auto image_id = AddImage();
  PaintImage(image_id, 255);
  PresentImage(image_id);
}

void YuvCyclicView::OnSceneInvalidated(
    fuchsia::images::PresentationInfo presentation_info) {
  if (!has_logical_size()) {
    return;
  }

  // Compute the amount of time that has elapsed since the view was created.
  double seconds =
      static_cast<double>(presentation_info.presentation_time) / 1'000'000'000;

  const float kHalfWidth = logical_size().x * 0.5f;
  const float kHalfHeight = logical_size().y * 0.5f;

  // Compute the translation for the window to swirl around the screen.
  // Why do this?  Well, this is an example of what a View can do, and it helps
  // debug to know if scenic is still running.
  node_.SetTranslation(kHalfWidth * (1. + .1 * sin(seconds * 0.8)),
                       kHalfHeight * (1. + .1 * sin(seconds * 0.6)),
                       -kDisplayHeight);

  // The recangle is constantly animating; invoke InvalidateScene() to guarantee
  // that OnSceneInvalidated() will be called again.
  InvalidateScene();
}

}  // namespace yuv_to_image_pipe
