// 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 "cobalt/trace_event/benchmark.h"

namespace {
FilePath GetBenchmarkImagePath() {
  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_benchmark_image.png"));
}
}  // namespace

TRACE_EVENT_BENCHMARK2(
    DecodePNGToRGBABenchmark,
    "PNGFileReadContext::PNGFileReadContext()",
        cobalt::trace_event::IN_SCOPE_DURATION,
    "PNGFileReadContext::DecodeImageTo()",
        cobalt::trace_event::IN_SCOPE_DURATION) {
  const int kIterationCount = 20;
  for (int i = 0; i < kIterationCount; ++i) {
    int width;
    int height;
    scoped_array<uint8_t> pixel_data =
        cobalt::renderer::test::png_utils::DecodePNGToRGBA(
            GetBenchmarkImagePath(),
            &width, &height);
  }
}

TRACE_EVENT_BENCHMARK2(
    DecodePNGToPremultipliedAlphaRGBABenchmark,
    "PNGFileReadContext::PNGFileReadContext()",
        cobalt::trace_event::IN_SCOPE_DURATION,
    "PNGFileReadContext::DecodeImageTo()",
        cobalt::trace_event::IN_SCOPE_DURATION) {
  FilePath data_directory;
  CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &data_directory));

  const int kIterationCount = 20;
  for (int i = 0; i < kIterationCount; ++i) {
    int width;
    int height;
    scoped_array<uint8_t> pixel_data =
        cobalt::renderer::test::png_utils::DecodePNGToPremultipliedAlphaRGBA(
            GetBenchmarkImagePath(),
            &width, &height);
  }
}
