// 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 "lib/images/cpp/images.h"

#include <zircon/assert.h>

namespace images {

// Overall bits per pixel, across all pixel data in the whole image.
size_t BitsPerPixel(const fuchsia::images::PixelFormat& pixel_format) {
  switch (pixel_format) {
    case fuchsia::images::PixelFormat::BGRA_8:
      return 4u * 8u;
    case fuchsia::images::PixelFormat::YUY2:
      return 2u * 8u;
    case fuchsia::images::PixelFormat::NV12:
      return 12;
    case fuchsia::images::PixelFormat::YV12:
      return 12;
  }
  ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format));
  return 0;
}

size_t StrideBytesPerWidthPixel(
    const fuchsia::images::PixelFormat& pixel_format) {
  switch (pixel_format) {
    case fuchsia::images::PixelFormat::BGRA_8:
      return 4u;
    case fuchsia::images::PixelFormat::YUY2:
      return 2u;
    case fuchsia::images::PixelFormat::NV12:
      return 1u;
    case fuchsia::images::PixelFormat::YV12:
      return 1u;
  }
  ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format));
  return 0;
}

size_t MaxSampleAlignment(const fuchsia::images::PixelFormat& pixel_format) {
  switch (pixel_format) {
    case fuchsia::images::PixelFormat::BGRA_8:
      return 4u;
    case fuchsia::images::PixelFormat::YUY2:
      return 2u;
    case fuchsia::images::PixelFormat::NV12:
      // In the sense that line stride "must preserve pixel alignment", which is
      // what MaxSampleAlignment() is used for, NV12 ~~has (very roughly
      // speaking) a pixel alignment of 2, ~~because the width of the Y plane in
      // this implementation must be even, and ~because the interleaved UV data
      // after the planar Y data is 2 bytes per sample, so we may as well
      // require UV samples to remain aligned UV line to UV line.
      return 2u;
    case fuchsia::images::PixelFormat::YV12:
      // In the sense that line stride "must preserve pixel alignment", which is
      // what MaxSampleAlignment() is used for, YV12 ~~has (very roughly
      // speaking) a pixel alignment of 2, ~~because the width of the Y plane in
      // this implementation must be even.
      return 2u;
  }
  ZX_PANIC("Unknown Pixel Format: %d", static_cast<int>(pixel_format));
  return 0;
}

size_t ImageSize(const fuchsia::images::ImageInfo& image_info) {
  ZX_DEBUG_ASSERT(image_info.tiling == fuchsia::images::Tiling::LINEAR);
  switch (image_info.pixel_format) {
    case fuchsia::images::PixelFormat::BGRA_8:
    case fuchsia::images::PixelFormat::YUY2:
      return image_info.height * image_info.stride;
    case fuchsia::images::PixelFormat::NV12:
      return image_info.height * image_info.stride * 3 / 2;
    case fuchsia::images::PixelFormat::YV12:
      return image_info.height * image_info.stride * 3 / 2;
  }
  ZX_PANIC("Unknown Pixel Format: %d",
           static_cast<int>(image_info.pixel_format));
  return 0;
}

}  // namespace images
