// Copyright (c) 2012 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 COBALT_MEDIA_BASE_COLOR_SPACE_H_
#define COBALT_MEDIA_BASE_COLOR_SPACE_H_

#include <stdint.h>

#include "base/gtest_prod_util.h"
#include "base/logging.h"
#include "build/build_config.h"
#include "media/base/gfx_export.h"

namespace IPC {
template <class P>
struct ParamTraits;
}  // namespace IPC


// This is a modified version of gfx::ColorSpace with Skia dependency removed.
// It is tentatively put inside media2 to avoid introducing new code into
// ui/gfx.  It will be further simplified and merged into media in follow up
// refactors.
namespace gfx {

// Used to represet a color space for the purpose of color conversion.
// This is designed to be safe and compact enough to send over IPC
// between any processes.
class ColorSpace {
 public:
  enum PrimaryID {
    // The first 0-255 values should match the H264 specification (see Table E-3
    // Colour Primaries in https://www.itu.int/rec/T-REC-H.264/en).
    kPrimaryIdReserved0 = 0,
    kPrimaryIdBt709 = 1,
    kPrimaryIdUnspecified = 2,
    kPrimaryIdReserved = 3,
    kPrimaryIdBt470M = 4,
    kPrimaryIdBt470Bg = 5,
    kPrimaryIdSmpte170M = 6,
    kPrimaryIdSmpte240M = 7,
    kPrimaryIdFilm = 8,
    kPrimaryIdBt2020 = 9,
    kPrimaryIdSmpteSt4281 = 10,
    kPrimaryIdSmpteSt4312 = 11,
    kPrimaryIdSmpteSt4321 = 12,

    kPrimaryIdLastStandardValue = kPrimaryIdSmpteSt4321,

    // Chrome-specific values start at 1000.
    kPrimaryIdUnknown = 1000,
    kPrimaryIdXyzD50,
    kPrimaryIdCustom,
    kPrimaryIdLast = kPrimaryIdCustom
  };

  enum TransferID {
    // The first 0-255 values should match the H264 specification (see Table E-4
    // Transfer Characteristics in https://www.itu.int/rec/T-REC-H.264/en).
    kTransferIdReserved0 = 0,
    kTransferIdBt709 = 1,
    kTransferIdUnspecified = 2,
    kTransferIdReserved = 3,
    kTransferIdGamma22 = 4,
    kTransferIdGamma28 = 5,
    kTransferIdSmpte170M = 6,
    kTransferIdSmpte240M = 7,
    kTransferIdLinear = 8,
    kTransferIdLog = 9,
    kTransferIdLogSqrt = 10,
    kTransferIdIec6196624 = 11,
    kTransferIdBt1361Ecg = 12,
    kTransferIdIec6196621 = 13,
    kTransferId10BitBt2020 = 14,
    kTransferId12BitBt2020 = 15,
    kTransferIdSmpteSt2084 = 16,
    kTransferIdSmpteSt4281 = 17,
    kTransferIdAribStdB67 = 18,  // AKA hybrid-log gamma, HLG.

    kTransferIdLastStandardValue = kTransferIdSmpteSt4281,

    // Chrome-specific values start at 1000.
    kTransferIdUnknown = 1000,
    kTransferIdGamma24,

    // This is an ad-hoc transfer function that decodes SMPTE 2084 content
    // into a 0-1 range more or less suitable for viewing on a non-hdr
    // display.
    kTransferIdSmpteSt2084NonHdr,

    // TODO(hubbe): Need to store an approximation of the gamma function(s).
    kTransferIdCustom,
    kTransferIdLast = kTransferIdCustom,
  };

  enum MatrixID {
    // The first 0-255 values should match the H264 specification (see Table E-5
    // Matrix Coefficients in https://www.itu.int/rec/T-REC-H.264/en).
    kMatrixIdRgb = 0,
    kMatrixIdBt709 = 1,
    kMatrixIdUnspecified = 2,
    kMatrixIdReserved = 3,
    kMatrixIdFcc = 4,
    kMatrixIdBt470Bg = 5,
    kMatrixIdSmpte170M = 6,
    kMatrixIdSmpte240M = 7,
    kMatrixIdYCgCo = 8,
    kMatrixIdBt2020NonconstantLuminance = 9,
    kMatrixIdBt2020ConstantLuminance = 10,
    kMatrixIdYDzDx = 11,

    kMatrixIdLastStandardValue = kMatrixIdYDzDx,

    // Chrome-specific values start at 1000
    kMatrixIdUnknown = 1000,
    kMatrixIdLast = kMatrixIdUnknown,
  };

  // This corresponds to the WebM Range enum which is part of WebM color data
  // (see http://www.webmproject.org/docs/container/#Range).
  // H.264 only uses a bool, which corresponds to the LIMITED/FULL values.
  // Chrome-specific values start at 1000.
  enum RangeID {
    // Range is not explicitly specified / unknown.
    kRangeIdUnspecified = 0,

    // Limited Rec. 709 color range with RGB values ranging from 16 to 235.
    kRangeIdLimited = 1,

    // Full RGB color range with RGB valees from 0 to 255.
    kRangeIdFull = 2,

    // Range is defined by TransferID/MatrixID.
    kRangeIdDerived = 3,

    kRangeIdLast = kRangeIdDerived
  };

  ColorSpace();
  ColorSpace(PrimaryID primaries,
             TransferID transfer,
             MatrixID matrix,
             RangeID full_range);
  ColorSpace(const ColorSpace& other);
  ColorSpace(int primaries, int transfer, int matrix, RangeID full_range);
  ~ColorSpace();

  typedef float CustomPrimaryMatrix[12];

  static PrimaryID PrimaryIDFromInt(int primary_id);
  static TransferID TransferIDFromInt(int transfer_id);
  static MatrixID MatrixIDFromInt(int matrix_id);

  static ColorSpace CreateXYZD50();

  // TODO: Remove these, and replace with more generic constructors.
  static ColorSpace CreateJpeg();
  static ColorSpace CreateREC601();
  static ColorSpace CreateREC709();

  bool operator==(const ColorSpace& other) const;
  bool operator!=(const ColorSpace& other) const;
  bool operator<(const ColorSpace& other) const;

  PrimaryID primaries() const { return primaries_; }
  TransferID transfer() const { return transfer_; }
  MatrixID matrix() const { return matrix_; }
  RangeID range() const { return range_; }

  const CustomPrimaryMatrix& custom_primary_matrix() const {
    DCHECK_EQ(primaries_, kPrimaryIdCustom);
    return custom_primary_matrix_;
  }

 private:
  PrimaryID primaries_;
  TransferID transfer_;
  MatrixID matrix_;
  RangeID range_;

  // Only used if primaries_ == kPrimaryIdCustom
  float custom_primary_matrix_[12];
};

}  // namespace gfx

#endif  // COBALT_MEDIA_BASE_COLOR_SPACE_H_
