// Copyright 2019 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 "format_conversion.h"

#include <lib/image-format/image_format.h>

#include "fidl/fuchsia.sysmem/cpp/wire_types.h"

namespace camera {

fuchsia_sysmem::wire::ImageFormat2 ConvertToWireType(fuchsia::sysmem::ImageFormat_2 image_format) {
  return {
      .pixel_format =
          {
              .type = static_cast<const fuchsia_sysmem::wire::PixelFormatType>(
                  image_format.pixel_format.type),
              .has_format_modifier = image_format.pixel_format.has_format_modifier,
              .format_modifier =
                  {
                      .value = image_format.pixel_format.format_modifier.value,
                  },
          },
      .coded_width = image_format.coded_width,
      .coded_height = image_format.coded_height,
      .bytes_per_row = image_format.bytes_per_row,
      .display_width = image_format.display_width,
      .display_height = image_format.display_height,
      .layers = image_format.layers,
      .color_space =
          {
              .type = static_cast<const fuchsia_sysmem::wire::ColorSpaceType>(
                  image_format.color_space.type),
          },
      .has_pixel_aspect_ratio = image_format.has_pixel_aspect_ratio,
      .pixel_aspect_ratio_width = image_format.pixel_aspect_ratio_width,
      .pixel_aspect_ratio_height = image_format.pixel_aspect_ratio_height,
  };
}

// TODO: Please use fidl::ToWire() instead.  See sysmem-version.cc for an UnusedArena that can
// avoid the caller needing to pass in a real arena, since sysmem V1 flat structs don't really need
// one (but fidl::ToWire() requires an arena param).
fuchsia_sysmem::wire::ImageFormatConstraints ConvertToWireType(
    fuchsia::sysmem::ImageFormatConstraints constraints) {
  return {
      .pixel_format =
          {
              .type =
                  static_cast<fuchsia_sysmem::wire::PixelFormatType>(constraints.pixel_format.type),
              .has_format_modifier = constraints.pixel_format.has_format_modifier,
              .format_modifier =
                  {
                      .value = constraints.pixel_format.format_modifier.value,
                  },
          },
      .color_spaces_count = constraints.color_spaces_count,
      .color_space =
          [&]() {
            fidl::Array<fuchsia_sysmem::wire::ColorSpace, 32> color_space;
            for (size_t i = 0; i < constraints.color_spaces_count; ++i) {
              color_space[i].type = static_cast<fuchsia_sysmem::wire::ColorSpaceType>(
                  constraints.color_space[i].type);
            }
            return color_space;
          }(),
      .min_coded_width = constraints.min_coded_width,
      .max_coded_width = constraints.max_coded_width,
      .min_coded_height = constraints.min_coded_height,
      .max_coded_height = constraints.max_coded_height,
      .min_bytes_per_row = constraints.min_bytes_per_row,
      .max_bytes_per_row = constraints.max_bytes_per_row,
      .max_coded_width_times_coded_height = constraints.max_coded_width_times_coded_height,
      .layers = constraints.layers,
      .coded_width_divisor = constraints.coded_width_divisor,
      .coded_height_divisor = constraints.coded_height_divisor,
      .bytes_per_row_divisor = constraints.bytes_per_row_divisor,
      .start_offset_divisor = constraints.start_offset_divisor,
      .display_width_divisor = constraints.display_width_divisor,
      .display_height_divisor = constraints.display_height_divisor,
      .required_min_coded_width = constraints.required_min_coded_width,
      .required_max_coded_width = constraints.required_max_coded_width,
      .required_min_coded_height = constraints.required_min_coded_height,
      .required_max_coded_height = constraints.required_max_coded_height,
      .required_min_bytes_per_row = constraints.required_min_bytes_per_row,
      .required_max_bytes_per_row = constraints.required_max_bytes_per_row,
  };
}

fuchsia_sysmem::wire::ImageFormat2 GetImageFormatFromConstraints(
    fuchsia_sysmem::wire::ImageFormatConstraints constraints, uint32_t coded_width,
    uint32_t coded_height) {
  uint32_t bytes_per_row;
  bool success = ImageFormatMinimumRowBytes(constraints, coded_width, &bytes_per_row);
  if (!success) {
    ZX_ASSERT(coded_width > 0);
    ZX_ASSERT(coded_width <= constraints.max_coded_width);
    ZX_ASSERT(coded_width >= constraints.min_coded_width);
    ZX_ASSERT(!constraints.pixel_format.has_format_modifier);
    ZX_ASSERT_MSG(constraints.max_bytes_per_row >= coded_width, "???? %d vs %d",
                  constraints.max_bytes_per_row, coded_width);
  }
  ZX_ASSERT(success);
  ZX_ASSERT(bytes_per_row != 0);
  return {
      .pixel_format = constraints.pixel_format,
      .coded_width = coded_width,
      .coded_height = coded_height,
      .bytes_per_row = bytes_per_row,
      .display_width = coded_width,
      .display_height = coded_height,
      .layers = 1,
      .color_space = constraints.color_space[0],
  };
}

}  // namespace camera
