1fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch// found in the LICENSE file.
4fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
5fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#ifndef SKIA_EXT_BENCHMARKING_CANVAS_H_
6fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#define SKIA_EXT_BENCHMARKING_CANVAS_H_
7fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
8fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "base/compiler_specific.h"
9fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "skia/ext/refptr.h"
10fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "third_party/skia/include/utils/SkNWayCanvas.h"
11fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "third_party/skia/src/utils/debugger/SkDebugCanvas.h"
12fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
13fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochnamespace skia {
14fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
15fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochclass TimingCanvas;
16fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
17fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochclass SK_API BenchmarkingCanvas : public SkNWayCanvas {
18fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochpublic:
19fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  BenchmarkingCanvas(int width, int height);
20fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  virtual ~BenchmarkingCanvas();
21fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
22fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Returns the number of draw commands executed on this canvas.
23fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  size_t CommandCount() const;
24fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
25fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Get draw command info for a given index.
26fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  SkDrawCommand* GetCommand(size_t index);
27fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
28fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Return the recorded render time (milliseconds) for a draw command index.
29fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  double GetTime(size_t index);
30fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
31fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochprivate:
32fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // In order to avoid introducing a Skia version dependency, this
33fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // implementation dispatches draw commands in lock-step to two distinct
34fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // canvases:
35fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  //   * a SkDebugCanvas used for gathering command info and tracking
36fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  //     the current command index
37fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  //   * a SkiaTimingCanvas used for measuring raster paint times (and relying
38fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  //     on the former for tracking the current command index).
39fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  //
40fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // This way, if the SkCanvas API is extended, we don't need to worry about
41fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // updating content::SkiaTimingCanvas to accurately override all new methods
42fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // (to avoid timing info indices from getting out of sync), as SkDebugCanvas
43fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // already does that for us.
44fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
45fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  skia::RefPtr<SkDebugCanvas> debug_canvas_;
46fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  skia::RefPtr<TimingCanvas> timing_canvas_;
47fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch};
48fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
49fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
50fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#endif // SKIA_EXT_BENCHMARKING_CANVAS_H
51