// Copyright 2017 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "core/fpdfapi/page/pageint.h"
#include "testing/gtest/include/gtest/gtest.h"

TEST(CPDF_DeviceCSTest, GetRGBFromGray) {
  FX_FLOAT R;
  FX_FLOAT G;
  FX_FLOAT B;
  CPDF_DeviceCS deviceGray(nullptr, PDFCS_DEVICEGRAY);

  // Test normal values. For gray, only first value from buf should be used.
  FX_FLOAT buf[3] = {0.43f, 0.11f, 0.34f};
  ASSERT_TRUE(deviceGray.GetRGB(buf, R, G, B));
  EXPECT_EQ(0.43f, R);
  EXPECT_EQ(0.43f, G);
  EXPECT_EQ(0.43f, B);
  buf[0] = 0.872f;
  ASSERT_TRUE(deviceGray.GetRGB(buf, R, G, B));
  EXPECT_EQ(0.872f, R);
  EXPECT_EQ(0.872f, G);
  EXPECT_EQ(0.872f, B);

  // Test boundary values
  buf[0] = {0.0f};
  ASSERT_TRUE(deviceGray.GetRGB(buf, R, G, B));
  EXPECT_EQ(0.0f, R);
  EXPECT_EQ(0.0f, G);
  EXPECT_EQ(0.0f, B);
  buf[0] = 1.0f;
  ASSERT_TRUE(deviceGray.GetRGB(buf, R, G, B));
  EXPECT_EQ(1.0f, R);
  EXPECT_EQ(1.0f, G);
  EXPECT_EQ(1.0f, B);

  // Test out of range values
  buf[0] = -0.01f;
  ASSERT_TRUE(deviceGray.GetRGB(buf, R, G, B));
  EXPECT_EQ(0.0f, R);
  EXPECT_EQ(0.0f, G);
  EXPECT_EQ(0.0f, B);
  buf[0] = 12.5f;
  ASSERT_TRUE(deviceGray.GetRGB(buf, R, G, B));
  EXPECT_EQ(1.0f, R);
  EXPECT_EQ(1.0f, G);
  EXPECT_EQ(1.0f, B);
}

TEST(CPDF_DeviceCSTest, GetRGBFromRGB) {
  FX_FLOAT R;
  FX_FLOAT G;
  FX_FLOAT B;
  CPDF_DeviceCS deviceRGB(nullptr, PDFCS_DEVICERGB);

  // Test normal values
  FX_FLOAT buf[3] = {0.13f, 1.0f, 0.652f};
  ASSERT_TRUE(deviceRGB.GetRGB(buf, R, G, B));
  EXPECT_EQ(0.13f, R);
  EXPECT_EQ(1.0f, G);
  EXPECT_EQ(0.652f, B);
  buf[0] = 0.0f;
  buf[1] = 0.52f;
  buf[2] = 0.78f;
  ASSERT_TRUE(deviceRGB.GetRGB(buf, R, G, B));
  EXPECT_EQ(0.0f, R);
  EXPECT_EQ(0.52f, G);
  EXPECT_EQ(0.78f, B);

  // Test out of range values
  buf[0] = -10.5f;
  buf[1] = 100.0f;
  ASSERT_TRUE(deviceRGB.GetRGB(buf, R, G, B));
  EXPECT_EQ(0.0f, R);
  EXPECT_EQ(1.0f, G);
  EXPECT_EQ(0.78f, B);
}

TEST(CPDF_DeviceCSTest, GetRGBFromCMYK) {
  FX_FLOAT R;
  FX_FLOAT G;
  FX_FLOAT B;
  CPDF_DeviceCS deviceCMYK(nullptr, PDFCS_DEVICECMYK);
  // Use an error threshold because of the calculations used here.
  FX_FLOAT eps = 1e-6f;
  // Test normal values
  FX_FLOAT buf[4] = {0.6f, 0.5f, 0.3f, 0.9f};
  ASSERT_TRUE(deviceCMYK.GetRGB(buf, R, G, B));
  EXPECT_TRUE(std::abs(0.0627451f - R) < eps);
  EXPECT_TRUE(std::abs(0.0627451f - G) < eps);
  EXPECT_TRUE(std::abs(0.105882f - B) < eps);
  buf[0] = 0.15f;
  buf[2] = 0.0f;
  ASSERT_TRUE(deviceCMYK.GetRGB(buf, R, G, B));
  EXPECT_TRUE(std::abs(0.2f - R) < eps);
  EXPECT_TRUE(std::abs(0.0862745f - G) < eps);
  EXPECT_TRUE(std::abs(0.164706f - B) < eps);
  buf[2] = 1.0f;
  buf[3] = 0.0f;
  ASSERT_TRUE(deviceCMYK.GetRGB(buf, R, G, B));
  EXPECT_TRUE(std::abs(0.850980f - R) < eps);
  EXPECT_TRUE(std::abs(0.552941f - G) < eps);
  EXPECT_TRUE(std::abs(0.156863f - B) < eps);

  // Test out of range values
  buf[2] = 1.5f;
  buf[3] = -0.6f;
  ASSERT_TRUE(deviceCMYK.GetRGB(buf, R, G, B));
  EXPECT_TRUE(std::abs(0.850980f - R) < eps);
  EXPECT_TRUE(std::abs(0.552941f - G) < eps);
  EXPECT_TRUE(std::abs(0.156863f - B) < eps);
}
