// Copyright (c) 2011 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.

// This small program is used to measure the performance of the various
// resize algorithms offered by the ImageOperations::Resize function.
// It will generate an empty source bitmap, and rescale it to specified
// dimensions. It will repeat this operation multiple time to get more accurate
// average throughput. Because it uses elapsed time to do its math, it is only
// accurate on an idle system (but that approach was deemed more accurate
// than the use of the times() call.
// To present a single number in MB/s, it calculates the 'speed' by taking
// source surface + destination surface and dividing by the elapsed time.
// This number is somewhat reasonable way to measure this, given our current
// implementation which somewhat scales this way.

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>

#include "base/command_line.h"
#include "base/format_macros.h"
#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "skia/ext/image_operations.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkRect.h"

namespace {

struct StringMethodPair {
  const char* name;
  skia::ImageOperations::ResizeMethod method;
};
#define ADD_METHOD(x) { #x, skia::ImageOperations::RESIZE_##x }
const StringMethodPair resize_methods[] = {
  ADD_METHOD(GOOD),
  ADD_METHOD(BETTER),
  ADD_METHOD(BEST),
  ADD_METHOD(BOX),
  ADD_METHOD(HAMMING1),
  ADD_METHOD(LANCZOS3),
};

// converts a string into one of the image operation method to resize.
// Returns true on success, false otherwise.
bool StringToMethod(const std::string& arg,
                    skia::ImageOperations::ResizeMethod* method) {
  for (size_t i = 0; i < base::size(resize_methods); ++i) {
    if (base::EqualsCaseInsensitiveASCII(arg, resize_methods[i].name)) {
      *method = resize_methods[i].method;
      return true;
    }
  }
  return false;
}

const char* MethodToString(skia::ImageOperations::ResizeMethod method) {
  for (size_t i = 0; i < base::size(resize_methods); ++i) {
    if (method == resize_methods[i].method) {
      return resize_methods[i].name;
    }
  }
  return "unknown";
}

// Prints all supported resize methods
void PrintMethods() {
  bool print_comma = false;
  for (size_t i = 0; i < base::size(resize_methods); ++i) {
    if (print_comma) {
      printf(",");
    } else {
      print_comma = true;
    }
    printf(" %s", resize_methods[i].name);
  }
}

// Returns the number of bytes that the bitmap has. This number is different
// from what SkBitmap::getSize() returns since it does not take into account
// the stride. The difference between the stride and the width can be large
// because of the alignment constraints on bitmaps created for SRB scaling
// (32 pixels) as seen on GTV platforms. Using this metric instead of the
// getSize seemed to be a more accurate representation of the work done (even
// though in terms of memory bandwidth that might be similar because of the
// cache line size).
int GetBitmapSize(const SkBitmap* bitmap) {
  return bitmap->height() * bitmap->bytesPerPixel() * bitmap->width();
}

// Simple class to represent dimensions of a bitmap (width, height).
class Dimensions {
 public:
  Dimensions()
      : width_(0),
        height_(0) {}

  void set(int w, int h) {
    width_ = w;
    height_ = h;
  }

  int width() const {
    return width_;
  }

  int height() const {
    return height_;
  }

  bool IsValid() const {
    return (width_ > 0 && height_ > 0);
  }

  // On failure, will set its state in such a way that IsValid will return
  // false.
  void FromString(const std::string& arg) {
    std::vector<base::StringPiece> strings = base::SplitStringPiece(
        arg, "x", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
    if (strings.size() != 2 ||
        base::StringToInt(strings[0], &width_) == false ||
        base::StringToInt(strings[1], &height_) == false) {
      width_ = -1;  // force the dimension object to be invalid.
    }
  }
 private:
  int width_;
  int height_;
};

// main class used for the benchmarking.
class Benchmark {
 public:
  static const int kDefaultNumberIterations;
  static const skia::ImageOperations::ResizeMethod kDefaultResizeMethod;

  Benchmark()
      : num_iterations_(kDefaultNumberIterations),
        method_(kDefaultResizeMethod) {}

  // Returns true if command line parsing was successful, false otherwise.
  bool ParseArgs(const base::CommandLine* command_line);

  // Returns true if successful, false otherwise.
  bool Run() const;

  static void Usage();
 private:
  int num_iterations_;
  skia::ImageOperations::ResizeMethod method_;
  Dimensions source_;
  Dimensions dest_;
};

// static
const int Benchmark::kDefaultNumberIterations = 1024;
const skia::ImageOperations::ResizeMethod Benchmark::kDefaultResizeMethod =
      skia::ImageOperations::RESIZE_LANCZOS3;

// argument management
void Benchmark::Usage() {
  printf("image_operations_bench -source wxh -destination wxh "
         "[-iterations i] [-method m] [-help]\n"
         "  -source wxh: specify source width and height\n"
         "  -destination wxh: specify destination width and height\n"
         "  -iter i: perform i iterations (default:%d)\n"
         "  -method m: use method m (default:%s), which can be:",
         Benchmark::kDefaultNumberIterations,
         MethodToString(Benchmark::kDefaultResizeMethod));
  PrintMethods();
  printf("\n  -help: prints this help and exits\n");
}

bool Benchmark::ParseArgs(const base::CommandLine* command_line) {
  const base::CommandLine::SwitchMap& switches = command_line->GetSwitches();
  bool fNeedHelp = false;

  for (base::CommandLine::SwitchMap::const_iterator iter = switches.begin();
       iter != switches.end();
       ++iter) {
    const std::string& s = iter->first;
    std::string value;
#if defined(OS_WIN)
    value = base::WideToUTF8(iter->second);
#else
    value = iter->second;
#endif
    if (s == "source") {
      source_.FromString(value);
    } else if (s == "destination") {
      dest_.FromString(value);
    } else if (s == "iterations") {
      if (base::StringToInt(value, &num_iterations_) == false) {
        fNeedHelp = true;
      }
    } else if (s == "method") {
      if (!StringToMethod(value, &method_)) {
        printf("Invalid method '%s' specified\n", value.c_str());
        fNeedHelp = true;
      }
    } else {
      fNeedHelp = true;
    }
  }

  if (num_iterations_ <= 0) {
    printf("Invalid number of iterations: %d\n", num_iterations_);
    fNeedHelp = true;
  }
  if (!source_.IsValid()) {
    printf("Invalid source dimensions specified\n");
    fNeedHelp = true;
  }
  if (!dest_.IsValid()) {
    printf("Invalid dest dimensions specified\n");
    fNeedHelp = true;
  }
  if (fNeedHelp == true) {
    return false;
  }
  return true;
}

// actual benchmark.
bool Benchmark::Run() const {
  SkBitmap source;
  source.allocN32Pixels(source_.width(), source_.height());
  source.eraseARGB(0, 0, 0, 0);

  SkBitmap dest;

  const base::TimeTicks start = base::TimeTicks::Now();

  for (int i = 0; i < num_iterations_; ++i) {
    dest = skia::ImageOperations::Resize(source,
                                         method_,
                                         dest_.width(), dest_.height());
  }

  const int64_t elapsed_us = (base::TimeTicks::Now() - start).InMicroseconds();

  const uint64_t num_bytes = static_cast<uint64_t>(num_iterations_) *
                             (GetBitmapSize(&source) + GetBitmapSize(&dest));

  printf("%" PRIu64 " MB/s,\telapsed = %" PRIu64 " source=%d dest=%d\n",
         static_cast<uint64_t>(elapsed_us == 0 ? 0 : num_bytes / elapsed_us),
         static_cast<uint64_t>(elapsed_us), GetBitmapSize(&source),
         GetBitmapSize(&dest));

  return true;
}

// A small class to automatically call Reset on the global command line to
// avoid nasty valgrind complaints for the leak of the global command line.
class CommandLineAutoReset {
 public:
  CommandLineAutoReset(int argc, char** argv) {
    base::CommandLine::Init(argc, argv);
  }
  ~CommandLineAutoReset() {
    base::CommandLine::Reset();
  }

  const base::CommandLine* Get() const {
    return base::CommandLine::ForCurrentProcess();
  }
};

}  // namespace

int main(int argc, char** argv) {
  Benchmark bench;
  CommandLineAutoReset command_line(argc, argv);

  if (!bench.ParseArgs(command_line.Get())) {
    Benchmark::Usage();
    return 1;
  }

  if (!bench.Run()) {
    printf("Failed to run benchmark\n");
    return 1;
  }

  return 0;
}
