// Copyright 2018 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.

#ifndef UI_GFX_MOJOM_COLOR_SPACE_MOJOM_TRAITS_H_
#define UI_GFX_MOJOM_COLOR_SPACE_MOJOM_TRAITS_H_

#include "base/component_export.h"
#include "base/containers/span.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/mojom/color_space.mojom-shared.h"

namespace mojo {

template <>
struct EnumTraits<gfx::mojom::ColorSpacePrimaryID, gfx::ColorSpace::PrimaryID> {
  static gfx::mojom::ColorSpacePrimaryID ToMojom(
      gfx::ColorSpace::PrimaryID input) {
    switch (input) {
      case gfx::ColorSpace::PrimaryID::INVALID:
        return gfx::mojom::ColorSpacePrimaryID::INVALID;
      case gfx::ColorSpace::PrimaryID::BT709:
        return gfx::mojom::ColorSpacePrimaryID::BT709;
      case gfx::ColorSpace::PrimaryID::BT470M:
        return gfx::mojom::ColorSpacePrimaryID::BT470M;
      case gfx::ColorSpace::PrimaryID::BT470BG:
        return gfx::mojom::ColorSpacePrimaryID::BT470BG;
      case gfx::ColorSpace::PrimaryID::SMPTE170M:
        return gfx::mojom::ColorSpacePrimaryID::SMPTE170M;
      case gfx::ColorSpace::PrimaryID::SMPTE240M:
        return gfx::mojom::ColorSpacePrimaryID::SMPTE240M;
      case gfx::ColorSpace::PrimaryID::FILM:
        return gfx::mojom::ColorSpacePrimaryID::FILM;
      case gfx::ColorSpace::PrimaryID::BT2020:
        return gfx::mojom::ColorSpacePrimaryID::BT2020;
      case gfx::ColorSpace::PrimaryID::SMPTEST428_1:
        return gfx::mojom::ColorSpacePrimaryID::SMPTEST428_1;
      case gfx::ColorSpace::PrimaryID::SMPTEST431_2:
        return gfx::mojom::ColorSpacePrimaryID::SMPTEST431_2;
      case gfx::ColorSpace::PrimaryID::SMPTEST432_1:
        return gfx::mojom::ColorSpacePrimaryID::SMPTEST432_1;
      case gfx::ColorSpace::PrimaryID::XYZ_D50:
        return gfx::mojom::ColorSpacePrimaryID::XYZ_D50;
      case gfx::ColorSpace::PrimaryID::ADOBE_RGB:
        return gfx::mojom::ColorSpacePrimaryID::ADOBE_RGB;
      case gfx::ColorSpace::PrimaryID::APPLE_GENERIC_RGB:
        return gfx::mojom::ColorSpacePrimaryID::APPLE_GENERIC_RGB;
      case gfx::ColorSpace::PrimaryID::WIDE_GAMUT_COLOR_SPIN:
        return gfx::mojom::ColorSpacePrimaryID::WIDE_GAMUT_COLOR_SPIN;
      case gfx::ColorSpace::PrimaryID::CUSTOM:
        return gfx::mojom::ColorSpacePrimaryID::CUSTOM;
    }
    NOTREACHED();
    return gfx::mojom::ColorSpacePrimaryID::INVALID;
  }

  static bool FromMojom(gfx::mojom::ColorSpacePrimaryID input,
                        gfx::ColorSpace::PrimaryID* out) {
    switch (input) {
      case gfx::mojom::ColorSpacePrimaryID::INVALID:
        *out = gfx::ColorSpace::PrimaryID::INVALID;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::BT709:
        *out = gfx::ColorSpace::PrimaryID::BT709;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::BT470M:
        *out = gfx::ColorSpace::PrimaryID::BT470M;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::BT470BG:
        *out = gfx::ColorSpace::PrimaryID::BT470BG;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::SMPTE170M:
        *out = gfx::ColorSpace::PrimaryID::SMPTE170M;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::SMPTE240M:
        *out = gfx::ColorSpace::PrimaryID::SMPTE240M;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::FILM:
        *out = gfx::ColorSpace::PrimaryID::FILM;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::BT2020:
        *out = gfx::ColorSpace::PrimaryID::BT2020;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::SMPTEST428_1:
        *out = gfx::ColorSpace::PrimaryID::SMPTEST428_1;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::SMPTEST431_2:
        *out = gfx::ColorSpace::PrimaryID::SMPTEST431_2;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::SMPTEST432_1:
        *out = gfx::ColorSpace::PrimaryID::SMPTEST432_1;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::XYZ_D50:
        *out = gfx::ColorSpace::PrimaryID::XYZ_D50;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::ADOBE_RGB:
        *out = gfx::ColorSpace::PrimaryID::ADOBE_RGB;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::APPLE_GENERIC_RGB:
        *out = gfx::ColorSpace::PrimaryID::APPLE_GENERIC_RGB;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::WIDE_GAMUT_COLOR_SPIN:
        *out = gfx::ColorSpace::PrimaryID::WIDE_GAMUT_COLOR_SPIN;
        return true;
      case gfx::mojom::ColorSpacePrimaryID::CUSTOM:
        *out = gfx::ColorSpace::PrimaryID::CUSTOM;
        return true;
    }
    NOTREACHED();
    return false;
  }
};

template <>
struct EnumTraits<gfx::mojom::ColorSpaceTransferID,
                  gfx::ColorSpace::TransferID> {
  static gfx::mojom::ColorSpaceTransferID ToMojom(
      gfx::ColorSpace::TransferID input) {
    switch (input) {
      case gfx::ColorSpace::TransferID::INVALID:
        return gfx::mojom::ColorSpaceTransferID::INVALID;
      case gfx::ColorSpace::TransferID::BT709:
        return gfx::mojom::ColorSpaceTransferID::BT709;
      case gfx::ColorSpace::TransferID::BT709_APPLE:
        return gfx::mojom::ColorSpaceTransferID::BT709_APPLE;
      case gfx::ColorSpace::TransferID::GAMMA18:
        return gfx::mojom::ColorSpaceTransferID::GAMMA18;
      case gfx::ColorSpace::TransferID::GAMMA22:
        return gfx::mojom::ColorSpaceTransferID::GAMMA22;
      case gfx::ColorSpace::TransferID::GAMMA24:
        return gfx::mojom::ColorSpaceTransferID::GAMMA24;
      case gfx::ColorSpace::TransferID::GAMMA28:
        return gfx::mojom::ColorSpaceTransferID::GAMMA28;
      case gfx::ColorSpace::TransferID::SMPTE170M:
        return gfx::mojom::ColorSpaceTransferID::SMPTE170M;
      case gfx::ColorSpace::TransferID::SMPTE240M:
        return gfx::mojom::ColorSpaceTransferID::SMPTE240M;
      case gfx::ColorSpace::TransferID::LINEAR:
        return gfx::mojom::ColorSpaceTransferID::LINEAR;
      case gfx::ColorSpace::TransferID::LOG:
        return gfx::mojom::ColorSpaceTransferID::LOG;
      case gfx::ColorSpace::TransferID::LOG_SQRT:
        return gfx::mojom::ColorSpaceTransferID::LOG_SQRT;
      case gfx::ColorSpace::TransferID::IEC61966_2_4:
        return gfx::mojom::ColorSpaceTransferID::IEC61966_2_4;
      case gfx::ColorSpace::TransferID::BT1361_ECG:
        return gfx::mojom::ColorSpaceTransferID::BT1361_ECG;
      case gfx::ColorSpace::TransferID::IEC61966_2_1:
        return gfx::mojom::ColorSpaceTransferID::IEC61966_2_1;
      case gfx::ColorSpace::TransferID::BT2020_10:
        return gfx::mojom::ColorSpaceTransferID::BT2020_10;
      case gfx::ColorSpace::TransferID::BT2020_12:
        return gfx::mojom::ColorSpaceTransferID::BT2020_12;
      case gfx::ColorSpace::TransferID::SMPTEST2084:
        return gfx::mojom::ColorSpaceTransferID::SMPTEST2084;
      case gfx::ColorSpace::TransferID::SMPTEST428_1:
        return gfx::mojom::ColorSpaceTransferID::SMPTEST428_1;
      case gfx::ColorSpace::TransferID::ARIB_STD_B67:
        return gfx::mojom::ColorSpaceTransferID::ARIB_STD_B67;
      case gfx::ColorSpace::TransferID::IEC61966_2_1_HDR:
        return gfx::mojom::ColorSpaceTransferID::IEC61966_2_1_HDR;
      case gfx::ColorSpace::TransferID::LINEAR_HDR:
        return gfx::mojom::ColorSpaceTransferID::LINEAR_HDR;
      case gfx::ColorSpace::TransferID::CUSTOM:
        return gfx::mojom::ColorSpaceTransferID::CUSTOM;
      case gfx::ColorSpace::TransferID::CUSTOM_HDR:
        return gfx::mojom::ColorSpaceTransferID::CUSTOM_HDR;
      case gfx::ColorSpace::TransferID::PIECEWISE_HDR:
        return gfx::mojom::ColorSpaceTransferID::PIECEWISE_HDR;
    }
    NOTREACHED();
    return gfx::mojom::ColorSpaceTransferID::INVALID;
  }

  static bool FromMojom(gfx::mojom::ColorSpaceTransferID input,
                        gfx::ColorSpace::TransferID* out) {
    switch (input) {
      case gfx::mojom::ColorSpaceTransferID::INVALID:
        *out = gfx::ColorSpace::TransferID::INVALID;
        return true;
      case gfx::mojom::ColorSpaceTransferID::BT709:
        *out = gfx::ColorSpace::TransferID::BT709;
        return true;
      case gfx::mojom::ColorSpaceTransferID::BT709_APPLE:
        *out = gfx::ColorSpace::TransferID::BT709_APPLE;
        return true;
      case gfx::mojom::ColorSpaceTransferID::GAMMA18:
        *out = gfx::ColorSpace::TransferID::GAMMA18;
        return true;
      case gfx::mojom::ColorSpaceTransferID::GAMMA22:
        *out = gfx::ColorSpace::TransferID::GAMMA22;
        return true;
      case gfx::mojom::ColorSpaceTransferID::GAMMA24:
        *out = gfx::ColorSpace::TransferID::GAMMA24;
        return true;
      case gfx::mojom::ColorSpaceTransferID::GAMMA28:
        *out = gfx::ColorSpace::TransferID::GAMMA28;
        return true;
      case gfx::mojom::ColorSpaceTransferID::SMPTE170M:
        *out = gfx::ColorSpace::TransferID::SMPTE170M;
        return true;
      case gfx::mojom::ColorSpaceTransferID::SMPTE240M:
        *out = gfx::ColorSpace::TransferID::SMPTE240M;
        return true;
      case gfx::mojom::ColorSpaceTransferID::LINEAR:
        *out = gfx::ColorSpace::TransferID::LINEAR;
        return true;
      case gfx::mojom::ColorSpaceTransferID::LOG:
        *out = gfx::ColorSpace::TransferID::LOG;
        return true;
      case gfx::mojom::ColorSpaceTransferID::LOG_SQRT:
        *out = gfx::ColorSpace::TransferID::LOG_SQRT;
        return true;
      case gfx::mojom::ColorSpaceTransferID::IEC61966_2_4:
        *out = gfx::ColorSpace::TransferID::IEC61966_2_4;
        return true;
      case gfx::mojom::ColorSpaceTransferID::BT1361_ECG:
        *out = gfx::ColorSpace::TransferID::BT1361_ECG;
        return true;
      case gfx::mojom::ColorSpaceTransferID::IEC61966_2_1:
        *out = gfx::ColorSpace::TransferID::IEC61966_2_1;
        return true;
      case gfx::mojom::ColorSpaceTransferID::BT2020_10:
        *out = gfx::ColorSpace::TransferID::BT2020_10;
        return true;
      case gfx::mojom::ColorSpaceTransferID::BT2020_12:
        *out = gfx::ColorSpace::TransferID::BT2020_12;
        return true;
      case gfx::mojom::ColorSpaceTransferID::SMPTEST2084:
        *out = gfx::ColorSpace::TransferID::SMPTEST2084;
        return true;
      case gfx::mojom::ColorSpaceTransferID::SMPTEST428_1:
        *out = gfx::ColorSpace::TransferID::SMPTEST428_1;
        return true;
      case gfx::mojom::ColorSpaceTransferID::ARIB_STD_B67:
        *out = gfx::ColorSpace::TransferID::ARIB_STD_B67;
        return true;
      case gfx::mojom::ColorSpaceTransferID::IEC61966_2_1_HDR:
        *out = gfx::ColorSpace::TransferID::IEC61966_2_1_HDR;
        return true;
      case gfx::mojom::ColorSpaceTransferID::LINEAR_HDR:
        *out = gfx::ColorSpace::TransferID::LINEAR_HDR;
        return true;
      case gfx::mojom::ColorSpaceTransferID::CUSTOM:
        *out = gfx::ColorSpace::TransferID::CUSTOM;
        return true;
      case gfx::mojom::ColorSpaceTransferID::CUSTOM_HDR:
        *out = gfx::ColorSpace::TransferID::CUSTOM_HDR;
        return true;
      case gfx::mojom::ColorSpaceTransferID::PIECEWISE_HDR:
        *out = gfx::ColorSpace::TransferID::PIECEWISE_HDR;
        return true;
    }
    NOTREACHED();
    return false;
  }
};

template <>
struct EnumTraits<gfx::mojom::ColorSpaceMatrixID, gfx::ColorSpace::MatrixID> {
  static gfx::mojom::ColorSpaceMatrixID ToMojom(
      gfx::ColorSpace::MatrixID input) {
    switch (input) {
      case gfx::ColorSpace::MatrixID::INVALID:
        return gfx::mojom::ColorSpaceMatrixID::INVALID;
      case gfx::ColorSpace::MatrixID::RGB:
        return gfx::mojom::ColorSpaceMatrixID::RGB;
      case gfx::ColorSpace::MatrixID::BT709:
        return gfx::mojom::ColorSpaceMatrixID::BT709;
      case gfx::ColorSpace::MatrixID::FCC:
        return gfx::mojom::ColorSpaceMatrixID::FCC;
      case gfx::ColorSpace::MatrixID::BT470BG:
        return gfx::mojom::ColorSpaceMatrixID::BT470BG;
      case gfx::ColorSpace::MatrixID::SMPTE170M:
        return gfx::mojom::ColorSpaceMatrixID::SMPTE170M;
      case gfx::ColorSpace::MatrixID::SMPTE240M:
        return gfx::mojom::ColorSpaceMatrixID::SMPTE240M;
      case gfx::ColorSpace::MatrixID::YCOCG:
        return gfx::mojom::ColorSpaceMatrixID::YCOCG;
      case gfx::ColorSpace::MatrixID::BT2020_NCL:
        return gfx::mojom::ColorSpaceMatrixID::BT2020_NCL;
      case gfx::ColorSpace::MatrixID::BT2020_CL:
        return gfx::mojom::ColorSpaceMatrixID::BT2020_CL;
      case gfx::ColorSpace::MatrixID::YDZDX:
        return gfx::mojom::ColorSpaceMatrixID::YDZDX;
      case gfx::ColorSpace::MatrixID::GBR:
        return gfx::mojom::ColorSpaceMatrixID::GBR;
    }
    NOTREACHED();
    return gfx::mojom::ColorSpaceMatrixID::INVALID;
  }

  static bool FromMojom(gfx::mojom::ColorSpaceMatrixID input,
                        gfx::ColorSpace::MatrixID* out) {
    switch (input) {
      case gfx::mojom::ColorSpaceMatrixID::INVALID:
        *out = gfx::ColorSpace::MatrixID::INVALID;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::RGB:
        *out = gfx::ColorSpace::MatrixID::RGB;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::BT709:
        *out = gfx::ColorSpace::MatrixID::BT709;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::FCC:
        *out = gfx::ColorSpace::MatrixID::FCC;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::BT470BG:
        *out = gfx::ColorSpace::MatrixID::BT470BG;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::SMPTE170M:
        *out = gfx::ColorSpace::MatrixID::SMPTE170M;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::SMPTE240M:
        *out = gfx::ColorSpace::MatrixID::SMPTE240M;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::YCOCG:
        *out = gfx::ColorSpace::MatrixID::YCOCG;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::BT2020_NCL:
        *out = gfx::ColorSpace::MatrixID::BT2020_NCL;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::BT2020_CL:
        *out = gfx::ColorSpace::MatrixID::BT2020_CL;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::YDZDX:
        *out = gfx::ColorSpace::MatrixID::YDZDX;
        return true;
      case gfx::mojom::ColorSpaceMatrixID::GBR:
        *out = gfx::ColorSpace::MatrixID::GBR;
        return true;
    }
    NOTREACHED();
    return false;
  }
};

template <>
struct EnumTraits<gfx::mojom::ColorSpaceRangeID, gfx::ColorSpace::RangeID> {
  static gfx::mojom::ColorSpaceRangeID ToMojom(gfx::ColorSpace::RangeID input) {
    switch (input) {
      case gfx::ColorSpace::RangeID::INVALID:
        return gfx::mojom::ColorSpaceRangeID::INVALID;
      case gfx::ColorSpace::RangeID::LIMITED:
        return gfx::mojom::ColorSpaceRangeID::LIMITED;
      case gfx::ColorSpace::RangeID::FULL:
        return gfx::mojom::ColorSpaceRangeID::FULL;
      case gfx::ColorSpace::RangeID::DERIVED:
        return gfx::mojom::ColorSpaceRangeID::DERIVED;
    }
    NOTREACHED();
    return gfx::mojom::ColorSpaceRangeID::INVALID;
  }

  static bool FromMojom(gfx::mojom::ColorSpaceRangeID input,
                        gfx::ColorSpace::RangeID* out) {
    switch (input) {
      case gfx::mojom::ColorSpaceRangeID::INVALID:
        *out = gfx::ColorSpace::RangeID::INVALID;
        return true;
      case gfx::mojom::ColorSpaceRangeID::LIMITED:
        *out = gfx::ColorSpace::RangeID::LIMITED;
        return true;
      case gfx::mojom::ColorSpaceRangeID::FULL:
        *out = gfx::ColorSpace::RangeID::FULL;
        return true;
      case gfx::mojom::ColorSpaceRangeID::DERIVED:
        *out = gfx::ColorSpace::RangeID::DERIVED;
        return true;
    }
    NOTREACHED();
    return false;
  }
};

template <>
struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
    StructTraits<gfx::mojom::ColorSpaceDataView, gfx::ColorSpace> {
  static gfx::ColorSpace::PrimaryID primaries(const gfx::ColorSpace& input) {
    return input.primaries_;
  }

  static gfx::ColorSpace::TransferID transfer(const gfx::ColorSpace& input) {
    return input.transfer_;
  }

  static gfx::ColorSpace::MatrixID matrix(const gfx::ColorSpace& input) {
    return input.matrix_;
  }

  static gfx::ColorSpace::RangeID range(const gfx::ColorSpace& input) {
    return input.range_;
  }

  static base::span<const float> custom_primary_matrix(
      const gfx::ColorSpace& input) {
    return input.custom_primary_matrix_;
  }

  static base::span<const float> transfer_params(const gfx::ColorSpace& input) {
    return input.transfer_params_;
  }

  static bool Read(gfx::mojom::ColorSpaceDataView data, gfx::ColorSpace* out);
};

}  // namespace mojo

#endif  // UI_GFX_MOJOM_COLOR_SPACE_MOJOM_TRAITS_H_
