// 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 "test.h"

namespace {

uint32_t interpolate(uint32_t val, uint32_t cur_limit, uint32_t new_limit) {
  // Interploates from [0, cur_limit) to [0, new_limit)
  return ((val * (new_limit - 1)) + cur_limit - 2) / (cur_limit - 1);
}

}  // namespace

namespace display_test {

DISPLAY_TEST(two_layer_test_dest_frame, [](Context* context) {
  auto layer1 = context->CreatePrimaryLayer(context->display_width(),
                                            context->display_height());
  auto image1 =
      context->CreateImage(context->display_width(), context->display_height());
  layer1->SetImage(image1);

  auto layer2 = context->CreatePrimaryLayer(context->display_width(),
                                            context->display_height() / 2);
  auto image2 = context->CreateImage(context->display_width(),
                                     context->display_height() / 2);
  layer2->SetPosition(
      fuchsia::display::Transform::IDENTITY,
      {0, 0, image2->width(), image2->height()},
      {0, context->display_height() / 4, image2->width(), image2->height()});
  layer2->SetImage(image2);

  context->SetLayers(std::vector<Layer*>({layer1, layer2}));
  context->ApplyConfig();
});

DISPLAY_TEST(two_layer_test_dest_frame_progressive, [](Context* context) {
  auto layer1 = context->CreatePrimaryLayer(context->display_width(),
                                            context->display_height());
  auto image1 =
      context->CreateImage(context->display_width(), context->display_height());
  layer1->SetImage(image1);

  auto layer2 = context->CreatePrimaryLayer(context->display_width() / 2,
                                            context->display_height() / 2);
  auto image2 = context->CreateImage(context->display_width() / 2,
                                     context->display_height() / 2);
  layer2->SetImage(image2);

  context->SetLayers(std::vector<Layer*>({layer1, layer2}));

  constexpr uint32_t kIterCount = 8;
  uint32_t width_limit = context->display_width() - image2->width();
  uint32_t height_limit = context->display_height() - image2->height();
  for (unsigned i = 0; i < kIterCount; i++) {
    uint32_t x = interpolate(i, kIterCount, width_limit);
    uint32_t y = interpolate(i, kIterCount, height_limit);
    layer2->SetPosition(fuchsia::display::Transform::IDENTITY,
                        {0, 0, image2->width(), image2->height()},
                        {x, y, image2->width(), image2->height()});
    context->ApplyConfig();
  }
});

DISPLAY_TEST(single_layer_src_frame, [](Context* context) {
  static const uint32_t offset = 10;
  auto layer = context->CreatePrimaryLayer(context->display_width() + offset,
                                           context->display_height() + offset);
  auto image = context->CreateImage(context->display_width() + offset,
                                    context->display_height() + offset);
  layer->SetPosition(
      fuchsia::display::Transform::IDENTITY,
      {offset, offset, context->display_width(), context->display_height()},
      {0, 0, context->display_width(), context->display_height()});
  layer->SetImage(image);

  context->SetLayers(std::vector<Layer*>({layer}));
  context->ApplyConfig();
});

DISPLAY_TEST(single_layer_src_frame_progressive, [](Context* context) {
  constexpr uint32_t kNumIters = 8;
  constexpr uint32_t kStepSize = 10;
  constexpr uint32_t kExtraSize = (kNumIters - 1) * kStepSize;

  auto layer =
      context->CreatePrimaryLayer(context->display_width() + kExtraSize,
                                  context->display_height() + kExtraSize);
  auto image = context->CreateImage(context->display_width() + kExtraSize,
                                    context->display_height() + kExtraSize);
  layer->SetImage(image);
  context->SetLayers(std::vector<Layer*>({layer}));

  for (unsigned i = 0; i < kNumIters; i++) {
    uint32_t offset = i * kStepSize;
    layer->SetPosition(
        fuchsia::display::Transform::IDENTITY,
        {offset, offset, context->display_width(), context->display_height()},
        {0, 0, context->display_width(), context->display_height()});
    context->ApplyConfig();
  }
});

Test rotation_test(fuchsia::display::Transform mode) {
  return [mode](Context* context) {
    auto layer = context->CreatePrimaryLayer(context->display_width(),
                                             context->display_height());
    auto image = context->CreateImage(context->display_width(),
                                      context->display_height());
    layer->SetPosition(
        mode, {0, 0, context->display_width(), context->display_height()},
        {0, 0, context->display_width(), context->display_height()});
    layer->SetImage(image);

    context->SetLayers(std::vector<Layer*>({layer}));
    context->ApplyConfig();
  };
}

DISPLAY_TEST(rotate_90_test,
             rotation_test(fuchsia::display::Transform::ROT_90));
DISPLAY_TEST(rotate_180_test,
             rotation_test(fuchsia::display::Transform::ROT_180));
DISPLAY_TEST(rotate_270_test,
             rotation_test(fuchsia::display::Transform::ROT_270));
DISPLAY_TEST(rotate_90_reflectx_test,
             rotation_test(fuchsia::display::Transform::ROT_90_REFLECT_X));
DISPLAY_TEST(rotate_90_reflecty_test,
             rotation_test(fuchsia::display::Transform::ROT_90_REFLECT_Y));
DISPLAY_TEST(rotate_reflectx_test,
             rotation_test(fuchsia::display::Transform::REFLECT_X));
DISPLAY_TEST(rotate_reflecty_test,
             rotation_test(fuchsia::display::Transform::REFLECT_Y));

DISPLAY_TEST(scale_up_test, [](Context* context) {
  auto layer = context->CreatePrimaryLayer(context->display_width() / 2,
                                           context->display_height() / 2);
  auto image = context->CreateScalableImage(context->display_width() / 2,
                                            context->display_height() / 2);
  layer->SetPosition(
      fuchsia::display::Transform::IDENTITY,
      {0, 0, image->width(), image->height()},
      {0, 0, context->display_width(), context->display_height()});
  layer->SetImage(image);

  context->SetLayers(std::vector<Layer*>({layer}));
  context->ApplyConfig();
});

DISPLAY_TEST(scale_down_test, [](Context* context) {
  auto layer = context->CreatePrimaryLayer(context->display_width() * 2,
                                           context->display_height() * 2);
  auto image = context->CreateScalableImage(context->display_width() * 2,
                                            context->display_height() * 2);
  layer->SetPosition(
      fuchsia::display::Transform::IDENTITY,
      {0, 0, image->width(), image->height()},
      {0, 0, context->display_width(), context->display_height()});
  layer->SetImage(image);

  context->SetLayers(std::vector<Layer*>({layer}));
  context->ApplyConfig();
});

DISPLAY_TEST(variable_scale_test, [](Context* context) {
  auto layer1 = context->CreatePrimaryLayer(context->display_width(),
                                            context->display_height());
  auto image1 =
      context->CreateImage(context->display_width(), context->display_height());
  layer1->SetImage(image1);

  auto layer2 = context->CreatePrimaryLayer(context->display_width() / 2,
                                            context->display_height() / 2);
  auto image2 = context->CreateScalableImage(context->display_width() / 2,
                                             context->display_height() / 2);
  layer2->SetImage(image2);
  context->SetLayers(std::vector<Layer*>({layer1, layer2}));

  // Scale from .5 to 2x
  constexpr uint32_t kIterCount = 8;
  uint32_t min_width = context->display_width() / 4;
  uint32_t min_height = context->display_height() / 4;
  uint32_t width_range = context->display_width() - min_width + 1;
  uint32_t height_range = context->display_height() - min_height + 1;
  for (unsigned i = 0; i < kIterCount; i++) {
    uint32_t width = interpolate(i, kIterCount, width_range) + min_width;
    uint32_t height = interpolate(i, kIterCount, height_range) + min_height;
    layer2->SetPosition(fuchsia::display::Transform::IDENTITY,
                        {0, 0, image2->width(), image2->height()},
                        {0, 0, width, height});
    context->ApplyConfig();
  }
});

// TODO(stevensd): test composition of motion and scaling

}  // namespace display_test
