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

#include "chrome/browser/chromeos/login/user_image_manager_test_util.h"

#include <string>

#include "base/file_util.h"
#include "base/memory/ref_counted.h"
#include "base/message_loop/message_loop_proxy.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_rep.h"

namespace chromeos {
namespace test {

const char kUserAvatarImage1RelativePath[] = "chromeos/avatar1.jpg";
const char kUserAvatarImage2RelativePath[] = "chromeos/avatar2.jpg";

bool AreImagesEqual(const gfx::ImageSkia& first, const gfx::ImageSkia& second) {
  if (first.width() != second.width() || first.height() != second.height())
    return false;
  const SkBitmap* first_bitmap = first.bitmap();
  const SkBitmap* second_bitmap = second.bitmap();
  if (!first_bitmap && !second_bitmap)
    return true;
  if (!first_bitmap || !second_bitmap)
    return false;

  const size_t size = first_bitmap->getSize();
  if (second_bitmap->getSize() != size)
    return false;

  SkAutoLockPixels first_pixel_lock(*first_bitmap);
  SkAutoLockPixels second_pixel_lock(*second_bitmap);
  uint8_t* first_data = reinterpret_cast<uint8_t*>(first_bitmap->getPixels());
  uint8_t* second_data = reinterpret_cast<uint8_t*>(second_bitmap->getPixels());
  for (size_t i = 0; i < size; ++i) {
    if (first_data[i] != second_data[i])
      return false;
  }
  return true;
}

ImageLoader::ImageLoader(const base::FilePath& path) : path_(path) {
}

ImageLoader::~ImageLoader() {
}

scoped_ptr<gfx::ImageSkia> ImageLoader::Load() {
  std::string image_data;
  ReadFileToString(path_, &image_data);
  scoped_refptr<ImageDecoder> image_decoder = new ImageDecoder(
      this,
      image_data,
      ImageDecoder::ROBUST_JPEG_CODEC);
  image_decoder->Start(base::MessageLoopProxy::current());
  run_loop_.Run();
  return decoded_image_.Pass();
}

void ImageLoader::OnImageDecoded(const ImageDecoder* decoder,
                                 const SkBitmap& decoded_image) {
  decoded_image_.reset(
      new gfx::ImageSkia(gfx::ImageSkiaRep(decoded_image, 1.0f)));
  run_loop_.Quit();
}

void ImageLoader::OnDecodeImageFailed(const ImageDecoder* decoder) {
  run_loop_.Quit();
}

}  // namespace test
}  // namespace chromeos
