/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "base/file_path.h"
#include "base/path_service.h"
#include "cobalt/base/cobalt_paths.h"
#include "cobalt/renderer/test/png_utils/png_decode.h"
#include "testing/gtest/include/gtest/gtest.h"

using cobalt::renderer::test::png_utils::DecodePNGToPremultipliedAlphaRGBA;
using cobalt::renderer::test::png_utils::DecodePNGToRGBA;

namespace {
FilePath GetPremultipliedAlphaTestImagePath() {
  FilePath data_directory;
  CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &data_directory));
  return data_directory.Append(FILE_PATH_LITERAL("test"))
      .Append(FILE_PATH_LITERAL("png_utils"))
      .Append(FILE_PATH_LITERAL("png_premultiplied_alpha_test_image.png"));
}

// Counts all pixels who's values differ from the passed in value
int CountDifferingPixels(const uint8_t* pixels, int width, int height,
                         uint32_t test_color) {
  // Number of pixels that differ from their expected value.
  int error_pixels = 0;

  // Iterate through each pixel testing that the value is the expected value.
  for (int row = 0; row < height; ++row) {
    const uint8_t* cur_pixel = pixels + width * row * 4;
    for (int col = 0; col < width; ++col) {
      uint32_t current_color =
          *(reinterpret_cast<const uint32_t*>(cur_pixel) + col);
      if (current_color != test_color) {
        ++error_pixels;
      }
    }
  }

  return error_pixels;
}

}  // namespace

// Test that we can decode the image properly into unpremultiplied alpha format.
TEST(PNGDecodeTests, CanDecodeUnpremultipliedAlpha) {
  int width;
  int height;
  scoped_array<uint8_t> pixels =
      DecodePNGToRGBA(GetPremultipliedAlphaTestImagePath(), &width, &height);

  // All pixels in the PNG image should have non-premultiplied alpha RGBA
  // values of (255, 0, 0, 127).
  uint32_t expected_color = 0;
  uint8_t* expected_color_components =
      reinterpret_cast<uint8_t*>(&expected_color);
  expected_color_components[0] = 255;
  expected_color_components[3] = 127;


  EXPECT_EQ(0,
            CountDifferingPixels(pixels.get(), width, height, expected_color));
}

// Test that we can decode the image properly into premultiplied alpha format.
TEST(PNGDecodeTests, CanDecodePremultipliedAlpha) {
  int width;
  int height;
  scoped_array<uint8_t> pixels = DecodePNGToPremultipliedAlphaRGBA(
      GetPremultipliedAlphaTestImagePath(), &width, &height);

  // All pixels in the PNG image should have premultiplied alpha RGBA
  // values of (127, 0, 0, 127).
  uint32_t expected_color = 0;
  uint8_t* expected_color_components =
      reinterpret_cast<uint8_t*>(&expected_color);
  expected_color_components[0] = 127;
  expected_color_components[3] = 127;


  EXPECT_EQ(0,
            CountDifferingPixels(pixels.get(), width, height, expected_color));
}
