// Copyright 2014 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 "cc/resources/picture_pile_impl.h"

#include "cc/debug/lap_timer.h"
#include "cc/test/fake_picture_pile_impl.h"
#include "cc/test/fake_rendering_stats_instrumentation.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/perf/perf_test.h"

namespace cc {
namespace {

const int kTimeLimitMillis = 2000;
const int kWarmupRuns = 5;
const int kTimeCheckInterval = 10;

const int kTileSize = 100;
const int kLayerSize = 1000;

class PicturePileImplPerfTest : public testing::Test {
 public:
  PicturePileImplPerfTest()
      : timer_(kWarmupRuns,
               base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
               kTimeCheckInterval) {}

  void RunAnalyzeTest(const std::string& test_name, float contents_scale) {
    scoped_refptr<PicturePileImpl> pile = FakePicturePileImpl::CreateFilledPile(
        gfx::Size(kTileSize, kTileSize), gfx::Size(kLayerSize, kLayerSize));
    // Content rect that will align with top-left tile at scale 1.0.
    gfx::Rect content_rect(0, 0, kTileSize, kTileSize);

    PicturePileImpl::Analysis analysis;
    timer_.Reset();
    do {
      pile->AnalyzeInRect(content_rect, contents_scale, &analysis);
      timer_.NextLap();
    } while (!timer_.HasTimeLimitExpired());

    perf_test::PrintResult(
        "analyze", "", test_name, timer_.LapsPerSecond(), "runs/s", true);
  }

  void RunRasterTest(const std::string& test_name, float contents_scale) {
    scoped_refptr<PicturePileImpl> pile = FakePicturePileImpl::CreateFilledPile(
        gfx::Size(kTileSize, kTileSize), gfx::Size(kLayerSize, kLayerSize));
    // Content rect that will align with top-left tile at scale 1.0.
    gfx::Rect content_rect(0, 0, kTileSize, kTileSize);

    SkBitmap bitmap;
    bitmap.allocN32Pixels(1, 1);
    SkCanvas canvas(bitmap);

    FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
    timer_.Reset();
    do {
      pile->RasterToBitmap(&canvas,
                           content_rect,
                           contents_scale,
                           &rendering_stats_instrumentation);
      timer_.NextLap();
    } while (!timer_.HasTimeLimitExpired());

    perf_test::PrintResult(
        "raster", "", test_name, timer_.LapsPerSecond(), "runs/s", true);
  }

 private:
  LapTimer timer_;
};

TEST_F(PicturePileImplPerfTest, Analyze) {
  RunAnalyzeTest("1", 1.0f);
  RunAnalyzeTest("4", 0.5f);
  RunAnalyzeTest("100", 0.1f);
}

TEST_F(PicturePileImplPerfTest, Raster) {
  RunRasterTest("1", 1.0f);
  RunRasterTest("4", 0.5f);
  RunRasterTest("100", 0.1f);
}

}  // namespace
}  // namespace cc
