Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / bench / DeferredCanvasBench.cpp
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #include "Benchmark.h"
8 #include "SkDeferredCanvas.h"
9 #include "SkDevice.h"
10 #include "SkString.h"
11
12 class DeferredCanvasBench : public Benchmark {
13 public:
14     DeferredCanvasBench(const char name[])  {
15         fName.printf("deferred_canvas_%s", name);
16     }
17
18     enum {
19         CANVAS_WIDTH = 200,
20         CANVAS_HEIGHT = 200,
21     };
22 protected:
23     virtual const char* onGetName() {
24         return fName.c_str();
25     }
26
27     virtual void onDraw(const int loops, SkCanvas* canvas) {
28 #if 0   // what specifically are we interested in timing here?
29         SkBaseDevice *device = canvas->getDevice()->createCompatibleDevice(
30             SkBitmap::kARGB_8888_Config, CANVAS_WIDTH, CANVAS_HEIGHT, false);
31
32         SkAutoTUnref<SkDeferredCanvas> deferredCanvas(SkDeferredCanvas::Create(device));
33         device->unref();
34
35         initDeferredCanvas(deferredCanvas);
36         drawInDeferredCanvas(loops, deferredCanvas);
37         finalizeDeferredCanvas(deferredCanvas);
38         deferredCanvas->flush();
39 #endif
40     }
41
42     virtual void initDeferredCanvas(SkDeferredCanvas* canvas) = 0;
43     virtual void drawInDeferredCanvas(const int loops, SkDeferredCanvas* canvas) = 0;
44     virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) = 0;
45
46     SkString fName;
47
48 private:
49     typedef Benchmark INHERITED;
50 };
51
52 class SimpleNotificationClient : public SkDeferredCanvas::NotificationClient {
53 public:
54     SimpleNotificationClient() : fDummy(false) {}
55
56     //bogus virtual implementations that just do something small
57     virtual void prepareForDraw() SK_OVERRIDE {fDummy = true;}
58     virtual void storageAllocatedForRecordingChanged(size_t) SK_OVERRIDE {fDummy = false;}
59     virtual void flushedDrawCommands() SK_OVERRIDE {fDummy = !fDummy;}
60 private:
61     bool fDummy;
62
63     typedef SkDeferredCanvas::NotificationClient INHERITED;
64 };
65
66 // Test that records very simple draw operations.
67 // This benchmark aims to capture performance fluctuations in the recording
68 // overhead of SkDeferredCanvas
69 class DeferredRecordBench : public DeferredCanvasBench {
70 public:
71     DeferredRecordBench()
72         : INHERITED("record") {
73     }
74
75 protected:
76
77     virtual void initDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE {
78         canvas->setNotificationClient(&fNotificationClient);
79     }
80
81     virtual void drawInDeferredCanvas(const int loops, SkDeferredCanvas* canvas) SK_OVERRIDE {
82         SkRect rect;
83         rect.setXYWH(0, 0, 10, 10);
84         SkPaint paint;
85         for (int i = 0; i < loops; i++) {
86             canvas->save();
87             canvas->translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT));
88             canvas->drawRect(rect, paint);
89             canvas->restore();
90         }
91     }
92
93     virtual void finalizeDeferredCanvas(SkDeferredCanvas* canvas) SK_OVERRIDE {
94         canvas->clear(0x0);
95         canvas->setNotificationClient(NULL);
96     }
97
98 private:
99     typedef DeferredCanvasBench INHERITED;
100     SimpleNotificationClient fNotificationClient;
101 };
102
103
104 ///////////////////////////////////////////////////////////////////////////////
105
106 DEF_BENCH( return new DeferredRecordBench(); )