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