blob: 898315e852017e68c599f113b3628df952d24276 [file] [log] [blame]
jvanverthf5d1b2d2015-09-15 07:40:56 -07001/*
2 * Copyright 2015 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.
jvanverthf5d1b2d2015-09-15 07:40:56 -07006 */
7
8#include "VisualInteractiveModule.h"
9
jvanverthf5d1b2d2015-09-15 07:40:56 -070010#include "SkCanvas.h"
11#include "SkCommandLineFlags.h"
jvanverthf5d1b2d2015-09-15 07:40:56 -070012
jvanverthf5d1b2d2015-09-15 07:40:56 -070013VisualInteractiveModule::VisualInteractiveModule(VisualBench* owner)
cdalton266e2022015-11-13 08:28:49 -080014 : INHERITED(owner)
joshualittd0f0bce2015-10-14 07:49:28 -070015 , fCurrentMeasurement(0)
16 , fAdvance(false) {
jvanverthf5d1b2d2015-09-15 07:40:56 -070017 memset(fMeasurements, 0, sizeof(fMeasurements));
18}
19
joshualittd0f0bce2015-10-14 07:49:28 -070020void VisualInteractiveModule::renderFrame(SkCanvas* canvas, Benchmark* benchmark, int loops) {
21 benchmark->draw(loops, canvas);
jvanverthf5d1b2d2015-09-15 07:40:56 -070022 this->drawStats(canvas);
23 canvas->flush();
jvanverthf5d1b2d2015-09-15 07:40:56 -070024}
25
26void VisualInteractiveModule::drawStats(SkCanvas* canvas) {
27 static const float kPixelPerMS = 2.0f;
28 static const int kDisplayWidth = 130;
29 static const int kDisplayHeight = 100;
30 static const int kDisplayPadding = 10;
31 static const int kGraphPadding = 3;
32 static const float kBaseMS = 1000.f / 60.f; // ms/frame to hit 60 fps
33
34 SkISize canvasSize = canvas->getDeviceSize();
35 SkRect rect = SkRect::MakeXYWH(SkIntToScalar(canvasSize.fWidth-kDisplayWidth-kDisplayPadding),
36 SkIntToScalar(kDisplayPadding),
37 SkIntToScalar(kDisplayWidth), SkIntToScalar(kDisplayHeight));
38 SkPaint paint;
39 canvas->clipRect(rect);
40 paint.setColor(SK_ColorBLACK);
41 canvas->drawRect(rect, paint);
42 // draw the 16ms line
43 paint.setColor(SK_ColorLTGRAY);
halcanary9d524f22016-03-29 09:03:52 -070044 canvas->drawLine(rect.fLeft, rect.fBottom - kBaseMS*kPixelPerMS,
jvanverthf5d1b2d2015-09-15 07:40:56 -070045 rect.fRight, rect.fBottom - kBaseMS*kPixelPerMS, paint);
46 paint.setColor(SK_ColorRED);
47 paint.setStyle(SkPaint::kStroke_Style);
48 canvas->drawRect(rect, paint);
49
50 int x = SkScalarTruncToInt(rect.fLeft) + kGraphPadding;
51 const int xStep = 2;
52 const int startY = SkScalarTruncToInt(rect.fBottom);
53 int i = fCurrentMeasurement;
54 do {
55 int endY = startY - (int)(fMeasurements[i] * kPixelPerMS + 0.5); // round to nearest value
halcanary9d524f22016-03-29 09:03:52 -070056 canvas->drawLine(SkIntToScalar(x), SkIntToScalar(startY),
jvanverthf5d1b2d2015-09-15 07:40:56 -070057 SkIntToScalar(x), SkIntToScalar(endY), paint);
58 i++;
59 i &= (kMeasurementCount - 1); // fast mod
60 x += xStep;
61 } while (i != fCurrentMeasurement);
62
63}
64
joshualittd0f0bce2015-10-14 07:49:28 -070065bool VisualInteractiveModule::timingFinished(Benchmark* benchmark, int loops, double measurement) {
66 // Record measurements
67 fMeasurements[fCurrentMeasurement++] = measurement;
68 fCurrentMeasurement &= (kMeasurementCount-1); // fast mod
69 SkASSERT(fCurrentMeasurement < kMeasurementCount);
70 if (fAdvance) {
71 fAdvance = false;
jvanverthf5d1b2d2015-09-15 07:40:56 -070072 return true;
73 }
joshualittd0f0bce2015-10-14 07:49:28 -070074 return false;
jvanverthf5d1b2d2015-09-15 07:40:56 -070075}
76
77bool VisualInteractiveModule::onHandleChar(SkUnichar c) {
78 if (' ' == c) {
joshualittdc5db592015-10-05 13:24:55 -070079 fAdvance = true;
jvanverthf5d1b2d2015-09-15 07:40:56 -070080 }
81
82 return true;
83}