| Index: skia/ext/benchmarking_canvas.cc
|
| diff --git a/skia/ext/benchmarking_canvas.cc b/skia/ext/benchmarking_canvas.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..60395158cb2096148951ca0c46704d14f7eb162e
|
| --- /dev/null
|
| +++ b/skia/ext/benchmarking_canvas.cc
|
| @@ -0,0 +1,237 @@
|
| +// Copyright (c) 2013 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 "base/containers/hash_tables.h"
|
| +#include "base/logging.h"
|
| +#include "base/time/time.h"
|
| +#include "skia/ext/benchmarking_canvas.h"
|
| +#include "third_party/skia/include/core/SkDevice.h"
|
| +#include "third_party/skia/include/utils/SkProxyCanvas.h"
|
| +
|
| +namespace skia {
|
| +
|
| +class AutoStamper {
|
| +public:
|
| + AutoStamper(TimingCanvas* timing_canvas);
|
| + ~AutoStamper();
|
| +
|
| +private:
|
| + TimingCanvas* timing_canvas_;
|
| + base::TimeTicks start_ticks_;
|
| +};
|
| +
|
| +class TimingCanvas : public SkProxyCanvas {
|
| +public:
|
| + TimingCanvas(int width, int height, const BenchmarkingCanvas* track_canvas)
|
| + : tracking_canvas_(track_canvas) {
|
| + skia::RefPtr<SkDevice> device = skia::AdoptRef(
|
| + SkNEW_ARGS(SkDevice, (SkBitmap::kARGB_8888_Config, width, height)));
|
| + canvas_ = skia::AdoptRef(SkNEW_ARGS(SkCanvas, (device.get())));
|
| +
|
| + setProxy(canvas_.get());
|
| + }
|
| +
|
| + virtual ~TimingCanvas() {
|
| + }
|
| +
|
| + double GetTime(size_t index) {
|
| + TimingsMap::const_iterator timing_info = timings_map_.find(index);
|
| + return timing_info != timings_map_.end()
|
| + ? timing_info->second.InMillisecondsF()
|
| + : 0.0;
|
| + }
|
| +
|
| + // SkCanvas overrides.
|
| + virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + return SkProxyCanvas::save(flags);
|
| + }
|
| +
|
| + virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
|
| + SaveFlags flags = kARGB_ClipLayer_SaveFlag) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + return SkProxyCanvas::saveLayer(bounds, paint, flags);
|
| + }
|
| +
|
| + virtual void restore() OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::restore();
|
| + }
|
| +
|
| + virtual bool clipRect(const SkRect& rect, SkRegion::Op op,
|
| + bool doAa) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + return SkProxyCanvas::clipRect(rect, op, doAa);
|
| + }
|
| +
|
| + virtual bool clipRRect(const SkRRect& rrect, SkRegion::Op op,
|
| + bool doAa) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + return SkProxyCanvas::clipRRect(rrect, op, doAa);
|
| + }
|
| +
|
| + virtual bool clipPath(const SkPath& path, SkRegion::Op op,
|
| + bool doAa) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + return SkProxyCanvas::clipPath(path, op, doAa);
|
| + }
|
| +
|
| + virtual bool clipRegion(const SkRegion& region,
|
| + SkRegion::Op op = SkRegion::kIntersect_Op) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + return SkProxyCanvas::clipRegion(region, op);
|
| + }
|
| +
|
| + virtual void drawPaint(const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawPaint(paint);
|
| + }
|
| +
|
| + virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
|
| + const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawPoints(mode, count, pts, paint);
|
| + }
|
| +
|
| + virtual void drawOval(const SkRect& rect, const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawOval(rect, paint);
|
| + }
|
| +
|
| + virtual void drawRect(const SkRect& rect, const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawRect(rect, paint);
|
| + }
|
| +
|
| + virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawRRect(rrect, paint);
|
| + }
|
| +
|
| + virtual void drawPath(const SkPath& path, const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawPath(path, paint);
|
| + }
|
| +
|
| + virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
|
| + const SkPaint* paint = NULL) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawBitmap(bitmap, left, top, paint);
|
| + }
|
| +
|
| + virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
|
| + const SkRect& dst,
|
| + const SkPaint* paint = NULL) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawBitmapRectToRect(bitmap, src, dst, paint);
|
| + }
|
| +
|
| + virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
|
| + const SkPaint* paint = NULL) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawBitmapMatrix(bitmap, m, paint);
|
| + }
|
| +
|
| + virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
|
| + const SkPaint* paint = NULL) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawSprite(bitmap, left, top, paint);
|
| + }
|
| +
|
| + virtual void drawText(const void* text, size_t byteLength, SkScalar x,
|
| + SkScalar y, const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawText(text, byteLength, x, y, paint);
|
| + }
|
| +
|
| + virtual void drawPosText(const void* text, size_t byteLength,
|
| + const SkPoint pos[],
|
| + const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawPosText(text, byteLength, pos, paint);
|
| + }
|
| +
|
| + virtual void drawPosTextH(const void* text, size_t byteLength,
|
| + const SkScalar xpos[], SkScalar constY,
|
| + const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawPosTextH(text, byteLength, xpos, constY, paint);
|
| + }
|
| +
|
| + virtual void drawTextOnPath(const void* text, size_t byteLength,
|
| + const SkPath& path, const SkMatrix* matrix,
|
| + const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawTextOnPath(text, byteLength, path, matrix, paint);
|
| + }
|
| +
|
| + virtual void drawPicture(SkPicture& picture) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawPicture(picture);
|
| + }
|
| +
|
| + virtual void drawVertices(VertexMode vmode, int vertexCount,
|
| + const SkPoint vertices[], const SkPoint texs[],
|
| + const SkColor colors[], SkXfermode* xmode,
|
| + const uint16_t indices[], int indexCount,
|
| + const SkPaint& paint) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawVertices(vmode, vertexCount, vertices, texs, colors,
|
| + xmode, indices, indexCount, paint);
|
| + }
|
| +
|
| + virtual void drawData(const void* data, size_t length) OVERRIDE {
|
| + AutoStamper stamper(this);
|
| + SkProxyCanvas::drawData(data, length);
|
| + }
|
| +
|
| +private:
|
| + typedef base::hash_map<size_t, base::TimeDelta> TimingsMap;
|
| + TimingsMap timings_map_;
|
| +
|
| + skia::RefPtr<SkCanvas> canvas_;
|
| +
|
| + friend class AutoStamper;
|
| + const BenchmarkingCanvas* tracking_canvas_;
|
| +};
|
| +
|
| +AutoStamper::AutoStamper(TimingCanvas *timing_canvas)
|
| + : timing_canvas_(timing_canvas) {
|
| + start_ticks_ = base::TimeTicks::HighResNow();
|
| +}
|
| +
|
| +AutoStamper::~AutoStamper() {
|
| + base::TimeDelta delta = base::TimeTicks::HighResNow() - start_ticks_;
|
| + int command_index = timing_canvas_->tracking_canvas_->CommandCount();
|
| + timing_canvas_->timings_map_[command_index] = delta;
|
| +}
|
| +
|
| +BenchmarkingCanvas::BenchmarkingCanvas(int width, int height)
|
| + : SkNWayCanvas(width, height) {
|
| + debug_canvas_ = skia::AdoptRef(SkNEW_ARGS(SkDebugCanvas, (width, height)));
|
| + timing_canvas_ = skia::AdoptRef(SkNEW_ARGS(TimingCanvas, (width, height, this)));
|
| +
|
| + addCanvas(debug_canvas_.get());
|
| + addCanvas(timing_canvas_.get());
|
| +}
|
| +
|
| +BenchmarkingCanvas::~BenchmarkingCanvas() {
|
| + removeAll();
|
| +}
|
| +
|
| +size_t BenchmarkingCanvas::CommandCount() const {
|
| + return debug_canvas_->getSize();
|
| +}
|
| +
|
| +SkDrawCommand* BenchmarkingCanvas::GetCommand(size_t index) {
|
| + DCHECK_LT(index, static_cast<size_t>(debug_canvas_->getSize()));
|
| + return debug_canvas_->getDrawCommandAt(index);
|
| +}
|
| +
|
| +double BenchmarkingCanvas::GetTime(size_t index) {
|
| + DCHECK_LT(index, static_cast<size_t>(debug_canvas_->getSize()));
|
| + return timing_canvas_->GetTime(index);
|
| +}
|
| +
|
| +} // namespace skia
|
|
|